Browse Source

Add nullability annotations

pull/3186/head
Siegfried Pammer 1 year ago
parent
commit
7e69247f3f
  1. 78
      ICSharpCode.ILSpyX/Analyzers/AnalyzerContext.cs
  2. 4
      ICSharpCode.ILSpyX/Analyzers/AnalyzerHelpers.cs
  3. 20
      ICSharpCode.ILSpyX/Analyzers/AnalyzerScope.cs
  4. 7
      ICSharpCode.ILSpyX/Analyzers/Builtin/EventImplementedByAnalyzer.cs
  5. 7
      ICSharpCode.ILSpyX/Analyzers/Builtin/EventOverriddenByAnalyzer.cs
  6. 10
      ICSharpCode.ILSpyX/Analyzers/Builtin/FieldAccessAnalyzer.cs
  7. 2
      ICSharpCode.ILSpyX/Analyzers/Builtin/MemberImplementsInterfaceAnalyzer.cs
  8. 10
      ICSharpCode.ILSpyX/Analyzers/Builtin/MethodImplementedByAnalyzer.cs
  9. 7
      ICSharpCode.ILSpyX/Analyzers/Builtin/MethodOverriddenByAnalyzer.cs
  10. 16
      ICSharpCode.ILSpyX/Analyzers/Builtin/MethodUsedByAnalyzer.cs
  11. 6
      ICSharpCode.ILSpyX/Analyzers/Builtin/MethodUsesAnalyzer.cs
  12. 19
      ICSharpCode.ILSpyX/Analyzers/Builtin/MethodVirtualUsedByAnalyzer.cs
  13. 7
      ICSharpCode.ILSpyX/Analyzers/Builtin/PropertyImplementedByAnalyzer.cs
  14. 10
      ICSharpCode.ILSpyX/Analyzers/Builtin/PropertyOverriddenByAnalyzer.cs
  15. 7
      ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs
  16. 6
      ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExtensionMethodsAnalyzer.cs
  17. 11
      ICSharpCode.ILSpyX/Analyzers/Builtin/TypeInstantiatedByAnalyzer.cs
  18. 6
      ICSharpCode.ILSpyX/Analyzers/Builtin/TypeUsedByAnalyzer.cs
  19. 2
      ICSharpCode.ILSpyX/Analyzers/ExportAnalyzerAttribute.cs
  20. 16
      ICSharpCode.ILSpyX/Search/SearchResult.cs
  21. 2
      ILSpy.Tests/Analyzers/MemberImplementsInterfaceAnalyzerTests.cs
  22. 9
      ILSpy/Search/SearchPane.cs

78
ICSharpCode.ILSpyX/Analyzers/AnalyzerContext.cs

@ -32,51 +32,51 @@ namespace ICSharpCode.ILSpyX.Analyzers
/// </summary> /// </summary>
public class AnalyzerContext public class AnalyzerContext
{ {
public AssemblyList AssemblyList { get; internal set; } public required AssemblyList AssemblyList { get; init; }
/// <summary> /// <summary>
/// CancellationToken. Currently Analyzers do not support cancellation from the UI, but it should be checked nonetheless. /// CancellationToken. Currently Analyzers do not support cancellation from the UI, but it should be checked nonetheless.
/// </summary> /// </summary>
public CancellationToken CancellationToken { get; internal set; } public CancellationToken CancellationToken { get; init; }
/// <summary> /// <summary>
/// Currently used language. /// Currently used language.
/// </summary> /// </summary>
public ILanguage Language { get; internal set; } public required ILanguage Language { get; init; }
/// <summary> /// <summary>
/// Allows the analyzer to control whether the tree nodes will be sorted. /// Allows the analyzer to control whether the tree nodes will be sorted.
/// Must be set within <see cref="IAnalyzer.Analyze(ISymbol, AnalyzerContext)"/> /// Must be set within <see cref="IAnalyzer.Analyze(ISymbol, AnalyzerContext)"/>
/// before the results are enumerated. /// before the results are enumerated.
/// </summary> /// </summary>
public bool SortResults { get; set; } public bool SortResults { get; set; }
public MethodBodyBlock GetMethodBody(IMethod method) public MethodBodyBlock? GetMethodBody(IMethod method)
{ {
if (!method.HasBody || method.MetadataToken.IsNil) if (!method.HasBody || method.MetadataToken.IsNil || method.ParentModule?.MetadataFile == null)
return null; return null;
var module = method.ParentModule.MetadataFile; var module = method.ParentModule.MetadataFile;
var md = module.Metadata.GetMethodDefinition((MethodDefinitionHandle)method.MetadataToken); var md = module.Metadata.GetMethodDefinition((MethodDefinitionHandle)method.MetadataToken);
try try
{ {
return module.GetMethodBody(md.RelativeVirtualAddress); return module.GetMethodBody(md.RelativeVirtualAddress);
} }
catch (BadImageFormatException) catch (BadImageFormatException)
{ {
return null; return null;
} }
} }
public AnalyzerScope GetScopeOf(IEntity entity) public AnalyzerScope GetScopeOf(IEntity entity)
{ {
return new AnalyzerScope(AssemblyList, entity); return new AnalyzerScope(AssemblyList, entity);
} }
readonly ConcurrentDictionary<MetadataFile, DecompilerTypeSystem> typeSystemCache = new(); readonly ConcurrentDictionary<MetadataFile, DecompilerTypeSystem> typeSystemCache = new();
public DecompilerTypeSystem GetOrCreateTypeSystem(MetadataFile module) public DecompilerTypeSystem GetOrCreateTypeSystem(MetadataFile module)
{ {
return typeSystemCache.GetOrAdd(module, m => new DecompilerTypeSystem(m, m.GetAssemblyResolver())); return typeSystemCache.GetOrAdd(module, m => new DecompilerTypeSystem(m, m.GetAssemblyResolver()));
} }
} }
} }

