From e44da4387abac6bcd796df4828a95ad81935f5e1 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 11 Jul 2017 21:52:24 +0200 Subject: [PATCH] fix some missing keywords in java completion (IDEA-175673, IDEA-175669) --- .../codeInsight/completion/JavaKeywordCompletion.java | 11 ++++++++--- .../completion/keywords/fileScopeAfterComment.java | 2 ++ .../codeInsight/completion/keywords/newInCast.java | 6 ++++++ .../codeInsight/completion/KeywordCompletionTest.java | 2 ++ 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterComment.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/newInCast.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java index 32b32abcc3a4..5f044778acac 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -38,6 +38,7 @@ import com.intellij.util.Consumer; import com.intellij.util.ObjectUtils; import com.intellij.util.ProcessingContext; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.JBIterable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -152,7 +153,7 @@ public class JavaKeywordCompletion { private static final ElementPattern EXPR_KEYWORDS = and( psiElement().withParent(psiElement(PsiReferenceExpression.class).withParent( not( - or(psiElement(PsiTypeCastExpression.class), + or( psiElement(PsiSwitchLabelStatement.class), psiElement(PsiExpressionStatement.class), psiElement(PsiPrefixExpression.class) @@ -193,12 +194,16 @@ public class JavaKeywordCompletion { mySession = session; myPrefix = session.getMatcher().getPrefix(); myPosition = parameters.getPosition(); - myPrevLeaf = PsiTreeUtil.prevVisibleLeaf(myPosition); + myPrevLeaf = prevSignificantLeaf(myPosition); addKeywords(); addEnumCases(); } + private static PsiElement prevSignificantLeaf(PsiElement position) { + return JBIterable.generate(position, PsiTreeUtil::prevVisibleLeaf).skip(1).skipWhile(e -> e instanceof PsiComment).first(); + } + private void addKeyword(LookupElement element) { if (element.getLookupString().startsWith(myPrefix)) { myResults.add(element); @@ -617,7 +622,7 @@ public class JavaKeywordCompletion { return false; } - PsiElement prev = PsiTreeUtil.prevVisibleLeaf(position); + PsiElement prev = prevSignificantLeaf(position); if (prev == null) { return true; } diff --git a/java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterComment.java b/java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterComment.java new file mode 100644 index 000000000000..21fb204e81dd --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterComment.java @@ -0,0 +1,2 @@ +//comment +package diff --git a/java/java-tests/testData/codeInsight/completion/keywords/newInCast.java b/java/java-tests/testData/codeInsight/completion/keywords/newInCast.java new file mode 100644 index 000000000000..acc9cc19f42a --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/newInCast.java @@ -0,0 +1,6 @@ +class Foo { + + Object test() { + return (CharSequence) n + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java index f8e28d8c5251..bc603d0e32c6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java @@ -45,6 +45,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase { } public void testFileScope1() { doTest(8, FILE_SCOPE_KEYWORDS); } + public void testFileScopeAfterComment() { doTest(4, "package", "class", "import", "public", "private"); } public void testFileScope2() { doTest(7, CLASS_SCOPE_KEYWORDS); } public void testClassScope1() { doTest(5, CLASS_SCOPE_KEYWORDS); } public void testClassScope2() { doTest(4, CLASS_SCOPE_KEYWORDS); } @@ -104,6 +105,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testNullInMethodCall() { doTest(); } public void testNullInMethodCall2() { doTest(); } public void testNewInMethodRefs() { doTest(1, "new", "null", "true", "false"); } + public void testNewInCast() { doTest(2, "new", "null", "true", "false"); } public void testSpaceAfterInstanceof() { doTest(); } public void testInstanceofAfterUnresolved() { doTest(1, "instanceof"); } public void testInstanceofAfterStatementStart() { doTest(1, "instanceof"); }