diff --git a/jvm/jvm-analysis-impl/resources/META-INF/JvmAnalysisPlugin.xml b/jvm/jvm-analysis-impl/resources/META-INF/JvmAnalysisPlugin.xml index 39054e9aff06..b8399c0318af 100644 --- a/jvm/jvm-analysis-impl/resources/META-INF/JvmAnalysisPlugin.xml +++ b/jvm/jvm-analysis-impl/resources/META-INF/JvmAnalysisPlugin.xml @@ -181,6 +181,8 @@ + + () ?: return + if (literalExpression !is ULiteralExpression && literalExpression !is UPolyadicExpression) return + val ranges = getRanges(literalExpression) ?: return + val offset = element.textRange.startOffset + ranges.forEach { range -> + val shiftedRange = range.shiftRight(offset) + holder.newSilentAnnotation(HighlightSeverity.TEXT_ATTRIBUTES).range(shiftedRange).textAttributes(DefaultLanguageHighlighterColors.VALID_STRING_ESCAPE).create() + } + } + + private fun getRanges(uExpression: UExpression): List? { + val context = getContext(uExpression) ?: return null + var rangeList = getPlaceholderRanges(context)?.flatMap { + val ranges = it.ranges + if (ranges.any { range -> range == null }) return null + ranges.filterNotNull() + } ?: return null + + val placeholderParametersSize = context.placeholderParameters.size + + if (placeholderParametersSize < rangeList.size) { + rangeList = rangeList.dropLast(rangeList.size - placeholderParametersSize) + } + + return getAlignedPlaceholderCount(rangeList, context) + } +} \ No newline at end of file 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 d4d3f19a56c6..46be306d9dd5 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 @@ -29,7 +29,6 @@ fun getLogArgumentReferences(uExpression: UExpression): List val ranges = getPlaceholderRanges(context) ?: return null val psiLiteralExpression = uExpression.sourcePsi ?: return null - val placeholderParametersSize = context.placeholderParameters.size val loggerReferenceList = ranges.zip(context.placeholderParameters) { placeholderRanges, parameter -> val parameterPsi = parameter.sourcePsi ?: return null @@ -39,23 +38,7 @@ fun getLogArgumentReferences(uExpression: UExpression): List } }.flatten() - return when (context.loggerType) { - SLF4J -> { - loggerReferenceList.take(if (context.lastArgumentIsException) placeholderParametersSize - 1 else placeholderParametersSize) - } - LOG4J_OLD_STYLE, LOG4J_FORMATTED_STYLE -> { - if (context.lastArgumentIsException && placeholderParametersSize == 1) { - emptyList() - } - else { - loggerReferenceList - } - } - SLF4J_EQUAL_PLACEHOLDERS, LOG4J_EQUAL_PLACEHOLDERS -> { - loggerReferenceList - } - else -> null - } + return getAlignedPlaceholderCount(loggerReferenceList, context) } internal fun getContext(uExpression: UExpression): PlaceholderContext? { @@ -67,6 +50,27 @@ internal fun getContext(uExpression: UExpression): PlaceholderContext? { return context } +internal fun getAlignedPlaceholderCount(placeholderList: List, context: PlaceholderContext): List? { + val placeholderParametersSize = context.placeholderParameters.size + return when (context.loggerType) { + SLF4J -> { + placeholderList.take(if (context.lastArgumentIsException) placeholderParametersSize - 1 else placeholderParametersSize) + } + LOG4J_OLD_STYLE, LOG4J_FORMATTED_STYLE -> { + if (context.lastArgumentIsException && placeholderParametersSize == 1) { + emptyList() + } + else { + placeholderList + } + } + SLF4J_EQUAL_PLACEHOLDERS, LOG4J_EQUAL_PLACEHOLDERS -> { + placeholderList + } + else -> null + } +} + internal fun getPlaceholderRanges(context: PlaceholderContext): List? { val logStringText = context.logStringArgument.sourcePsi?.text ?: return null val partHolders = listOf(