4
ICSharpCode.ILSpyX/Analyzers/AnalyzerHelpers.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.ILSpyX.Analyzers
{ {
case HandleKind.MethodDefinition: case HandleKind.MethodDefinition:
return member == analyzedMethod.MetadataToken return member == analyzedMethod.MetadataToken
&& module == analyzedMethod.ParentModule.MetadataFile; && module == analyzedMethod.ParentModule?.MetadataFile;
case HandleKind.MemberReference: case HandleKind.MemberReference:
var mr = metadata.GetMemberReference((MemberReferenceHandle)member); var mr = metadata.GetMemberReference((MemberReferenceHandle)member);
if (mr.GetKind() != MemberReferenceKind.Method) if (mr.GetKind() != MemberReferenceKind.Method)
@ -48,7 +48,7 @@ namespace ICSharpCode.ILSpyX.Analyzers
} }
} }
public static ISymbol GetParentEntity(DecompilerTypeSystem ts, CustomAttribute customAttribute) public static ISymbol? GetParentEntity(DecompilerTypeSystem ts, CustomAttribute customAttribute)
{ {
var metadata = ts.MainModule.MetadataFile.Metadata; var metadata = ts.MainModule.MetadataFile.Metadata;
switch (customAttribute.Parent.Kind) switch (customAttribute.Parent.Kind)

20
ICSharpCode.ILSpyX/Analyzers/AnalyzerScope.cs

@ -24,7 +24,6 @@ using System.Threading;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.Util; using ICSharpCode.Decompiler.Util;
using ICSharpCode.ILSpyX;
namespace ICSharpCode.ILSpyX.Analyzers namespace ICSharpCode.ILSpyX.Analyzers
{ {
@ -61,19 +60,19 @@ namespace ICSharpCode.ILSpyX.Analyzers
public IEnumerable<MetadataFile> GetModulesInScope(CancellationToken ct) public IEnumerable<MetadataFile> GetModulesInScope(CancellationToken ct)
{ {
if (IsLocal) if (IsLocal)
return new[] { TypeScope.ParentModule.MetadataFile }; return new[] { TypeScope.ParentModule!.MetadataFile! };
if (effectiveAccessibility.LessThanOrEqual(Accessibility.Internal)) if (effectiveAccessibility.LessThanOrEqual(Accessibility.Internal))
return GetModuleAndAnyFriends(TypeScope, ct); return GetModuleAndAnyFriends(TypeScope, ct);
return GetReferencingModules(TypeScope.ParentModule.MetadataFile, ct); return GetReferencingModules(TypeScope.ParentModule!.MetadataFile!, ct);
} }
public IEnumerable<MetadataFile> GetAllModules() public IEnumerable<MetadataFile> GetAllModules()
{ {
return assemblyListSnapshot.GetAllAssembliesAsync().GetAwaiter().GetResult() return assemblyListSnapshot.GetAllAssembliesAsync().GetAwaiter().GetResult()
.Select(asm => asm.GetMetadataFileOrNull()) .Select(asm => asm.GetMetadataFileOrNull())
.Where(x => x != null); .Where(x => x != null)!;
} }
public DecompilerTypeSystem ConstructTypeSystem(MetadataFile module) public DecompilerTypeSystem ConstructTypeSystem(MetadataFile module)
@ -113,7 +112,7 @@ namespace ICSharpCode.ILSpyX.Analyzers
else else
{ {
accessibility = input.Accessibility; accessibility = input.Accessibility;
typeScope = input.DeclaringTypeDefinition; typeScope = input.DeclaringTypeDefinition!;
} }
// Once we reach a private entity, we leave the loop with typeScope set to the class that // Once we reach a private entity, we leave the loop with typeScope set to the class that
// contains the private entity = the scope that needs to be searched. // contains the private entity = the scope that needs to be searched.
@ -123,7 +122,7 @@ namespace ICSharpCode.ILSpyX.Analyzers
{ {
accessibility = accessibility.Intersect(typeScope.Accessibility); accessibility = accessibility.Intersect(typeScope.Accessibility);
prevTypeScope = typeScope; prevTypeScope = typeScope;
typeScope = prevTypeScope.DeclaringTypeDefinition; typeScope = prevTypeScope.DeclaringTypeDefinition!;
} }
if (typeScope == null) if (typeScope == null)
{ {
@ -181,7 +180,7 @@ namespace ICSharpCode.ILSpyX.Analyzers
IEnumerable<MetadataFile> GetModuleAndAnyFriends(ITypeDefinition typeScope, CancellationToken ct) IEnumerable<MetadataFile> GetModuleAndAnyFriends(ITypeDefinition typeScope, CancellationToken ct)
{ {
var self = typeScope.ParentModule.MetadataFile; var self = typeScope.ParentModule!.MetadataFile!;
yield return self; yield return self;
@ -191,9 +190,10 @@ namespace ICSharpCode.ILSpyX.Analyzers
var friendAssemblies = new HashSet<string>(); var friendAssemblies = new HashSet<string>();
foreach (var attribute in attributes) foreach (var attribute in attributes)
{ {
string assemblyName = attribute.DecodeValue(typeProvider).FixedArguments[0].Value as string; string? assemblyName = attribute.DecodeValue(typeProvider).FixedArguments[0].Value as string;
assemblyName = assemblyName.Split(',')[0]; // strip off any public key info assemblyName = assemblyName?.Split(',')[0]; // strip off any public key info
friendAssemblies.Add(assemblyName); if (assemblyName != null)
friendAssemblies.Add(assemblyName);
} }
if (friendAssemblies.Count > 0) if (friendAssemblies.Count > 0)

7
ICSharpCode.ILSpyX/Analyzers/Builtin/EventImplementedByAnalyzer.cs

@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -44,17 +43,19 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type)
{ {
if (analyzedEntity.DeclaringTypeDefinition?.ParentModule?.MetadataFile == null)
yield break;
var token = analyzedEntity.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile;
var allTypes = type.GetAllBaseTypeDefinitions(); var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.MetadataFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule?.MetadataFile == module))
yield break; yield break;
foreach (var @event in type.Events) foreach (var @event in type.Events)
{ {
var baseMembers = InheritanceHelper.GetBaseMembers(@event, true); var baseMembers = InheritanceHelper.GetBaseMembers(@event, true);
if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.MetadataFile == module)) if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule?.MetadataFile == module))
yield return @event; yield return @event;
} }
} }

7
ICSharpCode.ILSpyX/Analyzers/Builtin/EventOverriddenByAnalyzer.cs

@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -44,11 +43,13 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type)
{ {
if (analyzedEntity.DeclaringTypeDefinition?.ParentModule?.MetadataFile == null)
yield break;
var token = analyzedEntity.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile;
var allTypes = type.GetAllBaseTypeDefinitions(); var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.MetadataFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule?.MetadataFile == module))
yield break; yield break;
foreach (var @event in type.Events) foreach (var @event in type.Events)
@ -56,7 +57,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
if (!@event.IsOverride) if (!@event.IsOverride)
continue; continue;
var baseMembers = InheritanceHelper.GetBaseMembers(@event, false); var baseMembers = InheritanceHelper.GetBaseMembers(@event, false);
if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule.MetadataFile == module)) if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule?.MetadataFile == module))
{ {
yield return @event; yield return @event;
} }

