From 3001c41aedaabe13b74671375fa6286425966639 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Wed, 18 Sep 2024 14:18:43 +0200 Subject: [PATCH] [java-inspections] IDEA-357938 try to infer logging type inside methods for StringConcatenationArgumentToLogCallInspection GitOrigin-RevId: a09f433bdc1cbed3c81ee4fab6f4986b5ada4271 --- ...ngConcatenationArgumentToLogCallInspection.java | 14 ++++++++++++++ .../Log4jFormatted.java | 2 +- .../SimpleConcatenationInsideMethod.after.java | 12 ++++++++++++ .../SimpleConcatenationInsideMethod.java | 12 ++++++++++++ ...tringConcatenationArgumentToLogCallFixTest.java | 3 ++- 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.after.java create mode 100644 java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.java diff --git a/java/java-impl/src/com/siyeh/ig/logging/StringConcatenationArgumentToLogCallInspection.java b/java/java-impl/src/com/siyeh/ig/logging/StringConcatenationArgumentToLogCallInspection.java index 9778160b6fbe..9525efd2cb00 100644 --- a/java/java-impl/src/com/siyeh/ig/logging/StringConcatenationArgumentToLogCallInspection.java +++ b/java/java-impl/src/com/siyeh/ig/logging/StringConcatenationArgumentToLogCallInspection.java @@ -142,6 +142,20 @@ public final class StringConcatenationArgumentToLogCallInspection extends BaseIn if (qualifierExpression != null) { boolean isFormatted = true; + if (qualifierExpression instanceof PsiMethodCallExpression callExpression) { + PsiMethod method = callExpression.resolveMethod(); + if (method != null && + method.getContainingFile() == qualifierExpression.getContainingFile() && + (method.hasModifierProperty(PsiModifier.PRIVATE) || + method.hasModifierProperty(PsiModifier.STATIC))) { + PsiReturnStatement[] statements = PsiUtil.findReturnStatements(method); + if (statements.length == 1) { + PsiReturnStatement statement = statements[0]; + qualifierExpression = statement.getReturnValue(); + } + } + } + if (qualifierExpression instanceof PsiReferenceExpression referenceExpression && referenceExpression.resolve() instanceof PsiVariable loggerVariable) { if (!loggerVariable.isPhysical() || diff --git a/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/Log4jFormatted.java b/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/Log4jFormatted.java index d312fbb0c9a2..f7428bfae9d7 100644 --- a/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/Log4jFormatted.java +++ b/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/Log4jFormatted.java @@ -2,7 +2,7 @@ import org.apache.logging.log4j.*; class Log4JFormatted { - private static final Logger logger = LogManager.getFormattedLogger(Log4JFormatted.class); + private static final Logger logger = LogManager.getFormatterLogger(Log4JFormatted.class); public static void m(String a) { logger.info("12" + a); diff --git a/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.after.java b/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.after.java new file mode 100644 index 000000000000..f9f1c2237c7f --- /dev/null +++ b/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.after.java @@ -0,0 +1,12 @@ +import org.apache.logging.log4j.*; + +class SimpleConcatenationInsideMethod { + + public void m(String a) { + getLogger().info("12{}", a); + } + + private Logger getLogger() { + return LogManager.getLogger(SimpleConcatenationInsideMethod.class); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.java b/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.java new file mode 100644 index 000000000000..f0ba6cd14aad --- /dev/null +++ b/java/java-tests/testData/ig/com/siyeh/igfixes/logging/string_concatenation_argument_to_log_call/SimpleConcatenationInsideMethod.java @@ -0,0 +1,12 @@ +import org.apache.logging.log4j.*; + +class SimpleConcatenationInsideMethod { + + public void m(String a) { + getLogger().info("12" + a); + } + + private Logger getLogger() { + return LogManager.getLogger(SimpleConcatenationInsideMethod.class); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/siyeh/ig/fixes/logging/StringConcatenationArgumentToLogCallFixTest.java b/java/java-tests/testSrc/com/siyeh/ig/fixes/logging/StringConcatenationArgumentToLogCallFixTest.java index 8775904e356b..2b7be65e02d8 100644 --- a/java/java-tests/testSrc/com/siyeh/ig/fixes/logging/StringConcatenationArgumentToLogCallFixTest.java +++ b/java/java-tests/testSrc/com/siyeh/ig/fixes/logging/StringConcatenationArgumentToLogCallFixTest.java @@ -40,10 +40,10 @@ public class StringConcatenationArgumentToLogCallFixTest extends IGQuickFixesTes public void testUseOfConstant() { doTest(); } public void testCharLiteral() { doTest(); } public void testQuoteCharLiteral() { doTest(); } - public void testLog4JLogBuilder() { doTest(); } public void testLog4jFormatted() { assertQuickfixNotAvailable(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.call.quickfix")); } + public void testLog4JLogBuilder() { doTest(); } public void testTextBlocks() { doTest( InspectionsBundle.message("fix.all.inspection.problems.in.file", @@ -54,6 +54,7 @@ public class StringConcatenationArgumentToLogCallFixTest extends IGQuickFixesTes public void testMessageFormatMissingParameter() { assertQuickfixNotAvailable(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.message.format.call.quickfix")); } public void testMessageFormatMoreArguments() { assertQuickfixNotAvailable(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.message.format.call.quickfix")); } public void testMessageFormatFormatter() { assertQuickfixNotAvailable(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.message.format.call.quickfix")); } + public void testSimpleConcatenationInsideMethod() { doTest(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.call.quickfix")); } public void testSimpleStringFormat() { doTest(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.string.format.call.quickfix")); } public void testStringFormatWithWidth() { assertQuickfixNotAvailable(InspectionGadgetsBundle.message("string.concatenation.argument.to.log.string.format.call.quickfix")); }