From 2a724787f0bd9f382b2499f62a1782105d27732d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 4 Jan 2023 11:05:45 +0100 Subject: [PATCH] K2: fix SUPERTYPE_NOT_INITIALIZED not being reported on object expressions ^KT-55597 Fixed --- .../resolve/diagnostics/conflictingOverloads.kt | 2 +- .../checkers/CommonDeclarationCheckers.kt | 2 +- .../FirPrimaryConstructorSuperTypeChecker.kt | 15 +++++++++------ .../underscoredTypeInForbiddenPositions.fir.kt | 2 +- .../underscoredTypeInForbiddenPositions.kt | 2 +- .../diagnostics/tests/objects/Objects.fir.kt | 2 ++ .../testData/diagnostics/tests/objects/Objects.kt | 2 ++ .../diagnostics/tests/objects/Objects.txt | 1 + .../org/jetbrains/kotlin/descriptors/ClassKind.kt | 3 +++ 9 files changed, 21 insertions(+), 10 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt index 19ac114302b..0390e7bfc22 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingOverloads.kt @@ -52,7 +52,7 @@ fun lol(a: Array) {} class M { companion object {} - val Companion = object : Any {} + val Companion = object : Any() {} } fun B.foo() {} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index 868f7fa3115..61c4c51b271 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -92,6 +92,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirImplementationMismatchChecker, FirTypeParametersInObjectChecker, FirSupertypesChecker, + FirPrimaryConstructorSuperTypeChecker, ) override val regularClassCheckers: Set @@ -106,7 +107,6 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirManyCompanionObjectsChecker, FirMethodOfAnyImplementedInInterfaceChecker, FirDataClassPrimaryConstructorChecker, - FirPrimaryConstructorSuperTypeChecker, FirFunInterfaceDeclarationChecker, FirNestedClassChecker, FirValueClassDeclarationChecker, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPrimaryConstructorSuperTypeChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPrimaryConstructorSuperTypeChecker.kt index c7a41d8b1ed..6d9db5e5fb3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPrimaryConstructorSuperTypeChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPrimaryConstructorSuperTypeChecker.kt @@ -7,12 +7,13 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.descriptors.isEnumEntry import org.jetbrains.kotlin.fir.analysis.checkers.SourceNavigator import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.utils.isInterface import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny @@ -23,8 +24,8 @@ import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull /** Checker on super type declarations in the primary constructor of a class declaration. */ -object FirPrimaryConstructorSuperTypeChecker : FirRegularClassChecker() { - override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { +object FirPrimaryConstructorSuperTypeChecker : FirClassChecker() { + override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { if (declaration.isInterface) { with(SourceNavigator.forElement(declaration)) { for (superTypeRef in declaration.superTypeRefs) { @@ -36,6 +37,8 @@ object FirPrimaryConstructorSuperTypeChecker : FirRegularClassChecker() { return } + if (declaration.classKind.isEnumEntry) return + val primaryConstructorSymbol = declaration.primaryConstructorIfAny(context.session) if (primaryConstructorSymbol == null) { @@ -56,7 +59,7 @@ object FirPrimaryConstructorSuperTypeChecker : FirRegularClassChecker() { */ private fun checkSuperTypeNotInitialized( primaryConstructorSymbol: FirConstructorSymbol, - regularClass: FirRegularClass, + regularClass: FirClass, context: CheckerContext, reporter: DiagnosticReporter ) { @@ -84,7 +87,7 @@ object FirPrimaryConstructorSuperTypeChecker : FirRegularClassChecker() { /** * SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR is reported on code like the following, where `B` does not have a primary * constructor, in which case, one can not call the delegated constructor of `A` in the super type list. `B` doesn't have a primary - * constructor because it doesn't declare it, nor is it implicitly created in presence of a explicitly declared constructor inside the + * constructor because it doesn't declare it, nor is it implicitly created in presence of an explicitly declared constructor inside the * class body. * * ``` @@ -95,7 +98,7 @@ object FirPrimaryConstructorSuperTypeChecker : FirRegularClassChecker() { * ``` */ private fun checkSupertypeInitializedWithoutPrimaryConstructor( - regularClass: FirRegularClass, + regularClass: FirClass, reporter: DiagnosticReporter, context: CheckerContext ) { diff --git a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt index 23473e8acec..4bd1452346e 100644 --- a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt @@ -47,7 +47,7 @@ fun test() { val x9: (Foo) -> Int = { x: Foo<_> -> 10 } val x10 = object : _ {} - val x11 = object : Foo<_> {} + val x11 = object : Foo<_>() {} if (x11 is _) { } if (x11 is Foo<_>) { } diff --git a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.kt b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.kt index 0740663d8d4..153eb3d4b21 100644 --- a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.kt +++ b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.kt @@ -47,7 +47,7 @@ fun test() { val x9: (Foo) -> Int = { x: Foo<_> -> 10 } val x10 = object : _ {} - val x11 = object : Foo<_> {} + val x11 = object : Foo<_>() {} if (x11 is _) { } if (x11 is Foo<_>) { } diff --git a/compiler/testData/diagnostics/tests/objects/Objects.fir.kt b/compiler/testData/diagnostics/tests/objects/Objects.fir.kt index 2e256a9f3cc..9a0a944e5fc 100644 --- a/compiler/testData/diagnostics/tests/objects/Objects.fir.kt +++ b/compiler/testData/diagnostics/tests/objects/Objects.fir.kt @@ -17,6 +17,8 @@ class T : Foo {} object B : A {} +val c = object : Foo {} + val x = A.foo() val y = object : Foo(x) { diff --git a/compiler/testData/diagnostics/tests/objects/Objects.kt b/compiler/testData/diagnostics/tests/objects/Objects.kt index c985cecf0fe..9ca1a00f4b4 100644 --- a/compiler/testData/diagnostics/tests/objects/Objects.kt +++ b/compiler/testData/diagnostics/tests/objects/Objects.kt @@ -17,6 +17,8 @@ object A : Foo { object B : A {} +val c = object : Foo {} + val x = A.foo() val y = object : Foo(x) { diff --git a/compiler/testData/diagnostics/tests/objects/Objects.txt b/compiler/testData/diagnostics/tests/objects/Objects.txt index d76e1bd8ccd..af3a083bc2b 100644 --- a/compiler/testData/diagnostics/tests/objects/Objects.txt +++ b/compiler/testData/diagnostics/tests/objects/Objects.txt @@ -1,6 +1,7 @@ package package toplevelObjectDeclarations { + public val c: toplevelObjectDeclarations.Foo public val x: kotlin.Int public val y: toplevelObjectDeclarations.Foo public val z: kotlin.Int diff --git a/core/compiler.common/src/org/jetbrains/kotlin/descriptors/ClassKind.kt b/core/compiler.common/src/org/jetbrains/kotlin/descriptors/ClassKind.kt index 6c26357fd39..42fd1532485 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/descriptors/ClassKind.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/descriptors/ClassKind.kt @@ -36,6 +36,9 @@ inline val ClassKind.isInterface: Boolean inline val ClassKind.isEnumClass: Boolean get() = this == ClassKind.ENUM_CLASS +inline val ClassKind.isEnumEntry: Boolean + get() = this == ClassKind.ENUM_ENTRY + inline val ClassKind.isAnnotationClass: Boolean get() = this == ClassKind.ANNOTATION_CLASS