10
ICSharpCode.ILSpyX/Analyzers/Builtin/FieldAccessAnalyzer.cs

@ -74,6 +74,8 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
var scope = context.GetScopeOf((IEntity)analyzedSymbol); var scope = context.GetScopeOf((IEntity)analyzedSymbol);
foreach (var type in scope.GetTypesInScope(context.CancellationToken)) foreach (var type in scope.GetTypesInScope(context.CancellationToken))
{ {
if (type.ParentModule?.MetadataFile == null)
continue;
var mappingInfo = context.Language.GetCodeMappingInfo(type.ParentModule.MetadataFile, type.MetadataToken); var mappingInfo = context.Language.GetCodeMappingInfo(type.ParentModule.MetadataFile, type.MetadataToken);
var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>(); var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>();
foreach (var method in methods) foreach (var method in methods)
@ -119,7 +121,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
bool IsUsedInMethod(IField analyzedField, IMethod method, CodeMappingInfo mappingInfo, AnalyzerContext context) bool IsUsedInMethod(IField analyzedField, IMethod method, CodeMappingInfo mappingInfo, AnalyzerContext context)
{ {
if (method.MetadataToken.IsNil) if (method.MetadataToken.IsNil || method.ParentModule?.MetadataFile == null)
return false; return false;
var module = method.ParentModule.MetadataFile; var module = method.ParentModule.MetadataFile;
foreach (var part in mappingInfo.GetMethodParts((MethodDefinitionHandle)method.MetadataToken)) foreach (var part in mappingInfo.GetMethodParts((MethodDefinitionHandle)method.MetadataToken))
@ -144,7 +146,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
bool ScanMethodBody(IField analyzedField, IMethod method, MethodBodyBlock methodBody) bool ScanMethodBody(IField analyzedField, IMethod method, MethodBodyBlock methodBody)
{ {
if (methodBody == null) if (methodBody == null || method.ParentModule?.MetadataFile == null)
return false; return false;
var mainModule = (MetadataModule)method.ParentModule; var mainModule = (MetadataModule)method.ParentModule;
@ -170,7 +172,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
EntityHandle fieldHandle = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32()); EntityHandle fieldHandle = MetadataTokenHelpers.EntityHandleOrNil(blob.ReadInt32());
if (!fieldHandle.Kind.IsMemberKind()) if (!fieldHandle.Kind.IsMemberKind())
continue; continue;
IField field; IField? field;
try try
{ {
field = mainModule.ResolveEntity(fieldHandle, genericContext) as IField; field = mainModule.ResolveEntity(fieldHandle, genericContext) as IField;
@ -183,7 +185,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
continue; continue;
if (field.MetadataToken == analyzedField.MetadataToken if (field.MetadataToken == analyzedField.MetadataToken
&& field.ParentModule.MetadataFile == analyzedField.ParentModule.MetadataFile) && field.ParentModule?.MetadataFile == analyzedField.ParentModule!.MetadataFile)
return true; return true;
} }

2
ICSharpCode.ILSpyX/Analyzers/Builtin/MemberImplementsInterfaceAnalyzer.cs

@ -38,7 +38,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
Debug.Assert(!member.IsStatic); Debug.Assert(!member.IsStatic);
var baseMembers = InheritanceHelper.GetBaseMembers(member, includeImplementedInterfaces: true); var baseMembers = InheritanceHelper.GetBaseMembers(member, includeImplementedInterfaces: true);
return baseMembers.Where(m => m.DeclaringTypeDefinition.Kind == TypeKind.Interface); return baseMembers.Where(m => m.DeclaringTypeDefinition?.Kind == TypeKind.Interface);
} }
public bool Show(ISymbol symbol) public bool Show(ISymbol symbol)

10
ICSharpCode.ILSpyX/Analyzers/Builtin/MethodImplementedByAnalyzer.cs

@ -16,13 +16,9 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
@ -47,17 +43,19 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type)
{ {
if (analyzedEntity.DeclaringTypeDefinition?.ParentModule?.MetadataFile == null)
yield break;
var token = analyzedEntity.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile;
var allTypes = type.GetAllBaseTypeDefinitions(); var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.MetadataFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule?.MetadataFile == module))
yield break; yield break;
foreach (var method in type.Methods) foreach (var method in type.Methods)
{ {
var baseMembers = InheritanceHelper.GetBaseMembers(method, true); var baseMembers = InheritanceHelper.GetBaseMembers(method, true);
if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.MetadataFile == module)) if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule?.MetadataFile == module))
yield return method; yield return method;
} }
} }

