[FIR] Fix reporting of UNINITIALIZED_ENUM_COMPANION in all places
This commit is contained in:
committed by
Space
parent
a2c12aa711
commit
09429ff432
+13
-12
@@ -16,7 +16,10 @@ import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
|
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.dfa.coneType
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
|
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
|
||||||
|
|
||||||
@@ -57,21 +60,19 @@ object FirEnumCompanionInEnumConstructorCallChecker : FirEnumEntryChecker() {
|
|||||||
|
|
||||||
|
|
||||||
private fun checkQualifiedAccess(expression: FirQualifiedAccessExpression): Boolean {
|
private fun checkQualifiedAccess(expression: FirQualifiedAccessExpression): Boolean {
|
||||||
val extensionReceiver = expression.extensionReceiver
|
val companionReceiver = checkReceiver(expression.extensionReceiver)
|
||||||
if (extensionReceiver !is FirResolvedQualifier && extensionReceiver !is FirThisReceiverExpression) return true
|
?: checkReceiver(expression.dispatchReceiver)
|
||||||
|
|
||||||
val receiverSymbol = expression.toResolvedCallableSymbol()
|
|
||||||
?.resolvedReceiverTypeRef
|
|
||||||
?.toRegularClassSymbol(context.session)
|
|
||||||
?: return true
|
?: return true
|
||||||
|
|
||||||
if (receiverSymbol == companionSymbol) {
|
val source = companionReceiver.source ?: expression.source
|
||||||
val source = expression.extensionReceiver.source ?: expression.source
|
reporter.reportOn(source, FirErrors.UNINITIALIZED_ENUM_COMPANION, companionSymbol, context)
|
||||||
reporter.reportOn(source, FirErrors.UNINITIALIZED_ENUM_COMPANION, companionSymbol, context)
|
return false
|
||||||
return false
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
private fun checkReceiver(receiverExpression: FirExpression): FirExpression? {
|
||||||
|
if (receiverExpression !is FirResolvedQualifier && receiverExpression !is FirThisReceiverExpression) return null
|
||||||
|
val receiverSymbol = receiverExpression.typeRef.coneType.toRegularClassSymbol(context.session) ?: return null
|
||||||
|
return receiverExpression.takeIf { receiverSymbol == companionSymbol }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-23
@@ -155,29 +155,6 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() {
|
|||||||
// val score = ... <!>common<!>
|
// val score = ... <!>common<!>
|
||||||
// }
|
// }
|
||||||
reporter.reportOn(source, FirErrors.UNINITIALIZED_VARIABLE, calleeSymbol, context)
|
reporter.reportOn(source, FirErrors.UNINITIALIZED_VARIABLE, calleeSymbol, context)
|
||||||
} else {
|
|
||||||
// enum class EnumCompanion2(...) {
|
|
||||||
// INSTANCE(<!>foo<!>())
|
|
||||||
// companion object {
|
|
||||||
// fun foo() = ...
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// <!>Companion<!>.foo() v.s. <!>foo<!>()
|
|
||||||
if ((expression.explicitReceiver as? FirResolvedQualifier)?.symbol == enumClassSymbol.companionObjectSymbol) {
|
|
||||||
reporter.reportOn(
|
|
||||||
expression.explicitReceiver!!.source,
|
|
||||||
FirErrors.UNINITIALIZED_ENUM_COMPANION,
|
|
||||||
enumClassSymbol,
|
|
||||||
context
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
reporter.reportOn(
|
|
||||||
expression.calleeReference.source,
|
|
||||||
FirErrors.UNINITIALIZED_ENUM_COMPANION,
|
|
||||||
enumClassSymbol,
|
|
||||||
context
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
// SKIP_TXT
|
// SKIP_TXT
|
||||||
|
|
||||||
enum class A(val z: Any) {
|
enum class A(val z: Any) {
|
||||||
Y(<!UNINITIALIZED_VARIABLE!>x<!>);
|
Y(<!UNINITIALIZED_ENUM_COMPANION, UNINITIALIZED_VARIABLE!>x<!>);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val x = A.Y.ordinal
|
val x = A.Y.ordinal
|
||||||
@@ -9,7 +9,7 @@ enum class A(val z: Any) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum class B(val z: Any) {
|
enum class B(val z: Any) {
|
||||||
Y(<!UNINITIALIZED_VARIABLE!>B.x<!>);
|
Y(<!UNINITIALIZED_VARIABLE!><!UNINITIALIZED_ENUM_COMPANION!>B<!>.x<!>);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val x = B.Y.ordinal
|
val x = B.Y.ordinal
|
||||||
|
|||||||
Vendored
+1
-1
@@ -9,7 +9,7 @@ enum class B(val x: Int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum class C(val x: Int) {
|
enum class C(val x: Int) {
|
||||||
C1(<!UNINITIALIZED_VARIABLE!>SUM<!>),
|
C1(<!UNINITIALIZED_ENUM_COMPANION, UNINITIALIZED_VARIABLE!>SUM<!>),
|
||||||
C2(1);
|
C2(1);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
Vendored
+8
-8
@@ -3,13 +3,13 @@
|
|||||||
|
|
||||||
enum class SomeEnum(val x: Int) {
|
enum class SomeEnum(val x: Int) {
|
||||||
A(<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length),// UNINITIALIZED_ENUM_COMPANION
|
A(<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length),// UNINITIALIZED_ENUM_COMPANION
|
||||||
B(<!UNINITIALIZED_VARIABLE!>companionProp<!>.length), // UNINITIALIZED_VARIABLE
|
B(<!UNINITIALIZED_ENUM_COMPANION, UNINITIALIZED_VARIABLE!>companionProp<!>.length), // UNINITIALIZED_VARIABLE
|
||||||
|
|
||||||
C(SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length),
|
C(<!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionFun().length),
|
||||||
D(<!UNINITIALIZED_VARIABLE!>SomeEnum.companionProp<!>.length),
|
D(<!UNINITIALIZED_VARIABLE!><!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionProp<!>.length),
|
||||||
|
|
||||||
E(SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.companionFun().length),
|
E(SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.companionFun().length),
|
||||||
F(<!UNINITIALIZED_VARIABLE!>SomeEnum.Companion.companionProp<!>.length); // UNINITIALIZED_VARIABLE
|
F(<!UNINITIALIZED_VARIABLE!>SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.companionProp<!>.length); // UNINITIALIZED_VARIABLE
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val companionProp = "someString"
|
val companionProp = "someString"
|
||||||
@@ -39,11 +39,11 @@ val OtherEnum.Companion.extensionProp: String
|
|||||||
|
|
||||||
enum class EnumWithLambda(val lambda: () -> Unit) {
|
enum class EnumWithLambda(val lambda: () -> Unit) {
|
||||||
M({
|
M({
|
||||||
companionFun().length
|
<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length
|
||||||
companionProp.length
|
<!UNINITIALIZED_ENUM_COMPANION!>companionProp<!>.length
|
||||||
|
|
||||||
EnumWithLambda.companionFun().length
|
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionFun().length
|
||||||
EnumWithLambda.companionProp.length
|
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionProp.length
|
||||||
|
|
||||||
<!UNINITIALIZED_ENUM_COMPANION!>extensionFun<!>().length
|
<!UNINITIALIZED_ENUM_COMPANION!>extensionFun<!>().length
|
||||||
<!UNINITIALIZED_ENUM_COMPANION!>extensionProp<!>.length
|
<!UNINITIALIZED_ENUM_COMPANION!>extensionProp<!>.length
|
||||||
|
|||||||
Vendored
+8
-8
@@ -3,13 +3,13 @@
|
|||||||
|
|
||||||
enum class SomeEnum(val x: Int) {
|
enum class SomeEnum(val x: Int) {
|
||||||
A(<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length),// UNINITIALIZED_ENUM_COMPANION
|
A(<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length),// UNINITIALIZED_ENUM_COMPANION
|
||||||
B(<!UNINITIALIZED_VARIABLE!>companionProp<!>.length), // UNINITIALIZED_VARIABLE
|
B(<!UNINITIALIZED_ENUM_COMPANION, UNINITIALIZED_VARIABLE!>companionProp<!>.length), // UNINITIALIZED_VARIABLE
|
||||||
|
|
||||||
C(SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length),
|
C(<!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionFun().length),
|
||||||
D(<!UNINITIALIZED_VARIABLE!>SomeEnum.companionProp<!>.length),
|
D(<!UNINITIALIZED_VARIABLE!><!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionProp<!>.length),
|
||||||
|
|
||||||
E(SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.companionFun().length),
|
E(SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.companionFun().length),
|
||||||
F(<!UNINITIALIZED_VARIABLE!>SomeEnum.Companion.companionProp<!>.length); // UNINITIALIZED_VARIABLE
|
F(<!UNINITIALIZED_VARIABLE!>SomeEnum.<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.companionProp<!>.length); // UNINITIALIZED_VARIABLE
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val companionProp = "someString"
|
val companionProp = "someString"
|
||||||
@@ -39,11 +39,11 @@ val OtherEnum.Companion.extensionProp: String
|
|||||||
|
|
||||||
enum class EnumWithLambda(val lambda: () -> Unit) {
|
enum class EnumWithLambda(val lambda: () -> Unit) {
|
||||||
M({
|
M({
|
||||||
companionFun().length
|
<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length
|
||||||
companionProp.length
|
<!UNINITIALIZED_ENUM_COMPANION!>companionProp<!>.length
|
||||||
|
|
||||||
EnumWithLambda.companionFun().length
|
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionFun().length
|
||||||
EnumWithLambda.companionProp.length
|
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionProp.length
|
||||||
|
|
||||||
<!UNINITIALIZED_ENUM_COMPANION!>extensionFun<!>().length
|
<!UNINITIALIZED_ENUM_COMPANION!>extensionFun<!>().length
|
||||||
<!UNINITIALIZED_ENUM_COMPANION!>extensionProp<!>.length
|
<!UNINITIALIZED_ENUM_COMPANION!>extensionProp<!>.length
|
||||||
|
|||||||
Reference in New Issue
Block a user