blob: 19e870feb39183d5e41cb564b757dc2cd372c679 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
//
// Generates the C# MdBinaryWriter class. This classes is responsible for correctly decoding
// data members in the .metadata file. See NativeFormatWriterGen.cs for how the MetadataWriter
// use this class.
//
class MdBinaryWriterGen : CsWriter
{
public MdBinaryWriterGen(string fileName)
: base(fileName)
{
}
public void EmitSource()
{
WriteLine("#pragma warning disable 649");
WriteLine();
WriteLine("using System;");
WriteLine("using System.IO;");
WriteLine("using System.Collections.Generic;");
WriteLine("using System.Reflection;");
WriteLine("using Internal.LowLevelLinq;");
WriteLine("using Internal.NativeFormat;");
WriteLine("using Debug = System.Diagnostics.Debug;");
WriteLine();
OpenScope("namespace Internal.Metadata.NativeFormat.Writer");
OpenScope("internal static partial class MdBinaryWriter");
foreach (var primitiveType in SchemaDef.PrimitiveTypes)
{
EmitWritePrimitiveArray(primitiveType.Name);
}
foreach (var enumType in SchemaDef.EnumTypes)
{
EmitWriteEnum(enumType);
}
EmitWriteArray($"MetadataRecord");
foreach (var typeName in SchemaDef.HandleSchema)
{
EmitWrite(typeName);
EmitWriteArray(typeName);
}
CloseScope("MdBinaryWriter");
CloseScope("Internal.Metadata.NativeFormat.Writer");
}
private void EmitWritePrimitiveArray(string typeName)
{
OpenScope($"public static void Write(this NativeWriter writer, {typeName}[] values)");
WriteLine("if (values == null)");
WriteLine("{");
WriteLine(" writer.WriteUnsigned(0);");
WriteLine(" return;");
WriteLine("}");
WriteLine("writer.WriteUnsigned((uint)values.Length);");
WriteLine($"foreach ({typeName} value in values)");
WriteLine("{");
WriteLine(" writer.Write(value);");
WriteLine("}");
CloseScope("Write");
}
private void EmitWriteEnum(EnumType enumType)
{
OpenScope($"public static void Write(this NativeWriter writer, {enumType.Name} value)");
WriteLine($"writer.WriteUnsigned((uint)value);");
CloseScope("Write");
}
private void EmitWrite(string typeName)
{
OpenScope($"public static void Write(this NativeWriter writer, {typeName} record)");
WriteLine("if (record != null)");
WriteLine(" writer.WriteUnsigned((uint)record.Handle.Offset);");
WriteLine("else");
WriteLine(" writer.WriteUnsigned(0);");
CloseScope("Write");
}
private void EmitWriteArray(string typeName)
{
OpenScope($"public static void Write(this NativeWriter writer, List<{typeName}> values)");
WriteLine("if (values == null)");
WriteLine("{");
WriteLine(" writer.WriteUnsigned(0);");
WriteLine(" return;");
WriteLine("}");
WriteLine("writer.WriteUnsigned((uint)values.Count);");
WriteLine($"foreach ({typeName} value in values)");
WriteLine("{");
WriteLine(" writer.Write(value);");
WriteLine("}");
CloseScope("Write");
}
}
|