24 const BindingFlags DefaultBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
26 readonly Type _underlyingType;
28 MethodBase[]? _methodsSource;
32 FieldInfo[]? _fieldsSource;
36 PropertyInfo[]? _propertiesSource;
37 int _propertiesBaseRow;
40 EventInfo[]? _eventsSource;
49 Type[]? _genericParametersSource;
52 ReaderWriterLockSlim? _genericTypesLock;
61 base(context, module, null, underlyingType)
63 Debug.Assert(module.UnderlyingModule == underlyingType.Module);
64 _underlyingType = underlyingType ??
throw new ArgumentNullException(nameof(underlyingType));
82 internal IkvmReflectionConstructorSymbol GetOrCreateConstructorSymbol(ConstructorInfo ctor)
84 return (IkvmReflectionConstructorSymbol)GetOrCreateMethodBaseSymbol(ctor);
92 internal IkvmReflectionMethodBaseSymbol GetOrCreateMethodBaseSymbol(MethodBase method)
95 throw new ArgumentNullException(nameof(method));
97 Debug.Assert(method.DeclaringType == _underlyingType);
99 var hnd = MetadataTokens.MethodDefinitionHandle(method.MetadataToken);
100 var row = MetadataTokens.GetRowNumber(hnd);
103 if (_methodsSource ==
null)
105 Interlocked.CompareExchange(
ref _methodsSource, _underlyingType.GetConstructors(DefaultBindingFlags).Cast<MethodBase>().Concat(_underlyingType.GetMethods(DefaultBindingFlags)).OrderBy(i => i.MetadataToken).ToArray(),
null);
106 _methodsBaseRow = _methodsSource.Length != 0 ? MetadataTokens.GetRowNumber(MetadataTokens.MethodDefinitionHandle(_methodsSource[0].MetadataToken)) : 0;
110 if (_methods ==
null)
111 Interlocked.CompareExchange(
ref _methods,
new IkvmReflectionMethodBaseSymbol?[_methodsSource.Length],
null);
114 var idx = row - _methodsBaseRow;
115 Debug.Assert(idx >= 0);
116 Debug.Assert(idx < _methodsSource.Length);
119 if (_methods.Length < idx)
120 throw new IndexOutOfRangeException();
123 ref var rec =
ref _methods[idx];
128 case ConstructorInfo c:
129 Interlocked.CompareExchange(
ref rec,
new IkvmReflectionConstructorSymbol(
Context, ContainingModule,
this, c),
null);
132 Interlocked.CompareExchange(
ref rec,
new IkvmReflectionMethodSymbol(
Context, ContainingModule,
this, m),
null);
138 if (rec is not IkvmReflectionMethodBaseSymbol sym)
139 throw new InvalidOperationException();
150 internal IkvmReflectionFieldSymbol GetOrCreateFieldSymbol(FieldInfo field)
153 throw new ArgumentNullException(nameof(field));
155 Debug.Assert(field.DeclaringType == _underlyingType);
157 var hnd = MetadataTokens.FieldDefinitionHandle(field.MetadataToken);
158 var row = MetadataTokens.GetRowNumber(hnd);
161 if (_fieldsSource ==
null)
163 Interlocked.CompareExchange(
ref _fieldsSource, _underlyingType.GetFields(DefaultBindingFlags).OrderBy(i => i.MetadataToken).ToArray(),
null);
164 _fieldsBaseRow = _fieldsSource.Length != 0 ? MetadataTokens.GetRowNumber(MetadataTokens.MethodDefinitionHandle(_fieldsSource[0].MetadataToken)) : 0;
169 Interlocked.CompareExchange(
ref _fields,
new IkvmReflectionFieldSymbol?[_fieldsSource.Length],
null);
172 var idx = row - _fieldsBaseRow;
173 Debug.Assert(idx >= 0);
174 Debug.Assert(idx < _fieldsSource.Length);
177 if (_fields.Length < idx)
178 throw new IndexOutOfRangeException();
181 ref var rec =
ref _fields[idx];
186 if (rec is not IkvmReflectionFieldSymbol sym)
187 throw new InvalidOperationException();
198 internal IkvmReflectionPropertySymbol GetOrCreatePropertySymbol(PropertyInfo property)
200 if (property is
null)
201 throw new ArgumentNullException(nameof(property));
203 Debug.Assert(property.DeclaringType == _underlyingType);
205 var hnd = MetadataTokens.PropertyDefinitionHandle(property.MetadataToken);
206 var row = MetadataTokens.GetRowNumber(hnd);
209 if (_propertiesSource ==
null)
211 Interlocked.CompareExchange(
ref _propertiesSource, _underlyingType.GetProperties(DefaultBindingFlags).OrderBy(i => i.MetadataToken).ToArray(),
null);
212 _propertiesBaseRow = _propertiesSource.Length != 0 ? MetadataTokens.GetRowNumber(MetadataTokens.MethodDefinitionHandle(_propertiesSource[0].MetadataToken)) : 0;
216 if (_properties ==
null)
217 Interlocked.CompareExchange(
ref _properties,
new IkvmReflectionPropertySymbol?[_propertiesSource.Length],
null);
220 var idx = row - _propertiesBaseRow;
221 Debug.Assert(idx >= 0);
222 Debug.Assert(idx < _propertiesSource.Length);
225 if (_properties.Length < idx)
226 throw new IndexOutOfRangeException();
229 ref var rec =
ref _properties[idx];
231 Interlocked.CompareExchange(
ref rec,
new IkvmReflectionPropertySymbol(
Context,
this, property),
null);
234 if (rec is not IkvmReflectionPropertySymbol sym)
235 throw new InvalidOperationException();
246 internal IkvmReflectionEventSymbol GetOrCreateEventSymbol(EventInfo @event)
249 throw new ArgumentNullException(nameof(@event));
251 Debug.Assert(@event.DeclaringType == _underlyingType);
253 var hnd = MetadataTokens.PropertyDefinitionHandle(@event.MetadataToken);
254 var row = MetadataTokens.GetRowNumber(hnd);
257 if (_eventsSource ==
null)
259 Interlocked.CompareExchange(
ref _eventsSource, _underlyingType.GetEvents(DefaultBindingFlags).OrderBy(i => i.MetadataToken).ToArray(),
null);
260 _eventsBaseRow = _eventsSource.Length != 0 ? MetadataTokens.GetRowNumber(MetadataTokens.EventDefinitionHandle(_eventsSource[0].MetadataToken)) : 0;
265 Interlocked.CompareExchange(
ref _events,
new IkvmReflectionEventSymbol?[_eventsSource.Length],
null);
268 var idx = row - _eventsBaseRow;
269 Debug.Assert(idx >= 0);
270 Debug.Assert(idx < _eventsSource.Length);
273 if (_events.Length < idx)
274 throw new IndexOutOfRangeException();
277 ref var rec =
ref _events[idx];
282 if (rec is not IkvmReflectionEventSymbol sym)
283 throw new InvalidOperationException();
296 if (genericTypeParameterType is
null)
297 throw new ArgumentNullException(nameof(genericTypeParameterType));
299 Debug.Assert(genericTypeParameterType.DeclaringType == _underlyingType);
302 if (_genericParametersSource ==
null)
303 Interlocked.CompareExchange(
ref _genericParametersSource, _underlyingType.GetGenericArguments(),
null);
304 if (_genericParameters ==
null)
308 var idx = genericTypeParameterType.GenericParameterPosition;
311 if (_genericParameters.Length < idx)
312 throw new IndexOutOfRangeException();
315 ref var rec =
ref _genericParameters[idx];
321 throw new InvalidOperationException();
334 if (genericTypeArguments is
null)
335 throw new ArgumentNullException(nameof(genericTypeArguments));
337 if (_underlyingType.IsGenericTypeDefinition ==
false)
338 throw new InvalidOperationException();
341 if (_genericParametersSource ==
null)
342 Interlocked.CompareExchange(
ref _genericParametersSource, _underlyingType.GetGenericArguments(),
null);
343 if (_genericParametersSource.Length != genericTypeArguments.Length)
344 throw new InvalidOperationException();
347 if (_genericTypes ==
null)
349 if (_genericTypesLock ==
null)
354 _genericTypesLock.EnterUpgradeableReadLock();
357 foreach (var i
in _genericTypes)
358 if (i.Arguments.SequenceEqual(genericTypeArguments))
363 _genericTypesLock.EnterWriteLock();
367 _genericTypes.Add((genericTypeArguments, sym));
372 _genericTypesLock.ExitWriteLock();
377 _genericTypesLock.ExitUpgradeableReadLock();
388 if (type == _underlyingType)
391 return base.ResolveTypeSymbol(type);
399 protected internal override IkvmReflectionConstructorSymbol ResolveConstructorSymbol(ConstructorInfo ctor)
401 if (ctor.DeclaringType == _underlyingType)
402 return GetOrCreateConstructorSymbol(ctor);
404 return base.ResolveConstructorSymbol(ctor);
412 protected internal override IkvmReflectionMethodSymbol ResolveMethodSymbol(MethodInfo method)
414 if (method.DeclaringType == _underlyingType)
415 return GetOrCreateMethodSymbol(method);
417 return base.ResolveMethodSymbol(method);
425 protected internal override IkvmReflectionFieldSymbol ResolveFieldSymbol(FieldInfo field)
427 if (field.DeclaringType == _underlyingType)
428 return GetOrCreateFieldSymbol(field);
430 return base.ResolveFieldSymbol(field);
438 protected internal override IkvmReflectionPropertySymbol ResolvePropertySymbol(PropertyInfo property)
440 if (property.DeclaringType == _underlyingType)
441 return GetOrCreatePropertySymbol(property);
443 return base.ResolvePropertySymbol(property);
451 protected internal override IkvmReflectionEventSymbol ResolveEventSymbol(EventInfo @event)
453 if (@event.DeclaringType == _underlyingType)
454 return GetOrCreateEventSymbol(@event);
456 return base.ResolveEventSymbol(@event);
462 internal Type UnderlyingType => _underlyingType;
468 public global::System.Reflection.TypeAttributes
Attributes => (global::System.Reflection.TypeAttributes)(
int)_underlyingType.Attributes;
470 public ITypeSymbol?
BaseType => _underlyingType.BaseType !=
null ? ResolveTypeSymbol(_underlyingType.BaseType) : null;
476 public string?
FullName => _underlyingType.FullName;
478 public global::System.Reflection.GenericParameterAttributes GenericParameterAttributes => (global::System.Reflection.GenericParameterAttributes)(
int)_underlyingType.GenericParameterAttributes;
488 public bool IsArray => _underlyingType.IsArray;
492 public bool IsByRef => _underlyingType.IsByRef;
494 public bool IsClass => _underlyingType.IsClass;
498 public bool IsEnum => _underlyingType.IsEnum;
536#pragma warning disable SYSLIB0050
538#pragma warning restore SYSLIB0050
550 return _underlyingType.GetArrayRank();
555 return _underlyingType.GetConstructor((BindingFlags)bindingAttr, binder:
null, UnpackTypeSymbols(types), modifiers:
null) is ConstructorInfo ctor ? ResolveConstructorSymbol(ctor) :
null;
560 return _underlyingType.GetConstructor(UnpackTypeSymbols(types)) is ConstructorInfo ctor ? ResolveConstructorSymbol(ctor) :
null;
565 return ResolveConstructorSymbols(_underlyingType.GetConstructors());
570 return ResolveConstructorSymbols(_underlyingType.GetConstructors((BindingFlags)bindingAttr));
575 return ResolveMemberSymbols(_underlyingType.GetDefaultMembers());
580 return _underlyingType.
GetElementType() is Type t ? ResolveTypeSymbol(t) :
null;
585 return _underlyingType.GetEnumName(value);
590 return _underlyingType.GetEnumNames();
595 return ResolveTypeSymbol(_underlyingType.GetEnumUnderlyingType());
600 return _underlyingType.GetEvent(name, (BindingFlags)bindingAttr) is { } f ? ResolveEventSymbol(f) :
null;
605 return _underlyingType.GetEvent(name) is { } f ? ResolveEventSymbol(f) :
null;
610 return ResolveEventSymbols(_underlyingType.GetEvents());
615 return ResolveEventSymbols(_underlyingType.GetEvents((BindingFlags)bindingAttr));
620 return _underlyingType.GetField(name) is FieldInfo f ? ResolveFieldSymbol(f) :
null;
625 return _underlyingType.GetField(name, (BindingFlags)bindingAttr) is FieldInfo f ? ResolveFieldSymbol(f) :
null;
630 return ResolveFieldSymbols(_underlyingType.GetFields());
635 return ResolveFieldSymbols(_underlyingType.GetFields((BindingFlags)bindingAttr));
640 return ResolveTypeSymbols(_underlyingType.GetGenericArguments());
645 return ResolveTypeSymbols(_underlyingType.GetGenericParameterConstraints());
650 return ResolveTypeSymbol(_underlyingType.GetGenericTypeDefinition());
655 return _underlyingType.
GetInterface(name) is { } i ? ResolveTypeSymbol(i) :
null;
660 return _underlyingType.
GetInterface(name, ignoreCase) is { } i ? ResolveTypeSymbol(i) :
null;
665 throw new NotImplementedException();
670 return ResolveTypeSymbols(_underlyingType.GetInterfaces());
675 return ResolveMemberSymbols(_underlyingType.GetMember(name));
680 return ResolveMemberSymbols(_underlyingType.GetMember(name, (BindingFlags)bindingAttr));
683 public IMemberSymbol[]
GetMember(
string name, global::System.Reflection.MemberTypes type, global::System.Reflection.BindingFlags bindingAttr)
685 return ResolveMemberSymbols(_underlyingType.GetMember(name, (MemberTypes)type, (BindingFlags)bindingAttr));
690 return ResolveMemberSymbols(_underlyingType.GetMembers((BindingFlags)bindingAttr));
695 return ResolveMemberSymbols(_underlyingType.GetMembers());
700 return _underlyingType.GetMethod(name, (BindingFlags)bindingAttr) is { } m ? ResolveMethodSymbol(m) :
null;
705 return _underlyingType.GetMethod(name, (BindingFlags)bindingAttr,
null, UnpackTypeSymbols(types),
null) is { } m ? ResolveMethodSymbol(m) :
null;
710 return _underlyingType.GetMethod(name, UnpackTypeSymbols(types)) is { } m ? ResolveMethodSymbol(m) :
null;
715 return _underlyingType.GetMethod(name) is { } m ? ResolveMethodSymbol(m) :
null;
720 if (modifiers !=
null)
721 throw new NotImplementedException();
723 return _underlyingType.GetMethod(name, UnpackTypeSymbols(types),
null) is { } m ? ResolveMethodSymbol(m) :
null;
728 return ResolveMethodSymbols(_underlyingType.GetMethods((BindingFlags)bindingAttr));
733 return ResolveMethodSymbols(_underlyingType.GetMethods());
738 return _underlyingType.
GetNestedType(name) is Type t ? ResolveTypeSymbol(t) :
null;
743 return _underlyingType.
GetNestedType(name, (BindingFlags)bindingAttr) is Type t ? ResolveTypeSymbol(t) :
null;
748 return ResolveTypeSymbols(_underlyingType.GetNestedTypes());
753 return ResolveTypeSymbols(_underlyingType.GetNestedTypes((BindingFlags)bindingAttr));
758 return ResolvePropertySymbols(_underlyingType.GetProperties());
763 return ResolvePropertySymbols(_underlyingType.GetProperties((BindingFlags)bindingAttr));
768 if (modifiers !=
null)
769 throw new NotImplementedException();
772 return _underlyingType.GetProperty(name, _returnType, UnpackTypeSymbols(types),
null) is { } p ? ResolvePropertySymbol(p) :
null;
777 return _underlyingType.GetProperty(name, UnpackTypeSymbols(types)) is { } p ? ResolvePropertySymbol(p) :
null;
783 return _underlyingType.GetProperty(name, _returnType, UnpackTypeSymbols(types)) is { } p ? ResolvePropertySymbol(p) :
null;
788 return _underlyingType.GetProperty(name, (BindingFlags)bindingAttr) is { } p ? ResolvePropertySymbol(p) :
null;
793 return _underlyingType.GetProperty(name) is { } p ? ResolvePropertySymbol(p) :
null;
800 return _underlyingType.GetProperty(name, _returnType) is { } p ? ResolvePropertySymbol(p) :
null;
810 return _underlyingType.IsEnumDefined(value);
820 if (_asSZArray ==
null)
831 if (_asArray ==
null)
834 ref var asArray =
ref _asArray[rank];
843 if (_asByRef ==
null)
851 throw new NotImplementedException();
856 if (_asPointer ==
null)