From 42d53dd9544dcf7de0e2d51238cee61c84d072d6 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 23 Mar 2021 15:13:30 +0300 Subject: [PATCH] FIR: introduce delegated & overridden conflict checks --- .../diagnostics/FirDiagnosticsList.kt | 8 +++ .../fir/analysis/diagnostics/FirErrors.kt | 2 + .../FirNotImplementedOverrideChecker.kt | 62 ++++++++++++++++--- .../clashes/finalMemberOverridden.fir.kt | 16 ++--- .../covariantOverrides/fromClass.fir.kt | 4 +- .../delegationToSubTypeWithOverride.fir.kt | 19 ------ .../delegationToSubTypeWithOverride.kt | 1 + ...gationToSubTypeWithOverrideProperty.fir.kt | 26 -------- ...delegationToSubTypeWithOverrideProperty.kt | 1 + .../diamond.fir.kt | 8 +-- .../fakeOverrideInTheMiddle.fir.kt | 13 ---- .../fakeOverrideInTheMiddle.kt | 1 + .../sameDelegationInHierarchy2.fir.kt | 2 +- .../severalDelegates.fir.kt | 2 +- .../simple.fir.kt | 19 ------ .../memberHidesSupertypeOverride/simple.kt | 1 + .../simpleProp.fir.kt | 17 ----- .../simpleProp.kt | 1 + .../superTraitAndDelegationToTraitImpl.fir.kt | 2 +- .../diagnostics/KtFirDataClassConverters.kt | 16 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 12 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 18 ++++++ 22 files changed, 131 insertions(+), 120 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.fir.kt 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 d9e44b7cf8f..d209400cc2b 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 @@ -336,6 +336,14 @@ object DIAGNOSTICS_LIST : DiagnosticList() { parameter>("classOrObject") parameter>("missingDeclaration") } + val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error(PositioningStrategy.DECLARATION_NAME) { + parameter>("delegatedDeclaration") + parameter>("overriddenDeclaration") + } + val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning(PositioningStrategy.DECLARATION_NAME) { + parameter>("delegatedDeclaration") + parameter>("overriddenDeclaration") + } val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error(PositioningStrategy.DECLARATION_RETURN_TYPE) { parameter("function") 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 cc9e64a3b88..970cc30c56d 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 @@ -225,6 +225,8 @@ object FirErrors { val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING by warning2, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val MANY_IMPL_MEMBER_NOT_IMPLEMENTED by error2, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED by error2, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) + val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error2, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) + val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning2, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt index 895a35b3aaa..37cd01e4084 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt @@ -18,10 +18,12 @@ import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_MEMBER_NOT_IMPLEMENTED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MANY_IMPL_MEMBER_NOT_IMPLEMENTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDING_FINAL_MEMBER_BY_DELEGATION import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* @@ -135,16 +137,58 @@ object FirNotImplementedOverrideChecker : FirClassChecker() { } } if (notImplementedIntersectionSymbols.isNotEmpty()) { - val notImplementedIntersectionSymbol = notImplementedIntersectionSymbols.first() - val notImplementedIntersection = notImplementedIntersectionSymbol.fir - val intersections = (notImplementedIntersectionSymbol as FirIntersectionCallableSymbol).intersections - if (intersections.any { - (it.containingClass()?.toSymbol(context.session)?.fir as? FirRegularClass)?.classKind == ClassKind.CLASS + var overridingFinalByDelegationReported = false + var manyMemberNotImplementedReported = false + var delegatedHidesSupertypeReported = false + for (notImplementedIntersectionSymbol in notImplementedIntersectionSymbols) { + val notImplementedIntersection = notImplementedIntersectionSymbol.fir + val intersections = (notImplementedIntersectionSymbol as FirIntersectionCallableSymbol).intersections + val delegatedIntersected = intersections.find { + val fir = it.fir as FirCallableMemberDeclaration + fir.origin == FirDeclarationOrigin.Delegated } - ) { - reporter.reportOn(source, MANY_IMPL_MEMBER_NOT_IMPLEMENTED, declaration, notImplementedIntersection, context) - } else { - reporter.reportOn(source, MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED, declaration, notImplementedIntersection, context) + if (delegatedIntersected != null) { + val finalIntersected = intersections.find { (it.fir as FirCallableMemberDeclaration).modality == Modality.FINAL } + if (finalIntersected != null) { + if (!overridingFinalByDelegationReported) { + reporter.reportOn( + source, + OVERRIDING_FINAL_MEMBER_BY_DELEGATION, + delegatedIntersected.fir, + finalIntersected.fir, + context + ) + overridingFinalByDelegationReported = true + } + continue + } + val notDelegatedIntersected = intersections.firstOrNull { + (it.fir as FirCallableMemberDeclaration).origin != FirDeclarationOrigin.Delegated + } + if (notDelegatedIntersected != null) { + if (!delegatedHidesSupertypeReported) { + reporter.reportOn( + source, + DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE, + delegatedIntersected.fir, + notDelegatedIntersected.fir, + context + ) + delegatedHidesSupertypeReported = true + } + continue + } + } + if (manyMemberNotImplementedReported) continue + if (intersections.any { + (it.containingClass()?.toSymbol(context.session)?.fir as? FirRegularClass)?.classKind == ClassKind.CLASS + } + ) { + reporter.reportOn(source, MANY_IMPL_MEMBER_NOT_IMPLEMENTED, declaration, notImplementedIntersection, context) + } else { + reporter.reportOn(source, MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED, declaration, notImplementedIntersection, context) + } + manyMemberNotImplementedReported = true } } } diff --git a/compiler/testData/diagnostics/tests/delegation/clashes/finalMemberOverridden.fir.kt b/compiler/testData/diagnostics/tests/delegation/clashes/finalMemberOverridden.fir.kt index e22d9bc2926..10f24e13d59 100644 --- a/compiler/testData/diagnostics/tests/delegation/clashes/finalMemberOverridden.fir.kt +++ b/compiler/testData/diagnostics/tests/delegation/clashes/finalMemberOverridden.fir.kt @@ -39,18 +39,18 @@ class CBarT : IBarT { override val bar: T get() = null!! } -class Test1 : Final(), IFoo by CFoo() +class Test1 : Final(), IFoo by CFoo() -class Test2 : Final(), IBar by CBar() +class Test2 : Final(), IBar by CBar() -class Test3 : Final(), IQux by CQux() +class Test3 : Final(), IQux by CQux() -class Test4 : Derived(), IFoo by CFoo() +class Test4 : Derived(), IFoo by CFoo() -class Test5 : Derived(), IBar by CBar() +class Test5 : Derived(), IBar by CBar() -class Test6 : Derived(), IQux by CQux() +class Test6 : Derived(), IQux by CQux() -class Test7 : Final(), IBarT by CBarT() +class Test7 : Final(), IBarT by CBarT() -class Test8 : Final(), IBarT by CBar() +class Test8 : Final(), IBarT by CBar() diff --git a/compiler/testData/diagnostics/tests/delegation/covariantOverrides/fromClass.fir.kt b/compiler/testData/diagnostics/tests/delegation/covariantOverrides/fromClass.fir.kt index b4db71d128a..8f384cd3e92 100644 --- a/compiler/testData/diagnostics/tests/delegation/covariantOverrides/fromClass.fir.kt +++ b/compiler/testData/diagnostics/tests/delegation/covariantOverrides/fromClass.fir.kt @@ -6,7 +6,7 @@ open class IDerived1 : IBase1 { override fun foo(): String = "1" } -class Broken1(val b: IBase1) : IBase1 by b, IDerived1() +class Broken1(val b: IBase1) : IBase1 by b, IDerived1() interface IBase2 { val foo: Any @@ -16,4 +16,4 @@ open class IDerived2 : IBase2 { override val foo: String = "2" } -class Broken2(val b: IBase2) : IBase2 by b, IDerived2() +class Broken2(val b: IBase2) : IBase2 by b, IDerived2() diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.fir.kt deleted file mode 100644 index eb7a997f4d1..00000000000 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -public interface Base { - fun test() = "OK" -} - -public interface Base2 : Base { - override fun test() = "OK2" -} - -class Delegate : Base2 - -fun box(): String { - object : Base, Base2 by Delegate() { - } - - object : Base2, Base by Delegate() { - } - - return "OK" -} diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.kt index 3a46baf687c..4ecf47d129b 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverride.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public interface Base { fun test() = "OK" } diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.fir.kt deleted file mode 100644 index f11545756b8..00000000000 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.fir.kt +++ /dev/null @@ -1,26 +0,0 @@ -public interface Base { - var test: String - get() = "OK" - set(s: String) { - } -} - -public interface Base2 : Base { - override var test: String - get() = "OK2" - set(value) {} -} - -class Delegate : Base2 { - -} - -fun box(): String { - object : Base, Base2 by Delegate() { - } - - object : Base2, Base by Delegate() { - } - - return "OK" -} diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.kt index a9a8bea5f54..f35c0a44c82 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/delegationToSubTypeWithOverrideProperty.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public interface Base { var test: String get() = "OK" diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/diamond.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/diamond.fir.kt index a493209b585..b44cfad8f5b 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/diamond.fir.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/diamond.fir.kt @@ -23,19 +23,19 @@ class ImplAll : Base, Base2, Base3 { } fun box(): String { - object : Base2, Base3, Base by Impl() { + object : Base2, Base3, Base by Impl() { } - object : Base2 by Impl2(), Base3, Base { + object : Base2 by Impl2(), Base3, Base { } - object : Base2, Base3 by Impl3(), Base { + object : Base2, Base3 by Impl3(), Base { } - object : Base2 by Impl2(), Base3 by Impl3(), Base by Impl() { + object : Base2 by Impl2(), Base3 by Impl3(), Base by Impl() { } diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.fir.kt deleted file mode 100644 index 185b566065d..00000000000 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.fir.kt +++ /dev/null @@ -1,13 +0,0 @@ -interface Base { - fun test() = "Base" -} - -class Delegate : Base - -abstract class Middle : Base { - override fun test() = "MyClass" -} - -abstract class MyClass : Middle() - -class A : MyClass(), Base by Delegate() diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.kt index 1c55159a710..2135be2f740 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/fakeOverrideInTheMiddle.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface Base { fun test() = "Base" } diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/sameDelegationInHierarchy2.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/sameDelegationInHierarchy2.fir.kt index 9807192268f..2ceed7aa62a 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/sameDelegationInHierarchy2.fir.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/sameDelegationInHierarchy2.fir.kt @@ -14,7 +14,7 @@ class Delegate : Derived { public open class MyClass : Base by Delegate() fun box(): String { - object : MyClass(), Derived by Delegate() { + object : MyClass(), Derived by Delegate() { } return "OK" } diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/severalDelegates.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/severalDelegates.fir.kt index 06098cc48fb..d89632145d8 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/severalDelegates.fir.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/severalDelegates.fir.kt @@ -23,6 +23,6 @@ public abstract class MyClass : Base1, Base2 { } } -class A : MyClass(), Base1 by Delegate1(), Base1 by Delegate2() { +class A : MyClass(), Base1 by Delegate1(), Base1 by Delegate2() { } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.fir.kt deleted file mode 100644 index caf2804ed72..00000000000 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -public interface Base { - fun getValue(): String - - fun test() = getValue() -} - -class Delegate : Base { - override fun getValue() = "Delegate" -} - -public abstract class MyClass : Base { - override fun test(): String { - return "Class" - } -} - -class A : MyClass(), Base by Delegate() { - override fun getValue() = "Delegate" -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.kt index 1dd53942cae..dc6006c8b5a 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simple.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public interface Base { fun getValue(): String diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.fir.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.fir.kt deleted file mode 100644 index 3878b279f00..00000000000 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -public interface Base { - val test: String - get() = "OK" -} - -open class Delegate : Base { - override val test: String - get() = "OK" -} - -fun box(): String { - object : Delegate(), Base by Delegate() { - - } - - return "OK" -} diff --git a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.kt b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.kt index 702521c97d0..b98e45dba31 100644 --- a/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.kt +++ b/compiler/testData/diagnostics/tests/delegation/memberHidesSupertypeOverride/simpleProp.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public interface Base { val test: String get() = "OK" diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/superTraitAndDelegationToTraitImpl.fir.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/superTraitAndDelegationToTraitImpl.fir.kt index 7fecce1889a..63f03c7c2b2 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/superTraitAndDelegationToTraitImpl.fir.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/superTraitAndDelegationToTraitImpl.fir.kt @@ -10,4 +10,4 @@ interface B { class C(f: A): A by f, B -class D(f: A): A by f, B \ No newline at end of file +class D(f: A): A by f, B diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index e805d395d7a..e904dd75924 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -965,6 +965,22 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.OVERRIDING_FINAL_MEMBER_BY_DELEGATION) { firDiagnostic -> + OverridingFinalMemberByDelegationImpl( + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE) { firDiagnostic -> + DelegatedMemberHidesSupertypeOverrideImpl( + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic -> ReturnTypeMismatchOnOverrideImpl( firSymbolBuilder.buildSymbol(firDiagnostic.a as FirDeclaration), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 2588f991a29..a876f1d02a2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -690,6 +690,18 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val missingDeclaration: KtCallableSymbol } + abstract class OverridingFinalMemberByDelegation : KtFirDiagnostic() { + override val diagnosticClass get() = OverridingFinalMemberByDelegation::class + abstract val delegatedDeclaration: KtCallableSymbol + abstract val overriddenDeclaration: KtCallableSymbol + } + + abstract class DelegatedMemberHidesSupertypeOverride : KtFirDiagnostic() { + override val diagnosticClass get() = DelegatedMemberHidesSupertypeOverride::class + abstract val delegatedDeclaration: KtCallableSymbol + abstract val overriddenDeclaration: KtCallableSymbol + } + abstract class ReturnTypeMismatchOnOverride : KtFirDiagnostic() { override val diagnosticClass get() = ReturnTypeMismatchOnOverride::class abstract val function: KtSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 8d4675178af..86df1ee18b3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -1105,6 +1105,24 @@ internal class ManyInterfacesMemberNotImplementedImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class OverridingFinalMemberByDelegationImpl( + override val delegatedDeclaration: KtCallableSymbol, + override val overriddenDeclaration: KtCallableSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.OverridingFinalMemberByDelegation(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class DelegatedMemberHidesSupertypeOverrideImpl( + override val delegatedDeclaration: KtCallableSymbol, + override val overriddenDeclaration: KtCallableSymbol, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.DelegatedMemberHidesSupertypeOverride(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class ReturnTypeMismatchOnOverrideImpl( override val function: KtSymbol, override val superFunction: KtSymbol,