From a3049b35c244e3fa84f42f3248b87a341957c500 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Thu, 19 Aug 2021 17:04:10 +0300 Subject: [PATCH] [FIR] Add ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE diagnostic --- .../generator/diagnostics/FirJvmDiagnosticsList.kt | 1 + .../fir/analysis/diagnostics/jvm/FirJvmErrors.kt | 1 + .../jvm/checkers/declaration/FirJvmRecordChecker.kt | 12 ++++++++++++ .../testsWithJava15/jvmRecord/supertypesCheck.fir.kt | 8 ++++---- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 7 files changed, 35 insertions(+), 4 deletions(-) diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index c9e07f3533d..39de01f7136 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -75,6 +75,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val JVM_RECORD_EXTENDS_CLASS by error(PositioningStrategy.ACTUAL_DECLARATION_NAME) { parameter("superType") } + val ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE by error() } } diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 5120289d9ff..81eb0dcc730 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -62,5 +62,6 @@ object FirJvmErrors { val FIELD_IN_JVM_RECORD by error0() val DELEGATION_BY_IN_JVM_RECORD by error0() val JVM_RECORD_EXTENDS_CLASS by error1(SourceElementPositioningStrategies.ACTUAL_DECLARATION_NAME) + val ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE by error0() } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt index ddd200cec9d..f772fa2c070 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt @@ -22,14 +22,26 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.languageVersionSettings +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.coneTypeSafe +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName object FirJvmRecordChecker : FirRegularClassChecker() { private val JVM_RECORD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmRecord") + private val JAVA_RECORD_CLASS_ID = ClassId.fromString("java/lang/Record") override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { + declaration.superTypeRefs.firstOrNull()?.let { typeRef -> + if (typeRef.coneTypeSafe()?.classId == JAVA_RECORD_CLASS_ID) { + reporter.reportOn(typeRef.source, FirJvmErrors.ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE, context) + return + } + } + val annotationSource = declaration.getAnnotationByFqName(JVM_RECORD_ANNOTATION_FQ_NAME)?.source ?: return val languageVersionSettings = context.session.languageVersionSettings diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/supertypesCheck.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/supertypesCheck.fir.kt index 62a0ab9f07a..79c94bd830f 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/supertypesCheck.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/supertypesCheck.fir.kt @@ -13,14 +13,14 @@ data class A1(val x: String) : Abstract(), I data class A2(val x: String) : Any(), I @JvmRecord -data class A3(val x: String) : Record(), I +data class A3(val x: String) : Record(), I @JvmRecord -data class A4(val x: String) : java.lang.Record(), I +data class A4(val x: String) : java.lang.Record(), I @JvmRecord data class A5(val x: String) : I -data class A6(val x: String) : Record(), I +data class A6(val x: String) : Record(), I -data class A7(val x: String) : java.lang.Record(), I +data class A7(val x: String) : java.lang.Record(), I diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index d5d6891cb4e..08624e7c645 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3605,4 +3605,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE) { firDiagnostic -> + IllegalJavaLangRecordSupertypeImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index c3a1d8a8028..15e14b03974 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2510,4 +2510,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val superType: KtType } + abstract class IllegalJavaLangRecordSupertype : KtFirDiagnostic() { + override val diagnosticClass get() = IllegalJavaLangRecordSupertype::class + } + } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 58cf6c4e177..ba96a407f13 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4071,3 +4071,10 @@ internal class JvmRecordExtendsClassImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class IllegalJavaLangRecordSupertypeImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.IllegalJavaLangRecordSupertype(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +