[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.openapi.util.TextRange
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.cfg.UnreachableCode import org.jetbrains.kotlin.cfg.UnreachableCode
import org.jetbrains.kotlin.diagnostics.DiagnosticMarker
import org.jetbrains.kotlin.diagnostics.PositioningStrategy import org.jetbrains.kotlin.diagnostics.PositioningStrategy
import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtNamedDeclaration
abstract class FirPsiPositioningStrategy<in E : PsiElement> : PositioningStrategy<E>(),
FirDiagnosticPositioningStrategy<FirPsiSourceElement>
object FirPsiPositioningStrategies { object FirPsiPositioningStrategies {
val UNREACHABLE_CODE = object : PositioningStrategy<PsiElement>() {
val UNREACHABLE_CODE = object : FirPsiPositioningStrategy<PsiElement>() { override fun markDiagnostic(diagnostic: DiagnosticMarker): List<TextRange> {
override fun markFirDiagnostic(element: FirPsiSourceElement, diagnostic: FirDiagnostic): List<TextRange> {
//todo it is better to implement arguments extraction in FirDiagnosticFactory, but kotlin struggle with checking types in it atm //todo it is better to implement arguments extraction in FirDiagnosticFactory, but kotlin struggle with checking types in it atm
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val typed = diagnostic as FirDiagnosticWithParameters2<Set<FirSourceElement>, Set<FirSourceElement>> val typed = diagnostic as FirDiagnosticWithParameters2<Set<FirSourceElement>, Set<FirSourceElement>>
val source = diagnostic.element as FirPsiSourceElement
return UnreachableCode.getUnreachableTextRanges( return UnreachableCode.getUnreachableTextRanges(
element.psi as KtElement, source.psi as KtElement,
typed.a.mapNotNull { it.psi as? KtElement }.toSet(), typed.a.mapNotNull { it.psi as? KtElement }.toSet(),
typed.b.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
import org.jetbrains.kotlin.lexer.KtTokens.WHITE_SPACE import org.jetbrains.kotlin.lexer.KtTokens.WHITE_SPACE
interface FirDiagnosticPositioningStrategy<E : FirSourceElement> { open class LightTreePositioningStrategy {
fun markFirDiagnostic(element: E, diagnostic: FirDiagnostic): List<TextRange> open fun markFirDiagnostic(element: FirSourceElement, diagnostic: FirDiagnostic): List<TextRange> {
}
open class LightTreePositioningStrategy : FirDiagnosticPositioningStrategy<FirSourceElement> {
override fun markFirDiagnostic(element: FirSourceElement, diagnostic: FirDiagnostic): List<TextRange> {
return mark(element.lighterASTNode, element.startOffset, element.endOffset, element.treeStructure) return mark(element.lighterASTNode, element.startOffset, element.endOffset, element.treeStructure)
} }
@@ -284,7 +284,7 @@ object SourceElementPositioningStrategies {
val ACTUAL_DECLARATION_NAME = SourceElementPositioningStrategy( val ACTUAL_DECLARATION_NAME = SourceElementPositioningStrategy(
LightTreePositioningStrategies.ACTUAL_DECLARATION_NAME, LightTreePositioningStrategies.ACTUAL_DECLARATION_NAME,
PositioningStrategies.DEFAULT // TODO FirPsiPositioningStrategies.ACTUAL_DECLARATION_NAME
) )
val LABEL = SourceElementPositioningStrategy( val LABEL = SourceElementPositioningStrategy(