From 6fee46316eb9836a13a8367c001d9122fff5974f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 1 Mar 2021 12:15:17 +0300 Subject: [PATCH] FIR: fix MANY_COMPANION_OBJECTS positioning --- .../resolve/diagnostics/manyCompanionObjects.kt | 4 ++-- .../generator/diagnostics/DiagnosticData.kt | 1 + .../generator/diagnostics/FirDiagnosticsList.kt | 2 +- .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 3 ++- .../diagnostics/LightTreePositioningStrategies.kt | 15 +++++++++++++++ .../SourceElementPositioningStrategies.kt | 5 +++++ .../tests/classObjects/ClassObjects.fir.kt | 6 +++--- .../multipleDissallowedDefaultObjects.fir.kt | 8 ++++---- 8 files changed, 33 insertions(+), 11 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt index 56cc10963e7..015131da28c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/manyCompanionObjects.kt @@ -3,7 +3,7 @@ class A { } - companion object { + companion object { } } @@ -13,7 +13,7 @@ class B { } - companion object B { + companion object B { } } 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 68a9f2b6da6..a8b701858cb 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 @@ -45,6 +45,7 @@ enum class PositioningStrategy(private val strategy: String) { SELECTOR_BY_QUALIFIED("SELECTOR_BY_QUALIFIED"), REFERENCE_BY_QUALIFIED("REFERENCE_BY_QUALIFIED"), PRIVATE_MODIFIER("PRIVATE_MODIFIER"), + COMPANION_OBJECT("COMPANION_OBJECT"), ; 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 26211e27bad..6832b2d9ecd 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 @@ -252,7 +252,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() { } val REDECLARATIONS by object : DiagnosticGroup("Redeclarations") { - val MANY_COMPANION_OBJECTS by error() + val MANY_COMPANION_OBJECTS by error(PositioningStrategy.COMPANION_OBJECT) val CONFLICTING_OVERLOADS by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { parameter>>("conflictingOverloads") } 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 65956d2f666..48a9364f5c6 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 @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor @@ -181,7 +182,7 @@ object FirErrors { val NON_FINAL_MEMBER_IN_OBJECT by warning0(SourceElementPositioningStrategies.OPEN_MODIFIER) // Redeclarations - val MANY_COMPANION_OBJECTS by error0() + val MANY_COMPANION_OBJECTS by error0(SourceElementPositioningStrategies.COMPANION_OBJECT) val CONFLICTING_OVERLOADS by error1>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val REDECLARATION by error1>>() val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error0() 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 00b2921b796..98b1ddc58e0 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 @@ -55,6 +55,18 @@ object LightTreePositioningStrategies { } } + val COMPANION_OBJECT: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + val target = tree.companionKeyword(node) ?: node + return markElement(target, startOffset, endOffset, tree, node) + } + } + val SECONDARY_CONSTRUCTOR_DELEGATION_CALL: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { override fun mark( node: LighterASTNode, @@ -405,6 +417,9 @@ fun FirSourceElement.hasVar(): Boolean = fun FirSourceElement.hasPrimaryConstructor(): Boolean = treeStructure.primaryConstructor(lighterASTNode) != null +private fun FlyweightCapableTreeStructure.companionKeyword(node: LighterASTNode): LighterASTNode? = + modifierList(node)?.let { findChildByType(it, KtTokens.COMPANION_KEYWORD) } + private fun FlyweightCapableTreeStructure.constructorKeyword(node: LighterASTNode): LighterASTNode? = findChildByType(node, KtTokens.CONSTRUCTOR_KEYWORD) 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 489dcb6b5d7..cae8244b4c6 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 @@ -18,6 +18,11 @@ object SourceElementPositioningStrategies { PositioningStrategies.VAL_OR_VAR_NODE ) + val COMPANION_OBJECT = SourceElementPositioningStrategy( + LightTreePositioningStrategies.COMPANION_OBJECT, + PositioningStrategies.COMPANION_OBJECT + ) + val SECONDARY_CONSTRUCTOR_DELEGATION_CALL = SourceElementPositioningStrategy( LightTreePositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL, PositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL diff --git a/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt b/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt index bacf3f33b28..4e8baccdef8 100644 --- a/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt @@ -5,7 +5,7 @@ class A { companion object { val x = 1 } - companion object { + companion object { val x = 1 } } @@ -14,10 +14,10 @@ class AA { companion object { val x = 1 } - companion object A { + companion object A { val x = 1 } - companion object AA { + companion object AA { val x = 1 } } diff --git a/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt b/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt index ec34b594b82..d5b96e7c186 100644 --- a/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt @@ -2,16 +2,16 @@ class A { inner class I { companion object A - companion object B + companion object B - companion object C + companion object C } } object O { companion object A - companion object B + companion object B - companion object C + companion object C }