[Java. Logging] Add base for tests for resolving logger methods in java

IDEA-342484

GitOrigin-RevId: fd2666c64933e2c82e546e20b752f2a4a4775c02
This commit is contained in:
Georgii Ustinov
2024-03-15 14:55:00 +02:00
committed by intellij-monorepo-bot
parent eec7243d08
commit c3bc0c82af
3 changed files with 62 additions and 5 deletions

View File

@@ -2,6 +2,7 @@
package com.intellij.analysis.logging.resolve
import com.intellij.codeInspection.logging.*
import com.intellij.codeInspection.logging.PlaceholderLoggerType.*
import com.intellij.model.Symbol
import com.intellij.model.psi.PsiExternalReferenceHost
import com.intellij.model.psi.PsiSymbolReference
@@ -9,9 +10,7 @@ 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.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.codeInspection.logging.PlaceholderLoggerType.*
import org.jetbrains.uast.*
class JvmLoggerSymbolReferenceProvider : PsiSymbolReferenceProvider {
@@ -56,7 +55,7 @@ fun getLogArgumentReferences(literalExpression: UExpression): List<PsiSymbolRefe
val loggerReferenceList = rangeWithParameterList.map { (range, parameter) ->
if (range == null) return null
val alignedRange = range.shiftTextRange(offset)
val alignedRange = range.shiftRight(offset)
val parameterPsi = parameter.sourcePsi ?: return null
JvmLoggerArgumentSymbolReference(psiLiteralExpression, alignedRange, parameterPsi)
}
@@ -72,8 +71,6 @@ fun getLogArgumentReferences(literalExpression: UExpression): List<PsiSymbolRefe
}
}
private fun TextRange.shiftTextRange(shift: Int): TextRange = TextRange(this.startOffset + shift, this.endOffset + shift)
private fun getOffsetInText(expression: PsiElement, value: String): Int? {
val text = expression.text
if (text == null) return null

View File

@@ -0,0 +1,13 @@
package com.intellij.jvm.analysis.internal.testFramework.logging
import com.intellij.jvm.analysis.testFramework.LightJvmCodeInsightFixtureTestCase
abstract class LoggingArgumentSymbolReferenceProviderTestBase : LightJvmCodeInsightFixtureTestCase() {
override fun setUp() {
super.setUp()
LoggingTestUtils.addSlf4J(myFixture)
LoggingTestUtils.addLog4J(myFixture)
LoggingTestUtils.addJUL(myFixture)
LoggingTestUtils.addKotlinAdapter(myFixture)
}
}

View File

@@ -0,0 +1,47 @@
package com.intellij.logging.resolve
import com.intellij.analysis.logging.resolve.JvmLoggerArgumentSymbol
import com.intellij.jvm.analysis.internal.testFramework.logging.LoggingArgumentSymbolReferenceProviderTestBase
import com.intellij.model.psi.PsiSymbolReference
import com.intellij.model.psi.PsiSymbolReferenceService
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiLiteralExpression
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.LightProjectDescriptor
import junit.framework.TestCase
import org.jetbrains.uast.ULiteralExpression
class JavaLoggingArgumentSymbolReferenceProviderTest : LoggingArgumentSymbolReferenceProviderTestBase() {
override fun getProjectDescriptor(): LightProjectDescriptor = JAVA_LATEST_WITH_LATEST_JDK
fun `test log4j2`() {
myFixture.configureByText("Logging.java", """
import org.apache.logging.log4j.*;
class Logging {
private static final Logger LOG = LogManager.getLogger();
void m(int i) {
LOG.info("<caret>{}", i);
}
}
""".trimIndent())
doTest(mapOf(TextRange(1, 3) to "i"))
}
private fun doTest(bindings : Map<TextRange, String>) {
val literal = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiLiteralExpression::class.java)
TestCase.assertFalse(literal == null)
val refs: Collection<PsiSymbolReference> = PsiSymbolReferenceService.getService().getReferences(literal!!)
refs.forEach {ref ->
assertEquals(literal, ref.element)
val symbols = ref.resolveReference()
assertEquals(bindings.size, symbols.size)
val symbol = symbols.single()
assertTrue(symbol is JvmLoggerArgumentSymbol)
val formatSymbol = symbol as JvmLoggerArgumentSymbol
assertTrue(formatSymbol.getPlaceholderString() is ULiteralExpression)
val expressionText = formatSymbol.expression.text
assertEquals(bindings[ref.rangeInElement], expressionText)
}
}
}