FIR checker: add diagnostic VAR_OVERRIDDEN_BY_VAL
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
80d5a1a1db
commit
3a07ca4c64
+18
@@ -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
|
||||
|
||||
+8
@@ -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
|
||||
}
|
||||
|
||||
+1
-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
@@ -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
|
||||
|
||||
+4
-4
@@ -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() {}
|
||||
|
||||
Reference in New Issue
Block a user