From 15b070b49419aa3e2ff926f14cecc09900bfffa9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 5 Jul 2023 14:02:04 +0200 Subject: [PATCH] K2: don't resolve callable reference to enum entries #KT-59611 Fixed --- ...sticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...agnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...htTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...FirPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/fir/resolve/calls/CandidateFactory.kt | 15 ++++++++++++--- .../fir/resolve/calls/ResolutionDiagnostic.kt | 2 +- .../codegen/box/enum/enumEntriesNameClashes.kt | 3 +-- .../tests/enum/referenceToEnumEntry.fir.kt | 5 +++++ .../tests/enum/referenceToEnumEntry.kt | 5 +++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 10 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.fir.kt create mode 100644 compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 85f371aea70..efaf2a48983 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -11062,6 +11062,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/enum/overrideFinalEnumMethods.kt"); } + @Test + @TestMetadata("referenceToEnumEntry.kt") + public void testReferenceToEnumEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt"); + } + @Test @TestMetadata("SecondaryConstructorCall.kt") public void testSecondaryConstructorCall() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index fdc43d2a0f1..bb4e220f9f4 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -11062,6 +11062,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/enum/overrideFinalEnumMethods.kt"); } + @Test + @TestMetadata("referenceToEnumEntry.kt") + public void testReferenceToEnumEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt"); + } + @Test @TestMetadata("SecondaryConstructorCall.kt") public void testSecondaryConstructorCall() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 258dd4a1fcc..cddd89a604b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -11062,6 +11062,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/enum/overrideFinalEnumMethods.kt"); } + @Test + @TestMetadata("referenceToEnumEntry.kt") + public void testReferenceToEnumEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt"); + } + @Test @TestMetadata("SecondaryConstructorCall.kt") public void testSecondaryConstructorCall() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index a6874a9f147..211ed042c76 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -11068,6 +11068,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/enum/overrideFinalEnumMethods.kt"); } + @Test + @TestMetadata("referenceToEnumEntry.kt") + public void testReferenceToEnumEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt"); + } + @Test @TestMetadata("SecondaryConstructorCall.kt") public void testSecondaryConstructorCall() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt index 36a68c8d8eb..90bb08a8a31 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt @@ -83,11 +83,20 @@ class CandidateFactory private constructor( ) // The counterpart in FE 1.0 checks if the given descriptor is VariableDescriptor yet not PropertyDescriptor. - // Here, we explicitly check if the referred declaration/symbol is value parameter, local variable, or backing field. + // Here, we explicitly check if the referred declaration/symbol is value parameter, local variable, enum entry, or backing field. val callSite = callInfo.callSite if (callSite is FirCallableReferenceAccess) { - if (symbol is FirValueParameterSymbol || symbol is FirPropertySymbol && symbol.isLocal || symbol is FirBackingFieldSymbol) { - result.addDiagnostic(Unsupported("References to variables aren't supported yet", callSite.calleeReference.source)) + when { + symbol is FirValueParameterSymbol || symbol is FirPropertySymbol && symbol.isLocal || symbol is FirBackingFieldSymbol -> { + result.addDiagnostic( + Unsupported("References to variables aren't supported yet", callSite.calleeReference.source) + ) + } + symbol is FirEnumEntrySymbol -> { + result.addDiagnostic( + Unsupported("References to enum entries aren't supported", callSite.calleeReference.source) + ) + } } } else if (objectsByName && symbol.isRegularClassWithoutCompanion(callInfo.session)) { result.addDiagnostic(NoCompanionObject) diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt index e91fcb52cd1..9d886f5fb36 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt @@ -123,7 +123,7 @@ class InfixCallOfNonInfixFunction(val function: FirNamedFunctionSymbol) : Resolu class OperatorCallOfNonOperatorFunction(val function: FirNamedFunctionSymbol) : ResolutionDiagnostic(CONVENTION_ERROR) class InferenceError(val constraintError: ConstraintSystemError) : ResolutionDiagnostic(constraintError.applicability) -class Unsupported(val message: String, val source: KtSourceElement? = null) : ResolutionDiagnostic(K2_UNSUPPORTED) +class Unsupported(val message: String, val source: KtSourceElement?) : ResolutionDiagnostic(K2_UNSUPPORTED) object PropertyAsOperator : ResolutionDiagnostic(K2_PROPERTY_AS_OPERATOR) diff --git a/compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt b/compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt index 262f7c785c8..ac9608c620e 100644 --- a/compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt +++ b/compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt @@ -1,6 +1,5 @@ -// !LANGUAGE: +EnumEntries +// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries // KT-59611 -// IGNORE_BACKEND_K2: JVM_IR, JS_IR, NATIVE, WASM // IGNORE_BACKEND: JS, JVM // WITH_STDLIB diff --git a/compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.fir.kt b/compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.fir.kt new file mode 100644 index 00000000000..22f03a8de4b --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.fir.kt @@ -0,0 +1,5 @@ +enum class My { V } + +fun test() { + val ref = My::V +} diff --git a/compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt b/compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt new file mode 100644 index 00000000000..f39ccbf5313 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt @@ -0,0 +1,5 @@ +enum class My { V } + +fun test() { + val ref = My::V +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index ed4e5132fa2..0e4ca8eb5c8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -11068,6 +11068,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/enum/overrideFinalEnumMethods.kt"); } + @Test + @TestMetadata("referenceToEnumEntry.kt") + public void testReferenceToEnumEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/enum/referenceToEnumEntry.kt"); + } + @Test @TestMetadata("SecondaryConstructorCall.kt") public void testSecondaryConstructorCall() throws Exception {