[FIR] Allow all extensions register declaration predicates
This commit is contained in:
committed by
TeamCityServer
parent
ce218b8a0b
commit
e7af50fe2b
+1
-2
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user