[FIR] Don't recreate transformers in FirPluginAnnotationsResolveTransformer
This commit is contained in:
+1
-1
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
|||||||
fun FirResolvePhase.createTransformerByPhase(session: FirSession, scopeSession: ScopeSession): FirTransformer<Nothing?> {
|
fun FirResolvePhase.createTransformerByPhase(session: FirSession, scopeSession: ScopeSession): FirTransformer<Nothing?> {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
RAW_FIR -> throw AssertionError("Raw FIR building phase does not have a transformer")
|
RAW_FIR -> throw AssertionError("Raw FIR building phase does not have a transformer")
|
||||||
ANNOTATIONS_FOR_PLUGINS -> FirPluginAnnotationsResolveTransformer(scopeSession)
|
ANNOTATIONS_FOR_PLUGINS -> FirPluginAnnotationsResolveTransformer(session, scopeSession)
|
||||||
FIRST_PLUGIN_GENERATION -> FirFirstGenerationTransformer()
|
FIRST_PLUGIN_GENERATION -> FirFirstGenerationTransformer()
|
||||||
IMPORTS -> FirImportResolveTransformer(session)
|
IMPORTS -> FirImportResolveTransformer(session)
|
||||||
SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession)
|
SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession)
|
||||||
|
|||||||
+21
-9
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.extensions.extensionsService
|
|||||||
import org.jetbrains.kotlin.fir.extensions.fqName
|
import org.jetbrains.kotlin.fir.extensions.fqName
|
||||||
import org.jetbrains.kotlin.fir.extensions.hasExtensions
|
import org.jetbrains.kotlin.fir.extensions.hasExtensions
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractPhaseTransformer
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirSpecificTypeResolverTransformer
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirSpecificTypeResolverTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||||
@@ -25,13 +26,21 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
|||||||
import org.jetbrains.kotlin.fir.visitors.compose
|
import org.jetbrains.kotlin.fir.visitors.compose
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
class FirPluginAnnotationsResolveTransformer(private val scopeSession: ScopeSession) : FirTransformer<Nothing?>() {
|
class FirPluginAnnotationsResolveTransformer(
|
||||||
|
override val session: FirSession,
|
||||||
|
scopeSession: ScopeSession
|
||||||
|
) : FirAbstractPhaseTransformer<Nothing?>(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS) {
|
||||||
|
private val annotationTransformer = FirAnnotationResolveTransformer(session, scopeSession)
|
||||||
|
private val importTransformer = FirPartialImportResolveTransformer(session)
|
||||||
|
|
||||||
|
private val extensionPointService = session.extensionsService
|
||||||
|
|
||||||
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
|
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
|
||||||
throw IllegalStateException("Should not be here")
|
throw IllegalStateException("Should not be here")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||||
val extensionPointService = file.session.extensionsService
|
checkSessionConsistency(file)
|
||||||
if (!extensionPointService.hasExtensions) return file.compose()
|
if (!extensionPointService.hasExtensions) return file.compose()
|
||||||
file.replaceResolvePhase(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS)
|
file.replaceResolvePhase(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS)
|
||||||
val newAnnotations = file.resolveAnnotations(extensionPointService.annotations, extensionPointService.metaAnnotations)
|
val newAnnotations = file.resolveAnnotations(extensionPointService.annotations, extensionPointService.metaAnnotations)
|
||||||
@@ -49,10 +58,10 @@ class FirPluginAnnotationsResolveTransformer(private val scopeSession: ScopeSess
|
|||||||
annotations: Set<AnnotationFqn>,
|
annotations: Set<AnnotationFqn>,
|
||||||
metaAnnotations: Set<AnnotationFqn>
|
metaAnnotations: Set<AnnotationFqn>
|
||||||
): Multimap<AnnotationFqn, FirRegularClass> {
|
): Multimap<AnnotationFqn, FirRegularClass> {
|
||||||
val importTransformer = FirPartialImportResolveTransformer(annotations)
|
importTransformer.acceptableFqNames = annotations
|
||||||
this.transform<FirFile, Nothing?>(importTransformer, null)
|
this.transformImports(importTransformer, null)
|
||||||
|
|
||||||
val annotationTransformer = FirAnnotationResolveTransformer(metaAnnotations, session, scopeSession)
|
annotationTransformer.metaAnnotations = metaAnnotations
|
||||||
val newAnnotations = LinkedHashMultimap.create<AnnotationFqn, FirRegularClass>()
|
val newAnnotations = LinkedHashMultimap.create<AnnotationFqn, FirRegularClass>()
|
||||||
this.transform<FirFile, Multimap<AnnotationFqn, FirRegularClass>>(annotationTransformer, newAnnotations)
|
this.transform<FirFile, Multimap<AnnotationFqn, FirRegularClass>>(annotationTransformer, newAnnotations)
|
||||||
return newAnnotations
|
return newAnnotations
|
||||||
@@ -60,17 +69,20 @@ class FirPluginAnnotationsResolveTransformer(private val scopeSession: ScopeSess
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class FirPartialImportResolveTransformer(
|
private class FirPartialImportResolveTransformer(
|
||||||
private val acceptableFqNames: Set<FqName>
|
session: FirSession
|
||||||
) : FirImportResolveTransformer(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS) {
|
) : FirImportResolveTransformer(session, FirResolvePhase.ANNOTATIONS_FOR_PLUGINS) {
|
||||||
|
var acceptableFqNames: Set<FqName> = emptySet()
|
||||||
|
|
||||||
override val FqName.isAcceptable: Boolean
|
override val FqName.isAcceptable: Boolean
|
||||||
get() = this in acceptableFqNames
|
get() = this in acceptableFqNames
|
||||||
}
|
}
|
||||||
|
|
||||||
private class FirAnnotationResolveTransformer(
|
private class FirAnnotationResolveTransformer(
|
||||||
private val metaAnnotations: Set<AnnotationFqn>,
|
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
scopeSession: ScopeSession
|
scopeSession: ScopeSession
|
||||||
) : FirAbstractAnnotationResolveTransformer<Multimap<AnnotationFqn, FirRegularClass>>(session, scopeSession) {
|
) : FirAbstractAnnotationResolveTransformer<Multimap<AnnotationFqn, FirRegularClass>>(session, scopeSession) {
|
||||||
|
var metaAnnotations: Set<AnnotationFqn> = emptySet()
|
||||||
|
|
||||||
private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(
|
private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(
|
||||||
towerScope,
|
towerScope,
|
||||||
session,
|
session,
|
||||||
|
|||||||
Reference in New Issue
Block a user