[FIR] Add FirControlFloGraph owner supertype to FirField

FirField, just like FirProperty, can have control flow graph of it's
  intializer
This commit is contained in:
Dmitriy Novozhilov
2021-11-22 15:28:55 +03:00
committed by teamcityserver
parent 3bef04cf5e
commit 5778cb440f
7 changed files with 19 additions and 7 deletions
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirFieldBuilder
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -56,7 +57,7 @@ class FirJavaField @FirImplementationDetail constructor(
override val getter: FirPropertyAccessor? get() = null
override val setter: FirPropertyAccessor? get() = null
override val backingField: FirBackingField? = null
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override val origin: FirDeclarationOrigin
get() = FirDeclarationOrigin.Java
@@ -153,6 +154,8 @@ class FirJavaField @FirImplementationDetail constructor(
override fun replaceGetter(newGetter: FirPropertyAccessor?) {}
override fun replaceSetter(newSetter: FirPropertyAccessor?) {}
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {}
}
@FirBuilderDsl
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -22,7 +23,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirField : FirVariable() {
abstract class FirField : FirVariable(), FirControlFlowGraphOwner {
abstract override val source: KtSourceElement?
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
@@ -44,6 +45,7 @@ abstract class FirField : FirVariable() {
abstract override val setter: FirPropertyAccessor?
abstract override val backingField: FirBackingField?
abstract override val annotations: List<FirAnnotation>
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirFieldSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitField(this, data)
@@ -66,6 +68,8 @@ abstract class FirField : FirVariable() {
abstract override fun replaceSetter(newSetter: FirPropertyAccessor?)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirField
abstract override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirField
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirDeclarationBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -56,6 +57,7 @@ class FirFieldImpl @FirImplementationDetail constructor(
override val isVal: Boolean get() = !isVar
override val getter: FirPropertyAccessor? get() = null
override val setter: FirPropertyAccessor? get() = null
override var controlFlowGraphReference: FirControlFlowGraphReference? = null
init {
symbol.bind(this)
@@ -68,6 +70,7 @@ class FirFieldImpl @FirImplementationDetail constructor(
initializer?.accept(visitor, data)
backingField?.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) }
controlFlowGraphReference?.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirFieldImpl {
@@ -128,6 +131,7 @@ class FirFieldImpl @FirImplementationDetail constructor(
override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirFieldImpl {
transformAnnotations(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
return this
}
@@ -152,4 +156,8 @@ class FirFieldImpl @FirImplementationDetail constructor(
override fun replaceGetter(newGetter: FirPropertyAccessor?) {}
override fun replaceSetter(newSetter: FirPropertyAccessor?) {}
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference
}
}
@@ -160,8 +160,6 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): R = visitTypedDeclaration(callableDeclaration, data)
override fun visitField(field: FirField, data: D): R = visitVariable(field, data)
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitVariable(enumEntry, data)
override fun visitFile(file: FirFile, data: D): R = visitDeclaration(file, data)
@@ -160,8 +160,6 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) = visitTypedDeclaration(callableDeclaration)
override fun visitField(field: FirField) = visitVariable(field)
override fun visitEnumEntry(enumEntry: FirEnumEntry) = visitVariable(enumEntry)
override fun visitFile(file: FirFile) = visitDeclaration(file)
@@ -39,7 +39,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val variable by sealedElement(Declaration, callableDeclaration, statement)
val valueParameter by element(Declaration, variable, controlFlowGraphOwner)
val property by element(Declaration, variable, typeParametersOwner, controlFlowGraphOwner)
val field by element(Declaration, variable)
val field by element(Declaration, variable, controlFlowGraphOwner)
val enumEntry by element(Declaration, variable)
val classLikeDeclaration by sealedElement(Declaration, memberDeclaration, statement)