From 1a014a13e82bdb0694ac11ff438497934a33788e Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 24 Mar 2015 15:57:13 +0100 Subject: [PATCH] IDEA-138061 Prefer "return" completion suggestion before the last expression in a code block --- .../completion/PreferByKindWeigher.java | 15 ++++++++++++++- .../PreferReturnBeforeExpression.java | 10 ++++++++++ .../NormalCompletionOrderingTest.groovy | 4 ++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/PreferReturnBeforeExpression.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java index cc67ca51de58..c20e89ce5f18 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementWeigher; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Conditions; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.ElementPattern; import com.intellij.psi.*; import com.intellij.psi.filters.getters.MembersGetter; @@ -256,6 +257,18 @@ public class PreferByKindWeigher extends LookupElementWeigher { return true; } PsiStatement[] siblings = ((PsiCodeBlock)statement.getParent()).getStatements(); - return statement == siblings[siblings.length - 1]; + PsiStatement lastOne = siblings[siblings.length - 1]; + if (statement == lastOne) { + return true; + } + + // we might complete 'return' before an expression, then it's still last statement + if (siblings.length >= 2 && statement == siblings[siblings.length - 2] && lastOne instanceof PsiExpressionStatement) { + int start = statement.getTextRange().getStartOffset(); + int end = lastOne.getTextRange().getStartOffset(); + return !StringUtil.contains(statement.getContainingFile().getViewProvider().getContents(), start, end, '\n'); + } + + return false; } } diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferReturnBeforeExpression.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferReturnBeforeExpression.java new file mode 100644 index 000000000000..c07f96c0a0f2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferReturnBeforeExpression.java @@ -0,0 +1,10 @@ +public class Test { + + int rMethod() {} + + int foo(int rParam) { + Object rLocal; + r rMethod(); + } + +} \ 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 a9841a464b0c..e0bc158b921b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -288,6 +288,10 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { checkPreferredItems(0, "return", "rLocal", "rParam", "rMethod"); } + public void testPreferReturnBeforeExpression() { + checkPreferredItems(0, "return", "rLocal", "rParam", "rMethod"); + } + public void testPreferModifiers() { checkPreferredItems(0, "private", "protected", "public", "paaa", "paab"); }