[FIR] Add NON_DATA_CLASS_JVM_RECORD diagnostic

This commit is contained in:
Andrey Zinovyev
2021-08-19 12:43:39 +03:00
committed by Space
parent 84f5d6b149
commit c7008892fd
9 changed files with 36 additions and 15 deletions
@@ -66,6 +66,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
val NON_FINAL_JVM_RECORD by error<PsiElement>(PositioningStrategy.NON_FINAL_MODIFIER_OR_NAME)
val ENUM_JVM_RECORD by error<PsiElement>(PositioningStrategy.ENUM_MODIFIER)
val JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS by error<PsiElement>()
val NON_DATA_CLASS_JVM_RECORD by error<PsiElement>()
}
}
@@ -55,5 +55,6 @@ object FirJvmErrors {
val NON_FINAL_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.NON_FINAL_MODIFIER_OR_NAME)
val ENUM_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.ENUM_MODIFIER)
val JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS by error0<PsiElement>()
val NON_DATA_CLASS_JVM_RECORD by error0<PsiElement>()
}
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.name.FqName
object FirJvmRecordChecker : FirRegularClassChecker() {
@@ -40,6 +37,11 @@ object FirJvmRecordChecker : FirRegularClassChecker() {
return
}
if (!declaration.isData) {
reporter.reportOn(annotationSource, FirJvmErrors.NON_DATA_CLASS_JVM_RECORD, context)
return
}
if (declaration.primaryConstructor?.valueParameters?.isEmpty() == true) {
reporter.reportOn(annotationSource, FirJvmErrors.JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS, context)
}
@@ -4,24 +4,24 @@
// JVM_TARGET: 15
// ENABLE_JVM_PREVIEW
<!JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS!>@JvmRecord<!>
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A0
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A1 {
constructor()
}
<!JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS!>@JvmRecord<!>
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A2()
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A3(name: String)
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A4(var name: String)
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A5(vararg val name: String, y: Int)
@JvmRecord
@@ -38,7 +38,7 @@ class A5(vararg val name: String, y: Int)
X("");
}
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A10(
val x: String,
val y: Int,
@@ -51,6 +51,6 @@ fun main() {
}
class Outer {
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
inner class Inner(val name: String)
}
@@ -5,7 +5,7 @@
public record JRecord(int x, CharSequence y) {}
// FILE: main.kt
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class MyRec(
val x: String,
val y: Int,
@@ -3,12 +3,12 @@
// JVM_TARGET: 15
// ENABLE_JVM_PREVIEW
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class BasicRecord(val x: String)
@JvmRecord
data class BasicDataRecord(val x: String)
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class BasicRecordWithSuperClass<!>(val x: String) : Record()
@@ -3562,4 +3562,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirJvmErrors.NON_DATA_CLASS_JVM_RECORD) { firDiagnostic ->
NonDataClassJvmRecordImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
}
@@ -2481,4 +2481,8 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = JvmRecordWithoutPrimaryConstructorParameters::class
}
abstract class NonDataClassJvmRecord : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = NonDataClassJvmRecord::class
}
}
@@ -4021,3 +4021,10 @@ internal class JvmRecordWithoutPrimaryConstructorParametersImpl(
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
}
internal class NonDataClassJvmRecordImpl(
firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.NonDataClassJvmRecord(), KtAbstractFirDiagnostic<PsiElement> {
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
}