diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java b/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java index c9e5c70a7bfd..9b97a9451a2b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.*; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiType; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -27,6 +28,8 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class CastingLookupElementDecorator extends LookupElementDecorator implements TypedLookupItem { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(CastingLookupElementDecorator.class); + private final LookupElement myCastItem; private final PsiType myCastType; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java index e2afa96bbdfe..62c4e060a265 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.*; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; @@ -30,6 +31,7 @@ import java.util.Set; * @author peter */ public class JavaChainLookupElement extends LookupElementDecorator implements TypedLookupItem { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaChainLookupElement.class); private final LookupElement myQualifier; private JavaChainLookupElement(LookupElement qualifier, LookupElement main) { @@ -72,7 +74,7 @@ public class JavaChainLookupElement extends LookupElementDecorator implements TypedLookupItem, StaticallyImportable { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaMethodCallElement.class); private static final Key INFERENCE_SUBSTITUTOR = Key.create("INFERENCE_SUBSTITUTOR"); @Nullable private final PsiClass myContainingClass; private final PsiMethod myMethod; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java index 513302500f98..74bdc7ccc0a5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java @@ -49,7 +49,7 @@ public class JavaMethodMergingContributor extends CompletionContributor { } final PsiMethod method = (PsiMethod)o; - final JavaChainLookupElement chain = item.as(JavaChainLookupElement.class); + final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); final String name = method.getName() + "#" + (chain == null ? "" : chain.getQualifier().getLookupString()); if (commonName != null && !commonName.equals(name)) { return AutoCompletionDecision.SHOW_LOOKUP; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java index 4a9c69361352..a3f8154cca60 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java @@ -21,7 +21,6 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiType; import com.intellij.psi.PsiTypeParameter; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author peter @@ -29,13 +28,10 @@ import org.jetbrains.annotations.Nullable; public class PreferNonGenericWeigher extends CompletionWeigher { public Comparable weigh(@NotNull final LookupElement item, @NotNull final CompletionLocation location) { - if (location == null) { - return null; - } final Object object = item.getObject(); if (object instanceof PsiMethod) { PsiType type = ((PsiMethod)object).getReturnType(); - final JavaMethodCallElement callItem = item.as(JavaMethodCallElement.class); + final JavaMethodCallElement callItem = item.as(JavaMethodCallElement.CLASS_CONDITION_KEY); if (callItem != null) { type = callItem.getSubstitutor().substitute(type); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index a420ee3fd001..1f92244fec69 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -167,7 +167,7 @@ public class ReferenceExpressionCompletionContributor { }), false, parameters); for (LookupElement lookupElement : elements) { if (lookupElement.getObject() instanceof PsiMethod) { - final JavaMethodCallElement item = lookupElement.as(JavaMethodCallElement.class); + final JavaMethodCallElement item = lookupElement.as(JavaMethodCallElement.CLASS_CONDITION_KEY); assert item != null; final PsiMethod method = (PsiMethod)lookupElement.getObject(); if (SmartCompletionDecorator.hasUnboundTypeParams(method)) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java index 281827fac929..ef32d2520c77 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java @@ -59,7 +59,7 @@ public class SmartCompletionDecorator extends TailTypeDecorator { } LookupElement delegate = getDelegate(); - LookupItem item = as(LookupItem.class); + LookupItem item = as(LookupItem.CLASS_CONDITION_KEY); Object object = delegate.getObject(); if (!CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET && (object instanceof PsiMethod || object instanceof PsiClass)) { return TailType.NONE; diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java b/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java index 13df562fcc7b..07718c7181fd 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementDecorator; +import com.intellij.openapi.util.ClassConditionKey; import org.jetbrains.annotations.Nullable; /** @@ -28,6 +29,7 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class PrioritizedLookupElement extends LookupElementDecorator { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(PrioritizedLookupElement.class); private final double myPriority; private final int myGrouping; diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java index 96c7ac02fc49..e9b76972dcde 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.lookup; +import com.intellij.openapi.util.ClassConditionKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,7 +57,7 @@ public enum AutoCompletionPolicy { @Nullable public static AutoCompletionPolicy getPolicy(LookupElement element) { - final PolicyDecorator decorator = element.as(PolicyDecorator.class); + final PolicyDecorator decorator = element.as(PolicyDecorator.CLASS_CONDITION_KEY); if (decorator != null) { return decorator.myPolicy; } @@ -64,6 +65,7 @@ public enum AutoCompletionPolicy { } private static class PolicyDecorator extends LookupElementDecorator { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(PolicyDecorator.class); private final AutoCompletionPolicy myPolicy; public PolicyDecorator(LookupElement element, AutoCompletionPolicy policy) { 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 10ad5a4984c0..af5581c3e8ff 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.lookup; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -82,10 +83,18 @@ public abstract class LookupElement extends UserDataHolderBase { presentation.setItemText(getLookupString()); } + /** + * use {@link #as(com.intellij.openapi.util.ClassConditionKey)} instead + */ + @Deprecated @Nullable - public T as(Class aClass) { - //noinspection unchecked - return aClass.isInstance(this) ? (T) this : null; + public final T as(Class aClass) { + return as(ClassConditionKey.create(aClass)); + } + + @Nullable + public T as(ClassConditionKey conditionKey) { + return conditionKey.isInstance(this) ? (T) this : null; } public boolean isCaseSensitive() { 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 1aab873ff062..3584b38fb685 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.completion.CompletionService; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.openapi.util.ClassConditionKey; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -108,9 +109,9 @@ public abstract class LookupElementDecorator extends Lo } @Override - public T as(Class aClass) { - final T t = super.as(aClass); - return t == null ? myDelegate.as(aClass) : t; + public T as(ClassConditionKey conditionKey) { + final T t = super.as(conditionKey); + return t == null ? myDelegate.as(conditionKey) : t; } public boolean isCaseSensitive() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 9035ea961bb7..af8c10fd19a6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -452,7 +452,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { return policy; } - final LookupItem item = element.as(LookupItem.class); + final LookupItem item = element.as(LookupItem.CLASS_CONDITION_KEY); if (item != null) { return item.getAutoCompletionPolicy(); } @@ -505,8 +505,8 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { protected void run(Result result) throws Throwable { String uniqueText = _uniqueText; - if (item.getObject() instanceof DeferredUserLookupValue && item.as(LookupItem.class) != null) { - if (!((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.class), context.getProject())) { + if (item.getObject() instanceof DeferredUserLookupValue && item.as(LookupItem.CLASS_CONDITION_KEY) != null) { + if (!((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.CLASS_CONDITION_KEY), context.getProject())) { return; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java index 10d7fda3fd4b..a452c63ec561 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java @@ -18,7 +18,6 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author peter @@ -26,10 +25,7 @@ import org.jetbrains.annotations.Nullable; public class GroupingWeigher extends CompletionWeigher { @Override public Integer weigh(@NotNull LookupElement element, @NotNull CompletionLocation location) { - if (location == null) { - return null; - } - final PrioritizedLookupElement prioritized = element.as(PrioritizedLookupElement.class); + final PrioritizedLookupElement prioritized = element.as(PrioritizedLookupElement.CLASS_CONDITION_KEY); if (prioritized != null) { return -prioritized.getGrouping(); } 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 13dd3f790f53..113fc37dd4f2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java @@ -25,6 +25,7 @@ import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.impl.ElementLookupRenderer; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; import com.intellij.util.containers.ContainerUtil; @@ -42,6 +43,8 @@ import java.util.Set; * This class represents an item of a lookup list. */ public class LookupItem extends MutableLookupElement implements Comparable { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(LookupItem.class); + public static final Object HIGHLIGHTED_ATTR = Key.create("highlighted"); public static final Object ICON_ATTR = Key.create("icon"); public static final Object TYPE_TEXT_ATTR = Key.create("typeText"); @@ -358,14 +361,6 @@ public class LookupItem extends MutableLookupElement implements Comparable return myAllLookupStrings; } - public void copyAttributes(final LookupItem item) { - if (myAttributes == null) { - if (item.myAttributes == null) return; - myAttributes = new HashMap(5); - } - myAttributes.putAll(item.myAttributes); - } - @Override public boolean isCaseSensitive() { return !Boolean.TRUE.equals(getAttribute(CASE_INSENSITIVE)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java index 264afef7d421..f5c649b16ee1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java @@ -46,7 +46,7 @@ public abstract class TailTypeDecorator extends LookupE final LookupElement delegate = getDelegate(); final TailType tailType = computeTailType(context); - final LookupItem lookupItem = delegate.as(LookupItem.class); + final LookupItem lookupItem = delegate.as(LookupItem.CLASS_CONDITION_KEY); if (lookupItem != null && tailType != null) { lookupItem.setTailType(TailType.UNKNOWN); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index bec42fbd1224..7b334b63176a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -593,8 +593,8 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { if (item == null || item instanceof EmptyLookupItem || item.getObject() instanceof DeferredUserLookupValue && - item.as(LookupItem.class) != null && - !((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.class), myProject)) { + item.as(LookupItem.CLASS_CONDITION_KEY) != null && + !((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.CLASS_CONDITION_KEY), myProject)) { fireItemSelected(null, completionChar); return; } diff --git a/platform/platform-api/src/com/intellij/openapi/util/ClassConditionKey.java b/platform/platform-api/src/com/intellij/openapi/util/ClassConditionKey.java new file mode 100644 index 000000000000..fb47b5f635e3 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/util/ClassConditionKey.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.util; + +import com.intellij.util.InstanceofCheckerGenerator; + +/** + * @author peter + */ +public class ClassConditionKey { + private final Condition myCondition; + private final Class myConditionClass; + + private ClassConditionKey(Class aClass) { + myCondition = InstanceofCheckerGenerator.getInstance().getInstanceofChecker(aClass); + myConditionClass = aClass; + } + + public static ClassConditionKey create(Class aClass) { + return new ClassConditionKey(aClass); + } + + public boolean isInstance(Object o) { + return myCondition.value(o); + } + + @Override + public String toString() { + return myConditionClass.getName(); + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java index 9af0d1b949b3..08bc54b2eccc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java @@ -57,7 +57,7 @@ public class GrMethodMergingContributor extends CompletionContributor { } final PsiMethod method = (PsiMethod)o; - final JavaChainLookupElement chain = item.as(JavaChainLookupElement.class); + final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); final String name = method.getName() + "#" + (chain == null ? "" : chain.getQualifier().getLookupString()); if (commonName != null && !commonName.equals(name)) {