From 4e5faa4c7bcd2f629f3edd1906670325c127cf3c Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 27 Aug 2015 15:38:30 +0200 Subject: [PATCH] unify how java lookup elements determine their type --- .../completion/ConstructorInsertHandler.java | 2 +- .../completion/JavaCompletionContributor.java | 2 +- .../completion/JavaCompletionUtil.java | 42 +------------------ .../JavaPsiClassReferenceElement.java | 15 ++++--- .../NullSmartCompletionContributor.java | 2 - .../TypeArgumentCompletionProvider.java | 2 +- .../codeInsight/lookup/PsiTypeLookupItem.java | 15 +++---- .../template/macro/ComponentTypeOfMacro.java | 5 +-- .../codeInsight/lookup/LookupItem.java | 1 - .../completion/GroovyNoVariantsDelegator.java | 21 +++++++++- 10 files changed, 43 insertions(+), 64 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java index 64a16addf3c3..4c81a4e2a87a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ConstructorInsertHandler.java @@ -178,7 +178,7 @@ public class ConstructorInsertHandler implements InsertHandler { +public class JavaPsiClassReferenceElement extends LookupItem implements TypedLookupItem { public static final Key PACKAGE_NAME = Key.create("PACKAGE_NAME"); public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaPsiClassReferenceElement.class); private final Object myClass; @@ -63,6 +60,14 @@ public class JavaPsiClassReferenceElement extends LookupItem { return myForcedPresentableName; } + @Nullable + @Override + public PsiType getType() { + PsiClass psiClass = getObject(); + final PsiSubstitutor substitutor = (PsiSubstitutor)getAttribute(LookupItem.SUBSTITUTOR); + return JavaPsiFacade.getElementFactory(psiClass.getProject()).createType(psiClass, substitutor == null ? PsiSubstitutor.EMPTY : substitutor); + } + @NotNull @Override public String getLookupString() { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java index fdfd1b3f93f0..6e433c81d280 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java @@ -20,7 +20,6 @@ import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiKeyword; import com.intellij.psi.PsiPrimitiveType; -import com.intellij.psi.PsiType; import java.util.Collection; import java.util.LinkedHashSet; @@ -53,7 +52,6 @@ public class NullSmartCompletionContributor extends CompletionContributor{ for (final ExpectedTypeInfo info : infos) { if (!(info.getType() instanceof PsiPrimitiveType)) { final LookupItem item = (LookupItem)BasicExpressionCompletionContributor.createKeywordLookupItem(parameters.getPosition(), PsiKeyword.NULL); - item.setAttribute(LookupItem.TYPE, PsiType.NULL); result.addElement(JavaSmartCompletionContributor.decorate(item, infos)); return; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java index 7f6920917c96..8c7af834937d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java @@ -217,7 +217,7 @@ class TypeArgumentCompletionProvider extends CompletionProvider DEFAULT_IMPORT_FIXER = new InsertHandler() { @Override public void handleInsert(InsertionContext context, PsiTypeLookupItem item) { @@ -65,13 +65,14 @@ public class PsiTypeLookupItem extends LookupItem { } @NotNull - public PsiType getPsiType() { + @Override + public PsiType getType() { Object object = getObject(); PsiType type = object instanceof PsiType ? (PsiType)object : JavaPsiFacade.getElementFactory(((PsiClass) object).getProject()).createType((PsiClass)object); for (int i = 0; i < getBracketsCount(); i++) { type = new PsiArrayType(type); } - return type; + return getSubstitutor().substitute(type); } @@ -191,18 +192,14 @@ public class PsiTypeLookupItem extends LookupItem { } - public static PsiTypeLookupItem createLookupItem(@NotNull PsiType type, @Nullable PsiElement context, boolean isDiamond, InsertHandler importFixer) { - final PsiType original = type; + public static PsiTypeLookupItem createLookupItem(@NotNull PsiType type, @Nullable PsiElement context, boolean isDiamond, InsertHandler importFixer) { int dim = 0; while (type instanceof PsiArrayType) { type = ((PsiArrayType)type).getComponentType(); dim++; } - PsiTypeLookupItem item = doCreateItem(type, context, dim, isDiamond, importFixer); - - item.setAttribute(TYPE, original); - return item; + return doCreateItem(type, context, dim, isDiamond, importFixer); } private static PsiTypeLookupItem doCreateItem(final PsiType type, diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/ComponentTypeOfMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/ComponentTypeOfMacro.java index d4ecc14c003e..5ab66a10ad6b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/ComponentTypeOfMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/ComponentTypeOfMacro.java @@ -20,7 +20,6 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.PsiTypeLookupItem; import com.intellij.codeInsight.template.*; import com.intellij.psi.PsiArrayType; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiExpression; import com.intellij.psi.PsiType; import com.intellij.util.containers.ContainerUtil; @@ -49,7 +48,7 @@ public class ComponentTypeOfMacro extends Macro { for (LookupElement element : lookupItems) { PsiTypeLookupItem lookupItem = element.as(PsiTypeLookupItem.CLASS_CONDITION_KEY); if (lookupItem != null) { - PsiType psiType = lookupItem.getPsiType(); + PsiType psiType = lookupItem.getType(); if (psiType instanceof PsiArrayType) { result.add(PsiTypeLookupItem.createLookupItem(((PsiArrayType)psiType).getComponentType(), null)); } @@ -83,7 +82,7 @@ public class ComponentTypeOfMacro extends Macro { for (LookupElement element : elements) { PsiTypeLookupItem typeLookupItem = element.as(PsiTypeLookupItem.CLASS_CONDITION_KEY); if (typeLookupItem != null) { - PsiType psiType = typeLookupItem.getPsiType(); + PsiType psiType = typeLookupItem.getType(); if (psiType instanceof PsiArrayType) { return new PsiTypeResult(((PsiArrayType)psiType).getComponentType(), context.getProject()); } 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 9b846da394f5..d1dc8be21110 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java @@ -53,7 +53,6 @@ public class LookupItem extends MutableLookupElement implements Comparable public static final Object FORCE_QUALIFY = Key.create("FORCE_QUALIFY"); public static final Object SUBSTITUTOR = Key.create("SUBSTITUTOR"); - public static final Object TYPE = Key.create("TYPE"); public static final Object CASE_INSENSITIVE = Key.create("CASE_INSENSITIVE"); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java index cb272e202350..2de1abf9f2df 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java @@ -25,6 +25,7 @@ import com.intellij.psi.*; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; @@ -118,7 +119,7 @@ public class GroovyNoVariantsDelegator extends CompletionContributor { final CompletionResultSet qualifiedCollector = result.withPrefixMatcher(fullPrefix); InheritorsHolder inheritors = new InheritorsHolder(result); for (final LookupElement base : suggestQualifierItems(parameters, (GrReferenceElement)qualifier, inheritors)) { - final PsiType type = JavaCompletionUtil.getLookupElementType(base); + final PsiType type = getPsiType(base.getObject()); if (type != null && !PsiType.VOID.equals(type)) { GrReferenceElement ref = createMockReference(position, type, base); PsiElement refName = ref.getReferenceNameElement(); @@ -139,6 +140,24 @@ public class GroovyNoVariantsDelegator extends CompletionContributor { } } + @Nullable + private static PsiType getPsiType(final Object o) { + if (o instanceof ResolveResult) { + return getPsiType(((ResolveResult)o).getElement()); + } + if (o instanceof PsiVariable) { + return ((PsiVariable)o).getType(); + } + else if (o instanceof PsiMethod) { + return ((PsiMethod)o).getReturnType(); + } + else if (o instanceof PsiClass) { + final PsiClass psiClass = (PsiClass)o; + return JavaPsiFacade.getElementFactory(psiClass.getProject()).createType(psiClass); + } + return null; + } + private static GrReferenceElement createMockReference(final PsiElement place, @NotNull PsiType qualifierType, LookupElement qualifierItem) { GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(place.getProject()); if (qualifierItem.getObject() instanceof PsiClass) {