[FIR] Pass symbol of containing class to FirStatusTransformerExtension instead of fir node

This commit is contained in:
Dmitriy Novozhilov
2023-02-07 15:42:58 +02:00
committed by Space Team
parent 67c504e6f0
commit ff4c5c1d03
9 changed files with 80 additions and 37 deletions
@@ -144,6 +144,10 @@ class FirJavaClass @FirImplementationDetail internal constructor(
typeParameters.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data)
return this return this
} }
override fun replaceStatus(newStatus: FirDeclarationStatus) {
status = newStatus
}
} }
@FirBuilderDsl @FirBuilderDsl
@@ -156,6 +156,10 @@ class FirJavaConstructor @FirImplementationDetail constructor(
override fun replaceBody(newBody: FirBlock?) { override fun replaceBody(newBody: FirBlock?) {
error("Body cannot be replaced for FirJavaConstructor") error("Body cannot be replaced for FirJavaConstructor")
} }
override fun replaceStatus(newStatus: FirDeclarationStatus) {
status = newStatus
}
} }
@FirBuilderDsl @FirBuilderDsl
@@ -166,6 +166,10 @@ class FirJavaField @FirImplementationDetail constructor(
override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) { override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) {
error("Body cannot be replaced for FirJavaField") error("Body cannot be replaced for FirJavaField")
} }
override fun replaceStatus(newStatus: FirDeclarationStatus) {
status = newStatus
}
} }
@FirBuilderDsl @FirBuilderDsl
@@ -184,6 +184,10 @@ class FirJavaMethod @FirImplementationDetail constructor(
override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) { override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) {
error("Body cannot be replaced for FirJavaMethod") error("Body cannot be replaced for FirJavaMethod")
} }
override fun replaceStatus(newStatus: FirDeclarationStatus) {
status = newStatus
}
} }
val ALL_JAVA_OPERATION_NAMES = val ALL_JAVA_OPERATION_NAMES =
@@ -196,6 +196,10 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) { override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) {
error("Body cannot be replaced for FirJavaValueParameter") error("Body cannot be replaced for FirJavaValueParameter")
} }
override fun replaceStatus(newStatus: FirDeclarationStatus) {
error("Status cannot be replaced for FirJavaValueParameter")
}
} }
@FirBuilderDsl @FirBuilderDsl
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.symbols.impl.FirClassLikeSymbol
import kotlin.reflect.KClass import kotlin.reflect.KClass
abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension(session) { abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension(session) {
@@ -34,7 +35,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
property: FirProperty, property: FirProperty,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, property) return transformStatus(status, property)
@@ -43,7 +44,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
function: FirSimpleFunction, function: FirSimpleFunction,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, function) return transformStatus(status, function)
@@ -52,7 +53,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
regularClass: FirRegularClass, regularClass: FirRegularClass,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, regularClass) return transformStatus(status, regularClass)
@@ -61,7 +62,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
typeAlias: FirTypeAlias, typeAlias: FirTypeAlias,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, typeAlias) return transformStatus(status, typeAlias)
@@ -70,7 +71,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
propertyAccessor: FirPropertyAccessor, propertyAccessor: FirPropertyAccessor,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
containingProperty: FirProperty?, containingProperty: FirProperty?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
@@ -80,7 +81,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
constructor: FirConstructor, constructor: FirConstructor,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, constructor) return transformStatus(status, constructor)
@@ -89,7 +90,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
field: FirField, field: FirField,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, field) return transformStatus(status, field)
@@ -98,7 +99,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
backingField: FirBackingField, backingField: FirBackingField,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, backingField) return transformStatus(status, backingField)
@@ -107,7 +108,7 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirExtension
open fun transformStatus( open fun transformStatus(
status: FirDeclarationStatus, status: FirDeclarationStatus,
enumEntry: FirEnumEntry, enumEntry: FirEnumEntry,
containingClass: FirClass?, containingClass: FirClassLikeSymbol<*>?,
isLocal: Boolean isLocal: Boolean
): FirDeclarationStatus { ): FirDeclarationStatus {
return transformStatus(status, enumEntry) return transformStatus(status, enumEntry)
@@ -111,7 +111,7 @@ class FirStatusResolver(
val statuses = overriddenStatuses val statuses = overriddenStatuses
?: getOverriddenProperties(property, containingClass).map { it.status as FirResolvedDeclarationStatus } ?: getOverriddenProperties(property, containingClass).map { it.status as FirResolvedDeclarationStatus }
val status = property.applyExtensionTransformers { transformStatus(it, property, containingClass, isLocal) } val status = property.applyExtensionTransformers { transformStatus(it, property, containingClass?.symbol, isLocal) }
return resolveStatus(property, status, containingClass, null, isLocal, statuses) return resolveStatus(property, status, containingClass, null, isLocal, statuses)
} }
@@ -142,7 +142,9 @@ class FirStatusResolver(
} }
fun resolveStatus(function: FirSimpleFunction, containingClass: FirClass?, isLocal: Boolean): FirResolvedDeclarationStatus { fun resolveStatus(function: FirSimpleFunction, containingClass: FirClass?, isLocal: Boolean): FirResolvedDeclarationStatus {
val status = function.applyExtensionTransformers { transformStatus(it, function, containingClass, isLocal) } val status = function.applyExtensionTransformers {
transformStatus(it, function, containingClass?.symbol, isLocal)
}
val overriddenStatuses = getOverriddenStatuses(function, containingClass) val overriddenStatuses = getOverriddenStatuses(function, containingClass)
return resolveStatus(function, status, containingClass, null, isLocal, overriddenStatuses) return resolveStatus(function, status, containingClass, null, isLocal, overriddenStatuses)
} }
@@ -153,7 +155,7 @@ class FirStatusResolver(
isLocal: Boolean isLocal: Boolean
): FirResolvedDeclarationStatus { ): FirResolvedDeclarationStatus {
val status = when (firClass) { val status = when (firClass) {
is FirRegularClass -> firClass.applyExtensionTransformers { transformStatus(it, firClass, containingClass, isLocal) } is FirRegularClass -> firClass.applyExtensionTransformers { transformStatus(it, firClass, containingClass?.symbol, isLocal) }
else -> firClass.status else -> firClass.status
} }
return resolveStatus(firClass, status, containingClass, null, isLocal, emptyList()) return resolveStatus(firClass, status, containingClass, null, isLocal, emptyList())
@@ -164,7 +166,9 @@ class FirStatusResolver(
containingClass: FirClass?, containingClass: FirClass?,
isLocal: Boolean isLocal: Boolean
): FirResolvedDeclarationStatus { ): FirResolvedDeclarationStatus {
val status = typeAlias.applyExtensionTransformers { transformStatus(it, typeAlias, containingClass, isLocal) } val status = typeAlias.applyExtensionTransformers {
transformStatus(it, typeAlias, containingClass?.symbol, isLocal)
}
return resolveStatus(typeAlias, status, containingClass, null, isLocal, emptyList()) return resolveStatus(typeAlias, status, containingClass, null, isLocal, emptyList())
} }
@@ -176,13 +180,15 @@ class FirStatusResolver(
overriddenStatuses: List<FirResolvedDeclarationStatus> = emptyList(), overriddenStatuses: List<FirResolvedDeclarationStatus> = emptyList(),
): FirResolvedDeclarationStatus { ): FirResolvedDeclarationStatus {
val status = propertyAccessor.applyExtensionTransformers { val status = propertyAccessor.applyExtensionTransformers {
transformStatus(it, propertyAccessor, containingClass, containingProperty, isLocal) transformStatus(it, propertyAccessor, containingClass?.symbol, containingProperty, isLocal)
} }
return resolveStatus(propertyAccessor, status, containingClass, containingProperty, isLocal, overriddenStatuses) return resolveStatus(propertyAccessor, status, containingClass, containingProperty, isLocal, overriddenStatuses)
} }
fun resolveStatus(constructor: FirConstructor, containingClass: FirClass?, isLocal: Boolean): FirResolvedDeclarationStatus { fun resolveStatus(constructor: FirConstructor, containingClass: FirClass?, isLocal: Boolean): FirResolvedDeclarationStatus {
val status = constructor.applyExtensionTransformers { transformStatus(it, constructor, containingClass, isLocal) } val status = constructor.applyExtensionTransformers {
transformStatus(it, constructor, containingClass?.symbol, isLocal)
}
return resolveStatus(constructor, status, containingClass, null, isLocal, emptyList()) return resolveStatus(constructor, status, containingClass, null, isLocal, emptyList())
} }
@@ -195,12 +201,16 @@ class FirStatusResolver(
containingClass: FirClass?, containingClass: FirClass?,
isLocal: Boolean isLocal: Boolean
): FirResolvedDeclarationStatus { ): FirResolvedDeclarationStatus {
val status = backingField.applyExtensionTransformers { transformStatus(it, backingField, containingClass, isLocal) } val status = backingField.applyExtensionTransformers {
transformStatus(it, backingField, containingClass?.symbol, isLocal)
}
return resolveStatus(backingField, status, containingClass, null, isLocal, emptyList()) return resolveStatus(backingField, status, containingClass, null, isLocal, emptyList())
} }
fun resolveStatus(enumEntry: FirEnumEntry, containingClass: FirClass?, isLocal: Boolean): FirResolvedDeclarationStatus { fun resolveStatus(enumEntry: FirEnumEntry, containingClass: FirClass?, isLocal: Boolean): FirResolvedDeclarationStatus {
val status = enumEntry.applyExtensionTransformers { transformStatus(it, enumEntry, containingClass, isLocal) } val status = enumEntry.applyExtensionTransformers {
transformStatus(it, enumEntry, containingClass?.symbol, isLocal)
}
return resolveStatus(enumEntry, status, containingClass, null, isLocal, emptyList()) return resolveStatus(enumEntry, status, containingClass, null, isLocal, emptyList())
} }
@@ -186,7 +186,11 @@ class FirSyntheticProperty(
notSupported() notSupported()
} }
override fun replaceStatus(newStatus: FirDeclarationStatus) {
notSupported()
}
private fun notSupported(): Nothing { private fun notSupported(): Nothing {
throw AssertionError("Transformation of synthetic property isn't supported") error("Transformation of synthetic property isn't supported")
} }
} }
@@ -92,78 +92,86 @@ class FirSyntheticPropertyAccessor(
} }
override fun replaceBody(newBody: FirBlock?) { override fun replaceBody(newBody: FirBlock?) {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirPropertyAccessor { override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirPropertyAccessor {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformBody(transformer: FirTransformer<D>, data: D): FirPropertyAccessor { override fun <D> transformBody(transformer: FirTransformer<D>, data: D): FirPropertyAccessor {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessor { override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessor {
throw AssertionError("Transformation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) { override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) { override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) { override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) { override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceContractDescription(newContractDescription: FirContractDescription) { override fun replaceContractDescription(newContractDescription: FirContractDescription) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) { override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
} }
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) { override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
throw AssertionError("Mutation of synthetic property accessor isn't supported") notSupported()
}
override fun replaceStatus(newStatus: FirDeclarationStatus) {
notSupported()
}
private fun notSupported(): Nothing {
error("Mutation of synthetic property accessor isn't supported")
} }
} }