[FIR] Add status transformer extension
This commit is contained in:
+17
-4
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.extensions
|
package org.jetbrains.kotlin.fir.extensions
|
||||||
|
|
||||||
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
|
||||||
abstract class FirExtensionRegistrarExtension {
|
abstract class FirExtensionRegistrarExtension {
|
||||||
companion object : ProjectExtensionDescriptor<FirExtensionRegistrarExtension>(
|
companion object : ProjectExtensionDescriptor<FirExtensionRegistrarExtension>(
|
||||||
@@ -13,16 +14,28 @@ abstract class FirExtensionRegistrarExtension {
|
|||||||
FirExtensionRegistrarExtension::class.java
|
FirExtensionRegistrarExtension::class.java
|
||||||
)
|
)
|
||||||
|
|
||||||
protected inner class ExtensionRegistrarContext
|
protected inner class ExtensionRegistrarContext {
|
||||||
|
operator fun ((FirSession) -> FirStatusTransformerExtension).unaryPlus() {
|
||||||
|
statusTransformerExtensions += FirStatusTransformerExtension.Factory { this.invoke(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract fun ExtensionRegistrarContext.configurePlugin()
|
protected abstract fun ExtensionRegistrarContext.configurePlugin()
|
||||||
|
|
||||||
fun configure(): RegisteredExtensions {
|
fun configure(): RegisteredExtensions {
|
||||||
ExtensionRegistrarContext().configurePlugin()
|
ExtensionRegistrarContext().configurePlugin()
|
||||||
return RegisteredExtensions()
|
return RegisteredExtensions(
|
||||||
|
statusTransformerExtensions
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class RegisteredExtensions
|
private val statusTransformerExtensions: MutableList<FirStatusTransformerExtension.Factory> = mutableListOf()
|
||||||
|
|
||||||
|
class RegisteredExtensions(
|
||||||
|
val statusTransformerExtensions: List<FirStatusTransformerExtension.Factory>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirExtensionPointService.registerExtensions(extensions: FirExtensionRegistrarExtension.RegisteredExtensions) {}
|
fun FirExtensionPointService.registerExtensions(extensions: FirExtensionRegistrarExtension.RegisteredExtensions) {
|
||||||
|
registerExtensions(FirStatusTransformerExtension::class, extensions.statusTransformerExtensions)
|
||||||
|
}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* 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.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||||
|
|
||||||
|
abstract class FirStatusTransformerExtension(session: FirSession) : FirExtensionPoint(session) {
|
||||||
|
companion object {
|
||||||
|
val NAME = FirExtensionPointName("StatusTransformer")
|
||||||
|
}
|
||||||
|
|
||||||
|
final override val name: FirExtensionPointName
|
||||||
|
get() = NAME
|
||||||
|
|
||||||
|
abstract fun transformStatus(declaration: FirDeclaration, status: FirDeclarationStatus): FirDeclarationStatus
|
||||||
|
|
||||||
|
fun interface Factory : FirExtensionPoint.Factory<FirStatusTransformerExtension>
|
||||||
|
}
|
||||||
|
|
||||||
|
val FirExtensionPointService.statusTransformerExtensions: List<FirStatusTransformerExtension> by FirExtensionPointService.registeredExtensions()
|
||||||
|
|
||||||
|
inline fun FirDeclarationStatus.transform(
|
||||||
|
visibility: Visibility = this.visibility,
|
||||||
|
modality: Modality? = this.modality,
|
||||||
|
init: FirDeclarationStatusImpl.() -> Unit = {}
|
||||||
|
): FirDeclarationStatus {
|
||||||
|
return FirDeclarationStatusImpl(visibility, modality).apply {
|
||||||
|
isExpect = this@transform.isExpect
|
||||||
|
isActual = this@transform.isActual
|
||||||
|
isOverride = this@transform.isOverride
|
||||||
|
isOperator = this@transform.isOperator
|
||||||
|
isInfix = this@transform.isInfix
|
||||||
|
isInline = this@transform.isInline
|
||||||
|
isTailRec = this@transform.isTailRec
|
||||||
|
isExternal = this@transform.isExternal
|
||||||
|
isConst = this@transform.isConst
|
||||||
|
isLateInit = this@transform.isLateInit
|
||||||
|
isInner = this@transform.isInner
|
||||||
|
isCompanion = this@transform.isCompanion
|
||||||
|
isData = this@transform.isData
|
||||||
|
isSuspend = this@transform.isSuspend
|
||||||
|
isStatic = this@transform.isStatic
|
||||||
|
isFromSealedClass = this@transform.isFromSealedClass
|
||||||
|
isFromEnumClass = this@transform.isFromEnumClass
|
||||||
|
}.apply(init)
|
||||||
|
}
|
||||||
+23
-6
@@ -14,6 +14,9 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||||
|
import org.jetbrains.kotlin.fir.extensions.extensionPointService
|
||||||
|
import org.jetbrains.kotlin.fir.extensions.statusTransformerExtensions
|
||||||
|
import org.jetbrains.kotlin.fir.firEffectiveVisibility
|
||||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.compose
|
import org.jetbrains.kotlin.fir.visitors.compose
|
||||||
@@ -89,12 +92,14 @@ private class FirStatusResolveTransformer(
|
|||||||
|
|
||||||
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: FirDeclarationStatus?): CompositeTransformResult<FirDeclaration> {
|
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: FirDeclarationStatus?): CompositeTransformResult<FirDeclaration> {
|
||||||
typeAlias.typeParameters.forEach { transformDeclaration(it, data) }
|
typeAlias.typeParameters.forEach { transformDeclaration(it, data) }
|
||||||
typeAlias.transformStatus(this, typeAlias.resolveStatus(typeAlias.status, containingClass, isLocal = false))
|
val status = prepareStatus(typeAlias, typeAlias.status)
|
||||||
|
typeAlias.transformStatus(this, typeAlias.resolveStatus(status, containingClass, isLocal = false))
|
||||||
return transformDeclaration(typeAlias, data)
|
return transformDeclaration(typeAlias, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun transformRegularClass(regularClass: FirRegularClass, data: FirDeclarationStatus?): CompositeTransformResult<FirStatement> {
|
override fun transformRegularClass(regularClass: FirRegularClass, data: FirDeclarationStatus?): CompositeTransformResult<FirStatement> {
|
||||||
regularClass.transformStatus(this, regularClass.resolveStatus(regularClass.status, containingClass, isLocal = false))
|
val status = prepareStatus(regularClass, regularClass.status)
|
||||||
|
regularClass.transformStatus(this, regularClass.resolveStatus(status, containingClass, isLocal = false))
|
||||||
return storeClass(regularClass) {
|
return storeClass(regularClass) {
|
||||||
regularClass.typeParameters.forEach { it.transformSingle(this, data) }
|
regularClass.typeParameters.forEach { it.transformSingle(this, data) }
|
||||||
transformDeclaration(regularClass, data)
|
transformDeclaration(regularClass, data)
|
||||||
@@ -114,7 +119,8 @@ private class FirStatusResolveTransformer(
|
|||||||
propertyAccessor: FirPropertyAccessor,
|
propertyAccessor: FirPropertyAccessor,
|
||||||
data: FirDeclarationStatus?
|
data: FirDeclarationStatus?
|
||||||
): CompositeTransformResult<FirStatement> {
|
): CompositeTransformResult<FirStatement> {
|
||||||
propertyAccessor.transformStatus(this, propertyAccessor.resolveStatus(propertyAccessor.status, containingClass, isLocal = false))
|
val status = prepareStatus(propertyAccessor, propertyAccessor.status)
|
||||||
|
propertyAccessor.transformStatus(this, propertyAccessor.resolveStatus(status, containingClass, isLocal = false))
|
||||||
return transformDeclaration(propertyAccessor, data) as CompositeTransformResult<FirStatement>
|
return transformDeclaration(propertyAccessor, data) as CompositeTransformResult<FirStatement>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +128,8 @@ private class FirStatusResolveTransformer(
|
|||||||
constructor: FirConstructor,
|
constructor: FirConstructor,
|
||||||
data: FirDeclarationStatus?
|
data: FirDeclarationStatus?
|
||||||
): CompositeTransformResult<FirDeclaration> {
|
): CompositeTransformResult<FirDeclaration> {
|
||||||
constructor.transformStatus(this, constructor.resolveStatus(constructor.status, containingClass, isLocal = false))
|
val status = prepareStatus(constructor, constructor.status)
|
||||||
|
constructor.transformStatus(this, constructor.resolveStatus(status, containingClass, isLocal = false))
|
||||||
return transformDeclaration(constructor, data)
|
return transformDeclaration(constructor, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +137,8 @@ private class FirStatusResolveTransformer(
|
|||||||
simpleFunction: FirSimpleFunction,
|
simpleFunction: FirSimpleFunction,
|
||||||
data: FirDeclarationStatus?
|
data: FirDeclarationStatus?
|
||||||
): CompositeTransformResult<FirDeclaration> {
|
): CompositeTransformResult<FirDeclaration> {
|
||||||
simpleFunction.transformStatus(this, simpleFunction.resolveStatus(simpleFunction.status, containingClass, isLocal = false))
|
val status = prepareStatus(simpleFunction, simpleFunction.status)
|
||||||
|
simpleFunction.transformStatus(this, simpleFunction.resolveStatus(status, containingClass, isLocal = false))
|
||||||
return transformDeclaration(simpleFunction, data)
|
return transformDeclaration(simpleFunction, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +146,8 @@ private class FirStatusResolveTransformer(
|
|||||||
property: FirProperty,
|
property: FirProperty,
|
||||||
data: FirDeclarationStatus?
|
data: FirDeclarationStatus?
|
||||||
): CompositeTransformResult<FirDeclaration> {
|
): CompositeTransformResult<FirDeclaration> {
|
||||||
property.transformStatus(this, property.resolveStatus(property.status, containingClass, isLocal = false))
|
val status = prepareStatus(property, property.status)
|
||||||
|
property.transformStatus(this, property.resolveStatus(status, containingClass, isLocal = false))
|
||||||
return transformDeclaration(property, data)
|
return transformDeclaration(property, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,6 +172,14 @@ private class FirStatusResolveTransformer(
|
|||||||
override fun transformBlock(block: FirBlock, data: FirDeclarationStatus?): CompositeTransformResult<FirStatement> {
|
override fun transformBlock(block: FirBlock, data: FirDeclarationStatus?): CompositeTransformResult<FirStatement> {
|
||||||
return block.compose()
|
return block.compose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun prepareStatus(declaration: FirDeclaration, status: FirDeclarationStatus): FirDeclarationStatus {
|
||||||
|
var result = status
|
||||||
|
session.extensionPointService.statusTransformerExtensions.forEach {
|
||||||
|
result = it.transformStatus(declaration, status)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val <F : FirClass<F>> FirClass<F>.effectiveVisibility: FirEffectiveVisibility
|
private val <F : FirClass<F>> FirClass<F>.effectiveVisibility: FirEffectiveVisibility
|
||||||
|
|||||||
Reference in New Issue
Block a user