7
ICSharpCode.ILSpyX/Analyzers/Builtin/MethodOverriddenByAnalyzer.cs

@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -46,11 +45,13 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type)
{ {
if (analyzedEntity.DeclaringTypeDefinition?.ParentModule?.MetadataFile == null)
yield break;
var token = analyzedEntity.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile;
var allTypes = type.GetAllBaseTypeDefinitions(); var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.MetadataFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule?.MetadataFile == module))
yield break; yield break;
foreach (var method in type.Methods) foreach (var method in type.Methods)
@ -58,7 +59,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
if (!method.IsOverride) if (!method.IsOverride)
continue; continue;
var baseMembers = InheritanceHelper.GetBaseMembers(method, false); var baseMembers = InheritanceHelper.GetBaseMembers(method, false);
if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule.MetadataFile == module)) if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule?.MetadataFile == module))
{ {
yield return method; yield return method;
} }

16
ICSharpCode.ILSpyX/Analyzers/Builtin/MethodUsedByAnalyzer.cs

@ -18,12 +18,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler; using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
@ -46,9 +44,11 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
var analyzedMethod = (IMethod)analyzedSymbol; var analyzedMethod = (IMethod)analyzedSymbol;
var analyzedBaseMethod = (IMethod)InheritanceHelper.GetBaseMember(analyzedMethod); var analyzedBaseMethod = (IMethod)InheritanceHelper.GetBaseMember(analyzedMethod);
if (analyzedMethod.ParentModule?.MetadataFile == null)
yield break;
var mapping = context.Language var mapping = context.Language
.GetCodeMappingInfo(analyzedMethod.ParentModule.MetadataFile, .GetCodeMappingInfo(analyzedMethod.ParentModule.MetadataFile,
analyzedMethod.DeclaringTypeDefinition.MetadataToken); analyzedMethod.DeclaringTypeDefinition!.MetadataToken);
var parentMethod = mapping.GetParentMethod((MethodDefinitionHandle)analyzedMethod.MetadataToken); var parentMethod = mapping.GetParentMethod((MethodDefinitionHandle)analyzedMethod.MetadataToken);
if (parentMethod != analyzedMethod.MetadataToken) if (parentMethod != analyzedMethod.MetadataToken)
@ -57,6 +57,8 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
var scope = context.GetScopeOf(analyzedMethod); var scope = context.GetScopeOf(analyzedMethod);
foreach (var type in scope.GetTypesInScope(context.CancellationToken)) foreach (var type in scope.GetTypesInScope(context.CancellationToken))
{ {
if (type.ParentModule?.MetadataFile == null)
continue;
var parentModule = (MetadataModule)type.ParentModule; var parentModule = (MetadataModule)type.ParentModule;
mapping = null; mapping = null;
var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>(); var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>();
@ -110,9 +112,9 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
return ScanMethodBody(analyzedEntity, method, analyzedBaseMethod, context.GetMethodBody(method)); return ScanMethodBody(analyzedEntity, method, analyzedBaseMethod, context.GetMethodBody(method));
} }
static bool ScanMethodBody(IMethod analyzedMethod, IMethod method, IMethod analyzedBaseMethod, MethodBodyBlock methodBody) static bool ScanMethodBody(IMethod analyzedMethod, IMethod method, IMethod analyzedBaseMethod, MethodBodyBlock? methodBody)
{ {
if (methodBody == null) if (methodBody == null || method.ParentModule?.MetadataFile == null)
return false; return false;
var mainModule = (MetadataModule)method.ParentModule; var mainModule = (MetadataModule)method.ParentModule;
@ -145,7 +147,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
} }
} }
IMember m; IMember? m;
try try
{ {
m = (mainModule.ResolveEntity(member, genericContext) as IMember)?.MemberDefinition; m = (mainModule.ResolveEntity(member, genericContext) as IMember)?.MemberDefinition;
@ -192,7 +194,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
static bool IsSameMember(IMember analyzedMethod, IMember m) static bool IsSameMember(IMember analyzedMethod, IMember m)
{ {
return m.MetadataToken == analyzedMethod.MetadataToken return m.MetadataToken == analyzedMethod.MetadataToken
&& m.ParentModule.MetadataFile == analyzedMethod.ParentModule.MetadataFile; && m.ParentModule?.MetadataFile == analyzedMethod.ParentModule!.MetadataFile;
} }
} }
} }

