From 3a07ca4c6434f10f6973f5c183d62e8a7868515e Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 28 Jan 2021 17:52:11 -0800 Subject: [PATCH] FIR checker: add diagnostic VAR_OVERRIDDEN_BY_VAL --- .../checkers/declaration/FirOverrideChecker.kt | 18 ++++++++++++++++++ .../diagnostics/FirDefaultErrorMessages.kt | 8 ++++++++ .../fir/analysis/diagnostics/FirErrors.kt | 2 ++ .../tests/OverridingVarByVal.fir.kt | 15 --------------- .../diagnostics/tests/OverridingVarByVal.kt | 1 + .../rendering/typeMismatchOnOverride.fir.kt | 2 +- .../tests/regressions/kt3810.fir.kt | 5 ----- .../diagnostics/tests/regressions/kt3810.kt | 1 + .../diagnostics/tests/scopes/kt323.fir.kt | 2 +- .../abstract-classes/p-2/neg/1.1.fir.kt | 8 ++++---- 10 files changed, 36 insertions(+), 26 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/OverridingVarByVal.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/regressions/kt3810.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 55f3ba6031c..a3692071c3b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -96,6 +96,13 @@ object FirOverrideChecker : FirRegularClassChecker() { return null } + private fun FirProperty.checkMutability( + overriddenSymbols: List>, + ): FirMemberDeclaration? { + if (isVar) return null + return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs() + } + private fun FirCallableMemberDeclaration<*>.checkReturnType( overriddenSymbols: List>, typeCheckerContext: AbstractTypeCheckerContext, @@ -178,6 +185,10 @@ object FirOverrideChecker : FirRegularClassChecker() { reporter.reportOverridingFinalMember(property, it) } + property.checkMutability(overriddenPropertySymbols)?.let { + reporter.reportVarOverriddenByVal(property, it) + } + val restriction = property.checkReturnType( overriddenSymbols = overriddenPropertySymbols, typeCheckerContext = typeCheckerContext, @@ -209,6 +220,13 @@ object FirOverrideChecker : FirRegularClassChecker() { } } + private fun DiagnosticReporter.reportVarOverriddenByVal( + overriding: FirMemberDeclaration, + overridden: FirMemberDeclaration + ) { + overriding.source?.let { report(FirErrors.VAR_OVERRIDDEN_BY_VAL.on(it, overriding, overridden)) } + } + private fun DiagnosticReporter.reportReturnTypeMismatchOnFunction( overriding: FirMemberDeclaration, overridden: FirMemberDeclaration diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index b02d8fdf4d9..1811b4b922a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -154,6 +154,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_INITIALI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_NEVER_READ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAR_ANNOTATION_PARAMETER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAR_OVERRIDDEN_BY_VAL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAR_TYPE_MISMATCH_ON_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_INVOCATION_KIND import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS @@ -353,6 +354,13 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { FQ_NAMES_IN_TYPES ) + map.put( + VAR_OVERRIDDEN_BY_VAL, + "Var-property {0} cannot be overridden by val-property {1}", + FQ_NAMES_IN_TYPES, + FQ_NAMES_IN_TYPES + ) + // Redeclarations map.put(MANY_COMPANION_OBJECTS, "Only one companion object is allowed per class") map.put(CONFLICTING_OVERLOADS, "Conflicting overloads: {0}", TO_STRING) // * diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 11bb6018b57..f3684ebea2d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -145,6 +145,8 @@ object FirErrors { val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) + val VAR_OVERRIDDEN_BY_VAL by error2(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) + // Redeclarations val MANY_COMPANION_OBJECTS by error0() val CONFLICTING_OVERLOADS by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) diff --git a/compiler/testData/diagnostics/tests/OverridingVarByVal.fir.kt b/compiler/testData/diagnostics/tests/OverridingVarByVal.fir.kt deleted file mode 100644 index 6ad543c6d65..00000000000 --- a/compiler/testData/diagnostics/tests/OverridingVarByVal.fir.kt +++ /dev/null @@ -1,15 +0,0 @@ -open class Var() { - open var v : Int = 1 -} - -interface VarT { - var v : Int -} - -class Val() : Var(), VarT { - override val v : Int = 1 -} - -class Var2() : Var() { - override var v : Int = 1 -} diff --git a/compiler/testData/diagnostics/tests/OverridingVarByVal.kt b/compiler/testData/diagnostics/tests/OverridingVarByVal.kt index c18a525c9e6..7e63c772458 100644 --- a/compiler/testData/diagnostics/tests/OverridingVarByVal.kt +++ b/compiler/testData/diagnostics/tests/OverridingVarByVal.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL open class Var() { open var v : Int = 1 } diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.fir.kt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.fir.kt index d297a3f996a..0b1634aeb75 100644 --- a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.fir.kt @@ -17,7 +17,7 @@ interface A { interface B : A { override val p1: Int @An - override val p2: @An String + override val p2: @An String override fun test(arg: String): Int } diff --git a/compiler/testData/diagnostics/tests/regressions/kt3810.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt3810.fir.kt deleted file mode 100644 index a9b163040e9..00000000000 --- a/compiler/testData/diagnostics/tests/regressions/kt3810.fir.kt +++ /dev/null @@ -1,5 +0,0 @@ -interface A { - var foo: String -} - -class B(override val foo: String) : A diff --git a/compiler/testData/diagnostics/tests/regressions/kt3810.kt b/compiler/testData/diagnostics/tests/regressions/kt3810.kt index 180c1dfc550..1b6a8957b92 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt3810.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt3810.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface A { var foo: String } diff --git a/compiler/testData/diagnostics/tests/scopes/kt323.fir.kt b/compiler/testData/diagnostics/tests/scopes/kt323.fir.kt index e1cf65d75ec..497022d7652 100644 --- a/compiler/testData/diagnostics/tests/scopes/kt323.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/kt323.fir.kt @@ -6,7 +6,7 @@ open class A { } class B : A() { - override val a = 34 + override val a = 34 var b : Int public get() = 23 diff --git a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.1.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.1.fir.kt index d07c8bf1aca..6686fdbde50 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.1.fir.kt @@ -22,9 +22,9 @@ fun case1() { class BaseImplCase2( override var a: Any, override - val b: Any, override var c: Any, override + val b: Any, override var c: Any, override - val d: Any = "5") : Base() + val d: Any = "5") : Base() { override fun foo() {} override internal fun boo() {} @@ -42,14 +42,14 @@ class ImplBaseCase2() : Base() { set(value) {} override - val b: Any + val b: Any get() = TODO() override var c: Any get() = TODO() set(value) {} override - val d: Any + val d: Any get() = TODO() override fun foo() {}