diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPsiPositioningStrategy.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPsiPositioningStrategy.kt index 4d483dff851..d5977b28c1b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPsiPositioningStrategy.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPsiPositioningStrategy.kt @@ -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 : PositioningStrategy(), - FirDiagnosticPositioningStrategy object FirPsiPositioningStrategies { - - val UNREACHABLE_CODE = object : FirPsiPositioningStrategy() { - - override fun markFirDiagnostic(element: FirPsiSourceElement, diagnostic: FirDiagnostic): List { + val UNREACHABLE_CODE = object : PositioningStrategy() { + override fun markDiagnostic(diagnostic: DiagnosticMarker): List { //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> + 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() ) } } -} \ No newline at end of file + val ACTUAL_DECLARATION_NAME = object : PositioningStrategy() { + override fun markDiagnostic(diagnostic: DiagnosticMarker): List { + require(diagnostic is FirDiagnostic) + val element = diagnostic.element.psi ?: return emptyList() + (element as? KtNamedDeclaration)?.nameIdentifier?.let { nameIdentifier -> + return mark(nameIdentifier) + } + return mark(element) + } + } +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt index 4b8ab630c0f..903cdaec9cb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategy.kt @@ -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 { - fun markFirDiagnostic(element: E, diagnostic: FirDiagnostic): List -} - -open class LightTreePositioningStrategy : FirDiagnosticPositioningStrategy { - - override fun markFirDiagnostic(element: FirSourceElement, diagnostic: FirDiagnostic): List { +open class LightTreePositioningStrategy { + open fun markFirDiagnostic(element: FirSourceElement, diagnostic: FirDiagnostic): List { return mark(element.lighterASTNode, element.startOffset, element.endOffset, element.treeStructure) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index 0be0422962b..06ab709cb93 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -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(