6
ICSharpCode.ILSpyX/Analyzers/Builtin/MethodUsesAnalyzer.cs

@ -38,7 +38,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
public IEnumerable<ISymbol> Analyze(ISymbol symbol, AnalyzerContext context) public IEnumerable<ISymbol> Analyze(ISymbol symbol, AnalyzerContext context)
{ {
if (symbol is IMethod method && method.ParentModule.MetadataFile is MetadataFile corFile) if (symbol is IMethod method && method.ParentModule?.MetadataFile is MetadataFile corFile)
{ {
var typeSystem = context.GetOrCreateTypeSystem(corFile); var typeSystem = context.GetOrCreateTypeSystem(corFile);
return context.Language.GetCodeMappingInfo(corFile, method.MetadataToken) return context.Language.GetCodeMappingInfo(corFile, method.MetadataToken)
@ -95,7 +95,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
case HandleKind.TypeDefinition: case HandleKind.TypeDefinition:
case HandleKind.TypeReference: case HandleKind.TypeReference:
case HandleKind.TypeSpecification: case HandleKind.TypeSpecification:
IType ty; IType? ty;
try try
{ {
ty = module.ResolveType(member, genericContext); ty = module.ResolveType(member, genericContext);
@ -110,7 +110,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
case HandleKind.MethodSpecification: case HandleKind.MethodSpecification:
case HandleKind.MemberReference: case HandleKind.MemberReference:
case HandleKind.FieldDefinition: case HandleKind.FieldDefinition:
IEntity m; IEntity? m;
try try
{ {
m = module.ResolveEntity(member, genericContext); m = module.ResolveEntity(member, genericContext);

19
ICSharpCode.ILSpyX/Analyzers/Builtin/MethodVirtualUsedByAnalyzer.cs

@ -41,9 +41,16 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
{ {
Debug.Assert(analyzedSymbol is IMethod); Debug.Assert(analyzedSymbol is IMethod);
var analyzedMethod = (IMethod)analyzedSymbol; var analyzedMethod = (IMethod)analyzedSymbol;
if (analyzedMethod.ParentModule?.MetadataFile == null)
yield break;
if (analyzedMethod.DeclaringTypeDefinition?.MetadataToken.IsNil != true)
yield break;
var mapping = context.Language var mapping = context.Language
.GetCodeMappingInfo(analyzedMethod.ParentModule.MetadataFile, .GetCodeMappingInfo(analyzedMethod.ParentModule.MetadataFile,
analyzedMethod.DeclaringTypeDefinition.MetadataToken); analyzedMethod.DeclaringTypeDefinition?.MetadataToken ?? default);
var parentMethod = mapping.GetParentMethod((MethodDefinitionHandle)analyzedMethod.MetadataToken); var parentMethod = mapping.GetParentMethod((MethodDefinitionHandle)analyzedMethod.MetadataToken);
if (parentMethod != analyzedMethod.MetadataToken) if (parentMethod != analyzedMethod.MetadataToken)
@ -52,7 +59,9 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
var scope = context.GetScopeOf(analyzedMethod); var scope = context.GetScopeOf(analyzedMethod);
foreach (var type in scope.GetTypesInScope(context.CancellationToken)) foreach (var type in scope.GetTypesInScope(context.CancellationToken))
{ {
var parentModule = (MetadataModule)type.ParentModule; var parentModule = (MetadataModule?)type.ParentModule;
if (parentModule?.MetadataFile == null)
continue;
mapping = context.Language.GetCodeMappingInfo(parentModule.MetadataFile, type.MetadataToken); mapping = context.Language.GetCodeMappingInfo(parentModule.MetadataFile, type.MetadataToken);
var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>(); var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>();
foreach (var method in methods) foreach (var method in methods)
@ -105,9 +114,9 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
return ScanMethodBody(analyzedEntity, method, context.GetMethodBody(method)); return ScanMethodBody(analyzedEntity, method, context.GetMethodBody(method));
} }
static bool ScanMethodBody(IMethod analyzedMethod, IMethod method, MethodBodyBlock methodBody) static bool ScanMethodBody(IMethod analyzedMethod, IMethod method, MethodBodyBlock? methodBody)
{ {
if (methodBody == null) if (methodBody == null || method.ParentModule?.MetadataFile == null)
return false; return false;
var mainModule = (MetadataModule)method.ParentModule; var mainModule = (MetadataModule)method.ParentModule;
var blob = methodBody.GetILReader(); var blob = methodBody.GetILReader();
@ -131,7 +140,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
case HandleKind.MethodSpecification: case HandleKind.MethodSpecification:
case HandleKind.MemberReference: case HandleKind.MemberReference:
var m = (mainModule.ResolveEntity(member, genericContext) as IMember)?.MemberDefinition; var m = (mainModule.ResolveEntity(member, genericContext) as IMember)?.MemberDefinition;
if (m != null && m.MetadataToken == analyzedMethod.MetadataToken && m.ParentModule.MetadataFile == analyzedMethod.ParentModule.MetadataFile) if (m != null && m.MetadataToken == analyzedMethod.MetadataToken && m.ParentModule?.MetadataFile == analyzedMethod.ParentModule!.MetadataFile)
{ {
return true; return true;
} }

7
ICSharpCode.ILSpyX/Analyzers/Builtin/PropertyImplementedByAnalyzer.cs

@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -44,17 +43,19 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type)
{ {
if (analyzedEntity.DeclaringTypeDefinition?.ParentModule?.MetadataFile == null)
yield break;
var token = analyzedEntity.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile;
var allTypes = type.GetAllBaseTypeDefinitions(); var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.MetadataFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule?.MetadataFile == module))
yield break; yield break;
foreach (var property in type.Properties) foreach (var property in type.Properties)
{ {
var baseMembers = InheritanceHelper.GetBaseMembers(property, true); var baseMembers = InheritanceHelper.GetBaseMembers(property, true);
if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.MetadataFile == module)) if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule?.MetadataFile == module))
yield return property; yield return property;
} }
} }

10
ICSharpCode.ILSpyX/Analyzers/Builtin/PropertyOverriddenByAnalyzer.cs

@ -16,13 +16,9 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
@ -47,11 +43,13 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type)
{ {
if (analyzedEntity.DeclaringTypeDefinition?.ParentModule?.MetadataFile == null)
yield break;
var token = analyzedEntity.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.MetadataFile;
var allTypes = type.GetAllBaseTypeDefinitions(); var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.MetadataFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule?.MetadataFile == module))
yield break; yield break;
foreach (var property in type.Properties) foreach (var property in type.Properties)
@ -59,7 +57,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
if (!property.IsOverride) if (!property.IsOverride)
continue; continue;
var baseMembers = InheritanceHelper.GetBaseMembers(property, false); var baseMembers = InheritanceHelper.GetBaseMembers(property, false);
if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule.MetadataFile == module)) if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule?.MetadataFile == module))
{ {
yield return property; yield return property;
} }

