diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
index 5108610f1c..45aeeaadb5 100644
--- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
+++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
@@ -49,6 +49,11 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
///
public class CodeCompletionItemProvider : AbstractCompletionItemProvider
{
+ ///
+ /// Gets/Sets whether items from all namespaces should be included in code completion, regardless of imports.
+ ///
+ public bool ShowItemsFromAllNamespaces { get; set; }
+
///
public override ICompletionItemList GenerateCompletionList(ITextEditor editor)
{
@@ -103,7 +108,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
if (rr == null)
return null;
IProjectContent callingContent = rr.CallingClass != null ? rr.CallingClass.ProjectContent : null;
- List arr = rr.GetCompletionData(callingContent ?? ParserService.CurrentProjectContent);
+ List arr = rr.GetCompletionData(callingContent ?? ParserService.CurrentProjectContent, this.ShowItemsFromAllNamespaces);
return GenerateCompletionListForCompletionData(arr, context);
}
diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CtrlSpaceCompletionItemProvider.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/CtrlSpaceCompletionItemProvider.cs
index e454b67499..f4e4a88c6a 100644
--- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CtrlSpaceCompletionItemProvider.cs
+++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/CtrlSpaceCompletionItemProvider.cs
@@ -27,17 +27,12 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
ExpressionContext overrideContext;
- bool allowCompleteExistingExpression;
-
///
/// Gets/Sets whether completing an old expression is allowed.
/// You have to set this property to true to let the provider run FindExpression, when
/// set to false it will use ExpressionContext.Default (unless the constructor with "overrideContext" was used).
///
- public bool AllowCompleteExistingExpression {
- get { return allowCompleteExistingExpression; }
- set { allowCompleteExistingExpression = value; }
- }
+ public bool AllowCompleteExistingExpression { get; set; }
///
/// Gets/Sets whether code templates should be included in code completion.
@@ -67,7 +62,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
ICompletionItemList GenerateCompletionListCore(ITextEditor editor)
{
preselectionLength = 0;
- if (!allowCompleteExistingExpression) {
+ if (!AllowCompleteExistingExpression) {
ExpressionContext context = overrideContext ?? ExpressionContext.Default;
var ctrlSpace = CtrlSpace(editor, context);
return GenerateCompletionListForCompletionData(ctrlSpace, context);
@@ -128,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
editor.Caret.Line, editor.Caret.Column,
ParserService.GetParseInformation(editor.FileName),
editor.Document.Text,
- context);
+ context, this.ShowItemsFromAllNamespaces);
}
}
}
diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryCodeCompletionBinding.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryCodeCompletionBinding.cs
index 50a9ea0ab4..6b8a9f1c37 100644
--- a/src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryCodeCompletionBinding.cs
+++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryCodeCompletionBinding.cs
@@ -64,6 +64,8 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
{
NRefactoryCtrlSpaceCompletionItemProvider provider = new NRefactoryCtrlSpaceCompletionItemProvider(languageProperties);
provider.AllowCompleteExistingExpression = true;
+ // on Ctrl+Space, include members (e.g. extension methods) from all namespaces, regardless of imports
+ provider.ShowItemsFromAllNamespaces = true;
provider.ShowCompletion(editor);
return true;
}
diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs
index d3714bf730..38b34b7f3a 100644
--- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs
+++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs
@@ -235,7 +235,7 @@ namespace ICSharpCode.SharpDevelop.Dom
return null;
}
- public static IList FindAllExtensions(LanguageProperties language, IClass callingClass)
+ public static IList FindAllExtensions(LanguageProperties language, IClass callingClass, bool searchInAllNamespaces = false)
{
if (language == null)
throw new ArgumentNullException("language");
@@ -251,9 +251,12 @@ namespace ICSharpCode.SharpDevelop.Dom
IMethod dummyMethod = new DefaultMethod("dummy", callingClass.ProjectContent.SystemTypes.Void,
ModifierEnum.Static, DomRegion.Empty, DomRegion.Empty, callingClass);
CtrlSpaceResolveHelper.AddContentsFromCalling(list, callingClass, dummyMethod);
- CtrlSpaceResolveHelper.AddImportedNamespaceContents(list, callingClass.CompilationUnit, callingClass);
- // search extension methods in all referenced projects, no matter the using section
- //CtrlSpaceResolveHelper.AddReferencedProjectsContents(list, callingClass.CompilationUnit, callingClass);
+ if (searchInAllNamespaces) {
+ // search extension methods in all referenced projects, no matter the using section
+ CtrlSpaceResolveHelper.AddReferencedProjectsContents(list, callingClass.CompilationUnit, callingClass);
+ } else {
+ CtrlSpaceResolveHelper.AddImportedNamespaceContents(list, callingClass.CompilationUnit, callingClass);
+ }
bool searchExtensionsInClasses = language.SearchExtensionsInClasses;
foreach (object o in list) {
diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs
index 946d90167c..3bc4e0318f 100644
--- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs
+++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs
@@ -1010,13 +1010,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
ReadOnlyCollection cachedExtensionMethods;
IClass cachedExtensionMethods_LastClass; // invalidate cache when callingClass != LastClass
- public ReadOnlyCollection SearchAllExtensionMethods()
+ public ReadOnlyCollection SearchAllExtensionMethods(bool searchInAllNamespaces = false)
{
if (callingClass == null)
return EmptyList.Instance;
if (callingClass != cachedExtensionMethods_LastClass) {
cachedExtensionMethods_LastClass = callingClass;
- cachedExtensionMethods = new ReadOnlyCollection(CtrlSpaceResolveHelper.FindAllExtensions(languageProperties, callingClass));
+ cachedExtensionMethods = new ReadOnlyCollection(CtrlSpaceResolveHelper.FindAllExtensions(languageProperties, callingClass, searchInAllNamespaces));
}
return cachedExtensionMethods;
}
@@ -1122,7 +1122,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
}
- public List CtrlSpace(int caretLine, int caretColumn, ParseInformation parseInfo, string fileContent, ExpressionContext context)
+ ///
+ /// Returns code completion entries for given context.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// If true, returns entries from all namespaces, regardless of current imports.
+ ///
+ public List CtrlSpace(int caretLine, int caretColumn, ParseInformation parseInfo, string fileContent, ExpressionContext context, bool showEntriesFromAllNamespaces = false)
{
if (!Initialize(parseInfo, caretLine, caretColumn))
return null;
@@ -1231,7 +1241,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
}
- void CtrlSpaceInternal(List result, string fileContent)
+ void CtrlSpaceInternal(List result, string fileContent, bool showEntriesFromAllNamespaces = true)
{
lookupTableVisitor = new LookupTableVisitor(language);
@@ -1265,11 +1275,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
result.Add(new DefaultField.ParameterField(callingMember.ReturnType, "value", callingMember.Region, callingClass));
}
- // CC contains contents of all imported namespaces
- //CtrlSpaceResolveHelper.AddImportedNamespaceContents(result, cu, callingClass); // FindReferences to AddImportedNamespaceContents results in OutOfMemory
-
- // CC contains contents of all referenced assemblies
- CtrlSpaceResolveHelper.AddReferencedProjectsContents(result, cu, callingClass);
+ if (showEntriesFromAllNamespaces) {
+ // CC contains contents of all referenced assemblies
+ CtrlSpaceResolveHelper.AddReferencedProjectsContents(result, cu, callingClass);
+ } else {
+ // CC contains contents of all imported namespaces
+ CtrlSpaceResolveHelper.AddImportedNamespaceContents(result, cu, callingClass);
+ }
}
sealed class CompareLambdaByLocation : IEqualityComparer
diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs
index d5e5b8fa1d..2289780acf 100644
--- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs
+++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs
@@ -78,6 +78,24 @@ namespace ICSharpCode.SharpDevelop.Dom
return this.Clone();
}
+ bool showAllNamespacesContentsInCC = false;
+ ///
+ /// Gets code completion data for this ResolveResult.
+ ///
+ ///
+ /// If true, items (e.g. extension methods) from all namespaces are returned, regardless current imports. Default is false.
+ ///
+ public List GetCompletionData(IProjectContent projectContent, bool showItemsFromAllNamespaces)
+ {
+ // Little hack - store value in a property to pass it to GetCompletionData(LanguageProperties language, bool showStatic)
+ // Otherwise we would have to add it as a parameter to GetCompletionData(IProjectContent projectContent),
+ // which would change signature in classes overriding this method as well.
+ this.showAllNamespacesContentsInCC = showItemsFromAllNamespaces;
+ var result = GetCompletionData(projectContent);
+ this.showAllNamespacesContentsInCC = false;
+ return result;
+ }
+
public virtual List GetCompletionData(IProjectContent projectContent)
{
return GetCompletionData(projectContent.Language, false);
@@ -94,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.Dom
}
if (!showStatic && callingClass != null) {
- AddExtensions(language, res.Add, callingClass, resolvedType);
+ AddExtensions(language, res.Add, callingClass, resolvedType, this.showAllNamespacesContentsInCC);
}
return res;
@@ -103,7 +121,7 @@ namespace ICSharpCode.SharpDevelop.Dom
///
/// Adds extension methods to .
///
- public static void AddExtensions(LanguageProperties language, Action methodFound, IClass callingClass, IReturnType resolvedType)
+ public static void AddExtensions(LanguageProperties language, Action methodFound, IClass callingClass, IReturnType resolvedType, bool searchInAllNamespaces = false)
{
if (language == null)
throw new ArgumentNullException("language");
@@ -117,7 +135,7 @@ namespace ICSharpCode.SharpDevelop.Dom
// convert resolvedType into direct type to speed up the IsApplicable lookups
resolvedType = resolvedType.GetDirectReturnType();
- foreach (IMethodOrProperty mp in CtrlSpaceResolveHelper.FindAllExtensions(language, callingClass)) {
+ foreach (IMethodOrProperty mp in CtrlSpaceResolveHelper.FindAllExtensions(language, callingClass, searchInAllNamespaces)) {
TryAddExtension(language, methodFound, mp, resolvedType);
}
}