[LL FIR] resolve compiler required annotations correctly

Original AbstractFirSpecificAnnotationResolveTransformer can jump
to other classes and resolve them outside
our transformers, so it leads to
problems with locks and lazy bodies

^KT-56543
This commit is contained in:
Dmitrii Gridin
2023-04-05 17:53:45 +02:00
committed by Space Team
parent 22b5d940f1
commit 71f48ede53
7 changed files with 377 additions and 16 deletions
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.DesignationState
import org.jetbrains.kotlin.fir.resolve.transformers.FirSpecificTypeResolverTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.ScopeClassDeclaration
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformerDispatcher
@@ -39,7 +38,6 @@ import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -242,16 +240,7 @@ abstract class AbstractFirSpecificAnnotationResolveTransformer(
private fun resolveAnnotationsOnAnnotationIfNeeded(annotationTypeRef: FirResolvedTypeRef) {
val symbol = annotationTypeRef.coneType.toRegularClassSymbol(session) ?: return
val regularClass = symbol.fir
if (computationSession.annotationsAreResolved(regularClass)) return
val designation = DesignationState.create(symbol, emptyMap(), includeFile = true) ?: return
val transformer = FirDesignatedCompilerRequiredAnnotationsResolveTransformer(
designation.firstDeclaration.moduleData.session,
scopeSession,
computationSession,
designation
)
designation.firstDeclaration.transformSingle(transformer, null)
computationSession.resolveAnnotationsOnAnnotationIfNeeded(symbol, scopeSession)
}
override fun transformAnnotation(annotation: FirAnnotation, data: Nothing?): FirStatement {
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.DesignationState
import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractPhaseTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.FirGlobalResolveProcessor
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.fir.withFileAnalysisExceptionWrapping
import org.jetbrains.kotlin.name.FqName
@@ -127,7 +128,7 @@ class FirDesignatedCompilerRequiredAnnotationsResolveTransformer(
FirDesignatedSpecificAnnotationResolveTransformer(session, scopeSession, computationSession, designation)
}
class CompilerRequiredAnnotationsComputationSession {
open class CompilerRequiredAnnotationsComputationSession {
private val filesWithResolvedImports = mutableSetOf<FirFile>()
fun importsAreResolved(file: FirFile): Boolean {
@@ -153,6 +154,25 @@ class CompilerRequiredAnnotationsComputationSession {
error("Annotations are resolved twice")
}
}
fun resolveAnnotationsOnAnnotationIfNeeded(symbol: FirRegularClassSymbol, scopeSession: ScopeSession) {
val regularClass = symbol.fir
if (annotationsAreResolved(regularClass)) return
resolveAnnotationSymbol(symbol, scopeSession)
}
open fun resolveAnnotationSymbol(symbol: FirRegularClassSymbol, scopeSession: ScopeSession) {
val designation = DesignationState.create(symbol, emptyMap(), includeFile = true) ?: return
val transformer = FirDesignatedCompilerRequiredAnnotationsResolveTransformer(
designation.firstDeclaration.moduleData.session,
scopeSession,
this,
designation,
)
designation.firstDeclaration.transformSingle(transformer, null)
}
}
private class FirPartialImportResolveTransformer(