7
ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs

@ -16,13 +16,8 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ICSharpCode.ILSpyX.Analyzers.Builtin namespace ICSharpCode.ILSpyX.Analyzers.Builtin
@ -52,7 +47,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
{ {
if (analyzedType.Kind == TypeKind.Enum if (analyzedType.Kind == TypeKind.Enum
&& type.MetadataToken == analyzedType.MetadataToken && type.MetadataToken == analyzedType.MetadataToken
&& type.ParentModule.MetadataFile == analyzedType.ParentModule.MetadataFile) && type.ParentModule?.MetadataFile == analyzedType.ParentModule?.MetadataFile)
yield break; yield break;
if (!context.Language.ShowMember(type)) if (!context.Language.ShowMember(type))

6
ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExtensionMethodsAnalyzer.cs

@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
@ -48,6 +47,9 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
if (!type.HasExtensionMethods) if (!type.HasExtensionMethods)
yield break; yield break;
if (analyzedType.ParentModule?.MetadataFile == null)
yield break;
foreach (IMethod method in type.Methods) foreach (IMethod method in type.Methods)
{ {
if (!method.IsExtensionMethod) if (!method.IsExtensionMethod)
@ -56,7 +58,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
var firstParamType = method.Parameters[0].Type.GetDefinition(); var firstParamType = method.Parameters[0].Type.GetDefinition();
if (firstParamType != null && if (firstParamType != null &&
firstParamType.MetadataToken == analyzedType.MetadataToken && firstParamType.MetadataToken == analyzedType.MetadataToken &&
firstParamType.ParentModule.MetadataFile == analyzedType.ParentModule.MetadataFile) firstParamType.ParentModule?.MetadataFile == analyzedType.ParentModule.MetadataFile)
yield return method; yield return method;
} }
} }

