diff --git a/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs b/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs index 00d6b6f10..72e0df9be 100644 --- a/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs +++ b/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs @@ -158,22 +158,6 @@ namespace ICSharpCode.Decompiler.Disassembler if (operand == null) throw new ArgumentNullException(nameof(operand)); - /*VariableReference variableRef = operand as VariableReference; - if (variableRef != null) { - writer.WriteReference(variableRef.Index.ToString(), variableRef); - return; - } - - ParameterReference paramRef = operand as ParameterReference; - if (paramRef != null) { - if (string.IsNullOrEmpty(paramRef.Name)) { - var paramDef = paramRef.Resolve(); - writer.WriteReference((paramDef == null ? paramRef.Index : paramDef.Sequence).ToString(), paramRef); - } else - writer.WriteReference(Escape(paramRef.Name), paramRef); - return; - }*/ - string s = operand as string; if (s != null) { WriteOperand(writer, s); diff --git a/ICSharpCode.Decompiler/Disassembler/DomExtensions.cs b/ICSharpCode.Decompiler/Disassembler/DomExtensions.cs index 57320c9c6..3c2249d48 100644 --- a/ICSharpCode.Decompiler/Disassembler/DomExtensions.cs +++ b/ICSharpCode.Decompiler/Disassembler/DomExtensions.cs @@ -71,9 +71,9 @@ namespace ICSharpCode.Decompiler.Disassembler } bool isCompilerControlled = (methodDefinition.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.PrivateScope; if (isCompilerControlled) { - output.Write(DisassemblerHelpers.Escape(method.Name + "$PST" + MetadataTokens.GetToken(method.Handle).ToString("X8"))); + output.Write(DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name) + "$PST" + MetadataTokens.GetToken(method.Handle).ToString("X8"))); } else { - output.Write(DisassemblerHelpers.Escape(method.Name)); + output.Write(DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name))); } var genericParameters = methodDefinition.GetGenericParameters(); if (genericParameters.Count > 0) { diff --git a/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs b/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs index cc3165b15..e9f9592df 100644 --- a/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs +++ b/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs @@ -150,7 +150,7 @@ namespace ICSharpCode.Decompiler.Disassembler var moduleRef = metadata.GetModuleReference(info.Module); output.Write("(\"" + DisassemblerHelpers.EscapeString(metadata.GetString(moduleRef.Name)) + "\""); - if (!info.Name.IsNil && metadata.GetString(info.Name) != method.Name) + if (!info.Name.IsNil && metadata.GetString(info.Name) != metadata.GetString(methodDefinition.Name)) output.Write(" as \"" + DisassemblerHelpers.EscapeString(metadata.GetString(info.Name)) + "\""); if ((info.Attributes & MethodImportAttributes.ExactSpelling) == MethodImportAttributes.ExactSpelling) @@ -221,9 +221,9 @@ namespace ICSharpCode.Decompiler.Disassembler } if (isCompilerControlled) { - output.Write(DisassemblerHelpers.Escape(method.Name + "$PST" + MetadataTokens.GetToken(method.Handle).ToString("X8"))); + output.Write(DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name) + "$PST" + MetadataTokens.GetToken(method.Handle).ToString("X8"))); } else { - output.Write(DisassemblerHelpers.Escape(method.Name)); + output.Write(DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name))); } WriteTypeParameters(output, method.Module, new GenericContext(method), methodDefinition.GetGenericParameters()); @@ -1227,26 +1227,56 @@ namespace ICSharpCode.Decompiler.Disassembler public void WriteModuleHeader(PEFile module) { var metadata = module.GetMetadataReader(); + + void WriteExportedType(ExportedType exportedType) + { + if (!exportedType.Namespace.IsNil) { + output.Write(DisassemblerHelpers.Escape(metadata.GetString(exportedType.Namespace))); + output.Write('.'); + } + output.Write(DisassemblerHelpers.Escape(metadata.GetString(exportedType.Name))); + } + foreach (var et in metadata.ExportedTypes) { var exportedType = metadata.GetExportedType(et); output.Write(".class extern "); if (exportedType.IsForwarder) output.Write("forwarder "); - /*exportedType.Implementation.WriteTo(metadata, output); - output.Write(metadata.GetFullName(exportedType. != null ? exportedType.Name : exportedType.FullName); + WriteExportedType(exportedType); OpenBlock(false); - if (exportedType.DeclaringType != null) - output.WriteLine(".class extern {0}", DisassemblerHelpers.Escape(exportedType.DeclaringType.FullName)); - else - output.WriteLine(".assembly extern {0}", DisassemblerHelpers.Escape(exportedType.Scope.Name)); - CloseBlock();*/ + switch (exportedType.Implementation.Kind) { + case HandleKind.AssemblyFile: + throw new NotImplementedException(); + case HandleKind.ExportedType: + output.Write(".class extern "); + var declaringType = metadata.GetExportedType((ExportedTypeHandle)exportedType.Implementation); + while (true) { + WriteExportedType(declaringType); + if (declaringType.Implementation.Kind == HandleKind.ExportedType) { + declaringType = metadata.GetExportedType((ExportedTypeHandle)declaringType.Implementation); + } else { + break; + } + } + output.WriteLine(); + break; + case HandleKind.AssemblyReference: + output.Write(".assembly extern "); + var reference = metadata.GetAssemblyReference((AssemblyReferenceHandle)exportedType.Implementation); + output.Write(DisassemblerHelpers.Escape(metadata.GetString(reference.Name))); + output.WriteLine(); + break; + default: + throw new NotSupportedException(); + } + CloseBlock(); } var moduleDefinition = metadata.GetModuleDefinition(); output.WriteLine(".module {0}", metadata.GetString(moduleDefinition.Name)); output.WriteLine("// MVID: {0}", metadata.GetGuid(moduleDefinition.Mvid).ToString("B").ToUpperInvariant()); // TODO: imagebase, file alignment, stackreserve, subsystem - //output.WriteLine(".corflags 0x{0:x} // {1}", module., module.Attributes.ToString()); + output.WriteLine(".corflags 0x{0:x} // {1}", module.Reader.PEHeaders.CorHeader.Flags, module.Reader.PEHeaders.CorHeader.Flags.ToString()); WriteAttributes(module, metadata.GetCustomAttributes(EntityHandle.ModuleDefinition)); } diff --git a/ICSharpCode.Decompiler/Metadata/Dom.cs b/ICSharpCode.Decompiler/Metadata/Dom.cs index 4e1167e8a..891fb5675 100644 --- a/ICSharpCode.Decompiler/Metadata/Dom.cs +++ b/ICSharpCode.Decompiler/Metadata/Dom.cs @@ -137,7 +137,7 @@ namespace ICSharpCode.Decompiler.Metadata AssemblyLinked, } - public struct Resource + public struct Resource : IEquatable { public PEFile Module { get; } public ManifestResourceHandle Handle { get; } @@ -151,6 +151,26 @@ namespace ICSharpCode.Decompiler.Metadata ManifestResource This() => Module.GetMetadataReader().GetManifestResource(Handle); + public bool Equals(Resource other) + { + return Module == other.Module && Handle == other.Handle; + } + + public override bool Equals(object obj) + { + if (obj is Resource res) + return Equals(res); + return false; + } + + public override int GetHashCode() + { + return unchecked(982451629 * Module.GetHashCode() + 982451653 * MetadataTokens.GetToken(Handle)); + } + + public static bool operator ==(Resource lhs, Resource rhs) => lhs.Equals(rhs); + public static bool operator !=(Resource lhs, Resource rhs) => !lhs.Equals(rhs); + public string Name => Module.GetMetadataReader().GetString(This().Name); public ManifestResourceAttributes Attributes => This().Attributes; @@ -449,24 +469,6 @@ namespace ICSharpCode.Decompiler.Metadata public static bool operator ==(MethodDefinition lhs, MethodDefinition rhs) => lhs.Equals(rhs); public static bool operator !=(MethodDefinition lhs, MethodDefinition rhs) => !lhs.Equals(rhs); - public string Name { - get { - var reader = Module.GetMetadataReader(); - return reader.GetString(reader.GetMethodDefinition(Handle).Name); - } - } - /* - public TypeDefinition DeclaringType => new TypeDefinition(Module, This().GetDeclaringType()); - - public MethodAttributes Attributes => This().Attributes; - public MethodImplAttributes ImplAttributes => This().ImplAttributes; - public CustomAttributeHandleCollection CustomAttributes => This().GetCustomAttributes(); - public DeclarativeSecurityAttributeHandleCollection DeclarativeSecurityAttributes => This().GetDeclarativeSecurityAttributes(); - public bool HasFlag(MethodAttributes attribute) => (This().Attributes & attribute) == attribute; - public bool HasPInvokeInfo => !This().GetImport().Module.IsNil || HasFlag(MethodAttributes.PinvokeImpl); - public bool IsConstructor => This().IsConstructor(Module.GetMetadataReader()); - public bool HasParameters => This().GetParameters().Count > 0;*/ - public IList GetSequencePoints() { return Module.DebugInfo?.GetSequencePoints(this); @@ -512,60 +514,6 @@ namespace ICSharpCode.Decompiler.Metadata public static bool operator ==(PropertyDefinition lhs, PropertyDefinition rhs) => lhs.Equals(rhs); public static bool operator !=(PropertyDefinition lhs, PropertyDefinition rhs) => !lhs.Equals(rhs); - /* - public string Name { - get { - var reader = Module.GetMetadataReader(); - return reader.GetString(reader.GetPropertyDefinition(Handle).Name); - } - } - - public TypeDefinition DeclaringType => GetAccessors().First().Method.DeclaringType; - - public MethodDefinition GetMethod => GetAccessors().FirstOrDefault(m => m.Kind == MethodSemanticsAttributes.Getter).Method; - public MethodDefinition SetMethod => GetAccessors().FirstOrDefault(m => m.Kind == MethodSemanticsAttributes.Setter).Method; - public ImmutableArray OtherMethods => GetAccessors().Where(a => a.Kind == MethodSemanticsAttributes.Other).Select(a => a.Method).ToImmutableArray(); - - public PropertyAttributes Attributes => This().Attributes; - public bool HasFlag(PropertyAttributes attribute) => (This().Attributes & attribute) == attribute; - public bool HasParameters => Handle.HasParameters(Module.GetMetadataReader()); - public CustomAttributeHandleCollection CustomAttributes => This().GetCustomAttributes(); - - public bool IsIndexer => HasMatchingDefaultMemberAttribute(out var attr); - - public unsafe ImmutableArray<(MethodSemanticsAttributes Kind, MethodDefinition Method)> GetAccessors() - { - return GetAccessors(Module, (uint)(MetadataTokens.GetRowNumber(Handle) << 1) | 1); - } - - internal static unsafe ImmutableArray<(MethodSemanticsAttributes Kind, MethodDefinition Method)> GetAccessors(PEFile module, uint encodedTag) - { - var reader = module.GetMetadataReader(); - byte* startPointer = reader.MetadataPointer; - int offset = reader.GetTableMetadataOffset(TableIndex.MethodSemantics); - - var methodDefRefSize = reader.GetReferenceSize(TableIndex.MethodDef); - (int startRow, int endRow) = reader.BinarySearchRange(TableIndex.MethodSemantics, 2 + methodDefRefSize, encodedTag, reader.IsSmallReference(TableIndex.MethodSemantics)); - if (startRow == -1) - return ImmutableArray<(MethodSemanticsAttributes Kind, MethodDefinition Method)>.Empty; - var methods = new(MethodSemanticsAttributes Kind, MethodDefinition Method)[endRow - startRow + 1]; - int rowSize = reader.GetTableRowSize(TableIndex.MethodSemantics); - for (int row = startRow; row <= endRow; row++) { - int rowOffset = row * rowSize; - byte* ptr = startPointer + offset + rowOffset; - var kind = (MethodSemanticsAttributes)(*(ushort*)ptr); - uint rowNo = methodDefRefSize == 2 ? *(ushort*)(ptr + 2) : *(uint*)(ptr + 2); - var handle = MetadataTokens.MethodDefinitionHandle((int)rowNo); - methods[row - startRow] = (kind, new MethodDefinition(module, handle)); - } - return methods.ToImmutableArray(); - } - - public MethodSignature DecodeSignature(ISignatureTypeProvider provider, TGenericContext genericContext) - { - return This().DecodeSignature(provider, genericContext); - } - */ } public struct FieldDefinition : IEquatable, IMetadataEntity @@ -677,29 +625,6 @@ namespace ICSharpCode.Decompiler.Metadata public static bool operator ==(EventDefinition lhs, EventDefinition rhs) => lhs.Equals(rhs); public static bool operator !=(EventDefinition lhs, EventDefinition rhs) => !lhs.Equals(rhs); - /* - public string Name { - get { - var reader = Module.GetMetadataReader(); - return reader.GetString(reader.GetEventDefinition(Handle).Name); - } - } - - public TypeDefinition DeclaringType => GetAccessors().First().Method.DeclaringType; - - public EventAttributes Attributes => This().Attributes; - public bool HasFlag(EventAttributes attribute) => (This().Attributes & attribute) == attribute; - public CustomAttributeHandleCollection CustomAttributes => This().GetCustomAttributes(); - - public MethodDefinition AddMethod => GetAccessors().FirstOrDefault(m => m.Kind == MethodSemanticsAttributes.Adder).Method; - public MethodDefinition RemoveMethod => GetAccessors().FirstOrDefault(m => m.Kind == MethodSemanticsAttributes.Remover).Method; - public MethodDefinition InvokeMethod => GetAccessors().FirstOrDefault(m => m.Kind == MethodSemanticsAttributes.Raiser).Method; - public ImmutableArray OtherMethods => GetAccessors().Where(a => a.Kind == MethodSemanticsAttributes.Other).Select(a => a.Method).ToImmutableArray(); - - public unsafe ImmutableArray<(MethodSemanticsAttributes Kind, MethodDefinition Method)> GetAccessors() - { - return PropertyDefinition.GetAccessors(Module, (uint)(MetadataTokens.GetRowNumber(Handle) << 1) | 0); - }*/ } public struct TypeDefinition : IEquatable, IMetadataEntity diff --git a/ICSharpCode.Decompiler/SRMHacks.cs b/ICSharpCode.Decompiler/SRMHacks.cs index 63a75c137..67bbc46e0 100644 --- a/ICSharpCode.Decompiler/SRMHacks.cs +++ b/ICSharpCode.Decompiler/SRMHacks.cs @@ -58,5 +58,30 @@ namespace ICSharpCode.Decompiler return list.ToImmutableArray(); } + + /* + internal static unsafe ImmutableArray<(MethodSemanticsAttributes Kind, MethodDefinition Method)> GetAccessors(PEFile module, uint encodedTag) + { + var reader = module.GetMetadataReader(); + byte* startPointer = reader.MetadataPointer; + int offset = reader.GetTableMetadataOffset(TableIndex.MethodSemantics); + + var methodDefRefSize = reader.GetReferenceSize(TableIndex.MethodDef); + (int startRow, int endRow) = reader.BinarySearchRange(TableIndex.MethodSemantics, 2 + methodDefRefSize, encodedTag, reader.IsSmallReference(TableIndex.MethodSemantics)); + if (startRow == -1) + return ImmutableArray<(MethodSemanticsAttributes Kind, MethodDefinition Method)>.Empty; + var methods = new(MethodSemanticsAttributes Kind, MethodDefinition Method)[endRow - startRow + 1]; + int rowSize = reader.GetTableRowSize(TableIndex.MethodSemantics); + for (int row = startRow; row <= endRow; row++) { + int rowOffset = row * rowSize; + byte* ptr = startPointer + offset + rowOffset; + var kind = (MethodSemanticsAttributes)(*(ushort*)ptr); + uint rowNo = methodDefRefSize == 2 ? *(ushort*)(ptr + 2) : *(uint*)(ptr + 2); + var handle = MetadataTokens.MethodDefinitionHandle((int)rowNo); + methods[row - startRow] = (kind, new MethodDefinition(module, handle)); + } + return methods.ToImmutableArray(); + } + */ } } diff --git a/ILSpy/Languages/Language.cs b/ILSpy/Languages/Language.cs index 888bc8f69..6b447eebf 100644 --- a/ILSpy/Languages/Language.cs +++ b/ILSpy/Languages/Language.cs @@ -62,7 +62,9 @@ namespace ICSharpCode.ILSpy public virtual void DecompileMethod(MethodDefinition method, ITextOutput output, DecompilationOptions options) { - WriteCommentLine(output, TypeToString(new Entity(method.Module, method.This().GetDeclaringType()), true) + "." + method.Name); + var metadata = method.Module.GetMetadataReader(); + var methodDefinition = metadata.GetMethodDefinition(method.Handle); + WriteCommentLine(output, TypeToString(new Entity(method.Module, methodDefinition.GetDeclaringType()), true) + "." + metadata.GetString(methodDefinition.Name)); } public virtual void DecompileProperty(PropertyDefinition property, ITextOutput output, DecompilationOptions options) diff --git a/ILSpy/MainWindow.xaml.cs b/ILSpy/MainWindow.xaml.cs index e45de4fb6..d40ad54c2 100644 --- a/ILSpy/MainWindow.xaml.cs +++ b/ILSpy/MainWindow.xaml.cs @@ -34,6 +34,7 @@ using System.Windows.Media.Imaging; using System.Windows.Threading; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.Documentation; +using ICSharpCode.Decompiler.Metadata; using ICSharpCode.ILSpy.TextView; using ICSharpCode.ILSpy.TreeNodes; using ICSharpCode.TreeView; @@ -576,44 +577,16 @@ namespace ICSharpCode.ILSpy public ILSpyTreeNode FindTreeNode(object reference) { - /*if (reference is TypeReference) - { - return assemblyListTreeNode.FindTypeNode(((TypeReference)reference).Resolve()); - } - else if (reference is MethodReference) - { - return assemblyListTreeNode.FindMethodNode(((MethodReference)reference).Resolve()); - } - else if (reference is FieldReference) - { - return assemblyListTreeNode.FindFieldNode(((FieldReference)reference).Resolve()); + switch (reference) { + case PEFile asm: + return assemblyListTreeNode.FindAssemblyNode(asm); + case Resource res: + return assemblyListTreeNode.FindResourceNode(res); + case IMetadataEntity entity: + throw new NotImplementedException(); + default: + return null; } - else if (reference is PropertyReference) - { - return assemblyListTreeNode.FindPropertyNode(((PropertyReference)reference).Resolve()); - } - else if (reference is EventReference) - { - return assemblyListTreeNode.FindEventNode(((EventReference)reference).Resolve()); - } - else if (reference is PEFile) - { - return assemblyListTreeNode.FindAssemblyNode((AssemblyDefinition)reference); - } - else if (reference is ModuleDefinition) - { - return assemblyListTreeNode.FindAssemblyNode((ModuleDefinition)reference); - } - else if (reference is Resource) - { - return null; - //return assemblyListTreeNode.FindResourceNode((Resource)reference); - } - else - { - return null; - }*/ - return null; } public void JumpToReference(object reference) diff --git a/ILSpy/TreeNodes/AssemblyListTreeNode.cs b/ILSpy/TreeNodes/AssemblyListTreeNode.cs index 56595a452..6898f53c1 100644 --- a/ILSpy/TreeNodes/AssemblyListTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyListTreeNode.cs @@ -45,9 +45,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public AssemblyListTreeNode(AssemblyList assemblyList) { - if (assemblyList == null) - throw new ArgumentNullException(nameof(assemblyList)); - this.assemblyList = assemblyList; + this.assemblyList = assemblyList ?? throw new ArgumentNullException(nameof(assemblyList)); BindToObservableCollection(assemblyList.assemblies); } @@ -154,7 +152,6 @@ namespace ICSharpCode.ILSpy.TreeNodes } #region Find*Node - /* public ILSpyTreeNode FindResourceNode(Resource resource) { if (resource == null) @@ -178,7 +175,6 @@ namespace ICSharpCode.ILSpy.TreeNodes } return null; } - */ public AssemblyTreeNode FindAssemblyNode(PEFile module) { diff --git a/ILSpy/TreeNodes/CopyFullyQualifiedNameContextMenuEntry.cs b/ILSpy/TreeNodes/CopyFullyQualifiedNameContextMenuEntry.cs index 94ff1815c..8dcdb730f 100644 --- a/ILSpy/TreeNodes/CopyFullyQualifiedNameContextMenuEntry.cs +++ b/ILSpy/TreeNodes/CopyFullyQualifiedNameContextMenuEntry.cs @@ -1,5 +1,6 @@ -using System.Windows; -using Mono.Cecil; +using System; +using System.Windows; +using ICSharpCode.Decompiler.Metadata; namespace ICSharpCode.ILSpy.TreeNodes { @@ -15,9 +16,9 @@ namespace ICSharpCode.ILSpy.TreeNodes public void Execute(TextViewContext context) { - /*var member = GetMemberNodeFromContext(context)?.Member; + var member = GetMemberNodeFromContext(context)?.Member; if (member == null) return; - Clipboard.SetText(GetFullyQualifiedName(member));*/ + Clipboard.SetText(GetFullyQualifiedName(member)); } private IMemberTreeNode GetMemberNodeFromContext(TextViewContext context) @@ -28,15 +29,16 @@ namespace ICSharpCode.ILSpy.TreeNodes /// /// Resolve full type name using .NET type representation for nested types. /// - private string GetFullyQualifiedName(MemberReference member) + private string GetFullyQualifiedName(IMetadataEntity member) { - if (member.DeclaringType != null) { + /*if (member.DeclaringType != null) { if (member is TypeReference) return GetFullyQualifiedName(member.DeclaringType) + "+" + member.Name; else return GetFullyQualifiedName(member.DeclaringType) + "." + member.Name; } - return (member is TypeReference t ? t.Namespace + "." : "") + member.Name; + return (member is TypeReference t ? t.Namespace + "." : "") + member.Name;*/ + throw new NotImplementedException(); } } } \ No newline at end of file diff --git a/ILSpy/TreeNodes/MethodTreeNode.cs b/ILSpy/TreeNodes/MethodTreeNode.cs index ea60b08f0..5b917451a 100644 --- a/ILSpy/TreeNodes/MethodTreeNode.cs +++ b/ILSpy/TreeNodes/MethodTreeNode.cs @@ -79,8 +79,8 @@ namespace ICSharpCode.ILSpy.TreeNodes { var metadata = method.Module.GetMetadataReader(); var methodDefinition = metadata.GetMethodDefinition(method.Handle); - - if (methodDefinition.HasFlag(MethodAttributes.SpecialName) && method.Name.StartsWith("op_", StringComparison.Ordinal)) { + var methodName = metadata.GetString(methodDefinition.Name); + if (methodDefinition.HasFlag(MethodAttributes.SpecialName) && methodName.StartsWith("op_", StringComparison.Ordinal)) { return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(methodDefinition.Attributes), false); } @@ -89,7 +89,7 @@ namespace ICSharpCode.ILSpy.TreeNodes } if (methodDefinition.HasFlag(MethodAttributes.SpecialName) && - (method.Name == ".ctor" || method.Name == ".cctor")) { + (methodName == ".ctor" || methodName == ".cctor")) { return Images.GetIcon(MemberIcon.Constructor, GetOverlayIcon(methodDefinition.Attributes), methodDefinition.HasFlag(MethodAttributes.Static)); } @@ -137,7 +137,9 @@ namespace ICSharpCode.ILSpy.TreeNodes { if (!settings.ShowInternalApi && !IsPublicAPI) return FilterResult.Hidden; - if (settings.SearchTermMatches(MethodDefinition.Name) && settings.Language.ShowMember(MethodDefinition)) + var metadata = MethodDefinition.Module.GetMetadataReader(); + var methodDefinition = metadata.GetMethodDefinition(MethodDefinition.Handle); + if (settings.SearchTermMatches(metadata.GetString(methodDefinition.Name)) && settings.Language.ShowMember(MethodDefinition)) return FilterResult.Match; else return FilterResult.Hidden;