[FIR] Fix reporting of UNINITIALIZED_ENUM_COMPANION in all places

This commit is contained in:
Dmitriy Novozhilov
2022-09-15 14:33:00 +03:00
committed by Space
parent a2c12aa711
commit 09429ff432
6 changed files with 32 additions and 54 deletions
@@ -16,7 +16,10 @@ import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
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.types.coneType
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
@@ -57,21 +60,19 @@ object FirEnumCompanionInEnumConstructorCallChecker : FirEnumEntryChecker() {
private fun checkQualifiedAccess(expression: FirQualifiedAccessExpression): Boolean {
val extensionReceiver = expression.extensionReceiver
if (extensionReceiver !is FirResolvedQualifier && extensionReceiver !is FirThisReceiverExpression) return true
val receiverSymbol = expression.toResolvedCallableSymbol()
?.resolvedReceiverTypeRef
?.toRegularClassSymbol(context.session)
val companionReceiver = checkReceiver(expression.extensionReceiver)
?: checkReceiver(expression.dispatchReceiver)
?: return true
if (receiverSymbol == companionSymbol) {
val source = expression.extensionReceiver.source ?: expression.source
reporter.reportOn(source, FirErrors.UNINITIALIZED_ENUM_COMPANION, companionSymbol, context)
return false
}
val source = companionReceiver.source ?: expression.source
reporter.reportOn(source, FirErrors.UNINITIALIZED_ENUM_COMPANION, companionSymbol, context)
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 }
}
}
}
@@ -155,29 +155,6 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() {
// val score = ... <!>common<!>
// }
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
)
}
}
}
}
@@ -1,7 +1,7 @@
// SKIP_TXT
enum class A(val z: Any) {
Y(<!UNINITIALIZED_VARIABLE!>x<!>);
Y(<!UNINITIALIZED_ENUM_COMPANION, UNINITIALIZED_VARIABLE!>x<!>);
companion object {
val x = A.Y.ordinal
@@ -9,7 +9,7 @@ enum class A(val z: Any) {
}
enum class B(val z: Any) {
Y(<!UNINITIALIZED_VARIABLE!>B.x<!>);
Y(<!UNINITIALIZED_VARIABLE!><!UNINITIALIZED_ENUM_COMPANION!>B<!>.x<!>);
companion object {
val x = B.Y.ordinal
@@ -9,7 +9,7 @@ enum class B(val x: Int) {
}
enum class C(val x: Int) {
C1(<!UNINITIALIZED_VARIABLE!>SUM<!>),
C1(<!UNINITIALIZED_ENUM_COMPANION, UNINITIALIZED_VARIABLE!>SUM<!>),
C2(1);
companion object {
@@ -3,13 +3,13 @@
enum class SomeEnum(val x: Int) {
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),
D(<!UNINITIALIZED_VARIABLE!>SomeEnum.companionProp<!>.length),
C(<!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionFun().length),
D(<!UNINITIALIZED_VARIABLE!><!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionProp<!>.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 {
val companionProp = "someString"
@@ -39,11 +39,11 @@ val OtherEnum.Companion.extensionProp: String
enum class EnumWithLambda(val lambda: () -> Unit) {
M({
companionFun().length
companionProp.length
<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length
<!UNINITIALIZED_ENUM_COMPANION!>companionProp<!>.length
EnumWithLambda.companionFun().length
EnumWithLambda.companionProp.length
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionFun().length
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionProp.length
<!UNINITIALIZED_ENUM_COMPANION!>extensionFun<!>().length
<!UNINITIALIZED_ENUM_COMPANION!>extensionProp<!>.length
@@ -3,13 +3,13 @@
enum class SomeEnum(val x: Int) {
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),
D(<!UNINITIALIZED_VARIABLE!>SomeEnum.companionProp<!>.length),
C(<!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionFun().length),
D(<!UNINITIALIZED_VARIABLE!><!UNINITIALIZED_ENUM_COMPANION!>SomeEnum<!>.companionProp<!>.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 {
val companionProp = "someString"
@@ -39,11 +39,11 @@ val OtherEnum.Companion.extensionProp: String
enum class EnumWithLambda(val lambda: () -> Unit) {
M({
companionFun().length
companionProp.length
<!UNINITIALIZED_ENUM_COMPANION!>companionFun<!>().length
<!UNINITIALIZED_ENUM_COMPANION!>companionProp<!>.length
EnumWithLambda.companionFun().length
EnumWithLambda.companionProp.length
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionFun().length
<!UNINITIALIZED_ENUM_COMPANION!>EnumWithLambda<!>.companionProp.length
<!UNINITIALIZED_ENUM_COMPANION!>extensionFun<!>().length
<!UNINITIALIZED_ENUM_COMPANION!>extensionProp<!>.length