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)