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 @@ -134,24 +134,39 @@ namespace ICSharpCode.ILSpy.Analyzers
if (typeScope.TypeParameterCount > 0)
reflectionTypeScopeName += "`" + typeScope.TypeParameterCount;
foreach (var assembly in AssemblyList.GetAssemblies()) {
ct.ThrowIfCancellationRequested();
bool found = false;
var module = assembly.GetPEFileOrNull();
if (module == null || !module.IsAssembly)
continue;
var resolver = assembly.GetAssemblyResolver();
foreach (var reference in module.AssemblyReferences) {
using (LoadedAssembly.DisableAssemblyLoad()) {
if (resolver.Resolve(reference) == self) {
found = true;
break;
var toWalkFiles = new Stack<PEFile>();
var checkedFiles = new HashSet<PEFile>();
toWalkFiles.Push(self);
checkedFiles.Add(self);
do {
PEFile curFile = toWalkFiles.Pop();
foreach (var assembly in AssemblyList.GetAssemblies()) {
ct.ThrowIfCancellationRequested();
bool found = false;
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))
yield return module;
}
} while (toWalkFiles.Count > 0);
}
IEnumerable<PEFile> GetModuleAndAnyFriends(ITypeDefinition typeScope, CancellationToken ct)
@ -198,6 +213,19 @@ namespace ICSharpCode.ILSpy.Analyzers @@ -198,6 +213,19 @@ namespace ICSharpCode.ILSpy.Analyzers
}
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
}
}

Loading…
Cancel
Save