From 27264fa515f55826de16bff7a8ec21392d0de87f Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Fri, 17 Jan 2025 13:36:38 +0100 Subject: [PATCH] [uast-inspection] IDEA-365213 support suppressions for LoggingSimilarMessageInspection GitOrigin-RevId: 2e671fb69eac1371bc1445f7ca5d03e2284e394b --- .../LoggingSimilarMessageInspection.kt | 33 ++++++++------- ...JavaLoggingSimilarMessageInspectionTest.kt | 36 ++++++++++++++++ .../K2LoggingSimilarMessageInspectionTest.kt | 41 +++++++++++++++++++ 3 files changed, 96 insertions(+), 14 deletions(-) diff --git a/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingSimilarMessageInspection.kt b/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingSimilarMessageInspection.kt index 862187967cf1..4addba6a4e08 100644 --- a/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingSimilarMessageInspection.kt +++ b/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingSimilarMessageInspection.kt @@ -2,10 +2,7 @@ package com.intellij.codeInspection.logging import com.intellij.analysis.JvmAnalysisBundle -import com.intellij.codeInspection.AbstractBaseUastLocalInspectionTool -import com.intellij.codeInspection.LocalInspectionToolSession -import com.intellij.codeInspection.ProblemDescriptor -import com.intellij.codeInspection.ProblemsHolder +import com.intellij.codeInspection.* import com.intellij.codeInspection.options.OptPane import com.intellij.java.JavaBundle import com.intellij.java.library.JavaLibraryUtil @@ -51,9 +48,11 @@ class LoggingSimilarMessageInspection : AbstractBaseUastLocalInspectionTool() { return true } - override fun buildVisitor(holder: ProblemsHolder, - isOnTheFly: Boolean, - session: LocalInspectionToolSession): PsiElementVisitor { + override fun buildVisitor( + holder: ProblemsHolder, + isOnTheFly: Boolean, + session: LocalInspectionToolSession, + ): PsiElementVisitor { val project = holder.project val fileModule = ModuleUtilCore.findModuleForFile(holder.file.virtualFile, project) if (!(JavaLibraryUtil.hasLibraryClass(fileModule, LoggingUtil.SLF4J_LOGGER) || @@ -162,6 +161,8 @@ class LoggingSimilarMessageInspection : AbstractBaseUastLocalInspectionTool() { val result = mutableSetOf() file.accept(object : AbstractUastVisitor() { override fun visitCallExpression(node: UCallExpression): Boolean { + val place = node.sourcePsi ?: return false + if (SuppressionUtil.inspectionResultSuppressed(place, this@LoggingSimilarMessageInspection)) return false val loggerTypeSearcher = LOGGER_TYPE_SEARCHERS.mapFirst(node) ?: return false if (mySkipErrorLogLevel) { val hasSetMessage = hasSetThrowable(node, loggerTypeSearcher) @@ -180,8 +181,10 @@ class LoggingSimilarMessageInspection : AbstractBaseUastLocalInspectionTool() { } } - private fun hasSetThrowable(node: UCallExpression, - loggerType: LoggerTypeSearcher?): Boolean { + private fun hasSetThrowable( + node: UCallExpression, + loggerType: LoggerTypeSearcher?, + ): Boolean { if (loggerType == null) { return false } @@ -189,10 +192,10 @@ class LoggingSimilarMessageInspection : AbstractBaseUastLocalInspectionTool() { return false } var currentCall = node.receiver - for (ignore in 0..MAX_BUILDER_LENGTH) { + (0..MAX_BUILDER_LENGTH).forEach { ignore -> if (currentCall is UQualifiedReferenceExpression) { currentCall = currentCall.selector - continue + return@forEach } if (currentCall !is UCallExpression) { return false @@ -322,9 +325,11 @@ private class PartHolderIterator(private val parts: List?) -private fun similar(first: List?, - second: List?, - minTextLength: Int): Boolean { +private fun similar( + first: List?, + second: List?, + minTextLength: Int, +): Boolean { if (first == null || second == null) return false if (first.isEmpty() || second.isEmpty()) return false if (first.any { it.callPart != null } || second.any { it.callPart != null }) { diff --git a/jvm/jvm-analysis-java-tests/testSrc/com/intellij/codeInspection/tests/java/logging/JavaLoggingSimilarMessageInspectionTest.kt b/jvm/jvm-analysis-java-tests/testSrc/com/intellij/codeInspection/tests/java/logging/JavaLoggingSimilarMessageInspectionTest.kt index 067632798ed9..56105bd3b61d 100644 --- a/jvm/jvm-analysis-java-tests/testSrc/com/intellij/codeInspection/tests/java/logging/JavaLoggingSimilarMessageInspectionTest.kt +++ b/jvm/jvm-analysis-java-tests/testSrc/com/intellij/codeInspection/tests/java/logging/JavaLoggingSimilarMessageInspectionTest.kt @@ -614,5 +614,41 @@ class JavaLoggingSimilarMessageInspectionTest : LoggingSimilarMessageInspectionT } """.trimIndent()) } + + fun `test suppressed slf4j statement`() { + myFixture.testHighlighting(JvmLanguage.JAVA, """ + import org.slf4j.*; + class Logging { + private static Logger LOG = LoggerFactory.getLogger(Logging.class); + + private static void request1(String i) { + LOG.debug("Call successful"); + } + + private static void request2(int i) { + //noinspection LoggingSimilarMessage + LOG.debug("Call successful"); + } + } + """.trimIndent()) + } + + fun `test suppressed slf4j method`() { + myFixture.testHighlighting(JvmLanguage.JAVA, """ + import org.slf4j.*; + class Logging { + private static Logger LOG = LoggerFactory.getLogger(Logging.class); + + private static void request1(String i) { + LOG.debug("Call successful"); + } + + @SuppressWarnings("LoggingSimilarMessage") + public static void test2() { + LOG.debug("Call successful"); + } + } + """.trimIndent()) + } } diff --git a/jvm/jvm-analysis-kotlin-tests-k2/testSrc/com/intellij/codeInspection/tests/kotlin/logging/K2LoggingSimilarMessageInspectionTest.kt b/jvm/jvm-analysis-kotlin-tests-k2/testSrc/com/intellij/codeInspection/tests/kotlin/logging/K2LoggingSimilarMessageInspectionTest.kt index f28649e532c1..473ba3310419 100644 --- a/jvm/jvm-analysis-kotlin-tests-k2/testSrc/com/intellij/codeInspection/tests/kotlin/logging/K2LoggingSimilarMessageInspectionTest.kt +++ b/jvm/jvm-analysis-kotlin-tests-k2/testSrc/com/intellij/codeInspection/tests/kotlin/logging/K2LoggingSimilarMessageInspectionTest.kt @@ -91,5 +91,46 @@ class K2LoggingSimilarMessageInspectionTest : KotlinLoggingSimilarMessageInspect } """.trimIndent()) } + + + fun `test suppressed slf4j statement`() { + myFixture.testHighlighting(JvmLanguage.KOTLIN, """ + import org.slf4j.Logger + import org.slf4j.LoggerFactory + + internal object Logging { + private val LOG: Logger = LoggerFactory.getLogger(Logging::class.java) + + private fun request1(i: String) { + LOG.debug("Call successful") + } + + fun test2() { + @Suppress("LoggingSimilarMessage") + LOG.debug("Call successful") + } + } + """.trimIndent()) + } + + fun `test suppressed slf4j method`() { + myFixture.testHighlighting(JvmLanguage.KOTLIN, """ + import org.slf4j.Logger + import org.slf4j.LoggerFactory + + internal object Logging { + private val LOG: Logger = LoggerFactory.getLogger(Logging::class.java) + + private fun request1(i: String) { + LOG.debug("Call successful") + } + + @Suppress("LoggingSimilarMessage") + fun test2() { + LOG.debug("Call successful") + } + } + """.trimIndent()) + } }