From 201dffa02d00f064cf27064c4ffecdf6eb7f7827 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Tue, 19 Nov 2024 16:57:18 +0100 Subject: [PATCH] [java-completion] IDEA-363557 Don't offer classes after dot at class level GitOrigin-RevId: da52d7093ed80c0eb80ebf11e5f43d2d58a0758e --- .../completion/JavaCompletionContributor.java | 11 +++++++++++ .../normal/NoSuggestionsAfterDotAtClassLevel.java | 9 +++++++++ .../normal/SuggestionsAfterDotAtClassLevel.java | 9 +++++++++ .../codeInsight/completion/NormalCompletionTest.java | 8 ++++++++ 4 files changed, 37 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/NoSuggestionsAfterDotAtClassLevel.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/SuggestionsAfterDotAtClassLevel.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 3694974d816c..2fe5d7f6acc7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -59,6 +59,7 @@ import com.intellij.psi.impl.light.LightJavaModule; import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl; import com.intellij.psi.impl.source.PsiLabelReference; import com.intellij.psi.impl.source.resolve.JavaResolveUtil; +import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.scope.ElementClassFilter; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.ProjectScope; @@ -88,6 +89,16 @@ public final class JavaCompletionContributor extends CompletionContributor imple private static final ElementPattern UNEXPECTED_REFERENCE_AFTER_DOT = or( // dot at the statement beginning psiElement().afterLeaf(".").insideStarting(psiExpressionStatement()), + //example: class A{ .something } + psiElement().afterLeaf(".") + .insideStarting(psiElement(JavaElementType.TYPE)) + .afterLeafSkipping(psiElement().andOr( + psiElement().whitespace(), + psiElement().withText("")), + psiElement().withParent(PsiErrorElement.class)) + .withParent(PsiJavaCodeReferenceElement.class) + .withSuperParent(2, PsiTypeElement.class) + .withSuperParent(3, PsiClass.class), // like `call(Cls::methodRef.` psiElement().afterLeaf(psiElement(JavaTokenType.DOT).afterSibling(psiElement(PsiMethodCallExpression.class).withLastChild( psiElement(PsiExpressionList.class).withLastChild(psiElement(PsiErrorElement.class))))), diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoSuggestionsAfterDotAtClassLevel.java b/java/java-tests/testData/codeInsight/completion/normal/NoSuggestionsAfterDotAtClassLevel.java new file mode 100644 index 000000000000..3de0ab152dcf --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoSuggestionsAfterDotAtClassLevel.java @@ -0,0 +1,9 @@ +class Foo { + class A{} + + public static void main(String[] args) { + + } + + . +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/SuggestionsAfterDotAtClassLevel.java b/java/java-tests/testData/codeInsight/completion/normal/SuggestionsAfterDotAtClassLevel.java new file mode 100644 index 000000000000..8f1001c2bf4d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/SuggestionsAfterDotAtClassLevel.java @@ -0,0 +1,9 @@ +class Foo { + class A{} + + public static void main(String[] args) { + + } + + Foo. +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java index 29a5b068a04a..69a545a315a1 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java @@ -3276,4 +3276,12 @@ public class NormalCompletionTest extends NormalCompletionTestCase { } """); } + + public void testNoSuggestionsAfterDotAtClassLevel() { doAntiTest(); } + + public void testSuggestionsAfterDotAtClassLevel() { + configureByTestName(); + myFixture.completeBasic(); + assertTrue(myFixture.getLookupElementStrings().contains("A")); + } }