From 6a80949468150b97bdd88dd3327b635733614d85 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Thu, 22 Apr 2010 18:30:43 +0400 Subject: [PATCH] misc optimizations for showing lookup with many elements: - using ContainerUtil.toArray - cheaper checks of relevance to Java-specific weighers - avoid expensive Class#isInstanceOf of LookupElement#as using: * LookupItem#from with explicit instanceof LookupItem (caring of LookupElementDecorator) * isCaseSensitive introduced to LookupElement --- .../completion/JavaCompletionStatistician.java | 2 +- .../codeInsight/completion/JavaCompletionUtil.java | 3 +-- .../codeInsight/completion/StaticMembersWeigher.java | 7 ++++--- .../psi/util/proximity/JavaInheritanceWeigher.java | 8 +++++--- .../intellij/codeInsight/lookup/LookupElement.java | 4 ++++ .../codeInsight/lookup/LookupElementDecorator.java | 4 ++++ .../src/com/intellij/psi/WeighingService.java | 3 ++- .../completion/impl/CamelHumpMatcher.java | 9 +-------- .../com/intellij/codeInsight/lookup/LookupItem.java | 12 ++++++++++++ 9 files changed, 34 insertions(+), 18 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java index 3897e6bf60a9..53c086b921ae 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java @@ -51,7 +51,7 @@ public class JavaCompletionStatistician extends CompletionStatistician{ } } - LookupItem item = element.as(LookupItem.class); + LookupItem item = LookupItem.from(element); if (item == null) return null; PsiType qualifierType = JavaCompletionUtil.getQualifierType(item); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 5d117e06d698..f1e4c57abf95 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -789,9 +789,8 @@ public class JavaCompletionUtil { return typed.getType(); } - final PsiType qualifierType = getPsiType(element.getObject()); - final LookupItem lookupItem = element.as(LookupItem.class); + final LookupItem lookupItem = LookupItem.from(element); if (lookupItem != null) { final Object o = lookupItem.getAttribute(LookupItem.TYPE); if (o instanceof PsiType) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMembersWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMembersWeigher.java index 6cd3ff7dc0b8..d6c57c7b8ed1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMembersWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMembersWeigher.java @@ -31,6 +31,10 @@ public class StaticMembersWeigher extends CompletionWeigher { final PsiElement position = loc.getCompletionParameters().getPosition(); if (!position.isValid()) return 0; + // cheap weigher applicability goes first + final Object o = element.getObject(); + if (!(o instanceof PsiMember)) return 0; + if (PsiTreeUtil.getParentOfType(position, PsiDocComment.class) != null) return 0; if (position.getParent() instanceof PsiReferenceExpression) { final PsiReferenceExpression refExpr = (PsiReferenceExpression)position.getParent(); @@ -43,9 +47,6 @@ public class StaticMembersWeigher extends CompletionWeigher { } } - final Object o = element.getObject(); - if (!(o instanceof PsiMember)) return 0; - if (((PsiMember)o).hasModifierProperty(PsiModifier.STATIC)) { if (o instanceof PsiMethod) return 5; if (o instanceof PsiField) return 4; diff --git a/java/java-impl/src/com/intellij/psi/util/proximity/JavaInheritanceWeigher.java b/java/java-impl/src/com/intellij/psi/util/proximity/JavaInheritanceWeigher.java index 227cc74a2809..ac39286e7063 100644 --- a/java/java-impl/src/com/intellij/psi/util/proximity/JavaInheritanceWeigher.java +++ b/java/java-impl/src/com/intellij/psi/util/proximity/JavaInheritanceWeigher.java @@ -28,6 +28,9 @@ import org.jetbrains.annotations.Nullable; public class JavaInheritanceWeigher extends ProximityWeigher { public Comparable weigh(@NotNull final PsiElement element, final ProximityLocation location) { + if (element instanceof PsiClass && isTooGeneral((PsiClass)element)) return false; + if (element instanceof PsiMethod && isTooGeneral(((PsiMethod)element).getContainingClass())) return false; + final PsiElement position = location.getPosition(); PsiClass placeClass = PsiTreeUtil.getContextOfType(element, PsiClass.class, false); if (position.getParent() instanceof PsiReferenceExpression) { @@ -43,9 +46,8 @@ public class JavaInheritanceWeigher extends ProximityWeigher { } } - if (element instanceof PsiClass && isTooGeneral((PsiClass)element)) return false; - if (element instanceof PsiMethod && isTooGeneral(((PsiMethod)element).getContainingClass())) return false; - + if (placeClass == null) return false; + PsiClass contextClass = PsiTreeUtil.getContextOfType(position, PsiClass.class, false); while (contextClass != null) { PsiClass elementClass = placeClass; diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java index 36551be199db..f347e1ad2674 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java @@ -78,4 +78,8 @@ public abstract class LookupElement extends UserDataHolderBase { //noinspection unchecked return aClass.isInstance(this) ? (T) this : null; } + + public boolean isCaseSensitive() { + return true; + } } diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java index 83b49414f150..1aab873ff062 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java @@ -112,6 +112,10 @@ public abstract class LookupElementDecorator extends Lo final T t = super.as(aClass); return t == null ? myDelegate.as(aClass) : t; } + + public boolean isCaseSensitive() { + return myDelegate.isCaseSensitive(); + } private static class InsertingDecorator extends LookupElementDecorator { private final InsertHandler> myInsertHandler; diff --git a/platform/lang-api/src/com/intellij/psi/WeighingService.java b/platform/lang-api/src/com/intellij/psi/WeighingService.java index 7fd0b33cd2fe..4a685e76a11a 100644 --- a/platform/lang-api/src/com/intellij/psi/WeighingService.java +++ b/platform/lang-api/src/com/intellij/psi/WeighingService.java @@ -17,6 +17,7 @@ package com.intellij.psi; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.KeyedExtensionCollector; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -37,7 +38,7 @@ public class WeighingService { @NotNull public static WeighingComparable weigh(Key> key, T element, Loc location) { final List weighers = COLLECTOR.forKey(key); - return new WeighingComparable(element, location, weighers.toArray(new Weigher[weighers.size()])); + return new WeighingComparable(element, location, ContainerUtil.toArray(weighers, new Weigher[weighers.size()])); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java index 1da6c1810f49..8c06d094e91e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java @@ -7,8 +7,6 @@ package com.intellij.codeInsight.completion.impl; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.codeInsight.lookup.LookupElementBuilder; -import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.NameUtil; import com.intellij.util.containers.hash.LinkedHashMap; @@ -62,12 +60,7 @@ public class CamelHumpMatcher extends PrefixMatcher { public boolean prefixMatches(@NotNull final LookupElement element) { - final LookupItem item = element.as(LookupItem.class); //must die, use LookupElementBuilder or CompletionResultSet.caseInsensitive - final LookupElementBuilder builder = element.as(LookupElementBuilder.class); - boolean itemCaseInsensitive = item != null && Boolean.TRUE.equals(item.getAttribute(LookupItem.CASE_INSENSITIVE)) || - builder != null && !builder.isCaseSensitive(); - - return prefixMatchersInternal(element, itemCaseInsensitive); + return prefixMatchersInternal(element, !element.isCaseSensitive()); } private boolean prefixMatchersInternal(final LookupElement element, final boolean itemCaseInsensitive) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java index a1337eb12f77..27c3d885c1fa 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java @@ -359,4 +359,16 @@ public class LookupItem extends MutableLookupElement implements Comparable myAttributes.putAll(item.myAttributes); } + @Override + public boolean isCaseSensitive() { + return !Boolean.TRUE.equals(getAttribute(CASE_INSENSITIVE)); + } + + public static @Nullable LookupItem from(LookupElement lookupElement) { + if (lookupElement instanceof LookupElementDecorator) { + lookupElement = ((LookupElementDecorator)lookupElement).getDelegate(); + } + if (lookupElement instanceof LookupItem) return (LookupItem)lookupElement; + return null; + } }