diff --git a/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingStringTemplateAsArgumentInspection.kt b/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingStringTemplateAsArgumentInspection.kt index 4cad45b9ea04..fa3f873f8f5a 100644 --- a/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingStringTemplateAsArgumentInspection.kt +++ b/jvm/jvm-analysis-impl/src/com/intellij/codeInspection/logging/LoggingStringTemplateAsArgumentInspection.kt @@ -15,6 +15,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.CommonClassNames import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiType +import com.intellij.psi.util.InheritanceUtil import com.intellij.psi.util.TypeConversionUtil import com.intellij.uast.UastHintedVisitorAdapter import org.jetbrains.uast.* @@ -106,6 +107,17 @@ class LoggingStringTemplateAsArgumentInspection : AbstractBaseUastLocalInspectio return true } + //strange behavior for last parameter as exception. let's ignore this case + val injected = parts.filter { it !is ULiteralExpression } + val javaLangThrowable = CommonClassNames.JAVA_LANG_THROWABLE + if ((injected.size == 1 && + InheritanceUtil.isInheritor(injected[0].getExpressionType(), javaLangThrowable)) || + ((valueArguments.size - 1 - indexStringExpression) == 1 && + InheritanceUtil.isInheritor(valueArguments[valueArguments.size - 1].getExpressionType(), javaLangThrowable)) + ) { + return true + } + if (mySkipPrimitives && allExpressionsInPatternArePrimitivesOrWrappers(parts)) { return true } diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgument.kt b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgument.kt index 3bb4ae95c51b..319c0e757593 100644 --- a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgument.kt +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgument.kt @@ -20,6 +20,14 @@ class StringTemplateAsArgument { loggerLog4J.atInfo().log( "variable1: ${variable1}") } + + fun testException(){ + var exception = RuntimeException() + loggerLog4J.info("exception: $exception") + val variable1 = 1 + loggerLog4J.info("variable1: $variable1", exception) + } + fun testLoggerSlf4J() { val variable1 = 1 loggerSlf4J.info("variable1: {}", variable1) @@ -28,7 +36,7 @@ class StringTemplateAsArgument { loggerSlf4J.info("${getInt()}") loggerSlf4J.info("variable1: ${variable1}") loggerSlf4J.info("variable1: $variable1") - loggerSlf4J.info("variable1: $variable1", RuntimeException()) + loggerSlf4J.info("variable1: $variable1", RuntimeException()) loggerSlf4J.info("{} variable1: $variable1", 1, RuntimeException()) loggerSlf4J.info("{} variable1: $variable1 {}", 1, 2, RuntimeException()) loggerSlf4J.info("{} variable1: $variable1 {} {}", 1, 2, RuntimeException()) diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt index 4b1e9485ed50..06970227d261 100644 --- a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt @@ -13,7 +13,7 @@ class StringTemplateAsArgumentFix { loggerSlf4J.info("variable1: {}", variable1) loggerSlf4J.info("variable1: {}", variable1) loggerSlf4J.info("variable1: {}", variable1) - loggerSlf4J.info("variable1: {}", variable1, RuntimeException()) + loggerSlf4J.info("variable1: $variable1", RuntimeException()) loggerSlf4J.info("{} variable1: {}", 1, variable1) loggerSlf4J.info("{} variable1: {} {} variable1: {}", 1, variable1, 2, variable1) loggerSlf4J.info("{} variable1: {} {} variable1: {} {}", 1, variable1, 2, variable1, 3)