Skip to content

Commit 32ad9d1

Browse files
authored
Merge pull request #513 from CreateAndInject/ResolveType
Improve Importer TryToUseTypeDefs
2 parents be1b313 + 6014534 commit 32ad9d1

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src/DotNet/Importer.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ public abstract class ImportMapper {
8484
/// Overrides default behavior of <see cref="Importer.Import(Type)"/>
8585
/// May be used to use reference assemblies for <see cref="Type"/> resolution, for example.
8686
/// </summary>
87-
/// <param name="source"><see cref="Type"/> to create <see cref="TypeRef"/> for. <paramref name="source"/> is non-generic type or generic type without generic arguments.</param>
88-
/// <returns><see cref="TypeRef"/> or null to use default <see cref="Importer"/>'s type resolution</returns>
89-
public virtual TypeRef Map(Type source) => null;
87+
/// <param name="source"><see cref="Type"/> to create <see cref="ITypeDefOrRef"/> for. <paramref name="source"/> is non-generic type or generic type without generic arguments.</param>
88+
/// <returns><see cref="ITypeDefOrRef"/> or null to use default <see cref="Importer"/>'s type resolution</returns>
89+
public virtual ITypeDefOrRef Map(Type source) => null;
9090
}
9191

9292
/// <summary>
@@ -223,8 +223,8 @@ TypeSig ImportAsTypeSig(Type type, Type declaringType, bool? treatAsGenericInst
223223
case ElementType.Ptr: return new PtrSig(ImportAsTypeSig(type.GetElementType(), declaringType));
224224
case ElementType.ByRef: return new ByRefSig(ImportAsTypeSig(type.GetElementType(), declaringType));
225225
case ElementType.SZArray: return new SZArraySig(ImportAsTypeSig(type.GetElementType(), declaringType));
226-
case ElementType.ValueType: return new ValueTypeSig(CreateTypeRef(type));
227-
case ElementType.Class: return new ClassSig(CreateTypeRef(type));
226+
case ElementType.ValueType: return new ValueTypeSig(CreateTypeDefOrRef(type));
227+
case ElementType.Class: return new ClassSig(CreateTypeDefOrRef(type));
228228
case ElementType.Var: return new GenericVar((uint)type.GenericParameterPosition, gpContext.Type);
229229
case ElementType.MVar: return new GenericMVar((uint)type.GenericParameterPosition, gpContext.Method);
230230

@@ -356,13 +356,26 @@ static bool Equals(IAssembly a, IAssembly b) {
356356
UTF8String.CaseInsensitiveEquals(a.Culture, b.Culture);
357357
}
358358

359-
ITypeDefOrRef CreateTypeRef(Type type) => TryResolve(mapper?.Map(type) ?? CreateTypeRef2(type));
359+
ITypeDefOrRef CreateTypeDefOrRef(Type type) {
360+
var tdr = mapper?.Map(type);
361+
if (tdr is TypeSpec)
362+
throw new InvalidOperationException();
363+
if (tdr is TypeDef td)
364+
return td;
365+
if (tdr is TypeRef tr)
366+
return TryResolve(tr);
367+
368+
if (TryToUseTypeDefs && IsThisModule(type.Module) && module.ResolveToken(type.MetadataToken) is TypeDef def)
369+
return def;
370+
371+
return TryResolve(CreateTypeRef(type));
372+
}
360373

361-
TypeRef CreateTypeRef2(Type type) {
374+
TypeRef CreateTypeRef(Type type) {
362375
if (!type.IsNested)
363376
return module.UpdateRowId(new TypeRefUser(module, type.Namespace ?? string.Empty, ReflectionExtensions.Unescape(type.Name) ?? string.Empty, CreateScopeReference(type)));
364377
type.GetTypeNamespaceAndName_TypeDefOrRef(out var @namespace, out var name);
365-
return module.UpdateRowId(new TypeRefUser(module, @namespace ?? string.Empty, name ?? string.Empty, CreateTypeRef2(type.DeclaringType)));
378+
return module.UpdateRowId(new TypeRefUser(module, @namespace ?? string.Empty, name ?? string.Empty, CreateTypeRef(type.DeclaringType)));
366379
}
367380

368381
IResolutionScope CreateScopeReference(Type type) {

0 commit comments

Comments
 (0)