[FIR] Get rid of FirExtension.key

In reality plugin key was used only in two ways:
- found corresponding generator for member scope of generated class
- pass it to declaration origin so it can be read in backend IR plugin

Because of first usage plugin key was required to be an object, which
  reduces functionality of second usage, because there was no way to
  pass any additional info via key to IR (in future this usecase will be
  covered with IR declaration attributes, but right now we don't have
  them)

So now generator which created some class is now saved in its attributes
  and plugins can use any keys they want. And since there is no other
  usages of `FirExtension.key` it removed from FirExtension API at all
This commit is contained in:
Dmitriy Novozhilov
2021-11-29 18:37:05 +03:00
committed by TeamCityServer
parent e7af50fe2b
commit c46e9943cc
16 changed files with 36 additions and 51 deletions
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2021 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
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationDataKey
import org.jetbrains.kotlin.fir.declarations.FirDeclarationDataRegistry
import org.jetbrains.kotlin.fir.extensions.FirDeclarationGenerationExtension
private object OwnerForGeneratedDeclarationKey : FirDeclarationDataKey()
internal var FirClassLikeDeclaration.ownerGenerator: FirDeclarationGenerationExtension? by FirDeclarationDataRegistry.data(OwnerForGeneratedDeclarationKey)
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.caches.*
import org.jetbrains.kotlin.fir.declarations.validate
import org.jetbrains.kotlin.fir.ownerGenerator
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
@@ -82,7 +83,11 @@ class FirExtensionDeclarationsSymbolProvider private constructor(
else -> extensionsByTopLevelClassId.getValue()[classId]
} ?: return null
val generatedClasses = matchedExtensions
.mapNotNull { it.generateClassLikeDeclaration(classId) }
.mapNotNull { generatorExtension ->
generatorExtension.generateClassLikeDeclaration(classId)?.also { symbol ->
symbol.fir.ownerGenerator = generatorExtension
}
}
.onEach { it.fir.validate() }
return when (generatedClasses.size) {
0 -> null
@@ -11,11 +11,11 @@ import org.jetbrains.kotlin.fir.caches.FirLazyValue
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.declarations.validate
import org.jetbrains.kotlin.fir.extensions.*
import org.jetbrains.kotlin.fir.ownerGenerator
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.CallableId
@@ -144,8 +144,7 @@ internal inline fun <T, V> FirSession.groupExtensionsByName(
internal fun FirSession.getExtensionsForClass(klass: FirClass): List<FirDeclarationGenerationExtension> {
val extensions = extensionService.declarationGenerators
return if (klass.origin.generated) {
val pluginKey = (klass.origin as FirDeclarationOrigin.Plugin).key
extensions.filter { it.key == pluginKey }
listOf(klass.ownerGenerator!!)
} else {
extensions
}
@@ -6,7 +6,6 @@
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
@@ -24,8 +23,6 @@ typealias AnnotationFqn = FqName
abstract class FirExtension(val session: FirSession) {
abstract val name: FirExtensionPointName
abstract val key: FirPluginKey
abstract val extensionType: KClass<out FirExtension>
fun interface Factory<out P : FirExtension> {