11
ICSharpCode.ILSpyX/Analyzers/Builtin/TypeInstantiatedByAnalyzer.cs

@ -18,12 +18,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler; using ICSharpCode.Decompiler.Disassembler;
@ -46,6 +43,8 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
var scope = context.GetScopeOf((ITypeDefinition)analyzedSymbol); var scope = context.GetScopeOf((ITypeDefinition)analyzedSymbol);
foreach (var type in scope.GetTypesInScope(context.CancellationToken)) foreach (var type in scope.GetTypesInScope(context.CancellationToken))
{ {
if (type.ParentModule?.MetadataFile == null)
continue;
var mappingInfo = context.Language.GetCodeMappingInfo(type.ParentModule.MetadataFile, type.MetadataToken); var mappingInfo = context.Language.GetCodeMappingInfo(type.ParentModule.MetadataFile, type.MetadataToken);
var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>(); var methods = type.GetMembers(m => m is IMethod, Options).OfType<IMethod>();
foreach (var method in methods) foreach (var method in methods)
@ -94,9 +93,9 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
return ScanMethodBody(analyzedEntity, method, context.GetMethodBody(method)); return ScanMethodBody(analyzedEntity, method, context.GetMethodBody(method));
} }
bool ScanMethodBody(ITypeDefinition analyzedEntity, IMethod method, MethodBodyBlock methodBody) bool ScanMethodBody(ITypeDefinition analyzedEntity, IMethod method, MethodBodyBlock? methodBody)
{ {
if (methodBody == null) if (methodBody == null || method.ParentModule?.MetadataFile == null)
return false; return false;
var blob = methodBody.GetILReader(); var blob = methodBody.GetILReader();
var module = (MetadataModule)method.ParentModule; var module = (MetadataModule)method.ParentModule;
@ -134,7 +133,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
continue; continue;
if (ctor.DeclaringTypeDefinition?.MetadataToken == analyzedEntity.MetadataToken if (ctor.DeclaringTypeDefinition?.MetadataToken == analyzedEntity.MetadataToken
&& ctor.ParentModule.MetadataFile == analyzedEntity.ParentModule.MetadataFile) && ctor.ParentModule?.MetadataFile == analyzedEntity.ParentModule!.MetadataFile)
return true; return true;
} }

