From 184dff3cc2be49069902b927ee2bc9e10202be88 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 19 Sep 2011 19:26:17 +0200 Subject: [PATCH] IDEA-71746 Please, enable completion of non initialized fields --- .../completion/JavaCompletionSorting.java | 2 +- .../codeInsight/completion/JavaCompletionUtil.java | 6 +++++- ...rLocalVariablesLiteralsAndAnnoMethodsWeigher.java | 12 +++++++++++- .../completion/scope/JavaCompletionProcessor.java | 2 +- .../NoUninitializedFieldsInConstructor-out.java | 8 -------- .../completion/SmartTypeCompletionTest.java | 6 +++++- 6 files changed, 23 insertions(+), 13 deletions(-) delete mode 100644 java/java-tests/testData/codeInsight/completion/smartType/NoUninitializedFieldsInConstructor-out.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java index 2a47bcd9ae6a..0a274ef446d5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java @@ -59,7 +59,7 @@ public class JavaCompletionSorting { List afterNegativeStats = new ArrayList(); ContainerUtil.addIfNotNull(afterNegativeStats, smart ? new PreferDefaultTypeWeigher(expectedTypes, parameters) : preferStatics(position)); - afterNegativeStats.add(new PreferLocalVariablesLiteralsAndAnnoMethodsWeigher(type)); + afterNegativeStats.add(new PreferLocalVariablesLiteralsAndAnnoMethodsWeigher(type, position)); ContainerUtil.addIfNotNull(afterNegativeStats, recursion(parameters, expectedTypes)); if (!smart && !afterNew) { afterNegativeStats.add(new PreferExpected(false, expectedTypes)); 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 16b0046718e9..bb0489172fc7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -417,7 +417,11 @@ public class JavaCompletionUtil { return matcher.prefixMatches(s); } }; - final JavaCompletionProcessor processor = new JavaCompletionProcessor(element, elementFilter, checkAccess, parameters.getInvocationCount() <= 1, nameCondition); + + PsiMethodCallExpression call = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class); + boolean checkInitialized = parameters.getInvocationCount() <= 1 && call != null && PsiKeyword.SUPER.equals(call.getMethodExpression().getText()); + + final JavaCompletionProcessor processor = new JavaCompletionProcessor(element, elementFilter, checkAccess, checkInitialized, nameCondition); javaReference.processVariants(processor); final Collection plainResults = processor.getResults(); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java index c097b3a72a1d..027e4e6d095c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java @@ -15,20 +15,25 @@ */ package com.intellij.codeInsight.completion; +import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementWeigher; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; +import java.util.Set; + /** * @author peter */ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupElementWeigher { private final CompletionType myCompletionType; + private final Set myNonInitializedFields; - public PreferLocalVariablesLiteralsAndAnnoMethodsWeigher(CompletionType completionType) { + public PreferLocalVariablesLiteralsAndAnnoMethodsWeigher(CompletionType completionType, PsiElement position) { super("local"); myCompletionType = completionType; + myNonInitializedFields = JavaCompletionProcessor.getNonInitializedFields(position); } enum MyResult { @@ -37,6 +42,7 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle localOrParameter, superMethodParameters, normal, + nonInitialized, classLiteral, className, } @@ -76,6 +82,10 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle if (object instanceof PsiClass) { return MyResult.className; } + + if (object instanceof PsiField && myNonInitializedFields.contains(object)) { + return MyResult.nonInitialized; + } } return MyResult.normal; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java index bdf1c181053a..b3fe96ef26ea 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/scope/JavaCompletionProcessor.java @@ -121,7 +121,7 @@ public class JavaCompletionProcessor extends BaseScopeProcessor implements Eleme return false; } - private static Set getNonInitializedFields(PsiElement element) { + public static Set getNonInitializedFields(PsiElement element) { final PsiStatement statement = PsiTreeUtil.getParentOfType(element, PsiStatement.class); final PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class, true, PsiClass.class); if (statement == null || method == null || !method.isConstructor()) { diff --git a/java/java-tests/testData/codeInsight/completion/smartType/NoUninitializedFieldsInConstructor-out.java b/java/java-tests/testData/codeInsight/completion/smartType/NoUninitializedFieldsInConstructor-out.java deleted file mode 100644 index e49b17247f65..000000000000 --- a/java/java-tests/testData/codeInsight/completion/smartType/NoUninitializedFieldsInConstructor-out.java +++ /dev/null @@ -1,8 +0,0 @@ -class A { - int aaa; - int aab; - A(int aac) { - aaa = aac; - } -} - diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index b9fe891858e7..70fa8f17d816 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -446,7 +446,11 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testNoSecondMethodTypeArguments() throws Throwable { doTest(Lookup.REPLACE_SELECT_CHAR); } public void testNoFieldsInSuperConstructorCall() throws Throwable { doTest(); } - public void testNoUninitializedFieldsInConstructor() throws Throwable { doTest(); } + + public void testNoUninitializedFieldsInConstructor() throws Throwable { + configureByTestName(); + assertStringItems("aac", "aab"); + } public void testFieldsSetInAnotherConstructor() throws Throwable { doTest(); } public void testFieldsSetAbove() throws Throwable { doTest(); }