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 7c1a3b877601..d64ab398b42a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.lookup.LookupElementWeigher; import com.intellij.psi.*; import com.intellij.psi.filters.getters.MembersGetter; import com.intellij.psi.util.PropertyUtil; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -30,11 +31,13 @@ import java.util.Set; */ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupElementWeigher { private final CompletionType myCompletionType; + private final PsiElement myPosition; private final Set myNonInitializedFields; public PreferLocalVariablesLiteralsAndAnnoMethodsWeigher(CompletionType completionType, PsiElement position) { super("local"); myCompletionType = completionType; + myPosition = position; myNonInitializedFields = JavaCompletionProcessor.getNonInitializedFields(position); } @@ -60,7 +63,10 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle if (object instanceof PsiKeyword) { String keyword = ((PsiKeyword)object).getText(); - if (PsiKeyword.RETURN.equals(keyword) || PsiKeyword.ELSE.equals(keyword) || PsiKeyword.FINALLY.equals(keyword)) { + if (PsiKeyword.RETURN.equals(keyword) && isLastStatement(PsiTreeUtil.getParentOfType(myPosition, PsiStatement.class))) { + return MyResult.probableKeyword; + } + if (PsiKeyword.ELSE.equals(keyword) || PsiKeyword.FINALLY.equals(keyword)) { return MyResult.probableKeyword; } } @@ -118,4 +124,12 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle return MyResult.normal; } + + private static boolean isLastStatement(PsiStatement statement) { + if (statement == null || !(statement.getParent() instanceof PsiCodeBlock)) { + return true; + } + PsiStatement[] siblings = ((PsiCodeBlock)statement.getParent()).getStatements(); + return statement == siblings[siblings.length - 1]; + } } diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferReturnBeforeStatement.java b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferReturnBeforeStatement.java new file mode 100644 index 000000000000..181d4481c5cc --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferReturnBeforeStatement.java @@ -0,0 +1,7 @@ +class Util { + void foo(int reaction, boolean rezet) { + re + System.out.println(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy index cdea5d74109c..df62e225be87 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -325,5 +325,9 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { assertPreferredItems(0, "Component", "FooBean3", "JComponent"); } + public void testDispreferReturnBeforeStatement() { + checkPreferredItems 0, 'reaction', 'rezet', 'return' + } + }