[FIR] Add cfg reference to classes

This commit is contained in:
Dmitriy Novozhilov
2020-03-26 14:47:20 +03:00
parent c1c0df962f
commit 8d3ee4f304
13 changed files with 84 additions and 3 deletions
@@ -18,6 +18,8 @@ import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuil
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -46,6 +48,7 @@ class FirJavaClass @FirImplementationDetail internal constructor(
internal val existingNestedClassifierNames: List<Name>
) : FirRegularClass() {
override val hasLazyNestedClassifiers: Boolean get() = true
override val controlFlowGraphReference: FirControlFlowGraphReference get() = FirEmptyControlFlowGraphReference
init {
symbol.bind(this)
@@ -85,6 +88,10 @@ class FirJavaClass @FirImplementationDetail internal constructor(
status = status.transformSingle(transformer, data)
return this
}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirRegularClass {
return this
}
}
@FirBuilderDsl
@@ -151,6 +158,13 @@ internal class FirJavaClassBuilder : AbstractFirRegularClassBuilder, FirAnnotati
set(value) {
throw IllegalStateException()
}
@Deprecated("Modification of 'controlFlowGraphReference' has no impact for FirClassImplBuilder", level = DeprecationLevel.HIDDEN)
override var controlFlowGraphReference: FirControlFlowGraphReference
get() = throw IllegalStateException()
set(value) {
throw IllegalStateException()
}
}
internal inline fun buildJavaClass(init: FirJavaClassBuilder.() -> Unit): FirJavaClass {
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -31,6 +32,9 @@ abstract class FirAnonymousObject : FirClass<FirAnonymousObject>, FirExpression(
abstract override val scopeProvider: FirScopeProvider
abstract override val typeRef: FirTypeRef
abstract override val symbol: FirAnonymousObjectSymbol
abstract val controlFlowGraphReference: FirControlFlowGraphReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnonymousObject(this, data)
abstract fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirAnonymousObject
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -36,10 +37,13 @@ abstract class FirRegularClass : FirPureAbstractElement(), FirMemberDeclaration,
abstract val companionObject: FirRegularClass?
abstract val hasLazyNestedClassifiers: Boolean
abstract override val superTypeRefs: List<FirTypeRef>
abstract val controlFlowGraphReference: FirControlFlowGraphReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitRegularClass(this, data)
abstract override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>)
abstract override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirRegularClass
abstract fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirRegularClass
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -36,6 +37,7 @@ abstract class FirSealedClass : FirRegularClass() {
abstract override val companionObject: FirRegularClass?
abstract override val hasLazyNestedClassifiers: Boolean
abstract override val superTypeRefs: List<FirTypeRef>
abstract override val controlFlowGraphReference: FirControlFlowGraphReference
abstract val inheritors: List<ClassId>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitSealedClass(this, data)
@@ -43,4 +45,6 @@ abstract class FirSealedClass : FirRegularClass() {
abstract fun replaceInheritors(newInheritors: List<ClassId>)
abstract override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirSealedClass
abstract override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirSealedClass
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -44,5 +45,6 @@ interface AbstractFirRegularClassBuilder : FirClassBuilder, FirTypeParametersOwn
abstract var symbol: FirRegularClassSymbol
abstract var companionObject: FirRegularClass?
abstract var hasLazyNestedClassifiers: Boolean
abstract var controlFlowGraphReference: FirControlFlowGraphReference
override fun build(): FirRegularClass
}
@@ -18,6 +18,8 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousObjectImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -19,6 +19,8 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -71,6 +73,13 @@ open class FirClassImplBuilder : AbstractFirRegularClassBuilder, FirAnnotationCo
set(value) {
throw IllegalStateException()
}
@Deprecated("Modification of 'controlFlowGraphReference' has no impact for FirClassImplBuilder", level = DeprecationLevel.HIDDEN)
override var controlFlowGraphReference: FirControlFlowGraphReference
get() = throw IllegalStateException()
set(value) {
throw IllegalStateException()
}
}
@OptIn(ExperimentalContracts::class)
@@ -20,6 +20,8 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirSealedClassImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -75,6 +77,13 @@ class FirSealedClassBuilder : AbstractFirRegularClassBuilder, FirAnnotationConta
set(value) {
throw IllegalStateException()
}
@Deprecated("Modification of 'controlFlowGraphReference' has no impact for FirSealedClassBuilder", level = DeprecationLevel.HIDDEN)
override var controlFlowGraphReference: FirControlFlowGraphReference
get() = throw IllegalStateException()
set(value) {
throw IllegalStateException()
}
}
@OptIn(ExperimentalContracts::class)
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -34,6 +36,8 @@ internal class FirAnonymousObjectImpl(
override var typeRef: FirTypeRef,
override val symbol: FirAnonymousObjectSymbol,
) : FirAnonymousObject() {
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference
init {
symbol.bind(this)
}
@@ -43,6 +47,7 @@ internal class FirAnonymousObjectImpl(
declarations.forEach { it.accept(visitor, data) }
annotations.forEach { it.accept(visitor, data) }
typeRef.accept(visitor, data)
controlFlowGraphReference.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAnonymousObjectImpl {
@@ -50,6 +55,12 @@ internal class FirAnonymousObjectImpl(
declarations.transformInplace(transformer, data)
annotations.transformInplace(transformer, data)
typeRef = typeRef.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return this
}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirAnonymousObjectImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -41,6 +43,7 @@ internal class FirClassImpl(
override val superTypeRefs: MutableList<FirTypeRef>,
) : FirRegularClass() {
override val hasLazyNestedClassifiers: Boolean get() = false
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference
init {
symbol.bind(this)
@@ -53,6 +56,7 @@ internal class FirClassImpl(
(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }
declarations.forEach { it.accept(visitor, data) }
superTypeRefs.forEach { it.accept(visitor, data) }
controlFlowGraphReference.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirClassImpl {
@@ -63,6 +67,7 @@ internal class FirClassImpl(
declarations.transformInplace(transformer, data)
companionObject = declarations.asSequence().filterIsInstance<FirRegularClass>().firstOrNull { it.status.isCompanion }
superTypeRefs.transformInplace(transformer, data)
transformControlFlowGraphReference(transformer, data)
return this
}
@@ -71,6 +76,11 @@ internal class FirClassImpl(
return this
}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirClassImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -44,6 +46,7 @@ internal class FirSealedClassImpl(
override val inheritors: MutableList<ClassId>,
) : FirSealedClass() {
override val hasLazyNestedClassifiers: Boolean get() = false
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference
init {
symbol.bind(this)
@@ -56,6 +59,7 @@ internal class FirSealedClassImpl(
(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }
declarations.forEach { it.accept(visitor, data) }
superTypeRefs.forEach { it.accept(visitor, data) }
controlFlowGraphReference.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirSealedClassImpl {
@@ -66,6 +70,7 @@ internal class FirSealedClassImpl(
declarations.transformInplace(transformer, data)
companionObject = declarations.asSequence().filterIsInstance<FirRegularClass>().firstOrNull { it.status.isCompanion }
superTypeRefs.transformInplace(transformer, data)
transformControlFlowGraphReference(transformer, data)
return this
}
@@ -74,6 +79,11 @@ internal class FirSealedClassImpl(
return this
}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirSealedClassImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
@@ -71,7 +71,7 @@ object FieldSets {
val status = field("status", declarationStatus)
val controlFlowGraphReferenceField = field("controlFlowGraphReference", controlFlowGraphReference)
val controlFlowGraphReferenceField = field("controlFlowGraphReference", controlFlowGraphReference).withTransform()
val visibility = field(visibilityType)
@@ -85,7 +85,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
function.configure {
withArg("F", "FirFunction<F>")
parentArg(callableDeclaration, "F", "F")
+controlFlowGraphReferenceField.withTransform()
+controlFlowGraphReferenceField
+symbol("FirFunctionSymbol", "F")
+fieldList(valueParameter, withReplace = true).withTransform()
+body(nullable = true)
@@ -231,11 +231,13 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("companionObject", regularClass, nullable = true)
+booleanField("hasLazyNestedClassifiers")
+superTypeRefs(withReplace = true)
+controlFlowGraphReferenceField
}
anonymousObject.configure {
parentArg(klass, "F", anonymousObject)
+symbol("FirAnonymousObjectSymbol")
+controlFlowGraphReferenceField
}
sealedClass.configure {
@@ -285,7 +287,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
property.configure {
parentArg(variable, "F", property)
parentArg(callableMemberDeclaration, "F", property)
+controlFlowGraphReferenceField.withTransform()
+controlFlowGraphReferenceField
+symbol("FirPropertySymbol")
+field("backingFieldSymbol", backingFieldSymbolType)
+booleanField("isLocal")