[FIR] Add owners to FirStatusTransformerExtension.transformStatus
This commit is contained in:
+6
-3
@@ -5,17 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.extensions
|
package org.jetbrains.kotlin.fir.extensions
|
||||||
|
|
||||||
import com.google.common.collect.ArrayListMultimap
|
|
||||||
import com.google.common.collect.LinkedHashMultimap
|
import com.google.common.collect.LinkedHashMultimap
|
||||||
import com.google.common.collect.Multimap
|
import com.google.common.collect.Multimap
|
||||||
import kotlinx.collections.immutable.PersistentList
|
import kotlinx.collections.immutable.PersistentList
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
|
||||||
import org.jetbrains.kotlin.fir.extensions.predicate.*
|
import org.jetbrains.kotlin.fir.extensions.predicate.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.fqName
|
import org.jetbrains.kotlin.fir.resolve.fqName
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
|
||||||
|
|
||||||
abstract class FirPredicateBasedProvider : FirSessionComponent {
|
abstract class FirPredicateBasedProvider : FirSessionComponent {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -40,6 +37,8 @@ abstract class FirPredicateBasedProvider : FirSessionComponent {
|
|||||||
predicate: DeclarationPredicate
|
predicate: DeclarationPredicate
|
||||||
): List<Pair<FirAnnotatedDeclaration, List<FirAnnotatedDeclaration>>>
|
): List<Pair<FirAnnotatedDeclaration, List<FirAnnotatedDeclaration>>>
|
||||||
|
|
||||||
|
abstract fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List<FirAnnotatedDeclaration>?
|
||||||
|
|
||||||
abstract fun registerAnnotatedDeclaration(declaration: FirAnnotatedDeclaration, owners: PersistentList<FirAnnotatedDeclaration>)
|
abstract fun registerAnnotatedDeclaration(declaration: FirAnnotatedDeclaration, owners: PersistentList<FirAnnotatedDeclaration>)
|
||||||
abstract fun registerGeneratedDeclaration(declaration: FirAnnotatedDeclaration, owner: FirAnnotatedDeclaration)
|
abstract fun registerGeneratedDeclaration(declaration: FirAnnotatedDeclaration, owner: FirAnnotatedDeclaration)
|
||||||
|
|
||||||
@@ -91,6 +90,10 @@ private class FirPredicateBasedProviderImpl(private val session: FirSession) : F
|
|||||||
cache.annotationsOfDeclaration.putAll(declaration, matchingAnnotations)
|
cache.annotationsOfDeclaration.putAll(declaration, matchingAnnotations)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List<FirAnnotatedDeclaration>? {
|
||||||
|
return cache.ownersForDeclaration[declaration]
|
||||||
|
}
|
||||||
|
|
||||||
override fun registerGeneratedDeclaration(declaration: FirAnnotatedDeclaration, owner: FirAnnotatedDeclaration) {
|
override fun registerGeneratedDeclaration(declaration: FirAnnotatedDeclaration, owner: FirAnnotatedDeclaration) {
|
||||||
val owners = cache.ownersForDeclaration.getValue(owner).add(owner)
|
val owners = cache.ownersForDeclaration.getValue(owner).add(owner)
|
||||||
registerAnnotatedDeclaration(declaration, owners)
|
registerAnnotatedDeclaration(declaration, owners)
|
||||||
|
|||||||
+2
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.extensions
|
|||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||||
@@ -23,7 +24,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirPredicate
|
|||||||
|
|
||||||
final override val extensionType: KClass<out FirExtension> = FirStatusTransformerExtension::class
|
final override val extensionType: KClass<out FirExtension> = FirStatusTransformerExtension::class
|
||||||
|
|
||||||
abstract fun transformStatus(declaration: FirDeclaration, status: FirDeclarationStatus): FirDeclarationStatus
|
abstract fun transformStatus(declaration: FirDeclaration, owners: List<FirAnnotatedDeclaration>, status: FirDeclarationStatus): FirDeclarationStatus
|
||||||
|
|
||||||
fun interface Factory : FirExtension.Factory<FirStatusTransformerExtension>
|
fun interface Factory : FirExtension.Factory<FirStatusTransformerExtension>
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-4
@@ -29,11 +29,11 @@ class FirGlobalExtensionStatusProcessor(
|
|||||||
if (extensions.isEmpty()) return
|
if (extensions.isEmpty()) return
|
||||||
val provider = session.predicateBasedProvider
|
val provider = session.predicateBasedProvider
|
||||||
for (extension in extensions) {
|
for (extension in extensions) {
|
||||||
val declarations = provider.getSymbolsByPredicate(extension.predicate)
|
val declarations = provider.getSymbolsWithOwnersByPredicate(extension.predicate)
|
||||||
for (declaration in declarations) {
|
for ((declaration, owners) in declarations) {
|
||||||
// TODO: maybe replace with visitor?
|
// TODO: maybe replace with visitor?
|
||||||
if (declaration is FirMemberDeclaration) {
|
if (declaration is FirMemberDeclaration) {
|
||||||
val newStatus = extension.transformStatus(declaration, declaration.status)
|
val newStatus = extension.transformStatus(declaration, owners, declaration.status)
|
||||||
declaration.transformStatus(ReplaceStatus, newStatus)
|
declaration.transformStatus(ReplaceStatus, newStatus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,12 +49,15 @@ class FirTransformerBasedExtensionStatusProcessor(
|
|||||||
|
|
||||||
private inner class StatusUpdater : FirDefaultTransformer<Nothing?>() {
|
private inner class StatusUpdater : FirDefaultTransformer<Nothing?>() {
|
||||||
private val extensions = session.extensionService.statusTransformerExtensions
|
private val extensions = session.extensionService.statusTransformerExtensions
|
||||||
|
private val predicateBasedProvider = session.predicateBasedProvider
|
||||||
|
|
||||||
private fun FirMemberDeclaration.updateStatus() {
|
private fun FirMemberDeclaration.updateStatus() {
|
||||||
if (extensions.isEmpty()) return
|
if (extensions.isEmpty()) return
|
||||||
|
val owners = predicateBasedProvider.getOwnersOfDeclaration(this)
|
||||||
|
requireNotNull(owners)
|
||||||
var status = this.status
|
var status = this.status
|
||||||
for (extension in extensions) {
|
for (extension in extensions) {
|
||||||
status = extension.transformStatus(this, status)
|
status = extension.transformStatus(this, owners, status)
|
||||||
}
|
}
|
||||||
transformStatus(ReplaceStatus, status)
|
transformStatus(ReplaceStatus, status)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user