Browse Source

Fixed performance issue in Ctrl-Space completion.

pull/14/head
Daniel Grunwald 15 years ago
parent
commit
3e13c25cb1
  1. 6
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs

6
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CtrlSpaceResolveHelper.cs

@ -108,17 +108,19 @@ namespace ICSharpCode.SharpDevelop.Dom
if (callingClass == null) { if (callingClass == null) {
return; return;
} }
// use HashSet so that Contains lookups are possible in O(1).
HashSet<ICompletionEntry> existingResults = new HashSet<ICompletionEntry>(result);
string[] namespaceParts = callingClass.Namespace.Split('.'); string[] namespaceParts = callingClass.Namespace.Split('.');
for (int i = 1; i <= namespaceParts.Length; i++) { for (int i = 1; i <= namespaceParts.Length; i++) {
foreach (ICompletionEntry member in projectContent.GetNamespaceContents(string.Join(".", namespaceParts, 0, i))) { foreach (ICompletionEntry member in projectContent.GetNamespaceContents(string.Join(".", namespaceParts, 0, i))) {
if (!result.Contains(member)) if (!existingResults.Contains(member))
result.Add(member); result.Add(member);
} }
} }
IClass currentClass = callingClass; IClass currentClass = callingClass;
do { do {
foreach (IClass innerClass in currentClass.GetCompoundClass().GetAccessibleTypes(currentClass)) { foreach (IClass innerClass in currentClass.GetCompoundClass().GetAccessibleTypes(currentClass)) {
if (!result.Contains(innerClass)) if (!existingResults.Contains(innerClass))
result.Add(innerClass); result.Add(innerClass);
} }
currentClass = currentClass.DeclaringType; currentClass = currentClass.DeclaringType;

Loading…
Cancel
Save