From b2271b925af5d7c27412bdbb2a9e204cf72e80c7 Mon Sep 17 00:00:00 2001 From: Georgii Ustinov Date: Thu, 21 Mar 2024 11:36:46 +0200 Subject: [PATCH] [Java. Logging] Implement better logging placeholder detection in text blocks for java IDEA-342484 GitOrigin-RevId: ccb5043d439b20207103cb2d81a09a40bb9f65cd --- .../LoggingArgumentSymbolReferenceProvider.kt | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/jvm/jvm-analysis-impl/src/com/intellij/analysis/logging/resolve/LoggingArgumentSymbolReferenceProvider.kt b/jvm/jvm-analysis-impl/src/com/intellij/analysis/logging/resolve/LoggingArgumentSymbolReferenceProvider.kt index 6327325d9354..2ac8ffc5c8e3 100644 --- a/jvm/jvm-analysis-impl/src/com/intellij/analysis/logging/resolve/LoggingArgumentSymbolReferenceProvider.kt +++ b/jvm/jvm-analysis-impl/src/com/intellij/analysis/logging/resolve/LoggingArgumentSymbolReferenceProvider.kt @@ -10,7 +10,9 @@ import com.intellij.model.psi.PsiSymbolReferenceHints import com.intellij.model.psi.PsiSymbolReferenceProvider import com.intellij.model.search.SearchRequest import com.intellij.openapi.project.Project -import com.intellij.psi.PsiElement +import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiLiteralExpression +import com.siyeh.ig.psiutils.ExpressionUtils import org.jetbrains.uast.* class JvmLoggerSymbolReferenceProvider : PsiSymbolReferenceProvider { @@ -34,28 +36,26 @@ class JvmLoggerSymbolReferenceProvider : PsiSymbolReferenceProvider { } } -fun getLogArgumentReferences(literalExpression: UExpression): List? { - val uCallExpression = literalExpression.getParentOfType() ?: return null +fun getLogArgumentReferences(uExpression: UExpression): List? { + val uCallExpression = uExpression.getParentOfType() ?: return null val log4jHasImplementationForSlf4j = LoggingUtil.hasBridgeFromSlf4jToLog4j2(uCallExpression) val logMethod = detectLoggerMethod(uCallExpression) ?: return null val context = getPlaceholderContext(logMethod, LOGGER_RESOLVE_TYPE_SEARCHERS, log4jHasImplementationForSlf4j) ?: return null - if (literalExpression != context.logStringArgument || context.partHolderList.size > 1) return null + if (uExpression != context.logStringArgument || context.partHolderList.size > 1) return null val placeholderCountResult = solvePlaceholderCount(context.loggerType, context.placeholderParameters.size, context.partHolderList) if (placeholderCountResult.status != PlaceholdersStatus.EXACTLY) return null val rangeWithParameterList = placeholderCountResult.placeholderRangeList.zip(context.placeholderParameters) - val psiLiteralExpression = literalExpression.sourcePsi ?: return null - val value = literalExpression.evaluateString() ?: return null + val psiLiteralExpression = uExpression.sourcePsi ?: return null + - val offset = getOffsetInText(psiLiteralExpression, value) ?: return null val placeholderParametersSize = context.placeholderParameters.size - val loggerReferenceList = rangeWithParameterList.map { (range, parameter) -> if (range == null) return null - val alignedRange = range.shiftRight(offset) + val alignedRange = getAlignedRangeInLiteralExpression(uExpression, range) ?: return null val parameterPsi = parameter.sourcePsi ?: return null LoggingArgumentSymbolReference(psiLiteralExpression, alignedRange, parameterPsi) } @@ -79,13 +79,18 @@ fun getLogArgumentReferences(literalExpression: UExpression): List