From 3f4982e47d7699182ed41387c7e7515e11eac31d Mon Sep 17 00:00:00 2001 From: Georgii Ustinov Date: Mon, 30 Sep 2024 10:18:14 +0300 Subject: [PATCH] [Java. Logging] Disable completion on reference expressions for logger IDEA-359882 GitOrigin-RevId: f5550041a59d0b89cf1b18a3ccd8104eed0fb240 --- .../completion/JvmLoggerCompletionContributor.kt | 10 +++++++--- .../logger/noAutoCompletionAfterNewExpression.java | 13 +++++++++++++ .../noAutoCompletionAfterReferenceExpression.java | 7 +++++++ .../codeInsight/completion/LoggerCompletionTest.kt | 12 ++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterNewExpression.java create mode 100644 java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterReferenceExpression.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JvmLoggerCompletionContributor.kt b/java/java-impl/src/com/intellij/codeInsight/completion/JvmLoggerCompletionContributor.kt index d441b5f92e2a..76999040350a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JvmLoggerCompletionContributor.kt +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JvmLoggerCompletionContributor.kt @@ -4,7 +4,7 @@ package com.intellij.codeInsight.completion import com.intellij.lang.logging.JvmLogger import com.intellij.openapi.module.ModuleUtil import com.intellij.patterns.PlatformPatterns.psiElement -import com.intellij.patterns.StandardPatterns +import com.intellij.psi.PsiExpression import com.intellij.psi.PsiReferenceExpression import com.intellij.util.ProcessingContext import com.siyeh.ig.psiutils.ExpressionUtils @@ -12,8 +12,8 @@ import com.siyeh.ig.psiutils.ExpressionUtils class JvmLoggerCompletionContributor : CompletionContributor() { init { extend(CompletionType.BASIC, - StandardPatterns.or( - psiElement().withParent(PsiReferenceExpression::class.java)), + psiElement().withParent(PsiReferenceExpression::class.java).andNot( + psiElement().withParent(psiElement(PsiReferenceExpression::class.java).withChild(psiElement(PsiExpression::class.java)))), object : CompletionProvider() { override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) { val parent = parameters.position.parent ?: return @@ -38,4 +38,8 @@ class JvmLoggerCompletionContributor : CompletionContributor() { } }) } + + override fun fillCompletionVariants(parameters: CompletionParameters, result: CompletionResultSet) { + super.fillCompletionVariants(parameters, result) + } } diff --git a/java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterNewExpression.java b/java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterNewExpression.java new file mode 100644 index 000000000000..2f17f707ec9e --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterNewExpression.java @@ -0,0 +1,13 @@ +public class A { + static void f() { + A a = new A().lo; + } + + A logMethod() { + return null; + } + + A anotherLogMethod() { + return null; + } +} diff --git a/java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterReferenceExpression.java b/java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterReferenceExpression.java new file mode 100644 index 000000000000..2459c002edb6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/logger/noAutoCompletionAfterReferenceExpression.java @@ -0,0 +1,7 @@ +public class A { + static void logMethod() { + A.lo + } + + static void anotherLogMethod() {} +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/LoggerCompletionTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/LoggerCompletionTest.kt index 90745aa6541c..29240d47ef05 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/LoggerCompletionTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/LoggerCompletionTest.kt @@ -195,6 +195,18 @@ class LoggerCompletionTest : LightFixtureCompletionTestCase() { doTest(1, "long", "log", "clone") } + @NeedsIndex.SmartMode(reason = SMART_MODE_REASON_MESSAGE) + fun testNoAutoCompletionAfterReferenceExpression() { + JvmLoggerTestSetupUtil.setupSlf4j(myFixture) + doAntiTest("logMethod", "anotherLogMethod") + } + + @NeedsIndex.SmartMode(reason = SMART_MODE_REASON_MESSAGE) + fun testNoAutoCompletionAfterNewExpression() { + JvmLoggerTestSetupUtil.setupSlf4j(myFixture) + doAntiTest("logMethod", "anotherLogMethod", "clone") + } + override fun getBasePath() = JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/logger"