Browse Source

Follow type forward in AnalyzerScope

Fix #1845
pull/1846/head
SilverFox 6 years ago
parent
commit
f0b0687631
  1. 58
      ILSpy/Analyzers/AnalyzerScope.cs

58
ILSpy/Analyzers/AnalyzerScope.cs

@ -134,24 +134,39 @@ namespace ICSharpCode.ILSpy.Analyzers
if (typeScope.TypeParameterCount > 0) if (typeScope.TypeParameterCount > 0)
reflectionTypeScopeName += "`" + typeScope.TypeParameterCount; reflectionTypeScopeName += "`" + typeScope.TypeParameterCount;
foreach (var assembly in AssemblyList.GetAssemblies()) { var toWalkFiles = new Stack<PEFile>();
ct.ThrowIfCancellationRequested(); var checkedFiles = new HashSet<PEFile>();
bool found = false;
var module = assembly.GetPEFileOrNull(); toWalkFiles.Push(self);
if (module == null || !module.IsAssembly) checkedFiles.Add(self);
continue;
var resolver = assembly.GetAssemblyResolver(); do {
foreach (var reference in module.AssemblyReferences) { PEFile curFile = toWalkFiles.Pop();
using (LoadedAssembly.DisableAssemblyLoad()) { foreach (var assembly in AssemblyList.GetAssemblies()) {
if (resolver.Resolve(reference) == self) { ct.ThrowIfCancellationRequested();
found = true; bool found = false;
break; var module = assembly.GetPEFileOrNull();
if (module == null || !module.IsAssembly)
continue;
if (checkedFiles.Contains(module))
continue;
var resolver = assembly.GetAssemblyResolver();
foreach (var reference in module.AssemblyReferences) {
using (LoadedAssembly.DisableAssemblyLoad()) {
if (resolver.Resolve(reference) == curFile) {
found = true;
break;
}
} }
} }
if (found && checkedFiles.Add(module)) {
if (ModuleReferencesScopeType(module.Metadata, reflectionTypeScopeName, typeScope.Namespace))
yield return module;
if (ModuleForwardsScopeType(module.Metadata, reflectionTypeScopeName, typeScope.Namespace))
toWalkFiles.Push(module);
}
} }
if (found && ModuleReferencesScopeType(module.Metadata, reflectionTypeScopeName, typeScope.Namespace)) } while (toWalkFiles.Count > 0);
yield return module;
}
} }
IEnumerable<PEFile> GetModuleAndAnyFriends(ITypeDefinition typeScope, CancellationToken ct) IEnumerable<PEFile> GetModuleAndAnyFriends(ITypeDefinition typeScope, CancellationToken ct)
@ -198,6 +213,19 @@ namespace ICSharpCode.ILSpy.Analyzers
} }
return hasRef; return hasRef;
} }
bool ModuleForwardsScopeType(MetadataReader metadata, string typeScopeName, string typeScopeNamespace)
{
bool hasForward = false;
foreach (var h in metadata.ExportedTypes) {
var exportedType = metadata.GetExportedType(h);
if (exportedType.IsForwarder && metadata.StringComparer.Equals(exportedType.Name, typeScopeName) && metadata.StringComparer.Equals(exportedType.Namespace, typeScopeNamespace)) {
hasForward = true;
break;
}
}
return hasForward;
}
#endregion #endregion
} }
} }

Loading…
Cancel
Save