diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirPredicateBasedProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirPredicateBasedProvider.kt index 19a6f431c40..8dc19d4cf8c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirPredicateBasedProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirPredicateBasedProvider.kt @@ -11,7 +11,9 @@ import kotlinx.collections.immutable.PersistentList import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.extensions.predicate.* +import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.fqName abstract class FirPredicateBasedProvider : FirSessionComponent { @@ -39,6 +41,8 @@ abstract class FirPredicateBasedProvider : FirSessionComponent { abstract fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List? + abstract fun fileHasPluginAnnotations(file: FirFile): Boolean + abstract fun registerAnnotatedDeclaration(declaration: FirAnnotatedDeclaration, owners: PersistentList) abstract fun registerGeneratedDeclaration(declaration: FirAnnotatedDeclaration, owner: FirAnnotatedDeclaration) @@ -78,6 +82,10 @@ private class FirPredicateBasedProviderImpl(private val session: FirSession) : F return this.map { it to cache.ownersForDeclaration.getValue(it) } } + override fun fileHasPluginAnnotations(file: FirFile): Boolean { + return file in cache.filesWithPluginAnnotations + } + override fun registerAnnotatedDeclaration(declaration: FirAnnotatedDeclaration, owners: PersistentList) { cache.ownersForDeclaration[declaration] = owners registerOwnersDeclarations(declaration, owners) @@ -88,6 +96,8 @@ private class FirPredicateBasedProviderImpl(private val session: FirSession) : F if (matchingAnnotations.isEmpty()) return matchingAnnotations.forEach { cache.declarationByAnnotation.put(it, declaration) } cache.annotationsOfDeclaration.putAll(declaration, matchingAnnotations) + val file = owners.first() as FirFile + cache.filesWithPluginAnnotations += file } override fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List? { @@ -172,6 +182,8 @@ private class FirPredicateBasedProviderImpl(private val session: FirSession) : F val parentAnnotationsOfDeclaration: LinkedHashMultimap = LinkedHashMultimap.create() val ownersForDeclaration: MutableMap> = mutableMapOf() + + val filesWithPluginAnnotations: MutableSet = mutableSetOf() } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveProcessor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveProcessor.kt index 2b855e1d5c6..d82428278fd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveProcessor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveProcessor.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.extensions.registeredPluginAnnotations import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession @@ -30,13 +31,14 @@ class FirAnnotationArgumentsResolveProcessor( class FirAnnotationArgumentsResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer() { private val transformer = FirAnnotationArgumentsResolveTransformer(session, scopeSession) private val hasAnnotations = session.registeredPluginAnnotations.annotations.isNotEmpty() + private val predicateBasedProvider = session.predicateBasedProvider override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { return element.compose() } override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { - if (!hasAnnotations) return file.compose() + if (!hasAnnotations || !predicateBasedProvider.fileHasPluginAnnotations(file)) return file.compose() return file.transform(transformer, ResolutionMode.ContextIndependent) } } \ No newline at end of file