From 9a802e7cd7aa7b987d0d61a0de17822475886c38 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 4 Oct 2021 16:28:02 +0300 Subject: [PATCH] [FIR] Return symbols instead of FIR from FirPredicateBasedProvider --- .../fir/extensions/FirPredicateBasedProvider.kt | 13 +++++++------ .../jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt | 5 +++++ .../fir/plugin/AllOpenVisibilityTransformer.kt | 7 ++++--- .../fir/plugin/generators/AllOpenClassGenerator.kt | 2 +- .../plugin/generators/AllOpenMembersGenerator.kt | 2 +- .../AllOpenTopLevelDeclarationsGenerator.kt | 2 +- 6 files changed, 19 insertions(+), 12 deletions(-) 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 93213497bbd..901bf4eabb8 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 @@ -15,6 +15,7 @@ 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.fqName +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol abstract class FirPredicateBasedProvider : FirSessionComponent { companion object { @@ -23,8 +24,8 @@ abstract class FirPredicateBasedProvider : FirSessionComponent { } } - abstract fun getSymbolsByPredicate(predicate: DeclarationPredicate): List - abstract fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List? + abstract fun getSymbolsByPredicate(predicate: DeclarationPredicate): List> + abstract fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List>? abstract fun fileHasPluginAnnotations(file: FirFile): Boolean abstract fun matches(predicate: DeclarationPredicate, declaration: FirAnnotatedDeclaration): Boolean @@ -38,13 +39,13 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic private val registeredPluginAnnotations = session.registeredPluginAnnotations private val cache = Cache() - override fun getSymbolsByPredicate(predicate: DeclarationPredicate): List { + override fun getSymbolsByPredicate(predicate: DeclarationPredicate): List> { val annotations = registeredPluginAnnotations.getAnnotationsForPredicate(predicate) if (annotations.isEmpty()) return emptyList() val declarations = annotations.flatMapTo(mutableSetOf()) { cache.declarationByAnnotation[it] + cache.declarationsUnderAnnotated[it] } - return declarations.filter { matches(predicate, it) } + return declarations.filter { matches(predicate, it) }.map { it.symbol } } override fun fileHasPluginAnnotations(file: FirFile): Boolean { @@ -65,8 +66,8 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic cache.filesWithPluginAnnotations += file } - override fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List? { - return cache.ownersForDeclaration[declaration] + override fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List>? { + return cache.ownersForDeclaration[declaration]?.map { it.symbol } } private fun registerOwnersDeclarations(declaration: FirAnnotatedDeclaration, owners: PersistentList) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt index 48dc4087268..b38fe26b88d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt @@ -7,8 +7,10 @@ package org.jetbrains.kotlin.fir.symbols import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.expressions.FirAnnotation abstract class FirBasedSymbol { private var _fir: E? = null @@ -30,6 +32,9 @@ abstract class FirBasedSymbol { val moduleData: FirModuleData get() = fir.moduleData + + val annotations: List + get() = (fir as? FirAnnotatedDeclaration)?.annotations ?: emptyList() } @RequiresOptIn diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt index f5fc7842780..59bb5976a82 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.extensions.predicate.hasOrUnder import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.extensions.transform import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.name.ClassId @@ -48,15 +49,15 @@ class AllOpenVisibilityTransformer(session: FirSession) : FirStatusTransformerEx return status.transform(visibility = visibility) } - private fun findVisibility(declaration: FirDeclaration, owners: List): Visibility? { - (declaration as? FirAnnotatedDeclaration)?.visibilityFromAnnotation()?.let { return it } + private fun findVisibility(declaration: FirDeclaration, owners: List>): Visibility? { + declaration.symbol.visibilityFromAnnotation()?.let { return it } for (owner in owners) { owner.visibilityFromAnnotation()?.let { return it } } return null } - private fun FirAnnotatedDeclaration.visibilityFromAnnotation(): Visibility? { + private fun FirBasedSymbol<*>.visibilityFromAnnotation(): Visibility? { val annotation = annotations.firstOrNull { it.annotationTypeRef.coneTypeSafe()?.lookupTag?.classId == AllPublicClassId } as? FirAnnotationCall ?: return null diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenClassGenerator.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenClassGenerator.kt index 32055ca6464..658e05b79d0 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenClassGenerator.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenClassGenerator.kt @@ -55,7 +55,7 @@ class AllOpenClassGenerator(session: FirSession) : FirDeclarationGenerationExten private val predicateBasedProvider = session.predicateBasedProvider private val matchedClasses by lazy { - predicateBasedProvider.getSymbolsByPredicate(PREDICATE).map { it.symbol }.filterIsInstance() + predicateBasedProvider.getSymbolsByPredicate(PREDICATE).filterIsInstance() } private val classIdsForMatchedClasses: Map by lazy { matchedClasses.associateBy { diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenMembersGenerator.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenMembersGenerator.kt index 52fc125d495..276b500b541 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenMembersGenerator.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenMembersGenerator.kt @@ -42,7 +42,7 @@ class AllOpenMembersGenerator(session: FirSession) : FirDeclarationGenerationExt private val predicateBasedProvider = session.predicateBasedProvider private val matchedClasses by lazy { - predicateBasedProvider.getSymbolsByPredicate(PREDICATE).map { it.symbol }.filterIsInstance() + predicateBasedProvider.getSymbolsByPredicate(PREDICATE).filterIsInstance() } override fun generateFunctions(callableId: CallableId, owner: FirClassSymbol<*>?): List { diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenTopLevelDeclarationsGenerator.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenTopLevelDeclarationsGenerator.kt index 71072a5dc6d..7edfeef4e9e 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenTopLevelDeclarationsGenerator.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AllOpenTopLevelDeclarationsGenerator.kt @@ -38,7 +38,7 @@ class AllOpenTopLevelDeclarationsGenerator(session: FirSession) : FirDeclaration private val predicateBasedProvider = session.predicateBasedProvider private val matchedClasses by lazy { - predicateBasedProvider.getSymbolsByPredicate(PREDICATE).map { it.symbol }.filterIsInstance() + predicateBasedProvider.getSymbolsByPredicate(PREDICATE).filterIsInstance() } override fun generateFunctions(callableId: CallableId, owner: FirClassSymbol<*>?): List {