From b3591e77be37748f88b6eaeb66ac136a9aa0d649 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Sun, 19 Sep 2021 18:12:06 +0700 Subject: [PATCH] [FE] Prohibit explicit @ContextFunctionTypeParams usage --- ...agnosisCompilerTestFE10TestdataTestGenerated.java | 12 ++++++++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 12 ++++++++++++ ...rontendDiagnosticsWithLightTreeTestGenerated.java | 12 ++++++++++++ .../jetbrains/kotlin/resolve/AnnotationChecker.kt | 7 +++++++ .../contextReceiverTypeParamsUsage.kt | 8 ++++++++ .../contextReceiverTypeParamsUsage.txt | 4 ++++ .../contextReceiverTypeParamsUsageError.kt | 7 +++++++ .../contextReceiverTypeParamsUsageError.txt | 4 ++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 12 ++++++++++++ core/builtins/src/kotlin/Annotations.kt | 1 - 10 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.txt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index d0860cbebb6..809aecd660a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -10582,6 +10582,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/ambiguityInGroup.kt"); } + @Test + @TestMetadata("contextReceiverTypeParamsUsage.kt") + public void testContextReceiverTypeParamsUsage() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt"); + } + + @Test + @TestMetadata("contextReceiverTypeParamsUsageError.kt") + public void testContextReceiverTypeParamsUsageError() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt"); + } + @Test @TestMetadata("functionalType.kt") public void testFunctionalType() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 97018845a84..d4e87909c36 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -10582,6 +10582,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/ambiguityInGroup.kt"); } + @Test + @TestMetadata("contextReceiverTypeParamsUsage.kt") + public void testContextReceiverTypeParamsUsage() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt"); + } + + @Test + @TestMetadata("contextReceiverTypeParamsUsageError.kt") + public void testContextReceiverTypeParamsUsageError() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt"); + } + @Test @TestMetadata("functionalType.kt") public void testFunctionalType() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 0d3508a2a4f..70f546b5b40 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -10582,6 +10582,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/ambiguityInGroup.kt"); } + @Test + @TestMetadata("contextReceiverTypeParamsUsage.kt") + public void testContextReceiverTypeParamsUsage() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt"); + } + + @Test + @TestMetadata("contextReceiverTypeParamsUsageError.kt") + public void testContextReceiverTypeParamsUsageError() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt"); + } + @Test @TestMetadata("functionalType.kt") public void testFunctionalType() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt index b5932774660..58e111b244f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.reportDiagnosticOnce +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getAnnotationEntries @@ -224,6 +225,12 @@ class AnnotationChecker( */ descriptor.forceResolveAllContents() } + + val contextReceiversSupported = languageVersionSettings.supportsFeature(ContextReceivers) + if (descriptor.fqName == FqName("kotlin.ContextFunctionTypeParams") && !contextReceiversSupported) { + trace.report(Errors.UNSUPPORTED_FEATURE.on(entry, ContextReceivers to languageVersionSettings)) + } + val classDescriptor = descriptor.annotationClass ?: continue val useSiteTarget = entry.useSiteTarget?.getAnnotationUseSiteTarget() ?: annotated.getDefaultUseSiteTarget(descriptor) diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt new file mode 100644 index 00000000000..07b63dcd53a --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt @@ -0,0 +1,8 @@ +// !LANGUAGE: +ContextReceivers +// FIR_IDENTICAL + +fun f(t: @ContextFunctionTypeParams(42) T, tt: @ContextFunctionTypeParams(1) Int) {} + +fun test() { + val f: @ContextFunctionTypeParams(1) @ExtensionFunctionType (Int, String) -> Unit = {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.txt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.txt new file mode 100644 index 00000000000..4bd328635ae --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.txt @@ -0,0 +1,4 @@ +package + +public fun f(/*0*/ t: @kotlin.ContextFunctionTypeParams(count = 42) T, /*1*/ tt: @kotlin.ContextFunctionTypeParams(count = 1) kotlin.Int): kotlin.Unit +public fun test(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt new file mode 100644 index 00000000000..dc0a1c5ebc4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt @@ -0,0 +1,7 @@ +// FIR_IDENTICAL + +fun f(t: @ContextFunctionTypeParams(42) T, tt: @ContextFunctionTypeParams(1) Int) {} + +fun test() { + val f: @ContextFunctionTypeParams(1) @ExtensionFunctionType (Int, String) -> Unit = {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.txt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.txt new file mode 100644 index 00000000000..4bd328635ae --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.txt @@ -0,0 +1,4 @@ +package + +public fun f(/*0*/ t: @kotlin.ContextFunctionTypeParams(count = 42) T, /*1*/ tt: @kotlin.ContextFunctionTypeParams(count = 1) kotlin.Int): kotlin.Unit +public fun test(): kotlin.Unit 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 9c6c7e00623..e93e8bd7205 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 @@ -10588,6 +10588,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/ambiguityInGroup.kt"); } + @Test + @TestMetadata("contextReceiverTypeParamsUsage.kt") + public void testContextReceiverTypeParamsUsage() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsage.kt"); + } + + @Test + @TestMetadata("contextReceiverTypeParamsUsageError.kt") + public void testContextReceiverTypeParamsUsageError() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/contextReceiverTypeParamsUsageError.kt"); + } + @Test @TestMetadata("functionalType.kt") public void testFunctionalType() throws Exception { diff --git a/core/builtins/src/kotlin/Annotations.kt b/core/builtins/src/kotlin/Annotations.kt index 9ee77802c95..8a7cac9b567 100644 --- a/core/builtins/src/kotlin/Annotations.kt +++ b/core/builtins/src/kotlin/Annotations.kt @@ -97,7 +97,6 @@ public enum class DeprecationLevel { @MustBeDocumented public annotation class ExtensionFunctionType -// TODO: How to make it require opt-in? @RequiresOptIn doesn't support TYPE target @Target(TYPE) @MustBeDocumented public annotation class ContextFunctionTypeParams(val count: Int)