FIR checker: add diagnostic VAR_OVERRIDDEN_BY_VAL

This commit is contained in:
Jinseong Jeon
2021-01-28 17:52:11 -08:00
committed by Dmitriy Novozhilov
parent 80d5a1a1db
commit 3a07ca4c64
10 changed files with 36 additions and 26 deletions
@@ -96,6 +96,13 @@ object FirOverrideChecker : FirRegularClassChecker() {
return null
}
private fun FirProperty.checkMutability(
overriddenSymbols: List<FirCallableSymbol<*>>,
): FirMemberDeclaration? {
if (isVar) return null
return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs()
}
private fun FirCallableMemberDeclaration<*>.checkReturnType(
overriddenSymbols: List<FirCallableSymbol<*>>,
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
@@ -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) // *
@@ -145,6 +145,8 @@ object FirErrors {
val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2<FirSourceElement, KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE)
val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2<FirSourceElement, KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE)
val VAR_OVERRIDDEN_BY_VAL by error2<FirSourceElement, KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.VAL_OR_VAR_NODE)
// Redeclarations
val MANY_COMPANION_OBJECTS by error0<FirSourceElement, PsiElement>()
val CONFLICTING_OVERLOADS by error1<FirSourceElement, PsiElement, String>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
@@ -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
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class Var() {
open var v : Int = 1
}
@@ -17,7 +17,7 @@ interface A {
interface B : A {
override val p1: <!PROPERTY_TYPE_MISMATCH_ON_OVERRIDE!>Int<!>
@An
override val p2: @An String
override <!VAR_OVERRIDDEN_BY_VAL!>val<!> p2: @An String
override fun test(arg: String): <!RETURN_TYPE_MISMATCH_ON_OVERRIDE!>Int<!>
}
@@ -1,5 +0,0 @@
interface A {
var foo: String
}
class B(override val foo: String) : A
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface A {
var foo: String
}
+1 -1
View File
@@ -6,7 +6,7 @@ open class A {
}
class B : A() {
override val a = 34
override <!VAR_OVERRIDDEN_BY_VAL!>val<!> a = 34
var b : Int
public get() = 23
@@ -22,9 +22,9 @@ fun case1() {
class BaseImplCase2(
override var a: Any, override
val b: Any, override var c: Any, override
<!VAR_OVERRIDDEN_BY_VAL!>val<!> b: Any, override var c: Any, override
val d: Any = "5") : Base()
<!VAR_OVERRIDDEN_BY_VAL!>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
<!VAR_OVERRIDDEN_BY_VAL!>val<!> b: Any
get() = TODO()
override var c: Any
get() = TODO()
set(value) {}
override
val d: Any
<!VAR_OVERRIDDEN_BY_VAL!>val<!> d: Any
get() = TODO()
override fun foo() {}