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 5c2f57e38f7..7d82d17fabc 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 @@ -69,6 +69,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val NON_DATA_CLASS_JVM_RECORD by error() val JVM_RECORD_NOT_VAL_PARAMETER by error() val JVM_RECORD_NOT_LAST_VARARG_PARAMETER by error() + val INNER_JVM_RECORD by error(PositioningStrategy.INNER_MODIFIER) } } 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 d2de2da9200..65cfea016b4 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 @@ -58,5 +58,6 @@ object FirJvmErrors { val NON_DATA_CLASS_JVM_RECORD by error0() val JVM_RECORD_NOT_VAL_PARAMETER by error0() val JVM_RECORD_NOT_LAST_VARARG_PARAMETER by error0() + val INNER_JVM_RECORD by error0(SourceElementPositioningStrategies.INNER_MODIFIER) } 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 99be1fb0399..1d9aac2de1a 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 @@ -43,6 +43,11 @@ object FirJvmRecordChecker : FirRegularClassChecker() { return } + if (declaration.isInner) { + reporter.reportOn(declaration.source, FirJvmErrors.INNER_JVM_RECORD, context) + return + } + if (!declaration.isFinal) { reporter.reportOn(declaration.source, FirJvmErrors.NON_FINAL_JVM_RECORD, context) return diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt deleted file mode 100644 index dfee8665900..00000000000 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt +++ /dev/null @@ -1,56 +0,0 @@ -// !API_VERSION: 1.5 -// !LANGUAGE: +JvmRecordSupport -// SKIP_TXT -// JVM_TARGET: 15 -// ENABLE_JVM_PREVIEW - -@JvmRecord -class A0 - -@JvmRecord -class A1 { - constructor() -} - -@JvmRecord -class A2() - -@JvmRecord -class A3(name: String) - -@JvmRecord -class A4(var name: String) - -@JvmRecord -class A5(vararg val name: String, y: Int) - -@JvmRecord -open class A6(val x: String) - -@JvmRecord -abstract class A7(val x: String) - -@JvmRecord -sealed class A8(val x: String) - -@JvmRecord -enum class A9(val x: String) { - X(""); -} - -@JvmRecord -class A10( - val x: String, - val y: Int, - vararg val z: Double, -) - -fun main() { - @JvmRecord - class Local -} - -class Outer { - @JvmRecord - inner class Inner(val name: String) -} diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.kt index 1ddb920271f..4f91205d807 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !API_VERSION: 1.5 // !LANGUAGE: +JvmRecordSupport // SKIP_TXT 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 7e4a882d71f..35efa2e50eb 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 @@ -3580,4 +3580,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.INNER_JVM_RECORD) { firDiagnostic -> + InnerJvmRecordImpl( + 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 4d252be8cd4..2571fb3b052 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 @@ -2493,4 +2493,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = JvmRecordNotLastVarargParameter::class } + abstract class InnerJvmRecord : KtFirDiagnostic() { + override val diagnosticClass get() = InnerJvmRecord::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 e2a20a2bb2f..225805d0f34 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 @@ -4042,3 +4042,10 @@ internal class JvmRecordNotLastVarargParameterImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class InnerJvmRecordImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.InnerJvmRecord(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +