Optimize/simplify FirSealedClassConstructorCallChecker

This commit is contained in:
Mikhail Glukhikh
2020-12-07 11:30:54 +03:00
parent c94c71cc50
commit 42b590d07c
@@ -13,13 +13,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.classId
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirSealedClassConstructorCallChecker : FirQualifiedAccessChecker() {
@@ -29,13 +27,10 @@ object FirSealedClassConstructorCallChecker : FirQualifiedAccessChecker() {
?.fir.safeAs<FirConstructor>()
?: return
val typeClassId = constructorFir.returnTypeRef.safeAs<FirResolvedTypeRef>()
val typeFir = constructorFir.returnTypeRef.safeAs<FirResolvedTypeRef>()
?.type.safeAs<ConeClassLikeType>()
?.lookupTag
?.classId
?: return
val typeFir = typeClassId.toRegularClass(context)
?.lookupTag?.toSymbol(context.session)
?.fir as? FirRegularClass
?: return
if (typeFir.status.modality == Modality.SEALED) {
@@ -43,15 +38,6 @@ object FirSealedClassConstructorCallChecker : FirQualifiedAccessChecker() {
}
}
private fun ClassId.toRegularClass(context: CheckerContext): FirRegularClass? = if (!isLocal) {
context.session.firSymbolProvider.getClassLikeSymbolByFqName(this)
?.fir.safeAs()
} else {
context.containingDeclarations
.lastOrNull { it.safeAs<FirRegularClass>()?.classId == this }
.safeAs()
}
private fun DiagnosticReporter.report(source: FirSourceElement?) {
source?.let { report(FirErrors.SEALED_CLASS_CONSTRUCTOR_CALL.on(it)) }
}