[FIR] Add ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE diagnostic
This commit is contained in:
+1
@@ -75,6 +75,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
|
||||
val JVM_RECORD_EXTENDS_CLASS by error<PsiElement>(PositioningStrategy.ACTUAL_DECLARATION_NAME) {
|
||||
parameter<ConeKotlinType>("superType")
|
||||
}
|
||||
val ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE by error<PsiElement>()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
@@ -62,5 +62,6 @@ object FirJvmErrors {
|
||||
val FIELD_IN_JVM_RECORD by error0<PsiElement>()
|
||||
val DELEGATION_BY_IN_JVM_RECORD by error0<PsiElement>()
|
||||
val JVM_RECORD_EXTENDS_CLASS by error1<PsiElement, ConeKotlinType>(SourceElementPositioningStrategies.ACTUAL_DECLARATION_NAME)
|
||||
val ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE by error0<PsiElement>()
|
||||
|
||||
}
|
||||
|
||||
+12
@@ -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<ConeClassLikeType>()?.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
|
||||
|
||||
+4
-4
@@ -13,14 +13,14 @@ data class <!JVM_RECORD_EXTENDS_CLASS!>A1<!>(val x: String) : Abstract(), I
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A2<!>(val x: String) : Any(), I
|
||||
|
||||
@JvmRecord
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A3<!>(val x: String) : Record(), I
|
||||
data class A3(val x: String) : <!ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE!>Record<!>(), I
|
||||
|
||||
@JvmRecord
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A4<!>(val x: String) : java.lang.Record(), I
|
||||
data class A4(val x: String) : <!ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE!>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) : <!ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE!>Record<!>(), I
|
||||
|
||||
data class A7(val x: String) : java.lang.Record(), I
|
||||
data class A7(val x: String) : <!ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE!>java.lang.Record<!>(), I
|
||||
|
||||
+6
@@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -2510,4 +2510,8 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
abstract val superType: KtType
|
||||
}
|
||||
|
||||
abstract class IllegalJavaLangRecordSupertype : KtFirDiagnostic<PsiElement>() {
|
||||
override val diagnosticClass get() = IllegalJavaLangRecordSupertype::class
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+7
@@ -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<PsiElement> {
|
||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user