From 594a854b4ed6fbc18af7e61fef437c02b8309dbf Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 20 May 2020 13:08:32 +0300 Subject: [PATCH] [FIR] Reimplement FirExtensionService - Get rid of old FirExtensionsService - Implement new FirExtensionService - Remove duplicating code in FirExtensionRegistrar --- .../compiler/KotlinToJVMBytecodeCompiler.kt | 10 +- .../FirAdditionalCheckersExtension.kt | 35 +---- .../fir/java/FirJavaModuleBasedSession.kt | 12 +- .../kotlin/fir/FirModuleBasedSession.kt | 12 +- .../extensions/FirClassGenerationExtension.kt | 6 +- .../kotlin/fir/extensions/FirExtension.kt | 26 ++-- .../fir/extensions/FirExtensionRegistrar.kt | 52 +++---- .../fir/extensions/FirExtensionService.kt | 53 +++++++ .../fir/extensions/FirOldExtensionsService.kt | 145 ++++++++---------- .../FirRegisteredPluginAnnotations.kt | 33 ++-- .../FirStatusTransfomerExtension.kt | 4 +- .../kotlin/fir/resolve/ResolveUtils.kt | 11 +- .../fir/AbstractFirBaseDiagnosticsTest.kt | 13 +- .../jetbrains/kotlin/fir/SessionTestUtils.kt | 5 +- .../kotlin/idea/fir/FirModuleResolveState.kt | 5 +- .../fir/AbstractFirMultiModuleResolveTest.kt | 3 +- 16 files changed, 226 insertions(+), 199 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionService.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index da56507ab1d..66c4525ef20 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -45,7 +45,10 @@ import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil import org.jetbrains.kotlin.cli.common.output.writeAll import org.jetbrains.kotlin.cli.common.toLogger import org.jetbrains.kotlin.cli.jvm.config.* -import org.jetbrains.kotlin.codegen.* +import org.jetbrains.kotlin.codegen.ClassBuilderFactories +import org.jetbrains.kotlin.codegen.CodegenFactory +import org.jetbrains.kotlin.codegen.DefaultCodegenFactory +import org.jetbrains.kotlin.codegen.KotlinCodegenFacade import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationStateEventCallback import org.jetbrains.kotlin.config.* @@ -54,8 +57,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.Fir2IrConverter import org.jetbrains.kotlin.fir.backend.jvm.FirJvmClassCodegen import org.jetbrains.kotlin.fir.builder.RawFirBuilder -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.extensions.oldExtensionsService +import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession import org.jetbrains.kotlin.fir.java.FirLibrarySession @@ -327,7 +329,7 @@ object KotlinToJVMBytecodeCompiler { dependenciesInfo, provider, librariesScope, project, environment.createPackagePartProvider(librariesScope) ) - it.oldExtensionsService.registerExtensions(FirExtensionRegistrar.RegisteredExtensions.EMPTY) + it.extensionService.registerExtensions(emptyList()) } val firProvider = (session.firProvider as FirProviderImpl) val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, stubMode = false) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt index f8d1f1fcee2..7089be5cd1a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/extensions/FirAdditionalCheckersExtension.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.fir.analysis.extensions import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers -import org.jetbrains.kotlin.fir.extensions.* -import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty +import org.jetbrains.kotlin.fir.extensions.AbstractFirAdditionalCheckersExtension +import org.jetbrains.kotlin.fir.extensions.FirExtensionPointName +import org.jetbrains.kotlin.fir.extensions.FirExtensionService abstract class FirAdditionalCheckersExtension(session: FirSession) : AbstractFirAdditionalCheckersExtension(session) { companion object { @@ -22,31 +22,8 @@ abstract class FirAdditionalCheckersExtension(session: FirSession) : AbstractFir final override val name: FirExtensionPointName get() = NAME - - final override val directlyApplicableAnnotations: Set - get() = emptySet() - - final override val childrenApplicableAnnotations: Set - get() = emptySet() - - final override val metaAnnotations: Map - get() = emptyMap() - - final override val mode: Mode - get() = Mode.ALL } -val FirOldExtensionsService.additionalCheckers: List by FirOldExtensionsService.additionalCheckers() - -private fun FirOldExtensionsService.Companion.additionalCheckers(): ReadOnlyProperty> { - val accessor = generateAccessor, AbstractFirAdditionalCheckersExtension>( - AbstractFirAdditionalCheckersExtension::class - ) - return object : ReadOnlyProperty> { - override fun getValue(thisRef: FirOldExtensionsService, property: KProperty<*>): List { - val extensions = accessor.getValue(thisRef, property) - @Suppress("UNCHECKED_CAST") - return extensions.extensionsWithAllMode as List - } - } -} \ No newline at end of file +val FirExtensionService.additionalCheckers: List by FirExtensionService.registeredExtensions( + AbstractFirAdditionalCheckersExtension::class +) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index e17d3e203b3..ba23f9c0f82 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -15,7 +15,8 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionBase import org.jetbrains.kotlin.fir.FirSessionProvider import org.jetbrains.kotlin.fir.analysis.CheckersComponent -import org.jetbrains.kotlin.fir.extensions.FirOldExtensionsService +import org.jetbrains.kotlin.fir.extensions.FirExtensionService +import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations import org.jetbrains.kotlin.fir.extensions.FirPredicateBasedProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.resolve.FirProvider @@ -123,8 +124,13 @@ class FirLibrarySession private constructor( ) registerComponent( - FirOldExtensionsService::class, - FirOldExtensionsService(this) + FirExtensionService::class, + FirExtensionService(this) + ) + + registerComponent( + FirRegisteredPluginAnnotations::class, + FirRegisteredPluginAnnotations.create(this) ) registerComponent( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt index ae1441b1d14..96681e2bb2e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt @@ -6,10 +6,13 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.fir.extensions.FirOldExtensionsService +import org.jetbrains.kotlin.fir.extensions.FirExtensionService +import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations +import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver import org.jetbrains.kotlin.fir.extensions.FirPredicateBasedProvider -import org.jetbrains.kotlin.fir.resolve.* -import org.jetbrains.kotlin.fir.resolve.impl.* +import org.jetbrains.kotlin.fir.resolve.FirTypeResolver +import org.jetbrains.kotlin.fir.resolve.impl.FirQualifierResolverImpl +import org.jetbrains.kotlin.fir.resolve.impl.FirTypeResolverImpl import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessionProvider: FirSessionProvider?) : @@ -18,7 +21,8 @@ abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessio registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this)) registerComponent(FirTypeResolver::class, FirTypeResolverImpl(this)) registerComponent(FirDeclaredMemberScopeProvider::class, FirDeclaredMemberScopeProvider()) - registerComponent(FirOldExtensionsService::class, FirOldExtensionsService(this)) + registerComponent(FirExtensionService::class, FirExtensionService(this)) + registerComponent(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotations.create(this)) registerComponent(FirPredicateBasedProvider::class, FirPredicateBasedProvider.create(this)) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirClassGenerationExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirClassGenerationExtension.kt index 416d66e47ec..3d623d559c5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirClassGenerationExtension.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirClassGenerationExtension.kt @@ -17,7 +17,7 @@ import kotlin.reflect.KClass * - add registration of new files * - check that annotations or meta-annotations is not empty */ -abstract class FirClassGenerationExtension(session: FirSession) : FirExtension(session) { +abstract class FirClassGenerationExtension(session: FirSession) : FirPredicateBasedExtension(session) { companion object { val NAME = FirExtensionPointName("StatusTransformer") } @@ -25,8 +25,6 @@ abstract class FirClassGenerationExtension(session: FirSession) : FirExtension(s final override val name: FirExtensionPointName get() = NAME - final override val mode: Mode = Mode.ANNOTATED_ELEMENT - final override val extensionType: KClass = FirClassGenerationExtension::class abstract fun generateClass( @@ -43,4 +41,4 @@ abstract class FirClassGenerationExtension(session: FirSession) : FirExtension(s fun interface Factory : FirExtension.Factory } -val FirOldExtensionsService.classGenerationExtensions: FirOldExtensionsService.ExtensionsAccessor by FirOldExtensionsService.registeredExtensions() +val FirExtensionService.classGenerationExtensions: List by FirExtensionService.registeredExtensions() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtension.kt index 28775d1d73e..fd74b2a436e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtension.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtension.kt @@ -7,20 +7,23 @@ package org.jetbrains.kotlin.fir.extensions import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirPluginKey +import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import kotlin.reflect.KClass typealias AnnotationFqn = FqName +/* + * Accessing extensions + * + * - specific extension -> all extension instances: extension accessor on `FirExtensionService` + * - all declarations matching extension with predicate -> FirPredicateBasedProvider.getSymbolsByPredicate + * - all specific extensions interested in specific declaration -> TODO with StateMachine + */ abstract class FirExtension(val session: FirSession) { abstract val name: FirExtensionPointName - abstract val directlyApplicableAnnotations: Set - abstract val childrenApplicableAnnotations: Set - abstract val metaAnnotations: Map - - abstract val mode: Mode abstract val key: FirPluginKey internal abstract val extensionType: KClass @@ -28,17 +31,10 @@ abstract class FirExtension(val session: FirSession) { fun interface Factory { fun create(session: FirSession): P } +} - enum class Mode { - ANNOTATED_ELEMENT, - ALL - } - - enum class MetaAnnotationMode(val directed: Boolean, val children: Boolean) { - ANNOTATED_DECLARATION(directed = true, children = false), - CHILDREN_DECLARATION(directed = false, children = true), - ANNOTATED_AND_CHILDREN(directed = true, children = true) - } +abstract class FirPredicateBasedExtension(session: FirSession) : FirExtension(session) { + abstract val predicate: DeclarationPredicate } data class FirExtensionPointName(val name: Name) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt index ad86fe249c8..67f65286c56 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.extensions import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor import org.jetbrains.kotlin.fir.FirSession +import kotlin.reflect.KClass abstract class FirExtensionRegistrar { companion object : ProjectExtensionDescriptor( @@ -14,51 +15,48 @@ abstract class FirExtensionRegistrar { FirExtensionRegistrar::class.java ) + protected abstract fun ExtensionRegistrarContext.configurePlugin() + protected inner class ExtensionRegistrarContext { @JvmName("plusStatusTransformerExtension") operator fun ((FirSession) -> FirStatusTransformerExtension).unaryPlus() { - statusTransformerExtensions += FirStatusTransformerExtension.Factory { this.invoke(it) } + registerExtension(FirStatusTransformerExtension::class, FirStatusTransformerExtension.Factory { this.invoke(it) }) } @JvmName("plusClassGenerationExtension") operator fun ((FirSession) -> FirClassGenerationExtension).unaryPlus() { - classGenerationExtensions += FirClassGenerationExtension.Factory { this.invoke(it) } + registerExtension(FirClassGenerationExtension::class, FirClassGenerationExtension.Factory { this.invoke(it) }) } @JvmName("plusAdditionalCheckersExtension") operator fun ((FirSession) -> AbstractFirAdditionalCheckersExtension).unaryPlus() { - additionalCheckersExtensions += AbstractFirAdditionalCheckersExtension.Factory { this.invoke(it) } + registerExtension( + AbstractFirAdditionalCheckersExtension::class, + AbstractFirAdditionalCheckersExtension.Factory { this.invoke(it) } + ) } } - protected abstract fun ExtensionRegistrarContext.configurePlugin() - - fun configure(): RegisteredExtensions { + fun configure(): Collection> { ExtensionRegistrarContext().configurePlugin() - return RegisteredExtensions( - statusTransformerExtensions, - classGenerationExtensions, - additionalCheckersExtensions, - ) + return map.values } - private val statusTransformerExtensions: MutableList = mutableListOf() - private val classGenerationExtensions: MutableList = mutableListOf() - private val additionalCheckersExtensions: MutableList = mutableListOf() + class RegisteredExtensionsFactories

(val kClass: KClass

) { + val extensionFactories: MutableList> = mutableListOf() + } - class RegisteredExtensions( - val statusTransformerExtensions: List, - val classGenerationExtensions: List, - val additionalCheckersExtensions: List, - ) { - companion object { - val EMPTY = RegisteredExtensions(emptyList(), emptyList(), emptyList()) - } + private val map: MutableMap, RegisteredExtensionsFactories<*>> = mutableMapOf() + + private fun

registerExtension(kClass: KClass, factory: FirExtension.Factory

) { + @Suppress("UNCHECKED_CAST") + val registeredExtensions = map.computeIfAbsent(kClass) { RegisteredExtensionsFactories(kClass) } as RegisteredExtensionsFactories

+ registeredExtensions.extensionFactories += factory } } -fun FirOldExtensionsService.registerExtensions(extensions: FirExtensionRegistrar.RegisteredExtensions) { - registerExtensions(FirStatusTransformerExtension::class, extensions.statusTransformerExtensions) - registerExtensions(FirClassGenerationExtension::class, extensions.classGenerationExtensions) - registerExtensions(AbstractFirAdditionalCheckersExtension::class, extensions.additionalCheckersExtensions) -} \ No newline at end of file +@OptIn(PluginServicesInitialization::class) +fun FirExtensionService.registerExtensions(registeredExtensions: Collection>) { + registeredExtensions.forEach { registerExtensions(it.kClass, it.extensionFactories) } + session.registeredPluginAnnotations.initialize() +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionService.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionService.kt new file mode 100644 index 00000000000..f41f2f77204 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionService.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.extensions + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.utils.ArrayMapAccessor +import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner +import org.jetbrains.kotlin.fir.utils.TypeRegistry +import kotlin.reflect.KClass + +@RequiresOptIn +annotation class PluginServicesInitialization + +class FirExtensionService(val session: FirSession) : ComponentArrayOwner>(), FirSessionComponent { + companion object : TypeRegistry>() { + inline fun > registeredExtensions(): ArrayMapAccessor, V> { + return generateAccessor(P::class) + } + + fun

> registeredExtensions(kClass: KClass

): ArrayMapAccessor, V> { + return generateAccessor(kClass) + } + } + + override val typeRegistry: TypeRegistry> + get() = Companion + + var registeredExtensionsSize: Int = 0 + private set + + @PluginServicesInitialization + fun registerExtensions(extensionClass: KClass, extensionFactories: List>) { + registeredExtensionsSize += extensionFactories.size + registerComponent( + extensionClass, + extensionFactories.map { it.create(session) } + ) + } + + @PluginServicesInitialization + fun getAllExtensions(): List { + return arrayMap.flatten() + } +} + +val FirSession.extensionService: FirExtensionService by FirSession.sessionComponentAccessor() + +val FirExtensionService.hasExtensions: Boolean + get() = registeredExtensionsSize > 0 diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirOldExtensionsService.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirOldExtensionsService.kt index db1a598207a..cd5e979265d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirOldExtensionsService.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirOldExtensionsService.kt @@ -7,24 +7,20 @@ package org.jetbrains.kotlin.fir.extensions import com.google.common.collect.LinkedHashMultimap import com.google.common.collect.Multimap -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirPluginKey import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall -import org.jetbrains.kotlin.fir.resolve.firSymbolProvider -import org.jetbrains.kotlin.fir.resolve.getSymbolByTypeRef -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.utils.* -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.fir.resolve.fqName +import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner +import org.jetbrains.kotlin.fir.utils.TypeRegistry import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KClass import kotlin.reflect.KProperty -class FirRegisteredExtension

( +class OldFirRegisteredExtension

( val extensionsWithAllMode: List

, val extensionsWithAnnotatedMode: Multimap, val extensionsWithAllInAnnotatedMode: Multimap, @@ -38,9 +34,9 @@ class FirRegisteredExtension

( @Deprecated("") class FirOldExtensionsService( val session: FirSession -) : ComponentArrayOwner>(), FirSessionComponent { - companion object : TypeRegistry>() { - inline fun > registeredExtensions(): ReadOnlyProperty> { +) : ComponentArrayOwner>(), FirSessionComponent { + companion object : TypeRegistry>() { + inline fun > registeredExtensions(): ReadOnlyProperty> { val accessor = generateAccessor(P::class) return object : ReadOnlyProperty> { override fun getValue(thisRef: FirOldExtensionsService, property: KProperty<*>): ExtensionsAccessor

{ @@ -52,73 +48,73 @@ class FirOldExtensionsService( private fun createMultimap(): Multimap = LinkedHashMultimap.create() } - override val typeRegistry: TypeRegistry> + override val typeRegistry: TypeRegistry> get() = Companion fun

registerExtensions(extensionClass: KClass

, extensionFactories: List>) { - registeredExtensionsSize += extensionFactories.size - val extensions = extensionFactories.map { it.create(session) } - - val extensionsWithAllMode = mutableListOf

() - val extensionsWithAnnotatedMode = createMultimap() - val extensionsWithAllInAnnotatedMode = createMultimap() - val extensionsByPlugin = createMultimap() - for (extension in extensions) { - _metaAnnotations += extension.metaAnnotations.keys - for (metaAnnotation in extension.metaAnnotations.keys) { - extensionsWithMetaAnnotations.put(metaAnnotation, extension) - } - _annotations += extension.directlyApplicableAnnotations - _annotations += extension.childrenApplicableAnnotations - when (extension.mode) { - FirExtension.Mode.ANNOTATED_ELEMENT -> { - for (annotation in extension.directlyApplicableAnnotations) { - extensionsWithAnnotatedMode.put(annotation, extension) - } - for (annotation in extension.childrenApplicableAnnotations) { - extensionsWithAllInAnnotatedMode.put(annotation, extension) - } - } - FirExtension.Mode.ALL -> extensionsWithAllMode += extension - } - extensionsByPlugin.put(extension.key, extension) - } - registerComponent( - extensionClass, - FirRegisteredExtension( - extensionsWithAllMode, - extensionsWithAnnotatedMode, - extensionsWithAllInAnnotatedMode, - extensionsByPlugin - ) - ) +// registeredExtensionsSize += extensionFactories.size +// val extensions = extensionFactories.map { it.create(session) } +// +// val extensionsWithAllMode = mutableListOf

() +// val extensionsWithAnnotatedMode = createMultimap() +// val extensionsWithAllInAnnotatedMode = createMultimap() +// val extensionsByPlugin = createMultimap() +// for (extension in extensions) { +// _metaAnnotations += extension.metaAnnotations.keys +// for (metaAnnotation in extension.metaAnnotations.keys) { +// extensionsWithMetaAnnotations.put(metaAnnotation, extension) +// } +// _annotations += extension.directlyApplicableAnnotations +// _annotations += extension.childrenApplicableAnnotations +// when (extension.mode) { +// FirExtension.Mode.ANNOTATED_ELEMENT -> { +// for (annotation in extension.directlyApplicableAnnotations) { +// extensionsWithAnnotatedMode.put(annotation, extension) +// } +// for (annotation in extension.childrenApplicableAnnotations) { +// extensionsWithAllInAnnotatedMode.put(annotation, extension) +// } +// } +// FirExtension.Mode.ALL -> extensionsWithAllMode += extension +// } +// extensionsByPlugin.put(extension.key, extension) +// } +// registerComponent( +// extensionClass, +// FirRegisteredExtension( +// extensionsWithAllMode, +// extensionsWithAnnotatedMode, +// extensionsWithAllInAnnotatedMode, +// extensionsByPlugin +// ) +// ) } @Deprecated("") fun registerUserDefinedAnnotation(metaAnnotation: AnnotationFqn, annotations: Collection) { - for (annotation in annotations) { - require(annotation.classKind == ClassKind.ANNOTATION_CLASS) - val fqName = annotation.symbol.classId.asSingleFqName() - _annotations += fqName - userDefinedAnnotations.put(metaAnnotation, fqName) - val extensions = extensionsWithMetaAnnotations[metaAnnotation] - if (extensions.isEmpty()) return - for (extension in extensions) { - val registeredExtensions = this[extension.extensionType] - - val metaAnnotationMode = extension.metaAnnotations.getValue(metaAnnotation) - - if (metaAnnotationMode.directed) { - @Suppress("UNCHECKED_CAST") - (registeredExtensions.extensionsWithAnnotatedMode as Multimap).put(fqName, extension) - } - - if (metaAnnotationMode.children) { - @Suppress("UNCHECKED_CAST") - (registeredExtensions.extensionsWithAllInAnnotatedMode as Multimap).put(fqName, extension) - } - } - } +// for (annotation in annotations) { +// require(annotation.classKind == ClassKind.ANNOTATION_CLASS) +// val fqName = annotation.symbol.classId.asSingleFqName() +// _annotations += fqName +// userDefinedAnnotations.put(metaAnnotation, fqName) +// val extensions = extensionsWithMetaAnnotations[metaAnnotation] +// if (extensions.isEmpty()) return +// for (extension in extensions) { +// val registeredExtensions = this[extension.extensionType] +// +// val metaAnnotationMode = extension.metaAnnotations.getValue(metaAnnotation) +// +// if (metaAnnotationMode.directed) { +// @Suppress("UNCHECKED_CAST") +// (registeredExtensions.extensionsWithAnnotatedMode as Multimap).put(fqName, extension) +// } +// +// if (metaAnnotationMode.children) { +// @Suppress("UNCHECKED_CAST") +// (registeredExtensions.extensionsWithAllInAnnotatedMode as Multimap).put(fqName, extension) +// } +// } +// } } @Deprecated("") @@ -142,7 +138,7 @@ class FirOldExtensionsService( class ExtensionsAccessor

( private val session: FirSession, - private val extensions: FirRegisteredExtension

+ private val extensions: OldFirRegisteredExtension

) { fun forDeclaration(declaration: FirAnnotationContainer, owners: Collection): Collection

{ if (extensions.isEmpty()) return emptySet() @@ -178,10 +174,5 @@ class FirOldExtensionsService( @Deprecated("") val FirSession.oldExtensionsService: FirOldExtensionsService by FirSession.sessionComponentAccessor() -fun FirAnnotationCall.fqName(session: FirSession): FqName? { - val symbol = session.firSymbolProvider.getSymbolByTypeRef(annotationTypeRef) ?: return null - return symbol.classId.asSingleFqName() -} - val FirOldExtensionsService.hasExtensions: Boolean get() = registeredExtensionsSize > 0 \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredPluginAnnotations.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredPluginAnnotations.kt index 632f31351f3..ff317162816 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredPluginAnnotations.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirRegisteredPluginAnnotations.kt @@ -13,10 +13,10 @@ import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate -abstract class FirRegisteredPluginAnnotations : FirSessionComponent { +abstract class FirRegisteredPluginAnnotations(val session: FirSession) : FirSessionComponent { companion object { - fun create(): FirRegisteredPluginAnnotations { - return FirRegisteredPluginAnnotationsImpl() + fun create(session: FirSession): FirRegisteredPluginAnnotations { + return FirRegisteredPluginAnnotationsImpl(session) } } @@ -24,14 +24,15 @@ abstract class FirRegisteredPluginAnnotations : FirSessionComponent { abstract val metaAnnotations: Set abstract fun getAnnotationsWithMetaAnnotation(metaAnnotation: AnnotationFqn): Collection - abstract fun registerAnnotations(annotations: Collection) - abstract fun registerMetaAnnotations(metaAnnotations: Collection) abstract fun registerUserDefinedAnnotation(metaAnnotation: AnnotationFqn, annotationClasses: Collection) abstract fun getAnnotationsForPredicate(predicate: DeclarationPredicate): Set + + @PluginServicesInitialization + abstract fun initialize() } -private class FirRegisteredPluginAnnotationsImpl : FirRegisteredPluginAnnotations() { +private class FirRegisteredPluginAnnotationsImpl(session: FirSession) : FirRegisteredPluginAnnotations(session) { override val annotations: MutableSet = mutableSetOf() override val metaAnnotations: MutableSet = mutableSetOf() @@ -44,18 +45,10 @@ private class FirRegisteredPluginAnnotationsImpl : FirRegisteredPluginAnnotation return userDefinedAnnotations[metaAnnotation] } - override fun registerAnnotations(annotations: Collection) { - this.annotations += annotations - } - - override fun registerMetaAnnotations(metaAnnotations: Collection) { - this.metaAnnotations += metaAnnotations - } - override fun registerUserDefinedAnnotation(metaAnnotation: AnnotationFqn, annotationClasses: Collection) { require(annotationClasses.all { it.classKind == ClassKind.ANNOTATION_CLASS }) val annotations = annotationClasses.map { it.symbol.classId.asSingleFqName() } - registerAnnotations(annotations) + this.annotations += annotations userDefinedAnnotations.putAll(metaAnnotation, annotations) } @@ -70,6 +63,16 @@ private class FirRegisteredPluginAnnotationsImpl : FirRegisteredPluginAnnotation result += predicate.annotations return result } + + @PluginServicesInitialization + override fun initialize() { + for (extension in session.extensionService.getAllExtensions()) { + if (extension !is FirPredicateBasedExtension) continue + val predicate = extension.predicate + annotations += predicate.annotations + metaAnnotations += predicate.metaAnnotations + } + } } val FirSession.registeredPluginAnnotations: FirRegisteredPluginAnnotations by FirSession.sessionComponentAccessor() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirStatusTransfomerExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirStatusTransfomerExtension.kt index c728ae85113..55b72a32c61 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirStatusTransfomerExtension.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirStatusTransfomerExtension.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import kotlin.reflect.KClass -abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension(session) { +abstract class FirStatusTransformerExtension(session: FirSession) : FirPredicateBasedExtension(session) { companion object { val NAME = FirExtensionPointName("StatusTransformer") } @@ -28,7 +28,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension fun interface Factory : FirExtension.Factory } -val FirOldExtensionsService.statusTransformerExtensions: FirOldExtensionsService.ExtensionsAccessor by FirOldExtensionsService.registeredExtensions() +val FirExtensionService.statusTransformerExtensions: List by FirExtensionService.registeredExtensions() inline fun FirDeclarationStatus.transform( visibility: Visibility = this.visibility, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index e6f92ee896c..6e0607812b7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -11,10 +11,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic -import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess -import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression -import org.jetbrains.kotlin.fir.expressions.FirResolvable -import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier +import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.FirResolvedReifiedParameterReferenceBuilder import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier @@ -38,6 +35,7 @@ import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -433,3 +431,8 @@ fun CallableId.isIteratorHasNext() = fun CallableId.isIterator() = callableName.asString() == "iterator" && packageName.asString() == "kotlin.collections" + +fun FirAnnotationCall.fqName(session: FirSession): FqName? { + val symbol = session.firSymbolProvider.getSymbolByTypeRef(annotationTypeRef) ?: return null + return symbol.classId.asSingleFqName() +} \ No newline at end of file diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt index ab217ff1e56..a5e9832455c 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt @@ -26,9 +26,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.extensions.FirOldExtensionsService -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.extensions.oldExtensionsService +import org.jetbrains.kotlin.fir.extensions.FirExtensionService +import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession import org.jetbrains.kotlin.fir.java.FirLibrarySession @@ -80,7 +79,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { builtInsModuleInfo, sessionProvider, allProjectScope, project, environment.createPackagePartProvider(allProjectScope) ).also { - registerFirExtensions(it.oldExtensionsService) + registerFirExtensions(it.extensionService) } val configToSession = modules.mapValues { (config, info) -> @@ -89,7 +88,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { project, moduleFiles.mapNotNull { it.ktFile }) FirJavaModuleBasedSession(info, sessionProvider, scope).also { - registerFirExtensions(it.oldExtensionsService) + registerFirExtensions(it.extensionService) } } @@ -109,8 +108,8 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { runAnalysis(testDataFile, files, firFilesPerSession) } - open fun registerFirExtensions(service: FirOldExtensionsService) { - service.registerExtensions(FirExtensionRegistrar.RegisteredExtensions.EMPTY) + open fun registerFirExtensions(service: FirExtensionService) { + service.registerExtensions(emptyList()) } private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List, firFiles: MutableList, useLightTree: Boolean) { diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt index df9157e386c..172f3e6d3f4 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt @@ -8,8 +8,7 @@ package org.jetbrains.kotlin.fir import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.extensions.oldExtensionsService +import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession import org.jetbrains.kotlin.fir.java.FirLibrarySession @@ -35,7 +34,7 @@ fun createSession( val provider = FirProjectSessionProvider(project) return FirJavaModuleBasedSession(moduleInfo, provider, sourceScope).also { createSessionForDependencies(project, provider, moduleInfo, librariesScope, packagePartProvider) - it.oldExtensionsService.registerExtensions(FirExtensionRegistrar.RegisteredExtensions.EMPTY) + it.extensionService.registerExtensions(emptyList()) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt index 9f9380aa1d0..0ad850e8fee 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt @@ -14,8 +14,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.extensions.oldExtensionsService +import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo @@ -40,7 +39,7 @@ interface FirModuleResolveState { sessionProvider.sessionCache[moduleInfo] = moduleBasedSession } session.also { - it.oldExtensionsService.registerExtensions(FirExtensionRegistrar.RegisteredExtensions.EMPTY) + it.extensionService.registerExtensions(emptyList()) } } } diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt index 39171fb3c18..47835ff02a1 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.dependenciesWithoutSelf import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.oldExtensionsService -import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession import org.jetbrains.kotlin.fir.java.FirLibrarySession import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider @@ -72,7 +71,7 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() { private fun createSession(module: Module, provider: FirProjectSessionProvider): FirJavaModuleBasedSession { val moduleInfo = module.productionSourceInfo()!! return FirJavaModuleBasedSession(moduleInfo, provider, moduleInfo.contentScope()).also { - it.oldExtensionsService.registerExtensions(FirExtensionRegistrar.RegisteredExtensions.EMPTY) + it.oldExtensionsService.registerExtensions(FirExtensionRegistrar.OldRegisteredExtensions.EMPTY) } }