diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java index f9b31e8be6c..f9f25fdec03 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java @@ -201,6 +201,11 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/explicitMetadata.kt"); } + @TestMetadata("jvmRecordWithoutJdk15.kt") + public void testJvmRecordWithoutJdk15() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.kt"); + } + @TestMetadata("JvmSyntheticOnDelegate.kt") public void testJvmSyntheticOnDelegate() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmRecordApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmRecordApplicabilityChecker.kt index 9adc7a58165..26283c25c3b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmRecordApplicabilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmRecordApplicabilityChecker.kt @@ -10,12 +10,14 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass import org.jetbrains.kotlin.resolve.jvm.JAVA_LANG_RECORD_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_RECORD_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.isJvmRecord @@ -29,6 +31,11 @@ object JvmRecordApplicabilityChecker : DeclarationChecker { declaration.annotationEntries.firstOrNull { it.shortName == JVM_RECORD_ANNOTATION_FQ_NAME.shortName() } ?: declaration + if (context.moduleDescriptor.resolveTopLevelClass(JAVA_LANG_RECORD_FQ_NAME, NoLookupLocation.FOR_DEFAULT_IMPORTS) == null) { + context.trace.report(ErrorsJvm.JVM_RECORD_REQUIRES_JDK15.on(reportOn)) + return + } + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.JvmRecordSupport)) { context.trace.report( Errors.UNSUPPORTED_FEATURE.on( diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index a3331c99177..55a5378d8c1 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -157,6 +157,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(JVM_RECORD_NOT_VAL_PARAMETER, "Constructor parameter of @JvmRecord class should be a val"); MAP.put(JVM_RECORD_NOT_LAST_VARARG_PARAMETER, "Only the last constructor parameter of @JvmRecord may be a vararg"); MAP.put(JVM_RECORD_EXTENDS_CLASS, "Record cannot inherit an other class but java.lang.Record" , RENDER_TYPE); + MAP.put(JVM_RECORD_REQUIRES_JDK15, "Using @JvmRecords requires at least JDK 15"); String MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS = "Method 'contains' from ConcurrentHashMap may have unexpected semantics: it calls 'containsValue' instead of 'containsKey'. " + diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index dd2c8e72897..13b4606b1e5 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -120,6 +120,7 @@ public interface ErrorsJvm { DiagnosticFactory0 JVM_RECORD_NOT_VAL_PARAMETER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 JVM_RECORD_NOT_LAST_VARARG_PARAMETER = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 JVM_RECORD_EXTENDS_CLASS = DiagnosticFactory1.create(ERROR); + DiagnosticFactory0 JVM_RECORD_REQUIRES_JDK15 = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.fir.kt new file mode 100644 index 00000000000..a9d577ce323 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.fir.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +JvmRecordSupport +// SKIP_TXT + +@JvmRecord +class MyRec( + val x: String, + val y: Int, + vararg val z: Double, +) diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.kt new file mode 100644 index 00000000000..8012ef2fdcb --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +JvmRecordSupport +// SKIP_TXT + +@JvmRecord +class MyRec( + val x: String, + val y: Int, + vararg val z: Double, +) diff --git a/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 102b487a90c..8889dc53890 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -201,6 +201,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/explicitMetadata.kt"); } + @TestMetadata("jvmRecordWithoutJdk15.kt") + public void testJvmRecordWithoutJdk15() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.kt"); + } + @TestMetadata("JvmSyntheticOnDelegate.kt") public void testJvmSyntheticOnDelegate() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index 25a24d11639..d4ef163daa6 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -201,6 +201,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/explicitMetadata.kt"); } + @TestMetadata("jvmRecordWithoutJdk15.kt") + public void testJvmRecordWithoutJdk15() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmRecordWithoutJdk15.kt"); + } + @TestMetadata("JvmSyntheticOnDelegate.kt") public void testJvmSyntheticOnDelegate() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt");