Skip to content

Commit 1386325

Browse files
authored
Add ImporterOptions.TryToUseExistingAssemblyRefs option (#422)
* add ImporterOptions.TryToUseExistingAssemblyRefs option to use already existing AssemblyRefs whenever possible * remove duplicated code
1 parent c25b455 commit 1386325

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/DotNet/Importer.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public enum ImporterOptions {
3737
/// <seealso cref="TryToUseFieldDefs"/>
3838
TryToUseDefs = TryToUseTypeDefs | TryToUseMethodDefs | TryToUseFieldDefs,
3939

40+
/// <summary>
41+
/// Use already existing <see cref="AssemblyRef"/>s whenever possible
42+
/// </summary>
43+
TryToUseExistingAssemblyRefs = 8,
44+
4045
/// <summary>
4146
/// Don't set this flag. For internal use only.
4247
/// </summary>
@@ -79,7 +84,7 @@ public abstract class ImportMapper {
7984
/// Overrides default behavior of <see cref="Importer.Import(Type)"/>
8085
/// May be used to use reference assemblies for <see cref="Type"/> resolution, for example.
8186
/// </summary>
82-
/// <param name="source"><see cref="Type"/> to create <see cref="TypeRef"/> for.</param>
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>
8388
/// <returns><see cref="TypeRef"/> or null to use default <see cref="Importer"/>'s type resolution</returns>
8489
public virtual TypeRef Map(Type source) => null;
8590
}
@@ -98,6 +103,7 @@ public struct Importer {
98103
bool TryToUseTypeDefs => (options & ImporterOptions.TryToUseTypeDefs) != 0;
99104
bool TryToUseMethodDefs => (options & ImporterOptions.TryToUseMethodDefs) != 0;
100105
bool TryToUseFieldDefs => (options & ImporterOptions.TryToUseFieldDefs) != 0;
106+
bool TryToUseExistingAssemblyRefs => (options & ImporterOptions.TryToUseExistingAssemblyRefs) != 0;
101107

102108
bool FixSignature {
103109
get => (options & ImporterOptions.FixSignature) != 0;
@@ -320,7 +326,7 @@ TypeDef GetDeclaringType(MemberRef mr) {
320326
bool IsThisModule(TypeRef tr) {
321327
if (tr is null)
322328
return false;
323-
var scopeType = tr.ScopeType.GetNonNestedTypeRefScope() as TypeRef;
329+
var scopeType = tr.GetNonNestedTypeRefScope() as TypeRef;
324330
if (scopeType is null)
325331
return false;
326332

@@ -374,6 +380,8 @@ IResolutionScope CreateScopeReference(Type type) {
374380
var pkt = asmName.GetPublicKeyToken();
375381
if (pkt is null || pkt.Length == 0)
376382
pkt = null;
383+
if (TryToUseExistingAssemblyRefs && module.GetAssemblyRef(asmName.Name) is AssemblyRef asmRef)
384+
return asmRef;
377385
return module.UpdateRowId(new AssemblyRefUser(asmName.Name, asmName.Version, PublicKeyBase.CreatePublicKeyToken(pkt), asmName.CultureInfo.Name));
378386
}
379387

@@ -719,6 +727,8 @@ IResolutionScope CreateScopeReference(IAssembly defAsm, ModuleDef defMod) {
719727
var pkt = PublicKeyBase.ToPublicKeyToken(defAsm.PublicKeyOrToken);
720728
if (PublicKeyBase.IsNullOrEmpty2(pkt))
721729
pkt = null;
730+
if (TryToUseExistingAssemblyRefs && module.GetAssemblyRef(defAsm.Name) is AssemblyRef asmRef)
731+
return asmRef;
722732
return module.UpdateRowId(new AssemblyRefUser(defAsm.Name, defAsm.Version, pkt, defAsm.Culture) { Attributes = defAsm.Attributes & ~AssemblyAttributes.PublicKey });
723733
}
724734

0 commit comments

Comments
 (0)