[FIR] Add JVM_RECORD_EXTENDS_CLASS diagnostic
This commit is contained in:
+3
@@ -72,6 +72,9 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
|
||||
val INNER_JVM_RECORD by error<PsiElement>(PositioningStrategy.INNER_MODIFIER)
|
||||
val FIELD_IN_JVM_RECORD by error<PsiElement>()
|
||||
val DELEGATION_BY_IN_JVM_RECORD by error<PsiElement>()
|
||||
val JVM_RECORD_EXTENDS_CLASS by error<PsiElement>(PositioningStrategy.ACTUAL_DECLARATION_NAME) {
|
||||
parameter<ConeKotlinType>("superType")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
@@ -61,5 +61,6 @@ object FirJvmErrors {
|
||||
val INNER_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.INNER_MODIFIER)
|
||||
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)
|
||||
|
||||
}
|
||||
|
||||
+11
@@ -6,9 +6,12 @@
|
||||
package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.FirRealSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirRegularClassChecker
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
|
||||
@@ -19,6 +22,7 @@ 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.coneType
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
object FirJvmRecordChecker : FirRegularClassChecker() {
|
||||
@@ -88,5 +92,12 @@ object FirJvmRecordChecker : FirRegularClassChecker() {
|
||||
reporter.reportOn(decl.source, FirJvmErrors.DELEGATION_BY_IN_JVM_RECORD, context)
|
||||
}
|
||||
}
|
||||
|
||||
declaration.superTypeRefs.firstOrNull()?.let { typeRef ->
|
||||
if (typeRef.source?.kind != FirRealSourceElementKind) return@let
|
||||
if (typeRef.toRegularClassSymbol(context.session)?.classKind == ClassKind.CLASS) {
|
||||
reporter.reportOn(declaration.source, FirJvmErrors.JVM_RECORD_EXTENDS_CLASS, typeRef.coneType, context)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -7,16 +7,16 @@ abstract class Abstract
|
||||
interface I
|
||||
|
||||
@JvmRecord
|
||||
data class A1(val x: String) : Abstract(), I
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A1<!>(val x: String) : Abstract(), I
|
||||
|
||||
@JvmRecord
|
||||
data class A2(val x: String) : Any(), I
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A2<!>(val x: String) : Any(), I
|
||||
|
||||
@JvmRecord
|
||||
data class A3(val x: String) : Record(), I
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A3<!>(val x: String) : Record(), I
|
||||
|
||||
@JvmRecord
|
||||
data class A4(val x: String) : java.lang.Record(), I
|
||||
data class <!JVM_RECORD_EXTENDS_CLASS!>A4<!>(val x: String) : java.lang.Record(), I
|
||||
|
||||
@JvmRecord
|
||||
data class A5(val x: String) : I
|
||||
|
||||
+7
@@ -3598,4 +3598,11 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirJvmErrors.JVM_RECORD_EXTENDS_CLASS) { firDiagnostic ->
|
||||
JvmRecordExtendsClassImpl(
|
||||
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
|
||||
firDiagnostic as FirPsiDiagnostic,
|
||||
token,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -2505,4 +2505,9 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
override val diagnosticClass get() = DelegationByInJvmRecord::class
|
||||
}
|
||||
|
||||
abstract class JvmRecordExtendsClass : KtFirDiagnostic<PsiElement>() {
|
||||
override val diagnosticClass get() = JvmRecordExtendsClass::class
|
||||
abstract val superType: KtType
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+8
@@ -4063,3 +4063,11 @@ internal class DelegationByInJvmRecordImpl(
|
||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class JvmRecordExtendsClassImpl(
|
||||
override val superType: KtType,
|
||||
firDiagnostic: FirPsiDiagnostic,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.JvmRecordExtendsClass(), KtAbstractFirDiagnostic<PsiElement> {
|
||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user