From e5b96561e0ce934f5e48c1db3138b8d5c7138ad5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 25 Jan 2023 23:01:30 +0100 Subject: [PATCH] [FIR] skip implicit call to enum constructor if super type call exists otherwise, reference to the super type would be resolved even when it's not e.g. for interface constructor ^ KTIJ-24437 --- ...sisSourceModuleResolveCallTestGenerated.java | 6 ++++++ ...sisSourceModuleResolveCallTestGenerated.java | 6 ++++++ ...sisSourceModuleResolveCallTestGenerated.java | 6 ++++++ .../enumSuperTypeInterface.descriptors.txt | 3 +++ .../resolveCall/enumSuperTypeInterface.kt | 4 ++++ .../resolveCall/enumSuperTypeInterface.txt | 3 +++ .../diagnostics/classInSupertypeForEnum.fir.txt | 4 ++-- .../converter/DeclarationsConverter.kt | 2 +- .../kotlin/fir/builder/RawFirBuilder.kt | 2 +- .../tests/enum/enumInheritance.fir.kt | 3 ++- .../diagnostics/tests/enum/enumInheritance.kt | 1 + .../diagnostics/tests/enum/enumInheritance.txt | 17 +++++++++++++++++ 12 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.descriptors.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 3da254a4ca6..72b314b4925 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -370,6 +370,12 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/enumAsAnnotationValue.kt"); } + @Test + @TestMetadata("enumSuperTypeInterface.kt") + public void testEnumSuperTypeInterface() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt"); + } + @Test @TestMetadata("eqEqCall_fromAny.kt") public void testEqEqCall_fromAny() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index b2543f38d1a..789fdbc4779 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -370,6 +370,12 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/enumAsAnnotationValue.kt"); } + @Test + @TestMetadata("enumSuperTypeInterface.kt") + public void testEnumSuperTypeInterface() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt"); + } + @Test @TestMetadata("eqEqCall_fromAny.kt") public void testEqEqCall_fromAny() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java index 585e74956c9..77df9723443 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -370,6 +370,12 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/enumAsAnnotationValue.kt"); } + @Test + @TestMetadata("enumSuperTypeInterface.kt") + public void testEnumSuperTypeInterface() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt"); + } + @Test @TestMetadata("eqEqCall_fromAny.kt") public void testEqEqCall_fromAny() throws Exception { diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.descriptors.txt new file mode 100644 index 00000000000..15e4bc9efec --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.descriptors.txt @@ -0,0 +1,3 @@ +KtErrorCallInfo: + candidateCalls = [] + diagnostic = ERROR \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt new file mode 100644 index 00000000000..aea4136a3fa --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.kt @@ -0,0 +1,4 @@ +enum class E : I(), I1{} + +interface I {} +interface I1 {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.txt new file mode 100644 index 00000000000..b3f4eec7227 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/enumSuperTypeInterface.txt @@ -0,0 +1,3 @@ +KtErrorCallInfo: + candidateCalls = [] + diagnostic = ERROR> \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/classInSupertypeForEnum.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/classInSupertypeForEnum.fir.txt index c2f4189e757..0462d1203c6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/classInSupertypeForEnum.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/classInSupertypeForEnum.fir.txt @@ -7,9 +7,9 @@ FILE: classInSupertypeForEnum.kt } public abstract interface C : R|kotlin/Any| { } - public final enum class B : R|C|, R|A|, R|kotlin/Any|, R|kotlin/Enum| { + public final enum class B : R|C|, R|A|, R|kotlin/Any| { private constructor(): R|B| { - super|>() + super() } public final static fun values(): R|kotlin/Array| { diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 6fd60feec71..0583c5710e1 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -538,7 +538,7 @@ class DeclarationsConverter( delegationSpecifiers?.let { superTypeRefs += it.superTypesRef } when { - modifiers.isEnum() && (classKind == ClassKind.ENUM_CLASS) -> { + modifiers.isEnum() && (classKind == ClassKind.ENUM_CLASS) && delegatedConstructorSource == null -> { delegatedSuperTypeRef = buildResolvedTypeRef { type = ConeClassLikeTypeImpl( implicitEnumType.type.lookupTag, diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index ce6ea9cb2a2..2f663b5a5eb 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -881,7 +881,7 @@ open class RawFirBuilder( } when { - this is KtClass && classKind == ClassKind.ENUM_CLASS -> { + this is KtClass && classKind == ClassKind.ENUM_CLASS && superTypeCallEntry == null -> { /* * kotlin.Enum constructor has (name: String, ordinal: Int) signature, * so we should generate non-trivial constructors for enum and it's entry diff --git a/compiler/testData/diagnostics/tests/enum/enumInheritance.fir.kt b/compiler/testData/diagnostics/tests/enum/enumInheritance.fir.kt index cac2450a5f1..6b73dad2e58 100644 --- a/compiler/testData/diagnostics/tests/enum/enumInheritance.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/enumInheritance.fir.kt @@ -2,7 +2,8 @@ // FILE: test.kt enum class MyEnum(): MyClass() {} enum class MyEnum2(): MyTrait {} -enum class MyEnum3(): MyEnumBase() {} +enum class MyEnum2_1(): MyTrait() {} +enum class MyEnum3(): MyEnumBase() {} open class MyClass() {} diff --git a/compiler/testData/diagnostics/tests/enum/enumInheritance.kt b/compiler/testData/diagnostics/tests/enum/enumInheritance.kt index 9d81a0eb1e2..12725079adb 100644 --- a/compiler/testData/diagnostics/tests/enum/enumInheritance.kt +++ b/compiler/testData/diagnostics/tests/enum/enumInheritance.kt @@ -2,6 +2,7 @@ // FILE: test.kt enum class MyEnum(): MyClass() {} enum class MyEnum2(): MyTrait {} +enum class MyEnum2_1(): MyTrait() {} enum class MyEnum3(): MyEnumBase() {} open class MyClass() {} diff --git a/compiler/testData/diagnostics/tests/enum/enumInheritance.txt b/compiler/testData/diagnostics/tests/enum/enumInheritance.txt index 340d2e4f9f6..a84c71e4a21 100644 --- a/compiler/testData/diagnostics/tests/enum/enumInheritance.txt +++ b/compiler/testData/diagnostics/tests/enum/enumInheritance.txt @@ -35,6 +35,23 @@ public final enum class MyEnum2 : kotlin.Enum, MyTrait { public final /*synthesized*/ fun values(): kotlin.Array } +public final enum class MyEnum2_1 : kotlin.Enum, MyTrait { + private constructor MyEnum2_1() + @kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String + public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: MyEnum2_1): kotlin.Int + public final override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit + public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class! + public final override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): MyEnum2_1 + public final /*synthesized*/ fun values(): kotlin.Array +} + public final enum class MyEnum3 : MyEnumBase { private constructor MyEnum3() @kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String