From ab25e5c283c3a8f6f43aeeab36ee466fadf1fb56 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 16 Sep 2019 09:00:34 +0200 Subject: [PATCH] Fix #1697: Unexpected results in "implemented by" analyzer. --- .../Builtin/EventImplementsInterfaceAnalyzer.cs | 13 +++++++------ .../Builtin/MethodImplementsInterfaceAnalyzer.cs | 13 +++++++------ .../Builtin/PropertyImplementsInterfaceAnalyzer.cs | 13 +++++++------ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/ILSpy/Analyzers/Builtin/EventImplementsInterfaceAnalyzer.cs b/ILSpy/Analyzers/Builtin/EventImplementsInterfaceAnalyzer.cs index c6efcd98f..8f25b069d 100644 --- a/ILSpy/Analyzers/Builtin/EventImplementsInterfaceAnalyzer.cs +++ b/ILSpy/Analyzers/Builtin/EventImplementsInterfaceAnalyzer.cs @@ -42,15 +42,16 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin IEnumerable AnalyzeType(IEvent analyzedEntity, ITypeDefinition type) { - var token = analyzedEntity.DeclaringTypeDefinition.MetadataToken; + var token = analyzedEntity.MetadataToken; + var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile; - if (!type.GetAllBaseTypeDefinitions() - .Any(t => t.MetadataToken == token && t.ParentModule.PEFile == module)) + var allTypes = type.GetAllBaseTypeDefinitions(); + if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module)) yield break; - foreach (var @event in type.GetEvents(options: GetMemberOptions.ReturnMemberDefinitions)) { - if (InheritanceHelper.GetBaseMembers(@event, true) - .Any(m => m.DeclaringTypeDefinition.MetadataToken == token && m.ParentModule.PEFile == module)) + foreach (var @event in type.Events) { + var baseMembers = InheritanceHelper.GetBaseMembers(@event, true); + if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.PEFile == module)) yield return @event; } } diff --git a/ILSpy/Analyzers/Builtin/MethodImplementsInterfaceAnalyzer.cs b/ILSpy/Analyzers/Builtin/MethodImplementsInterfaceAnalyzer.cs index 75c8c4e6a..099cd069e 100644 --- a/ILSpy/Analyzers/Builtin/MethodImplementsInterfaceAnalyzer.cs +++ b/ILSpy/Analyzers/Builtin/MethodImplementsInterfaceAnalyzer.cs @@ -45,15 +45,16 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin IEnumerable AnalyzeType(IMethod analyzedEntity, ITypeDefinition type) { - var token = analyzedEntity.DeclaringTypeDefinition.MetadataToken; + var token = analyzedEntity.MetadataToken; + var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile; - if (!type.GetAllBaseTypeDefinitions() - .Any(t => t.MetadataToken == token && t.ParentModule.PEFile == module)) + var allTypes = type.GetAllBaseTypeDefinitions(); + if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module)) yield break; - foreach (var method in type.GetMethods(options: GetMemberOptions.ReturnMemberDefinitions)) { - if (InheritanceHelper.GetBaseMembers(method, true) - .Any(m => m.DeclaringTypeDefinition.MetadataToken == token && m.ParentModule.PEFile == module)) + foreach (var method in type.Methods) { + var baseMembers = InheritanceHelper.GetBaseMembers(method, true); + if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.PEFile == module)) yield return method; } } diff --git a/ILSpy/Analyzers/Builtin/PropertyImplementsInterfaceAnalyzer.cs b/ILSpy/Analyzers/Builtin/PropertyImplementsInterfaceAnalyzer.cs index 938e0e4e2..f23db8cc6 100644 --- a/ILSpy/Analyzers/Builtin/PropertyImplementsInterfaceAnalyzer.cs +++ b/ILSpy/Analyzers/Builtin/PropertyImplementsInterfaceAnalyzer.cs @@ -42,15 +42,16 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin IEnumerable AnalyzeType(IProperty analyzedEntity, ITypeDefinition type) { - var token = analyzedEntity.DeclaringTypeDefinition.MetadataToken; + var token = analyzedEntity.MetadataToken; + var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile; - if (!type.GetAllBaseTypeDefinitions() - .Any(t => t.MetadataToken == token && t.ParentModule.PEFile == module)) + var allTypes = type.GetAllBaseTypeDefinitions(); + if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module)) yield break; - foreach (var property in type.GetProperties(options: GetMemberOptions.ReturnMemberDefinitions)) { - if (InheritanceHelper.GetBaseMembers(property, true) - .Any(m => m.DeclaringTypeDefinition.MetadataToken == token && m.ParentModule.PEFile == module)) + foreach (var property in type.Properties) { + var baseMembers = InheritanceHelper.GetBaseMembers(property, true); + if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.PEFile == module)) yield return property; } }