[FIR] Add JVM_RECORD_EXTENDS_CLASS diagnostic

This commit is contained in:
Andrey Zinovyev
2021-08-19 16:30:58 +03:00
committed by Space
parent 8c2d37917f
commit 09a1d54865
7 changed files with 39 additions and 4 deletions
@@ -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")
}
}
}
@@ -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)
}
@@ -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)
}
}
}
}
@@ -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
@@ -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,
)
}
}
@@ -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
}
}
@@ -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)
}