From fe2adcd8872b4829b05a01cf1b61f01b9d72d7ea Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 5 Dec 2021 23:47:36 +0100 Subject: [PATCH] Add context menu entries to allow setting "inassembly:" and "innamespace:" prefixes from tree nodes and search results. --- .../CopyFullyQualifiedNameContextMenuEntry.cs | 21 ++++- ILSpy/Commands/ScopeSearchToAssembly.cs | 82 +++++++++++++++++++ ILSpy/Commands/ScopeSearchToNamespace.cs | 82 +++++++++++++++++++ ILSpy/Properties/Resources.Designer.cs | 18 ++++ ILSpy/Properties/Resources.resx | 6 ++ 5 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 ILSpy/Commands/ScopeSearchToAssembly.cs create mode 100644 ILSpy/Commands/ScopeSearchToNamespace.cs diff --git a/ILSpy/Commands/CopyFullyQualifiedNameContextMenuEntry.cs b/ILSpy/Commands/CopyFullyQualifiedNameContextMenuEntry.cs index 020fc76b3..0a197035c 100644 --- a/ILSpy/Commands/CopyFullyQualifiedNameContextMenuEntry.cs +++ b/ILSpy/Commands/CopyFullyQualifiedNameContextMenuEntry.cs @@ -1,9 +1,22 @@ -using System; +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. using System.Windows; -using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Metadata; -using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.ILSpy.Properties; using ICSharpCode.ILSpy.TreeNodes; diff --git a/ILSpy/Commands/ScopeSearchToAssembly.cs b/ILSpy/Commands/ScopeSearchToAssembly.cs new file mode 100644 index 000000000..89512a2c9 --- /dev/null +++ b/ILSpy/Commands/ScopeSearchToAssembly.cs @@ -0,0 +1,82 @@ +// Copyright (c) 2021 Siegfried Pammer +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +using System; + +using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.ILSpy.Properties; +using ICSharpCode.ILSpy.TreeNodes; + +namespace ICSharpCode.ILSpy +{ + [ExportContextMenuEntry(Header = nameof(Resources.ScopeSearchToThisAssembly), Category = nameof(Resources.Analyze), Order = 9999)] + public class ScopeSearchToAssembly : IContextMenuEntry + { + public void Execute(TextViewContext context) + { + string asmName = GetAssembly(context); + string searchTerm = MainWindow.Instance.SearchPane.SearchTerm; + string[] args = NativeMethods.CommandLineToArgumentArray(searchTerm); + bool replaced = false; + for (int i = 0; i < args.Length; i++) + { + if (args[i].StartsWith("inassembly:", StringComparison.OrdinalIgnoreCase)) + { + args[i] = "inassembly:" + asmName; + replaced = true; + break; + } + } + if (!replaced) + { + searchTerm += " inassembly:" + asmName; + } + else + { + searchTerm = NativeMethods.ArgumentArrayToCommandLine(args); + } + MainWindow.Instance.SearchPane.SearchTerm = searchTerm; + } + + public bool IsEnabled(TextViewContext context) + { + return GetAssembly(context) != null; + } + + public bool IsVisible(TextViewContext context) + { + return GetAssembly(context) != null; + } + + string GetAssembly(TextViewContext context) + { + if (context.Reference?.Reference is IEntity entity) + return entity.ParentModule.AssemblyName; + if (context.SelectedTreeNodes?.Length != 1) + return null; + switch (context.SelectedTreeNodes[0]) + { + case AssemblyTreeNode tn: + return tn.LoadedAssembly.ShortName; + case IMemberTreeNode member: + return member.Member.ParentModule.AssemblyName; + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/ILSpy/Commands/ScopeSearchToNamespace.cs b/ILSpy/Commands/ScopeSearchToNamespace.cs new file mode 100644 index 000000000..b1f194183 --- /dev/null +++ b/ILSpy/Commands/ScopeSearchToNamespace.cs @@ -0,0 +1,82 @@ +// Copyright (c) 2021 Siegfried Pammer +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +using System; + +using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.ILSpy.Properties; +using ICSharpCode.ILSpy.TreeNodes; + +namespace ICSharpCode.ILSpy +{ + [ExportContextMenuEntry(Header = nameof(Resources.ScopeSearchToThisNamespace), Category = nameof(Resources.Analyze), Order = 9999)] + public class ScopeSearchToNamespace : IContextMenuEntry + { + public void Execute(TextViewContext context) + { + string ns = GetNamespace(context); + string searchTerm = MainWindow.Instance.SearchPane.SearchTerm; + string[] args = NativeMethods.CommandLineToArgumentArray(searchTerm); + bool replaced = false; + for (int i = 0; i < args.Length; i++) + { + if (args[i].StartsWith("innamespace:", StringComparison.OrdinalIgnoreCase)) + { + args[i] = "innamespace:" + ns; + replaced = true; + break; + } + } + if (!replaced) + { + searchTerm += " innamespace:" + ns; + } + else + { + searchTerm = NativeMethods.ArgumentArrayToCommandLine(args); + } + MainWindow.Instance.SearchPane.SearchTerm = searchTerm; + } + + public bool IsEnabled(TextViewContext context) + { + return GetNamespace(context) != null; + } + + public bool IsVisible(TextViewContext context) + { + return GetNamespace(context) != null; + } + + string GetNamespace(TextViewContext context) + { + if (context.Reference?.Reference is IEntity entity) + return entity.Namespace; + if (context.SelectedTreeNodes?.Length != 1) + return null; + switch (context.SelectedTreeNodes[0]) + { + case NamespaceTreeNode tn: + return tn.Name; + case IMemberTreeNode member: + return member.Member.Namespace; + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/ILSpy/Properties/Resources.Designer.cs b/ILSpy/Properties/Resources.Designer.cs index 1fdc2e2cf..ffa968765 100644 --- a/ILSpy/Properties/Resources.Designer.cs +++ b/ILSpy/Properties/Resources.Designer.cs @@ -2194,6 +2194,24 @@ namespace ICSharpCode.ILSpy.Properties { } } + /// + /// Looks up a localized string similar to Scope search to this assembly. + /// + public static string ScopeSearchToThisAssembly { + get { + return ResourceManager.GetString("ScopeSearchToThisAssembly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scope search to this namespace. + /// + public static string ScopeSearchToThisNamespace { + get { + return ResourceManager.GetString("ScopeSearchToThisNamespace", resourceCulture); + } + } + /// /// Looks up a localized string similar to Search.... /// diff --git a/ILSpy/Properties/Resources.resx b/ILSpy/Properties/Resources.resx index b01f6a5ba..81a874de8 100644 --- a/ILSpy/Properties/Resources.resx +++ b/ILSpy/Properties/Resources.resx @@ -755,6 +755,12 @@ Do you want to continue? Save Code + + Scope search to this assembly + + + Scope search to this namespace + Search...