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
|
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(
|
private fun FirCallableMemberDeclaration<*>.checkReturnType(
|
||||||
overriddenSymbols: List<FirCallableSymbol<*>>,
|
overriddenSymbols: List<FirCallableSymbol<*>>,
|
||||||
typeCheckerContext: AbstractTypeCheckerContext,
|
typeCheckerContext: AbstractTypeCheckerContext,
|
||||||
@@ -178,6 +185,10 @@ object FirOverrideChecker : FirRegularClassChecker() {
|
|||||||
reporter.reportOverridingFinalMember(property, it)
|
reporter.reportOverridingFinalMember(property, it)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property.checkMutability(overriddenPropertySymbols)?.let {
|
||||||
|
reporter.reportVarOverriddenByVal(property, it)
|
||||||
|
}
|
||||||
|
|
||||||
val restriction = property.checkReturnType(
|
val restriction = property.checkReturnType(
|
||||||
overriddenSymbols = overriddenPropertySymbols,
|
overriddenSymbols = overriddenPropertySymbols,
|
||||||
typeCheckerContext = typeCheckerContext,
|
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(
|
private fun DiagnosticReporter.reportReturnTypeMismatchOnFunction(
|
||||||
overriding: FirMemberDeclaration,
|
overriding: FirMemberDeclaration,
|
||||||
overridden: 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.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.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_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.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_INVOCATION_KIND
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS
|
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
|
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
|
// Redeclarations
|
||||||
map.put(MANY_COMPANION_OBJECTS, "Only one companion object is allowed per class")
|
map.put(MANY_COMPANION_OBJECTS, "Only one companion object is allowed per class")
|
||||||
map.put(CONFLICTING_OVERLOADS, "Conflicting overloads: {0}", TO_STRING) // *
|
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 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_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
|
// Redeclarations
|
||||||
val MANY_COMPANION_OBJECTS by error0<FirSourceElement, PsiElement>()
|
val MANY_COMPANION_OBJECTS by error0<FirSourceElement, PsiElement>()
|
||||||
val CONFLICTING_OVERLOADS by error1<FirSourceElement, PsiElement, String>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
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 class Var() {
|
||||||
open var v : Int = 1
|
open var v : Int = 1
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ interface A {
|
|||||||
interface B : A {
|
interface B : A {
|
||||||
override val p1: <!PROPERTY_TYPE_MISMATCH_ON_OVERRIDE!>Int<!>
|
override val p1: <!PROPERTY_TYPE_MISMATCH_ON_OVERRIDE!>Int<!>
|
||||||
@An
|
@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<!>
|
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 {
|
interface A {
|
||||||
var foo: String
|
var foo: String
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ open class A {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class B : A() {
|
class B : A() {
|
||||||
override val a = 34
|
override <!VAR_OVERRIDDEN_BY_VAL!>val<!> a = 34
|
||||||
|
|
||||||
var b : Int
|
var b : Int
|
||||||
public get() = 23
|
public get() = 23
|
||||||
|
|||||||
+4
-4
@@ -22,9 +22,9 @@ fun case1() {
|
|||||||
|
|
||||||
class BaseImplCase2(
|
class BaseImplCase2(
|
||||||
override var a: Any, override
|
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 fun foo() {}
|
||||||
override internal fun boo() {}
|
override internal fun boo() {}
|
||||||
@@ -42,14 +42,14 @@ class ImplBaseCase2() : Base() {
|
|||||||
set(value) {}
|
set(value) {}
|
||||||
override
|
override
|
||||||
|
|
||||||
val b: Any
|
<!VAR_OVERRIDDEN_BY_VAL!>val<!> b: Any
|
||||||
get() = TODO()
|
get() = TODO()
|
||||||
override var c: Any
|
override var c: Any
|
||||||
get() = TODO()
|
get() = TODO()
|
||||||
set(value) {}
|
set(value) {}
|
||||||
override
|
override
|
||||||
|
|
||||||
val d: Any
|
<!VAR_OVERRIDDEN_BY_VAL!>val<!> d: Any
|
||||||
get() = TODO()
|
get() = TODO()
|
||||||
|
|
||||||
override fun foo() {}
|
override fun foo() {}
|
||||||
|
|||||||
Reference in New Issue
Block a user