diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt index e42699b4888..6ca5292d888 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt @@ -36,7 +36,7 @@ enum class PositioningStrategy(private val strategy: String) { PARAMETER_VARARG_MODIFIER("PARAMETER_VARARG_MODIFIER"), DECLARATION_RETURN_TYPE("DECLARATION_RETURN_TYPE"), OVERRIDE_MODIFIER("OVERRIDE_MODIFIER"), - DOT_BY_SELECTOR("DOT_BY_SELECTOR"), + DOT_BY_QUALIFIED("DOT_BY_QUALIFIED"), OPEN_MODIFIER("OPEN_MODIFIER"), WHEN_EXPRESSION("WHEN_EXPRESSION"), IF_EXPRESSION("IF_EXPRESSION"), diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 7a2ea3c0abf..3ca0d8635e2 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -361,7 +361,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() { } val NULLABILITY by object : DiagnosticGroup("Nullability") { - val UNSAFE_CALL by error(PositioningStrategy.DOT_BY_SELECTOR) { + val UNSAFE_CALL by error(PositioningStrategy.DOT_BY_QUALIFIED) { parameter("receiverType") } val UNSAFE_IMPLICIT_INVOKE_CALL by error { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index e0fd06ce1bc..30eb6beba1e 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -234,7 +234,7 @@ object FirErrors { val WRONG_IMPLIES_CONDITION by warning0() // Nullability - val UNSAFE_CALL by error1(SourceElementPositioningStrategies.DOT_BY_SELECTOR) + val UNSAFE_CALL by error1(SourceElementPositioningStrategies.DOT_BY_QUALIFIED) val UNSAFE_IMPLICIT_INVOKE_CALL by error1() val UNSAFE_INFIX_CALL by error3() val UNSAFE_OPERATOR_CALL by error3() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index b5ba01f5d06..d48905957ae 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -315,23 +315,17 @@ object LightTreePositioningStrategies { } } - val DOT_BY_SELECTOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + val DOT_BY_QUALIFIED: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { override fun mark( node: LighterASTNode, startOffset: Int, endOffset: Int, tree: FlyweightCapableTreeStructure ): List { - if (node.tokenType != KtNodeTypes.REFERENCE_EXPRESSION && node.tokenType != KtNodeTypes.CALL_EXPRESSION) { - // TODO: normally CALL_EXPRESSION should not be here. In PSI we have REFERENCE_EXPRESSION even for x.bar() case - // Remove CALL_EXPRESSION from here and repeat code below twice (see PSI counterpart) when fixed + if (node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION) { return super.mark(node, startOffset, endOffset, tree) } - val parentNode = tree.getParent(node) ?: return super.mark(node, startOffset, endOffset, tree) - if (parentNode.tokenType == KtNodeTypes.DOT_QUALIFIED_EXPRESSION) { - return markElement(tree.dotOperator(parentNode) ?: node, startOffset, endOffset, tree, node) - } - return super.mark(node, startOffset, endOffset, tree) + return markElement(tree.dotOperator(node) ?: node, startOffset, endOffset, tree, node) } } 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 804e1626282..6e006527cb2 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 @@ -98,9 +98,9 @@ object SourceElementPositioningStrategies { PositioningStrategies.PARAMETER_VARARG_MODIFIER ) - val DOT_BY_SELECTOR = SourceElementPositioningStrategy( - LightTreePositioningStrategies.DOT_BY_SELECTOR, - PositioningStrategies.DOT_BY_SELECTOR + val DOT_BY_QUALIFIED = SourceElementPositioningStrategy( + LightTreePositioningStrategies.DOT_BY_QUALIFIED, + PositioningStrategies.DOT_BY_QUALIFIED ) val SELECTOR_BY_QUALIFIED = SourceElementPositioningStrategy( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index ee35b392ce8..3848d8afb95 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -711,15 +711,11 @@ object PositioningStrategies { } } - val DOT_BY_SELECTOR: PositioningStrategy = object : PositioningStrategy() { + val DOT_BY_QUALIFIED: PositioningStrategy = object : PositioningStrategy() { override fun mark(element: PsiElement): List { when (element) { - is KtNameReferenceExpression -> { - var parent = element - repeat(2) { - parent = parent.parent - (parent as? KtDotQualifiedExpression)?.operationTokenNode?.psi?.let { return mark(it) } - } + is KtDotQualifiedExpression -> { + return mark(element.operationTokenNode.psi) } } return super.mark(element)