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(