diff --git a/ILSpy/Analyzers/Builtin/MethodUsedByAnalyzer.cs b/ILSpy/Analyzers/Builtin/MethodUsedByAnalyzer.cs index c478847f6..d4dc7486f 100644 --- a/ILSpy/Analyzers/Builtin/MethodUsedByAnalyzer.cs +++ b/ILSpy/Analyzers/Builtin/MethodUsedByAnalyzer.cs @@ -43,11 +43,21 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin public IEnumerable Analyze(ISymbol analyzedSymbol, AnalyzerContext context) { Debug.Assert(analyzedSymbol is IMethod); - var scope = context.GetScopeOf((IEntity)analyzedSymbol); + + var analyzedMethod = (IMethod)analyzedSymbol; + var mapping = context.Language + .GetCodeMappingInfo(analyzedMethod.ParentModule.PEFile, + analyzedMethod.DeclaringTypeDefinition.MetadataToken); + + var parentMethod = mapping.GetParentMethod((MethodDefinitionHandle)analyzedMethod.MetadataToken); + if (parentMethod != analyzedMethod.MetadataToken) + yield return ((MetadataModule)analyzedMethod.ParentModule).GetDefinition(parentMethod); + + var scope = context.GetScopeOf(analyzedMethod); foreach (var type in scope.GetTypesInScope(context.CancellationToken)) { var parentModule = (MetadataModule)type.ParentModule; - var mapping = context.Language.GetCodeMappingInfo(parentModule.PEFile, type.MetadataToken); + mapping = context.Language.GetCodeMappingInfo(parentModule.PEFile, type.MetadataToken); var methods = type.GetMembers(m => m is IMethod, Options).OfType(); foreach (var method in methods) { diff --git a/ILSpy/Analyzers/Builtin/MethodVirtualUsedByAnalyzer.cs b/ILSpy/Analyzers/Builtin/MethodVirtualUsedByAnalyzer.cs index a778aacd4..a6e63ecdc 100644 --- a/ILSpy/Analyzers/Builtin/MethodVirtualUsedByAnalyzer.cs +++ b/ILSpy/Analyzers/Builtin/MethodVirtualUsedByAnalyzer.cs @@ -42,25 +42,38 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin public IEnumerable Analyze(ISymbol analyzedSymbol, AnalyzerContext context) { Debug.Assert(analyzedSymbol is IMethod); - var scope = context.GetScopeOf((IEntity)analyzedSymbol); + var analyzedMethod = (IMethod)analyzedSymbol; + var mapping = context.Language + .GetCodeMappingInfo(analyzedMethod.ParentModule.PEFile, + analyzedMethod.DeclaringTypeDefinition.MetadataToken); + + var parentMethod = mapping.GetParentMethod((MethodDefinitionHandle)analyzedMethod.MetadataToken); + if (parentMethod != analyzedMethod.MetadataToken) + yield return ((MetadataModule)analyzedMethod.ParentModule).GetDefinition(parentMethod); + + var scope = context.GetScopeOf(analyzedMethod); foreach (var type in scope.GetTypesInScope(context.CancellationToken)) { - var mappingInfo = context.Language.GetCodeMappingInfo(type.ParentModule.PEFile, type.MetadataToken); + var parentModule = (MetadataModule)type.ParentModule; + mapping = context.Language.GetCodeMappingInfo(parentModule.PEFile, type.MetadataToken); var methods = type.GetMembers(m => m is IMethod, Options).OfType(); foreach (var method in methods) { - if (IsUsedInMethod((IMethod)analyzedSymbol, method, mappingInfo, context)) - yield return method; + if (IsUsedInMethod((IMethod)analyzedSymbol, method, context)) + { + var parent = mapping.GetParentMethod((MethodDefinitionHandle)method.MetadataToken); + yield return parentModule.GetDefinition(parent); + } } foreach (var property in type.Properties) { - if (property.CanGet && IsUsedInMethod((IMethod)analyzedSymbol, property.Getter, mappingInfo, context)) + if (property.CanGet && IsUsedInMethod((IMethod)analyzedSymbol, property.Getter, context)) { yield return property; continue; } - if (property.CanSet && IsUsedInMethod((IMethod)analyzedSymbol, property.Setter, mappingInfo, context)) + if (property.CanSet && IsUsedInMethod((IMethod)analyzedSymbol, property.Setter, context)) { yield return property; continue; @@ -69,17 +82,17 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin foreach (var @event in type.Events) { - if (@event.CanAdd && IsUsedInMethod((IMethod)analyzedSymbol, @event.AddAccessor, mappingInfo, context)) + if (@event.CanAdd && IsUsedInMethod((IMethod)analyzedSymbol, @event.AddAccessor, context)) { yield return @event; continue; } - if (@event.CanRemove && IsUsedInMethod((IMethod)analyzedSymbol, @event.RemoveAccessor, mappingInfo, context)) + if (@event.CanRemove && IsUsedInMethod((IMethod)analyzedSymbol, @event.RemoveAccessor, context)) { yield return @event; continue; } - if (@event.CanInvoke && IsUsedInMethod((IMethod)analyzedSymbol, @event.InvokeAccessor, mappingInfo, context)) + if (@event.CanInvoke && IsUsedInMethod((IMethod)analyzedSymbol, @event.InvokeAccessor, context)) { yield return @event; continue; @@ -89,7 +102,7 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin } } - bool IsUsedInMethod(IMethod analyzedEntity, IMethod method, CodeMappingInfo mappingInfo, AnalyzerContext context) + bool IsUsedInMethod(IMethod analyzedEntity, IMethod method, AnalyzerContext context) { return ScanMethodBody(analyzedEntity, method, context.GetMethodBody(method)); }