From 09429ff4326f0b29c1238fcf0dcc4425fccb2c15 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 15 Sep 2022 14:33:00 +0300 Subject: [PATCH] [FIR] Fix reporting of UNINITIALIZED_ENUM_COMPANION in all places --- ...umCompanionInEnumConstructorCallChecker.kt | 25 ++++++++++--------- .../expression/FirUninitializedEnumChecker.kt | 23 ----------------- .../UninitializedEnumCompanionVals.fir.kt | 4 +-- .../enumCompanionInterdependence.fir.kt | 2 +- .../uninitializedCompanionOfEnum_after.fir.kt | 16 ++++++------ ...uninitializedCompanionOfEnum_before.fir.kt | 16 ++++++------ 6 files changed, 32 insertions(+), 54 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt index 889329f5714..1d40ab46181 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumCompanionInEnumConstructorCallChecker.kt @@ -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 } } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt index c9f87c89778..28dcc36a157 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt @@ -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 - ) - } } } } diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedEnumCompanionVals.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedEnumCompanionVals.fir.kt index 7aa91241b67..e59692764df 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedEnumCompanionVals.fir.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/UninitializedEnumCompanionVals.fir.kt @@ -1,7 +1,7 @@ // SKIP_TXT enum class A(val z: Any) { - Y(x); + Y(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(B.x); + Y(B.x); companion object { val x = B.Y.ordinal diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/enumCompanionInterdependence.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/enumCompanionInterdependence.fir.kt index 58b2a34f3e1..621bbd0bd31 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/enumCompanionInterdependence.fir.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/enumCompanionInterdependence.fir.kt @@ -9,7 +9,7 @@ enum class B(val x: Int) { } enum class C(val x: Int) { - C1(SUM), + C1(SUM), C2(1); companion object { diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_after.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_after.fir.kt index 28762f8c210..0727d4e6832 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_after.fir.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_after.fir.kt @@ -3,13 +3,13 @@ enum class SomeEnum(val x: Int) { A(companionFun().length),// UNINITIALIZED_ENUM_COMPANION - B(companionProp.length), // UNINITIALIZED_VARIABLE + B(companionProp.length), // UNINITIALIZED_VARIABLE - C(SomeEnum.companionFun().length), - D(SomeEnum.companionProp.length), + C(SomeEnum.companionFun().length), + D(SomeEnum.companionProp.length), E(SomeEnum.Companion.companionFun().length), - F(SomeEnum.Companion.companionProp.length); // UNINITIALIZED_VARIABLE + F(SomeEnum.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 + companionFun().length + companionProp.length - EnumWithLambda.companionFun().length - EnumWithLambda.companionProp.length + EnumWithLambda.companionFun().length + EnumWithLambda.companionProp.length extensionFun().length extensionProp.length diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_before.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_before.fir.kt index ccfad5129b3..c94d1876f35 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_before.fir.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/uninitializedCompanionOfEnum_before.fir.kt @@ -3,13 +3,13 @@ enum class SomeEnum(val x: Int) { A(companionFun().length),// UNINITIALIZED_ENUM_COMPANION - B(companionProp.length), // UNINITIALIZED_VARIABLE + B(companionProp.length), // UNINITIALIZED_VARIABLE - C(SomeEnum.companionFun().length), - D(SomeEnum.companionProp.length), + C(SomeEnum.companionFun().length), + D(SomeEnum.companionProp.length), E(SomeEnum.Companion.companionFun().length), - F(SomeEnum.Companion.companionProp.length); // UNINITIALIZED_VARIABLE + F(SomeEnum.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 + companionFun().length + companionProp.length - EnumWithLambda.companionFun().length - EnumWithLambda.companionProp.length + EnumWithLambda.companionFun().length + EnumWithLambda.companionProp.length extensionFun().length extensionProp.length