6
ICSharpCode.ILSpyX/Analyzers/Builtin/TypeUsedByAnalyzer.cs

@ -107,7 +107,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
if (found || ScanMethodBody(analyzedType, module, md, decoder)) if (found || ScanMethodBody(analyzedType, module, md, decoder))
{ {
var method = typeSystem.MainModule.GetDefinition(h); var method = typeSystem.MainModule.GetDefinition(h);
yield return method?.AccessorOwner ?? method; yield return method.AccessorOwner ?? method;
} }
} }
@ -221,7 +221,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
} }
return false; return false;
bool CheckAttributeValue(object value) bool CheckAttributeValue(object? value)
{ {
if (value is TokenSearchResult typeofType) if (value is TokenSearchResult typeofType)
{ {
@ -408,7 +408,7 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
public override IType VisitTypeDefinition(ITypeDefinition type) public override IType VisitTypeDefinition(ITypeDefinition type)
{ {
Found |= TypeDefinition.MetadataToken == type.MetadataToken Found |= TypeDefinition.MetadataToken == type.MetadataToken
&& TypeDefinition.ParentModule.MetadataFile == type.ParentModule.MetadataFile; && TypeDefinition.ParentModule!.MetadataFile == type.ParentModule?.MetadataFile;
return base.VisitTypeDefinition(type); return base.VisitTypeDefinition(type);
} }

2
ICSharpCode.ILSpyX/Analyzers/ExportAnalyzerAttribute.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.ILSpyX.Analyzers
public ExportAnalyzerAttribute() : base("Analyzer", typeof(IAnalyzer)) public ExportAnalyzerAttribute() : base("Analyzer", typeof(IAnalyzer))
{ } { }
public string Header { get; set; } public required string Header { get; init; }
public int Order { get; set; } public int Order { get; set; }
} }

16
ICSharpCode.ILSpyX/Search/SearchResult.cs

@ -42,18 +42,14 @@ namespace ICSharpCode.ILSpyX.Search
public float Fitness { get; set; } public float Fitness { get; set; }
#nullable disable public required string Name { get; set; }
public string Name { get; set; } public required string Location { get; set; }
public string Location { get; set; } public required string Assembly { get; set; }
public string Assembly { get; set; }
#nullable enable
public object? ToolTip { get; set; } public object? ToolTip { get; set; }
#nullable disable public required object Image { get; set; }
public object Image { get; set; } public required object LocationImage { get; set; }
public object LocationImage { get; set; }
public object AssemblyImage { get; set; } public required object AssemblyImage { get; set; }
#nullable enable
public override string ToString() public override string ToString()
{ {

2
ILSpy.Tests/Analyzers/MemberImplementsInterfaceAnalyzerTests.cs

@ -145,7 +145,7 @@ namespace ICSharpCode.ILSpy.Tests.Analyzers
var analyzer = new MemberImplementsInterfaceAnalyzer(); var analyzer = new MemberImplementsInterfaceAnalyzer();
// Act // Act
var results = analyzer.Analyze(symbol, new AnalyzerContext()); var results = analyzer.Analyze(symbol, new AnalyzerContext() { AssemblyList = new ILSpyX.AssemblyList(), Language = new CSharpLanguage() });
// Assert // Assert
Assert.That(results, Is.Not.Null); Assert.That(results, Is.Not.Null);

9
ILSpy/Search/SearchPane.cs

@ -218,7 +218,14 @@ namespace ICSharpCode.ILSpy.Search
if (resultsAdded > 0 && Results.Count == MAX_RESULTS) if (resultsAdded > 0 && Results.Count == MAX_RESULTS)
{ {
Results.Add(new SearchResult { Name = Properties.Resources.SearchAbortedMoreThan1000ResultsFound }); Results.Add(new SearchResult {
Name = Properties.Resources.SearchAbortedMoreThan1000ResultsFound,
Location = null!,
Assembly = null!,
Image = null!,
LocationImage = null!,
AssemblyImage = null!,
});
currentSearch.Cancel(); currentSearch.Cancel();
} }
} }

Loading…
Cancel
Save