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 67ad744e305b..465743b69c15 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java @@ -15,12 +15,14 @@ */ package com.intellij.codeInsight.completion; -import com.intellij.codeInsight.lookup.*; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementDecorator; +import com.intellij.codeInsight.lookup.LookupElementPresentation; +import com.intellij.codeInsight.lookup.TypedLookupItem; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; @@ -99,8 +101,7 @@ public class JavaChainLookupElement extends LookupElementDecorator implements TypedLookupItem, StaticallyImportable { @Nullable private final MemberLookupHelper myHelper; private final Color myColor; + private final String myTailText; private PsiSubstitutor mySubstitutor = PsiSubstitutor.EMPTY; public VariableLookupItem(PsiVariable var) { super(var, var.getName()); myHelper = null; myColor = getInitializerColor(var); + myTailText = getInitializerText(var); } public VariableLookupItem(PsiField field, boolean shouldImport) { @@ -64,27 +69,39 @@ public class VariableLookupItem extends LookupItem implements Typed } } myColor = getInitializerColor(field); + myTailText = getInitializerText(field); } @Nullable - private static Color getInitializerColor(@NotNull PsiVariable var) { - if (!JavaColorProvider.isColorType(var.getType())) { - return null; - } + private String getInitializerText(PsiVariable var) { + if (myColor != null || !var.hasModifierProperty(PsiModifier.FINAL) || !var.hasModifierProperty(PsiModifier.STATIC)) return null; + PsiElement initializer = var instanceof PsiEnumConstant ? ((PsiEnumConstant)var).getArgumentList() : getInitializer(var); + String initText = initializer == null ? null : initializer.getText(); + if (StringUtil.isEmpty(initText)) return null; + + String prefix = var instanceof PsiEnumConstant ? "" : " = "; + String suffix = var instanceof PsiEnumConstant && ((PsiEnumConstant)var).getInitializingClass() != null ? " {...}" : ""; + return StringUtil.trimLog(prefix + initText + suffix, 30); + } + + private static PsiExpression getInitializer(@NotNull PsiVariable var) { PsiElement navigationElement = var.getNavigationElement(); if (navigationElement instanceof PsiVariable) { var = (PsiVariable)navigationElement; } - return getExpressionColor(var.getInitializer()); + return var instanceof PsiFieldImpl ? ((PsiFieldImpl)var).getDetachedInitializer() : var.getInitializer(); } @Nullable - private static Color getExpressionColor(@Nullable PsiExpression expression) { + private static Color getInitializerColor(@NotNull PsiVariable var) { + if (!JavaColorProvider.isColorType(var.getType())) return null; + + PsiExpression expression = getInitializer(var); if (expression instanceof PsiReferenceExpression) { final PsiElement target = ((PsiReferenceExpression)expression).resolve(); if (target instanceof PsiVariable) { - return RecursionManager.doPreventingRecursion(expression, true, () -> getExpressionColor(((PsiVariable)target).getInitializer())); + return RecursionManager.doPreventingRecursion(expression, true, () -> getInitializerColor((PsiVariable)target)); } } return JavaColorProvider.getJavaColorFromExpression(expression); @@ -144,6 +161,9 @@ public class VariableLookupItem extends LookupItem implements Typed } else { presentation.setTypeText(getType().getPresentableText()); } + if (myTailText != null && StringUtil.isEmpty(presentation.getTailText())) { + presentation.setTailText(myTailText, true); + } } @Override diff --git a/java/java-tests/testData/codeInsight/completion/normal/ShowVarInitializers.java b/java/java-tests/testData/codeInsight/completion/normal/ShowVarInitializers.java new file mode 100644 index 000000000000..c8bea222e7fe --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/ShowVarInitializers.java @@ -0,0 +1,20 @@ +class X { + { + E.FIELD + } +} + +enum E { + FIELD1( "x"), + FIELD2("y") { + public String toString() { + return super.toString(); + } + }, + FIELD3 {}; + + E(String s) { + } + + public static final int FIELD4 = 42; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index fd474a494413..411d5fabe3cf 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -1427,7 +1427,7 @@ class Foo {{ def constant = myFixture.lookupElements.find { it.lookupString == 'Util.CONSTANT' } LookupElementPresentation p = ApplicationManager.application.runReadAction ({ LookupElementPresentation.renderElement(constant) } as Computable) assert p.itemText == 'Util.CONSTANT' - assert p.tailText == ' (foo)' + assert p.tailText == ' = 2 (foo)' assert p.typeText == 'int' type 'fo\n' diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 8a4e4e35a653..fed893a48af9 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1589,4 +1589,12 @@ class Bar { configure() assert 'B' == LookupElementPresentation.renderElement(myFixture.lookup.items[0]).typeText } + + public void testShowVarInitializers() { + configure() + assert LookupElementPresentation.renderElement(myFixture.lookup.items[0]).tailText == '( "x")' + assert LookupElementPresentation.renderElement(myFixture.lookup.items[1]).tailText == '("y") {...}' + assert !LookupElementPresentation.renderElement(myFixture.lookup.items[2]).tailText + assert LookupElementPresentation.renderElement(myFixture.lookup.items[3]).tailText == ' = 42' + } }