[FIR] Add INNER_JVM_RECORD diagnostic

This commit is contained in:
Andrey Zinovyev
2021-08-19 15:07:45 +03:00
committed by Space
parent 49484c4292
commit dbc1e31e67
8 changed files with 25 additions and 56 deletions
@@ -69,6 +69,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
val NON_DATA_CLASS_JVM_RECORD by error<PsiElement>()
val JVM_RECORD_NOT_VAL_PARAMETER by error<PsiElement>()
val JVM_RECORD_NOT_LAST_VARARG_PARAMETER by error<PsiElement>()
val INNER_JVM_RECORD by error<PsiElement>(PositioningStrategy.INNER_MODIFIER)
}
}
@@ -58,5 +58,6 @@ object FirJvmErrors {
val NON_DATA_CLASS_JVM_RECORD by error0<PsiElement>()
val JVM_RECORD_NOT_VAL_PARAMETER by error0<PsiElement>()
val JVM_RECORD_NOT_LAST_VARARG_PARAMETER by error0<PsiElement>()
val INNER_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.INNER_MODIFIER)
}
@@ -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
@@ -1,56 +0,0 @@
// !API_VERSION: 1.5
// !LANGUAGE: +JvmRecordSupport
// SKIP_TXT
// JVM_TARGET: 15
// ENABLE_JVM_PREVIEW
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A0
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A1 {
constructor()
}
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A2()
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A3(name: String)
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A4(var name: String)
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A5(vararg val name: String, y: Int)
@JvmRecord
<!NON_FINAL_JVM_RECORD!>open<!> class A6(val x: String)
@JvmRecord
<!NON_FINAL_JVM_RECORD!>abstract<!> class A7(val x: String)
@JvmRecord
<!NON_FINAL_JVM_RECORD!>sealed<!> class A8(val x: String)
@JvmRecord
<!ENUM_JVM_RECORD!>enum<!> class A9(val x: String) {
X("");
}
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A10(
val x: String,
val y: Int,
vararg val z: Double,
)
fun main() {
<!LOCAL_JVM_RECORD!>@JvmRecord<!>
class Local
}
class Outer {
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
inner class Inner(val name: String)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !API_VERSION: 1.5
// !LANGUAGE: +JvmRecordSupport
// SKIP_TXT
@@ -3580,4 +3580,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirJvmErrors.INNER_JVM_RECORD) { firDiagnostic ->
InnerJvmRecordImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
}
@@ -2493,4 +2493,8 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = JvmRecordNotLastVarargParameter::class
}
abstract class InnerJvmRecord : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = InnerJvmRecord::class
}
}
@@ -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<PsiElement> {
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
}