FIR: implement LT positioning in diagnostic tests, fix LT strategies

This commit is contained in:
Mikhail Glukhikh
2021-01-21 13:47:07 +03:00
parent f1d8a6e5d1
commit 40bec30393
36 changed files with 275 additions and 210 deletions
@@ -6,14 +6,11 @@
package org.jetbrains.kotlin.test.frontend.fir.handlers
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codeMetaInfo.model.CodeMetaInfo
import org.jetbrains.kotlin.codeMetaInfo.renderConfigurations.AbstractCodeMetaInfoRenderConfiguration
import org.jetbrains.kotlin.diagnostics.PositioningStrategy
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDefaultErrorMessages
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderer
import org.jetbrains.kotlin.fir.psi
object FirMetaInfoUtils {
val renderDiagnosticNoArgs = FirDiagnosticCodeMetaRenderConfiguration().apply { renderParams = false }
@@ -24,23 +21,18 @@ class FirDiagnosticCodeMetaInfo(
val diagnostic: FirDiagnostic<*>,
renderConfiguration: FirDiagnosticCodeMetaRenderConfiguration
) : CodeMetaInfo {
// TODO: this implementation is hacky and doesn't support proper ranges for light tree diagnostics
private val textRangeFromClassicDiagnostic: TextRange? = run {
val psi = diagnostic.element.psi ?: return@run null
@Suppress("UNCHECKED_CAST")
val positioningStrategy = diagnostic.factory.positioningStrategy.psiStrategy as PositioningStrategy<PsiElement>
positioningStrategy.mark(psi).first()
private val textRangeFromClassicDiagnostic: TextRange = run {
diagnostic.factory.positioningStrategy.markDiagnostic(diagnostic).first()
}
override var renderConfiguration: FirDiagnosticCodeMetaRenderConfiguration = renderConfiguration
private set
override val start: Int
get() = textRangeFromClassicDiagnostic?.startOffset ?: diagnostic.element.startOffset
get() = textRangeFromClassicDiagnostic.startOffset
override val end: Int
get() = textRangeFromClassicDiagnostic?.endOffset ?: diagnostic.element.endOffset
get() = textRangeFromClassicDiagnostic.endOffset
override val tag: String
get() = renderConfiguration.getTag(this)