[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:
committed by
Space Team
parent
22b5d940f1
commit
71f48ede53
+1
-12
@@ -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 {
|
||||
|
||||
+21
-1
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user