diff --git a/ILSpy/SearchPane.cs b/ILSpy/SearchPane.cs index ee743b425..7c7fc7a55 100644 --- a/ILSpy/SearchPane.cs +++ b/ILSpy/SearchPane.cs @@ -58,6 +58,7 @@ namespace ICSharpCode.ILSpy private SearchPane() { InitializeComponent(); + searchModeComboBox.Items.Add(new { Image = Images.Library, Name = "Types and Members" }); searchModeComboBox.Items.Add(new { Image = Images.Class, Name = "Type" }); searchModeComboBox.Items.Add(new { Image = Images.Property, Name = "Member" }); searchModeComboBox.Items.Add(new { Image = Images.Method, Name = "Method" }); @@ -65,7 +66,7 @@ namespace ICSharpCode.ILSpy searchModeComboBox.Items.Add(new { Image = Images.Property, Name = "Property" }); searchModeComboBox.Items.Add(new { Image = Images.Event, Name = "Event" }); searchModeComboBox.Items.Add(new { Image = Images.Literal, Name = "Constant" }); - searchModeComboBox.SelectedIndex = (int)SearchMode.Type; + searchModeComboBox.SelectedIndex = (int)SearchMode.TypeAndMember; ContextMenuProvider.Add(listBox); MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged; @@ -253,6 +254,9 @@ namespace ICSharpCode.ILSpy AbstractSearchStrategy GetSearchStrategy(SearchMode mode, string[] terms) { if (terms.Length == 1) { + if (terms[0].StartsWith("tm:", StringComparison.Ordinal)) + return new TypeAndMemberSearchStrategy(terms[0].Substring(3)); + if (terms[0].StartsWith("t:", StringComparison.Ordinal)) return new TypeSearchStrategy(terms[0].Substring(2)); @@ -277,6 +281,8 @@ namespace ICSharpCode.ILSpy switch (mode) { + case SearchMode.TypeAndMember: + return new TypeAndMemberSearchStrategy(terms); case SearchMode.Type: return new TypeSearchStrategy(terms); case SearchMode.Member: @@ -333,6 +339,7 @@ namespace ICSharpCode.ILSpy public enum SearchMode { + TypeAndMember, Type, Member, Method, diff --git a/ILSpy/SearchStrategies.cs b/ILSpy/SearchStrategies.cs index 47ea64d0f..7d0912a0b 100644 --- a/ILSpy/SearchStrategies.cs +++ b/ILSpy/SearchStrategies.cs @@ -373,4 +373,53 @@ namespace ICSharpCode.ILSpy } } + class TypeAndMemberSearchStrategy : AbstractSearchStrategy + { + public TypeAndMemberSearchStrategy(params string[] terms) + : base(terms) + { + } + + public override void Search(TypeDefinition type, Language language, Action addResult) + { + if (IsMatch(type.Name) || IsMatch(type.FullName)) + { + addResult(new SearchResult + { + Member = type, + Image = TypeTreeNode.GetIcon(type), + Name = language.TypeToString(type, includeNamespace: false), + LocationImage = type.DeclaringType != null ? TypeTreeNode.GetIcon(type.DeclaringType) : Images.Namespace, + Location = type.DeclaringType != null ? language.TypeToString(type.DeclaringType, includeNamespace: true) : type.Namespace + }); + } + + foreach (TypeDefinition nestedType in type.NestedTypes) + { + Search(nestedType, language, addResult); + } + + base.Search(type, language, addResult); + } + + protected override bool IsMatch(FieldDefinition field) + { + return IsMatch(field.Name); + } + + protected override bool IsMatch(PropertyDefinition property) + { + return IsMatch(property.Name); + } + + protected override bool IsMatch(EventDefinition ev) + { + return IsMatch(ev.Name); + } + + protected override bool IsMatch(MethodDefinition m) + { + return IsMatch(m.Name); + } + } }