[FIR] Don't use positioning strategies from FE 1.0

This commit is contained in:
Dmitriy Novozhilov
2021-09-08 18:20:57 +03:00
committed by TeamCityServer
parent 00069b1d2f
commit c32aecb7ae
3 changed files with 20 additions and 16 deletions
@@ -8,29 +8,38 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.cfg.UnreachableCode
import org.jetbrains.kotlin.diagnostics.DiagnosticMarker
import org.jetbrains.kotlin.diagnostics.PositioningStrategy
import org.jetbrains.kotlin.fir.FirPsiSourceElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtNamedDeclaration
abstract class FirPsiPositioningStrategy<in E : PsiElement> : PositioningStrategy<E>(),
FirDiagnosticPositioningStrategy<FirPsiSourceElement>
object FirPsiPositioningStrategies {
val UNREACHABLE_CODE = object : FirPsiPositioningStrategy<PsiElement>() {
override fun markFirDiagnostic(element: FirPsiSourceElement, diagnostic: FirDiagnostic): List<TextRange> {
val UNREACHABLE_CODE = object : PositioningStrategy<PsiElement>() {
override fun markDiagnostic(diagnostic: DiagnosticMarker): List<TextRange> {
//todo it is better to implement arguments extraction in FirDiagnosticFactory, but kotlin struggle with checking types in it atm
@Suppress("UNCHECKED_CAST")
val typed = diagnostic as FirDiagnosticWithParameters2<Set<FirSourceElement>, Set<FirSourceElement>>
val source = diagnostic.element as FirPsiSourceElement
return UnreachableCode.getUnreachableTextRanges(
element.psi as KtElement,
source.psi as KtElement,
typed.a.mapNotNull { it.psi as? KtElement }.toSet(),
typed.b.mapNotNull { it.psi as? KtElement }.toSet()
)
}
}
}
val ACTUAL_DECLARATION_NAME = object : PositioningStrategy<PsiElement>() {
override fun markDiagnostic(diagnostic: DiagnosticMarker): List<TextRange> {
require(diagnostic is FirDiagnostic)
val element = diagnostic.element.psi ?: return emptyList()
(element as? KtNamedDeclaration)?.nameIdentifier?.let { nameIdentifier ->
return mark(nameIdentifier)
}
return mark(element)
}
}
}
@@ -16,13 +16,8 @@ import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.WHITE_SPACE
interface FirDiagnosticPositioningStrategy<E : FirSourceElement> {
fun markFirDiagnostic(element: E, diagnostic: FirDiagnostic): List<TextRange>
}
open class LightTreePositioningStrategy : FirDiagnosticPositioningStrategy<FirSourceElement> {
override fun markFirDiagnostic(element: FirSourceElement, diagnostic: FirDiagnostic): List<TextRange> {
open class LightTreePositioningStrategy {
open fun markFirDiagnostic(element: FirSourceElement, diagnostic: FirDiagnostic): List<TextRange> {
return mark(element.lighterASTNode, element.startOffset, element.endOffset, element.treeStructure)
}
@@ -284,7 +284,7 @@ object SourceElementPositioningStrategies {
val ACTUAL_DECLARATION_NAME = SourceElementPositioningStrategy(
LightTreePositioningStrategies.ACTUAL_DECLARATION_NAME,
PositioningStrategies.DEFAULT // TODO
FirPsiPositioningStrategies.ACTUAL_DECLARATION_NAME
)
val LABEL = SourceElementPositioningStrategy(