[FIR] Don't use positioning strategies from FE 1.0
This commit is contained in:
committed by
TeamCityServer
parent
00069b1d2f
commit
c32aecb7ae
+17
-8
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+2
-7
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user