From e1036c438c694e70189140900efb6689cee6571d Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 4 Jan 2018 15:35:20 +0100 Subject: [PATCH] java completion: use a single way to find previous interesting PSI (IDEA-184555) --- .../codeInsight/completion/JavaKeywordCompletion.java | 4 ++-- .../keywords/fileScopeAfterJavaDocInsideModifierList.java | 7 +++++++ .../java/codeInsight/completion/KeywordCompletionTest.java | 1 + .../src/com/intellij/psi/filters/FilterPositionUtil.java | 4 +++- 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterJavaDocInsideModifierList.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 9c0020b096ca..9f0968be3427 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -12,6 +12,7 @@ import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PsiElementPattern; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.filters.FilterPositionUtil; import com.intellij.psi.templateLanguages.OuterLanguageElement; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; @@ -19,7 +20,6 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.util.Consumer; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.JBIterable; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -124,7 +124,7 @@ public class JavaKeywordCompletion { } private static PsiElement prevSignificantLeaf(PsiElement position) { - return JBIterable.generate(position, PsiTreeUtil::prevVisibleLeaf).skip(1).skipWhile(e -> PsiTreeUtil.getNonStrictParentOfType(e, PsiComment.class) != null).first(); + return FilterPositionUtil.searchNonSpaceNonCommentBack(position); } private void addKeyword(LookupElement element) { diff --git a/java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterJavaDocInsideModifierList.java b/java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterJavaDocInsideModifierList.java new file mode 100644 index 000000000000..03418e29f55f --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/fileScopeAfterJavaDocInsideModifierList.java @@ -0,0 +1,7 @@ +abstract /** javadoc */ + class Primitive { + + public abstract void draw(); + + +} \ No newline at end of file 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 d7dc1599f020..fa0233b78cf3 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 @@ -48,6 +48,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 testFileScopeAfterJavaDoc() { doTest(4, "package", "class", "import", "public", "private"); } + public void testFileScopeAfterJavaDocInsideModifierList() { doTest(2, "class", "public"); } public void testFileScope2() { doTest(7, CLASS_SCOPE_KEYWORDS); } public void testClassScope1() { doTest(5, CLASS_SCOPE_KEYWORDS); } public void testClassScope2() { doTest(4, CLASS_SCOPE_KEYWORDS); } diff --git a/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java b/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java index 950bf0be5889..e2aa89bd54be 100644 --- a/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java @@ -20,6 +20,7 @@ import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.TokenType; import com.intellij.psi.impl.source.tree.TreeUtil; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.Nullable; /** @@ -37,7 +38,8 @@ public class FilterPositionUtil { ASTNode leftNeighbour = TreeUtil.prevLeaf(element.getNode()); if (!strict) { while (leftNeighbour != null && - (leftNeighbour.getElementType() == TokenType.WHITE_SPACE || leftNeighbour.getPsi() instanceof PsiComment)) { + (leftNeighbour.getElementType() == TokenType.WHITE_SPACE || + PsiTreeUtil.getNonStrictParentOfType(leftNeighbour.getPsi(), PsiComment.class) != null)) { leftNeighbour = TreeUtil.prevLeaf(leftNeighbour); } }