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...