[FIR] Add ILLEGAL_JAVA_LANG_RECORD_SUPERTYPE diagnostic

This commit is contained in:
Andrey Zinovyev
2021-08-19 17:04:10 +03:00
committed by Space
parent 09a1d54865
commit a3049b35c2
7 changed files with 35 additions and 4 deletions
@@ -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>()
}
}
@@ -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>()
}
@@ -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
@@ -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
@@ -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,
)
}
}
@@ -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
}
}
@@ -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)
}