42 internal static Metadata Create(
ClassFile classFile)
47 string[][] genericMetaData =
null;
48 object[][] annotations =
null;
50 TypeAnnotationTable runtimeVisibleTypeAnnotations = TypeAnnotationTable.Empty;
51 TypeAnnotationTable[] fieldRuntimeVisibleTypeAnnotations =
null;
52 TypeAnnotationTable[] methodRuntimeVisibleTypeAnnotations =
null;
54 if (classFile.EnclosingMethod !=
null)
56 genericMetaData ??=
new string[4][];
57 genericMetaData[2] = classFile.EnclosingMethod;
60 if (classFile.GenericSignature !=
null)
62 genericMetaData ??=
new string[4][];
63 genericMetaData[3] =
new string[] { classFile.GenericSignature };
66 if (classFile.Annotations !=
null)
68 annotations ??=
new object[5][];
69 annotations[0] = classFile.Annotations;
72 if (classFile.RuntimeVisibleTypeAnnotations.Count > 0)
74 runtimeVisibleTypeAnnotations = classFile.RuntimeVisibleTypeAnnotations;
77 for (
int i = 0; i < classFile.Methods.Length; i++)
79 if (classFile.Methods[i].GenericSignature !=
null)
81 genericMetaData ??=
new string[4][];
82 genericMetaData[0] ??=
new string[classFile.Methods.Length];
83 genericMetaData[0][i] = classFile.Methods[i].GenericSignature;
86 if (classFile.Methods[i].Annotations !=
null)
88 annotations ??=
new object[5][];
89 annotations[1] ??=
new object[classFile.Methods.Length];
90 annotations[1][i] = classFile.Methods[i].Annotations;
93 if (classFile.Methods[i].ParameterAnnotations !=
null)
95 annotations ??=
new object[5][];
96 annotations[2] ??=
new object[classFile.Methods.Length];
97 annotations[2][i] = classFile.Methods[i].ParameterAnnotations;
100 if (classFile.Methods[i].AnnotationDefault !=
null)
102 annotations ??=
new object[5][];
103 annotations[3] ??=
new object[classFile.Methods.Length];
104 annotations[3][i] = classFile.Methods[i].AnnotationDefault;
107 if (classFile.Methods[i].MethodParameters !=
null)
110 methodParameters[i] = classFile.Methods[i].MethodParameters;
113 if (classFile.Methods[i].RuntimeVisibleTypeAnnotations.Count > 0)
115 methodRuntimeVisibleTypeAnnotations ??=
new TypeAnnotationTable[classFile.Methods.Length];
116 methodRuntimeVisibleTypeAnnotations[i] = classFile.Methods[i].RuntimeVisibleTypeAnnotations;
120 for (
int i = 0; i < classFile.Fields.Length; i++)
122 if (classFile.Fields[i].GenericSignature !=
null)
124 genericMetaData ??=
new string[4][];
125 genericMetaData[1] ??=
new string[classFile.Fields.Length];
126 genericMetaData[1][i] = classFile.Fields[i].GenericSignature;
129 if (classFile.Fields[i].Annotations !=
null)
131 annotations ??=
new object[5][];
132 annotations[4] ??=
new object[classFile.Fields.Length][];
133 annotations[4][i] = classFile.Fields[i].Annotations;
136 if (classFile.Fields[i].RuntimeVisibleTypeAnnotations.Count > 0)
138 fieldRuntimeVisibleTypeAnnotations ??=
new TypeAnnotationTable[classFile.Fields.Length];
139 fieldRuntimeVisibleTypeAnnotations[i] = classFile.Fields[i].RuntimeVisibleTypeAnnotations;
143 if (genericMetaData !=
null ||
144 annotations !=
null ||
145 methodParameters !=
null ||
146 runtimeVisibleTypeAnnotations.Count > 0 ||
147 fieldRuntimeVisibleTypeAnnotations !=
null ||
148 methodRuntimeVisibleTypeAnnotations !=
null)
150 var constantPool = runtimeVisibleTypeAnnotations.Count > 0 || fieldRuntimeVisibleTypeAnnotations !=
null || methodRuntimeVisibleTypeAnnotations !=
null ? classFile.GetConstantPool() :
null;
151 return new Metadata(genericMetaData, annotations, methodParameters, runtimeVisibleTypeAnnotations, fieldRuntimeVisibleTypeAnnotations, methodRuntimeVisibleTypeAnnotations, constantPool);
157 internal static string GetGenericSignature(Metadata m)
159 if (m !=
null && m.genericMetaData !=
null && m.genericMetaData[3] !=
null)
160 return m.genericMetaData[3][0];
165 internal static string[] GetEnclosingMethod(Metadata m)
167 if (m !=
null && m.genericMetaData !=
null)
168 return m.genericMetaData[2];
173 internal static string GetGenericMethodSignature(Metadata m,
int index)
175 if (m !=
null && m.genericMetaData !=
null && m.genericMetaData[0] !=
null)
176 return m.genericMetaData[0][index];
181 internal static string GetGenericFieldSignature(Metadata m,
int index)
183 if (m !=
null && m.genericMetaData !=
null && m.genericMetaData[1] !=
null)
184 return m.genericMetaData[1][index];
189 internal static object[] GetAnnotations(Metadata m)
191 if (m !=
null && m.annotations !=
null)
192 return m.annotations[0];
197 internal static object[] GetMethodAnnotations(Metadata m,
int index)
199 if (m !=
null && m.annotations !=
null && m.annotations[1] !=
null)
200 return (
object[])m.annotations[1][index];
205 internal static object[][] GetMethodParameterAnnotations(Metadata m,
int index)
207 if (m !=
null && m.annotations !=
null && m.annotations[2] !=
null)
208 return (
object[][])m.annotations[2][index];
215 if (m !=
null && m.methodParameters !=
null)
216 return m.methodParameters[index];
221 internal static object GetMethodDefaultValue(Metadata m,
int index)
223 if (m !=
null && m.annotations !=
null && m.annotations[3] !=
null)
224 return m.annotations[3][index];
230 internal static object[] GetFieldAnnotations(Metadata m,
int index)
232 if (m !=
null && m.annotations !=
null && m.annotations[4] !=
null)
233 return (
object[])m.annotations[4][index];
238 internal static object[] GetConstantPool(Metadata m)
240 return m.constantPool;
243 internal static byte[] GetRawTypeAnnotations(Metadata m)
246 return SerializeTypeAnnotations(in m.runtimeVisibleTypeAnnotations);
251 internal static byte[] GetMethodRawTypeAnnotations(Metadata m,
int index)
253 if (m !=
null && m.methodRuntimeVisibleTypeAnnotations !=
null)
254 return SerializeTypeAnnotations(in m.methodRuntimeVisibleTypeAnnotations[index]);
259 internal static byte[] GetFieldRawTypeAnnotations(Metadata m,
int index)
261 if (m !=
null && m.fieldRuntimeVisibleTypeAnnotations !=
null)
262 return SerializeTypeAnnotations(in m.fieldRuntimeVisibleTypeAnnotations[index]);
267 static byte[] SerializeTypeAnnotations(
ref readonly TypeAnnotationTable annotations)
269 if (annotations.Count == 0)
272 var builder =
new BlobBuilder();
273 var encoder =
new TypeAnnotationTableEncoder(builder);
274 annotations.WriteTo(
ref encoder);
275 return builder.ToArray();
278 readonly
string[][] genericMetaData;
279 readonly
object[][] annotations;
281 readonly TypeAnnotationTable runtimeVisibleTypeAnnotations;
282 readonly TypeAnnotationTable[] fieldRuntimeVisibleTypeAnnotations;
283 readonly TypeAnnotationTable[] methodRuntimeVisibleTypeAnnotations;
284 readonly
object[] constantPool;
294 Metadata(
string[][] genericMetaData,
object[][] annotations,
MethodParametersEntry[][] methodParameters, TypeAnnotationTable runtimeVisibleTypeAnnotations, TypeAnnotationTable[] fieldRuntimeVisibleTypeAnnotations, TypeAnnotationTable[] methodRuntimeVisibleTypeAnnotations,
object[] constantPool)
296 this.genericMetaData = genericMetaData;
297 this.annotations = annotations;
298 this.methodParameters = methodParameters;
299 this.runtimeVisibleTypeAnnotations = runtimeVisibleTypeAnnotations;
300 this.fieldRuntimeVisibleTypeAnnotations = fieldRuntimeVisibleTypeAnnotations;
301 this.methodRuntimeVisibleTypeAnnotations = methodRuntimeVisibleTypeAnnotations;
302 this.constantPool = constantPool;