25using System.Collections.Generic;
38 readonly
string typeName;
39 readonly
string typeNamespace;
52 this.typeName = module.GetString(module.TypeDefTable.records[index].TypeName);
53 this.typeNamespace = module.GetString(module.TypeDefTable.records[index].TypeNamespace);
54 MarkKnownType(typeNamespace, typeName);
61 var extends = module.TypeDefTable.records[index].Extends;
62 if ((extends & 0xFFFFFF) == 0)
65 return module.ResolveType(extends,
this);
71 get {
return (TypeAttributes)module.TypeDefTable.records[index].Flags; }
76 foreach (var i
in module.EventMapTable.Filter(
this.MetadataToken))
78 var evt = module.EventMapTable.records[i].EventList - 1;
79 var end = module.EventMapTable.records.Length > i + 1 ? module.EventMapTable.records[i + 1].EventList - 1 : module.EventTable.records.Length;
80 var events =
new EventInfo[end - evt];
81 if (module.EventPtrTable.RowCount == 0)
82 for (
int j = 0; evt < end; evt++, j++)
85 for (
int j = 0; evt < end; evt++, j++)
86 events[j] =
new EventInfoImpl(module,
this, module.EventPtrTable.records[evt] - 1);
91 return Array.Empty<EventInfo>();
96 var field = module.TypeDefTable.records[index].FieldList - 1;
97 var end = module.TypeDefTable.records.Length > index + 1 ? module.TypeDefTable.records[index + 1].FieldList - 1 : module.FieldTable.records.Length;
98 var fields =
new FieldInfo[end - field];
99 if (module.FieldPtrTable.RowCount == 0)
100 for (
int i = 0; field < end; i++, field++)
101 fields[i] = module.GetFieldAt(
this, field);
103 for (
int i = 0; field < end; i++, field++)
104 fields[i] = module.GetFieldAt(
this, module.FieldPtrTable.records[field] - 1);
111 List<Type> list =
null;
112 foreach (
int i
in module.InterfaceImplTable.Filter(
MetadataToken))
114 list ??=
new List<Type>();
115 list.Add(module.ResolveType(module.InterfaceImplTable.records[i].Interface,
this));
118 return Util.ToArray(list, Type.EmptyTypes);
123 var method = module.TypeDefTable.records[index].MethodList - 1;
124 var end = module.TypeDefTable.records.Length > index + 1 ? module.TypeDefTable.records[index + 1].MethodList - 1 : module.MethodDefTable.records.Length;
125 var methods =
new MethodBase[end - method];
126 if (module.MethodPtrTable.RowCount == 0)
127 for (
int i = 0; method < end; method++, i++)
128 methods[i] = module.GetMethodAt(
this, method);
130 for (
int i = 0; method < end; method++, i++)
131 methods[i] = module.GetMethodAt(
this, module.MethodPtrTable.records[method] - 1);
138 PopulateGenericArguments();
140 var bodies =
new List<MethodInfo>();
141 var declarations =
new List<List<MethodInfo>>();
142 foreach (
int i
in module.MethodImplTable.Filter(
this.MetadataToken))
144 var body = (
MethodInfo)module.ResolveMethod(module.MethodImplTable.records[i].MethodBody, typeArgs,
null);
145 int index = bodies.IndexOf(body);
148 index = bodies.Count;
150 declarations.Add(
new List<MethodInfo>());
153 var declaration = (
MethodInfo)module.ResolveMethod(module.MethodImplTable.records[i].MethodDeclaration, typeArgs,
null);
154 declarations[index].Add(declaration);
157 var map =
new __MethodImplMap();
158 map.TargetType =
this;
159 map.MethodBodies = bodies.ToArray();
160 map.MethodDeclarations =
new MethodInfo[declarations.Count][];
161 for (var i = 0; i < map.MethodDeclarations.Length; i++)
162 map.MethodDeclarations[i] = declarations[i].ToArray();
170 var list =
new List<Type>();
173 for (
int i = 0; i < module.NestedClassTable.records.Length; i++)
174 if (module.NestedClassTable.records[i].EnclosingClass == token)
175 list.Add(module.ResolveType(module.NestedClassTable.records[i].NestedClass));
177 return list.ToArray();
182 foreach (var i
in module.PropertyMapTable.Filter(
this.MetadataToken))
184 var
property = module.PropertyMapTable.records[i].PropertyList - 1;
185 var end = module.PropertyMapTable.records.Length > i + 1 ? module.PropertyMapTable.records[i + 1].PropertyList - 1 : module.PropertyTable.records.Length;
186 var properties =
new PropertyInfo[end - property];
187 if (module.PropertyPtrTable.RowCount == 0)
188 for (
int j = 0;
property < end;
property++, j++)
191 for (
int j = 0;
property < end;
property++, j++)
192 properties[j] =
new PropertyInfoImpl(module,
this, module.PropertyPtrTable.records[property] - 1);
197 return Array.Empty<PropertyInfo>();
202 get {
return new TypeName(typeNamespace, typeName); }
212 get {
return GetFullName(); }
222 PopulateGenericArguments();
223 return Util.Copy(typeArgs);
226 private void PopulateGenericArguments()
228 if (typeArgs ==
null)
231 var first = module.GenericParamTable.FindFirstByOwner(token);
234 typeArgs = Type.EmptyTypes;
238 var list =
new List<Type>();
239 var len = module.GenericParamTable.records.Length;
240 for (
int i = first; i < len && module.GenericParamTable.records[i].Owner == token; i++)
241 list.Add(
new GenericTypeParameter(module, i,
Signature.ELEMENT_TYPE_VAR));
243 typeArgs = list.ToArray();
248 internal override Type GetGenericTypeArgument(
int index)
250 PopulateGenericArguments();
251 return typeArgs[index];
256 PopulateGenericArguments();
257 return new CustomModifiers[typeArgs.Length];
269 if ((typeFlags & (TypeFlags.IsGenericTypeDefinition | TypeFlags.NotGenericTypeDefinition)) == 0)
270 typeFlags |= module.GenericParamTable.FindFirstByOwner(
MetadataToken) == -1 ? TypeFlags.NotGenericTypeDefinition : TypeFlags.IsGenericTypeDefinition;
272 return (typeFlags & TypeFlags.IsGenericTypeDefinition) != 0;
283 var sb =
new StringBuilder(this.
FullName);
296 return sb.ToString();
299 internal bool IsNestedByFlags
301 get {
return (
Attributes & TypeAttributes.VisibilityMask & ~TypeAttributes.Public) != 0; }
309 if (!IsNestedByFlags)
312 foreach (
int i
in module.NestedClassTable.Filter(
MetadataToken))
313 return module.ResolveType(module.NestedClassTable.records[i].EnclosingClass,
null,
null);
315 throw new InvalidOperationException();
319 public override bool __GetLayout(out
int packingSize, out
int typeSize)
321 foreach (
int i
in module.ClassLayoutTable.Filter(
MetadataToken))
323 packingSize = module.ClassLayoutTable.records[i].PackingSize;
324 typeSize = module.ClassLayoutTable.records[i].ClassSize;
333 public override Module Module
335 get {
return module; }
338 internal override bool IsModulePseudoType
340 get {
return index == 0; }
343 internal override bool IsBaked
353 if (baseType !=
null && baseType.IsEnumOrValueType && !IsEnumOrValueType)
355 typeFlags |= TypeFlags.ValueType;
360 typeFlags |= TypeFlags.NotValueType;
IKVM.Reflection.Type Type
IKVM.Reflection.MethodInfo MethodInfo
global::java.lang.invoke.LambdaForm.Name Name
override TypeAttributes Attributes
override EventInfo[] __GetDeclaredEvents()
override string ToString()
override Type DeclaringType
override __MethodImplMap __GetMethodImplMap()
override Type[] GetGenericArguments()
override Type[] __GetDeclaredTypes()
override Type GetGenericTypeDefinition()
override int MetadataToken
override bool IsGenericTypeDefinition
override PropertyInfo[] __GetDeclaredProperties()
override bool IsGenericType
override bool __GetLayout(out int packingSize, out int typeSize)
override bool IsValueTypeImpl
override MethodBase[] __GetDeclaredMethods()
override FieldInfo[] __GetDeclaredFields()
override Type[] __GetDeclaredInterfaces()
override CustomModifiers[] __GetGenericArgumentsCustomModifiers()