From 0c70b6098853712fd19b3237c876cd0bf823765a Mon Sep 17 00:00:00 2001 From: "Evgeniy.Zhelenskiy" Date: Tue, 11 Oct 2022 00:13:00 +0200 Subject: [PATCH] [IR] Add context receiver test on MFVC Signed-off-by: Evgeniy.Zhelenskiy #KT-1179 --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++--- ...irOldFrontendDiagnosticsTestGenerated.java | 6 +++--- ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++--- .../FirInlineClassDeclarationChecker.kt | 2 ++ .../jetbrains/kotlin/diagnostics/Errors.java | 4 ++-- .../rendering/DefaultErrorMessages.java | 2 +- .../checkers/InlineClassDeclarationChecker.kt | 2 +- .../noContextReceiversOnInlineClasses.fir.kt | 6 ------ .../noContextReceiversOnInlineClasses.kt | 6 ------ .../noContextReceiversOnInlineClasses.txt | 16 ---------------- .../noContextReceiversOnValueClasses.fir.kt | 19 +++++++++++++++++++ .../noContextReceiversOnValueClasses.kt | 19 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++--- 13 files changed, 56 insertions(+), 44 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt delete mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.txt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.fir.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt 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 16686f197b3..ca647afc442 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 @@ -11062,9 +11062,9 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag } @Test - @TestMetadata("noContextReceiversOnInlineClasses.kt") - public void testNoContextReceiversOnInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt"); + @TestMetadata("noContextReceiversOnValueClasses.kt") + public void testNoContextReceiversOnValueClasses() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal()); } @Test 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 451cf006847..adf186bf1dd 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 @@ -11068,9 +11068,9 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti } @Test - @TestMetadata("noContextReceiversOnInlineClasses.kt") - public void testNoContextReceiversOnInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt"); + @TestMetadata("noContextReceiversOnValueClasses.kt") + public void testNoContextReceiversOnValueClasses() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal()); } @Test 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 6e4ea0fd378..4822fb9e1d4 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 @@ -11062,9 +11062,9 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac } @Test - @TestMetadata("noContextReceiversOnInlineClasses.kt") - public void testNoContextReceiversOnInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt"); + @TestMetadata("noContextReceiversOnValueClasses.kt") + public void testNoContextReceiversOnValueClasses() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal()); } @Test diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt index 470bf855b37..ca1175f8aab 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt @@ -52,6 +52,8 @@ object FirInlineClassDeclarationChecker : FirRegularClassChecker() { reporter.reportOn(declaration.source, FirErrors.VALUE_CLASS_NOT_FINAL, context) } + // TODO check absence of context receivers when FIR infrastructure is ready + for (supertypeEntry in declaration.superTypeRefs) { if (supertypeEntry.toRegularClassSymbol(context.session)?.isInterface != true) { reporter.reportOn(supertypeEntry.source, FirErrors.VALUE_CLASS_CANNOT_EXTEND_CLASSES, context) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 27858ddb41e..2a7cb40bba0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -425,8 +425,8 @@ public interface Errors { DiagnosticFactory0 INNER_CLASS_INSIDE_VALUE_CLASS = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 VALUE_CLASS_CANNOT_BE_CLONEABLE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 INLINE_CLASS_DEPRECATED = DiagnosticFactory0.create(WARNING); - DiagnosticFactory0 INLINE_CLASS_CANNOT_HAVE_CONTEXT_RECEIVERS = DiagnosticFactory0.create(ERROR); - DiagnosticFactory1 INEFFICIENT_EQUALS_OVERRIDING_IN_INLINE_CLASS = + DiagnosticFactory0 VALUE_CLASS_CANNOT_HAVE_CONTEXT_RECEIVERS = DiagnosticFactory0.create(ERROR); + DiagnosticFactory1 INEFFICIENT_EQUALS_OVERRIDING_IN_VALUE_CLASS = DiagnosticFactory1.create(WARNING, DECLARATION_NAME); // Result class diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 863e7a4620f..11d79f2b8c9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -800,7 +800,7 @@ public class DefaultErrorMessages { MAP.put(INNER_CLASS_INSIDE_VALUE_CLASS, "Value class cannot have inner classes"); MAP.put(VALUE_CLASS_CANNOT_BE_CLONEABLE, "Value class cannot be Cloneable"); MAP.put(INLINE_CLASS_DEPRECATED, "'inline' modifier is deprecated. Use 'value' instead"); - MAP.put(INLINE_CLASS_CANNOT_HAVE_CONTEXT_RECEIVERS, "Inline classes cannot have context receivers"); + MAP.put(VALUE_CLASS_CANNOT_HAVE_CONTEXT_RECEIVERS, "Value classes cannot have context receivers"); MAP.put(INEFFICIENT_EQUALS_OVERRIDING_IN_INLINE_CLASS, "Overriding ''equals'' from ''Any'' in inline class without operator ''equals(other: {0}): Boolean'' leads to boxing on every equality comparison", RENDER_TYPE); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt index 6718d6d6c33..07c62378055 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt @@ -62,7 +62,7 @@ object InlineClassDeclarationChecker : DeclarationChecker { if (declaration.contextReceivers.isNotEmpty()) { val contextReceiverList = declaration.getContextReceiverList() requireNotNull(contextReceiverList) { "Declaration cannot have context receivers with no context receiver list" } - trace.report(Errors.INLINE_CLASS_CANNOT_HAVE_CONTEXT_RECEIVERS.on(contextReceiverList)) + trace.report(Errors.VALUE_CLASS_CANNOT_HAVE_CONTEXT_RECEIVERS.on(contextReceiverList)) } val modalityModifier = declaration.modalityModifier() diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.fir.kt deleted file mode 100644 index 08f684ad182..00000000000 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +ContextReceivers - -class A - -context(A) -inline class B(val x: Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt deleted file mode 100644 index 9a7a98c1ab6..00000000000 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt +++ /dev/null @@ -1,6 +0,0 @@ -// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +ContextReceivers - -class A - -context(A) -inline class B(val x: Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.txt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.txt deleted file mode 100644 index e5a64849dc6..00000000000 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.txt +++ /dev/null @@ -1,16 +0,0 @@ -package - -public final class A { - public constructor A() - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String -} - -context(A) public final inline class B { - public constructor B(/*0*/ x: kotlin.Int) - public final val x: kotlin.Int - public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String -} diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.fir.kt new file mode 100644 index 00000000000..96b1dd8f4f9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.fir.kt @@ -0,0 +1,19 @@ +// !LANGUAGE: +ContextReceivers, +ValueClasses +// WITH_STDLIB +// SKIP_TXT +// WORKS_WHEN_VALUE_CLASS + +@file:Suppress("INLINE_CLASS_DEPRECATED") + +class A + +context(A) +inline class B1(val x: Int) + +context(A) +OPTIONAL_JVM_INLINE_ANNOTATION +value class B2(val x: Int) + +context(A) +OPTIONAL_JVM_INLINE_ANNOTATION +value class C(val x: Int, val y: Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt new file mode 100644 index 00000000000..80a25ff01cd --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt @@ -0,0 +1,19 @@ +// !LANGUAGE: +ContextReceivers, +ValueClasses +// WITH_STDLIB +// SKIP_TXT +// WORKS_WHEN_VALUE_CLASS + +@file:Suppress("INLINE_CLASS_DEPRECATED") + +class A + +context(A) +inline class B1(val x: Int) + +context(A) +OPTIONAL_JVM_INLINE_ANNOTATION +value class B2(val x: Int) + +context(A) +OPTIONAL_JVM_INLINE_ANNOTATION +value class C(val x: Int, val y: Int) 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 16a944d8eea..007b82ad89c 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,9 +11068,9 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { } @Test - @TestMetadata("noContextReceiversOnInlineClasses.kt") - public void testNoContextReceiversOnInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnInlineClasses.kt"); + @TestMetadata("noContextReceiversOnValueClasses.kt") + public void testNoContextReceiversOnValueClasses() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/noContextReceiversOnValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal()); } @Test