[FIR] Allow all extensions register declaration predicates

This commit is contained in:
Dmitriy Novozhilov
2021-11-29 18:16:28 +03:00
committed by TeamCityServer
parent ce218b8a0b
commit e7af50fe2b
7 changed files with 9 additions and 17 deletions
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.FirLazyValue import org.jetbrains.kotlin.fir.caches.FirLazyValue
import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -21,7 +20,7 @@ import kotlin.reflect.KClass
* TODO: * TODO:
* - check that annotations or meta-annotations is not empty * - check that annotations or meta-annotations is not empty
*/ */
abstract class FirDeclarationGenerationExtension(session: FirSession) : FirPredicateBasedExtension(session) { abstract class FirDeclarationGenerationExtension(session: FirSession) : FirExtension(session) {
companion object { companion object {
val NAME = FirExtensionPointName("ExistingClassModification") val NAME = FirExtensionPointName("ExistingClassModification")
} }
@@ -23,6 +23,10 @@ abstract class FirRegisteredPluginAnnotations(val session: FirSession) : FirSess
abstract val annotations: Set<AnnotationFqn> abstract val annotations: Set<AnnotationFqn>
abstract val metaAnnotations: Set<AnnotationFqn> abstract val metaAnnotations: Set<AnnotationFqn>
val hasRegisteredAnnotations: Boolean
get() = annotations.isNotEmpty() || metaAnnotations.isNotEmpty()
abstract fun getAnnotationsWithMetaAnnotation(metaAnnotation: AnnotationFqn): Collection<AnnotationFqn> abstract fun getAnnotationsWithMetaAnnotation(metaAnnotation: AnnotationFqn): Collection<AnnotationFqn>
abstract fun registerUserDefinedAnnotation(metaAnnotation: AnnotationFqn, annotationClasses: Collection<FirRegularClass>) abstract fun registerUserDefinedAnnotation(metaAnnotation: AnnotationFqn, annotationClasses: Collection<FirRegularClass>)
@@ -80,7 +84,6 @@ private class FirRegisteredPluginAnnotationsImpl(session: FirSession) : FirRegis
} }
for (extension in session.extensionService.getAllExtensions()) { for (extension in session.extensionService.getAllExtensions()) {
if (extension !is FirPredicateBasedExtension) continue
with(extension) { with(extension) {
registrar.registerPredicates() registrar.registerPredicates()
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import kotlin.reflect.KClass import kotlin.reflect.KClass
abstract class FirStatusTransformerExtension(session: FirSession) : FirPredicateBasedExtension(session) { abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension(session) {
companion object { companion object {
val NAME = FirExtensionPointName("StatusTransformer") val NAME = FirExtensionPointName("StatusTransformer")
} }
@@ -8,10 +8,9 @@ package org.jetbrains.kotlin.fir.extensions
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
import kotlin.reflect.KClass import kotlin.reflect.KClass
abstract class FirSupertypeGenerationExtension(session: FirSession) : FirPredicateBasedExtension(session) { abstract class FirSupertypeGenerationExtension(session: FirSession) : FirExtension(session) {
companion object { companion object {
val NAME = FirExtensionPointName("SupertypeGenerator") val NAME = FirExtensionPointName("SupertypeGenerator")
} }
@@ -54,8 +54,8 @@ class FirPluginAnnotationsResolveTransformer(
override fun transformFile(file: FirFile, data: Any?): FirFile { override fun transformFile(file: FirFile, data: Any?): FirFile {
checkSessionConsistency(file) checkSessionConsistency(file)
if (!extensionService.hasPredicateBasedExtensions) return file
val registeredPluginAnnotations = session.registeredPluginAnnotations val registeredPluginAnnotations = session.registeredPluginAnnotations
if (!registeredPluginAnnotations.hasRegisteredAnnotations) return file
val newAnnotations = file.resolveAnnotations(registeredPluginAnnotations.annotations, registeredPluginAnnotations.metaAnnotations) val newAnnotations = file.resolveAnnotations(registeredPluginAnnotations.annotations, registeredPluginAnnotations.metaAnnotations)
if (!newAnnotations.isEmpty) { if (!newAnnotations.isEmpty) {
for (metaAnnotation in newAnnotations.keySet()) { for (metaAnnotation in newAnnotations.keySet()) {
@@ -31,10 +31,8 @@ abstract class FirExtension(val session: FirSession) {
fun interface Factory<out P : FirExtension> { fun interface Factory<out P : FirExtension> {
fun create(session: FirSession): P fun create(session: FirSession): P
} }
}
abstract class FirPredicateBasedExtension(session: FirSession) : FirExtension(session) { open fun FirDeclarationPredicateRegistrar.registerPredicates() {}
abstract fun FirDeclarationPredicateRegistrar.registerPredicates()
} }
data class FirExtensionPointName(val name: Name) { data class FirExtensionPointName(val name: Name) {
@@ -36,14 +36,10 @@ class FirExtensionService(val session: FirSession) : ComponentArrayOwner<FirExte
var registeredExtensionsSize: Int = 0 var registeredExtensionsSize: Int = 0
private set private set
var registeredPredicateBasedExtensionsSize: Int = 0
private set
@PluginServicesInitialization @PluginServicesInitialization
fun registerExtensions(extensionClass: KClass<out FirExtension>, extensionFactories: List<FirExtension.Factory<*>>) { fun registerExtensions(extensionClass: KClass<out FirExtension>, extensionFactories: List<FirExtension.Factory<*>>) {
registeredExtensionsSize += extensionFactories.size registeredExtensionsSize += extensionFactories.size
val extensions = extensionFactories.map { it.create(session) } val extensions = extensionFactories.map { it.create(session) }
registeredPredicateBasedExtensionsSize += extensions.count { it is FirPredicateBasedExtension }
registerComponent( registerComponent(
extensionClass, extensionClass,
extensions extensions
@@ -60,6 +56,3 @@ val FirSession.extensionService: FirExtensionService by FirSession.sessionCompon
val FirExtensionService.hasExtensions: Boolean val FirExtensionService.hasExtensions: Boolean
get() = registeredExtensionsSize > 0 get() = registeredExtensionsSize > 0
val FirExtensionService.hasPredicateBasedExtensions: Boolean
get() = registeredPredicateBasedExtensionsSize > 0