[FIR] Add references to control flow graph to FirFunction and FirProperty

Also add updating CFG references anfter data flow analyzer builds graph
That graph is needed for further control flow analysis
This commit is contained in:
Dmitriy Novozhilov
2019-08-22 12:59:52 +03:00
parent 56ac1201b6
commit 9f0781c9de
22 changed files with 217 additions and 8 deletions
@@ -16,6 +16,8 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirAbstractCallableMember
import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl.Companion.NAME import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl.Companion.NAME
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -54,8 +56,14 @@ class FirJavaConstructor(
override val valueParameters = mutableListOf<FirValueParameter>() override val valueParameters = mutableListOf<FirValueParameter>()
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirJavaConstructor { override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
return this
}
} }
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirTryExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirTryExpressionImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirWhenExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirWhenExpressionImpl
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -54,7 +55,8 @@ fun FirAnonymousFunction.copy(
body: FirBlock? = this.body, body: FirBlock? = this.body,
annotations: List<FirAnnotationCall> = this.annotations, annotations: List<FirAnnotationCall> = this.annotations,
typeRef: FirTypeRef = this.typeRef, typeRef: FirTypeRef = this.typeRef,
label: FirLabel? = this.label label: FirLabel? = this.label,
controlFlowGraphReference: FirControlFlowGraphReference = this.controlFlowGraphReference
): FirAnonymousFunction { ): FirAnonymousFunction {
return FirAnonymousFunctionImpl(session, psi, returnTypeRef, receiverTypeRef, symbol).apply { return FirAnonymousFunctionImpl(session, psi, returnTypeRef, receiverTypeRef, symbol).apply {
this.valueParameters.addAll(valueParameters) this.valueParameters.addAll(valueParameters)
@@ -62,6 +64,7 @@ fun FirAnonymousFunction.copy(
this.annotations.addAll(annotations) this.annotations.addAll(annotations)
this.typeRef = typeRef this.typeRef = typeRef
this.label = label this.label = label
this.controlFlowGraphReference = controlFlowGraphReference
} }
} }
@@ -0,0 +1,11 @@
/*
* Copyright 2010-2019 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.resolve.dfa
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
class FirControlFlowGraphReferenceImpl(val controlFlowGraph: ControlFlowGraph) : FirControlFlowGraphReference()
@@ -0,0 +1,41 @@
/*
* Copyright 2010-2019 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.resolve.transformers
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.resolve.dfa.FirControlFlowGraphReferenceImpl
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose
object ControlFlowGraphReferenceTransformer : FirTransformer<ControlFlowGraph>() {
override fun <E : FirElement> transformElement(element: E, data: ControlFlowGraph): CompositeTransformResult<E> {
return element.compose()
}
override fun <F : FirFunction<F>> transformFunction(
function: FirFunction<F>,
data: ControlFlowGraph
): CompositeTransformResult<FirDeclaration> {
return (function.transformChildren(this, data) as FirFunction<*>).compose()
}
override fun transformControlFlowGraphReference(
controlFlowGraphReference: FirControlFlowGraphReference,
data: ControlFlowGraph
): CompositeTransformResult<FirControlFlowGraphReference> {
return if (controlFlowGraphReference is FirEmptyControlFlowGraphReference) {
FirControlFlowGraphReferenceImpl(data).compose()
} else {
controlFlowGraphReference.compose()
}
}
}
@@ -599,9 +599,9 @@ open class FirBodyResolveTransformer(
localScopes += FirLocalScope() localScopes += FirLocalScope()
dataFlowAnalyzer.enterFunction(function) dataFlowAnalyzer.enterFunction(function)
super.transformFunction(function, data).also { super.transformFunction(function, data).also {
val result = it.single val result = it.single as FirFunction<*>
// TODO: handle graph val controlFlowGraph = dataFlowAnalyzer.exitFunction(result)
val controlFlowGraph = dataFlowAnalyzer.exitFunction(result as FirFunction<*>) result.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph)
} }
} }
} }
@@ -765,8 +765,8 @@ open class FirBodyResolveTransformer(
} }
} }
property.resolvePhase = transformerPhase property.resolvePhase = transformerPhase
// TODO: handle graph
val controlFlowGraph = dataFlowAnalyzer.exitProperty(property) val controlFlowGraph = dataFlowAnalyzer.exitProperty(property)
property.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph)
property.compose() property.compose()
} }
} }
@@ -10,8 +10,10 @@ import org.jetbrains.kotlin.fir.FirLabeledElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirAnonymousFunction( abstract class FirAnonymousFunction(
@@ -22,6 +24,8 @@ abstract class FirAnonymousFunction(
abstract override val symbol: FirAnonymousFunctionSymbol abstract override val symbol: FirAnonymousFunctionSymbol
abstract override val controlFlowGraphReference: FirControlFlowGraphReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnonymousFunction(this, data) visitor.visitAnonymousFunction(this, data)
@@ -33,4 +37,6 @@ abstract class FirAnonymousFunction(
} }
abstract fun replaceReceiverTypeRef(receiverTypeRef: FirTypeRef) abstract fun replaceReceiverTypeRef(receiverTypeRef: FirTypeRef)
abstract override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
} }
@@ -31,5 +31,6 @@ interface FirConstructor : @VisitedSupertype FirMemberFunction<FirConstructor> {
} }
returnTypeRef.accept(visitor, data) returnTypeRef.accept(visitor, data)
body?.accept(visitor, data) body?.accept(visitor, data)
controlFlowGraphReference?.accept(visitor, data)
} }
} }
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirTargetElement
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -19,6 +20,7 @@ interface FirFunction<F : FirFunction<F>> : @VisitedSupertype FirDeclarationWith
FirTargetElement, FirStatement, FirSymbolOwner<F> { FirTargetElement, FirStatement, FirSymbolOwner<F> {
val valueParameters: List<FirValueParameter> val valueParameters: List<FirValueParameter>
val controlFlowGraphReference: FirControlFlowGraphReference?
override val symbol: FirFunctionSymbol<F> override val symbol: FirFunctionSymbol<F>
@@ -30,8 +32,11 @@ interface FirFunction<F : FirFunction<F>> : @VisitedSupertype FirDeclarationWith
for (parameter in valueParameters) { for (parameter in valueParameters) {
parameter.accept(visitor, data) parameter.accept(visitor, data)
} }
controlFlowGraphReference?.accept(visitor, data)
super<FirDeclarationWithBody>.acceptChildren(visitor, data) super<FirDeclarationWithBody>.acceptChildren(visitor, data)
} }
fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirFunction<F> fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirFunction<F>
fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirFunction<F>
} }
@@ -24,5 +24,6 @@ interface FirMemberFunction<F : FirMemberFunction<F>> :
parameter.accept(visitor, data) parameter.accept(visitor, data)
} }
body?.accept(visitor, data) body?.accept(visitor, data)
controlFlowGraphReference?.accept(visitor, data)
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirVariable import org.jetbrains.kotlin.fir.expressions.FirVariable
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
@@ -30,6 +31,8 @@ interface FirProperty :
// TODO: it should be probably nullable // TODO: it should be probably nullable
val backingFieldSymbol: FirBackingFieldSymbol val backingFieldSymbol: FirBackingFieldSymbol
val controlFlowGraphReference: FirControlFlowGraphReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitProperty(this, data) visitor.visitProperty(this, data)
@@ -39,5 +42,8 @@ interface FirProperty :
delegate?.accept(visitor, data) delegate?.accept(visitor, data)
getter?.accept(visitor, data) getter?.accept(visitor, data)
setter?.accept(visitor, data) setter?.accept(visitor, data)
controlFlowGraphReference.accept(visitor, data)
} }
fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirProperty
} }
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -34,12 +36,15 @@ class FirAnonymousFunctionImpl(
override var resolvePhase = FirResolvePhase.DECLARATIONS override var resolvePhase = FirResolvePhase.DECLARATIONS
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data) returnTypeRef = returnTypeRef.transformSingle(transformer, data)
receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data)
label = label?.transformSingle(transformer, data) label = label?.transformSingle(transformer, data)
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data) body = body?.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return super<FirAnonymousFunction>.transformChildren(transformer, data) return super<FirAnonymousFunction>.transformChildren(transformer, data)
} }
@@ -56,4 +61,9 @@ class FirAnonymousFunctionImpl(
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirAnonymousFunction {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
} }
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
@@ -61,6 +63,8 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
override var body: FirBlock? = null override var body: FirBlock? = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data) annotations.transformInplace(transformer, data)
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
@@ -68,6 +72,7 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
status = status.transformSingle(transformer, data) status = status.transformSingle(transformer, data)
delegatedConstructor?.transformSingle(transformer, data) delegatedConstructor?.transformSingle(transformer, data)
body = body?.transformSingle(transformer, data) body = body?.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return this return this
} }
@@ -79,6 +84,7 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
status.accept(visitor, data) status.accept(visitor, data)
delegatedConstructor?.accept(visitor, data) delegatedConstructor?.accept(visitor, data)
body?.accept(visitor, data) body?.accept(visitor, data)
controlFlowGraphReference.accept(visitor, data)
} }
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirConstructorImpl { override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirConstructorImpl {
@@ -86,6 +92,11 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirConstructorImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
companion object { companion object {
val NAME = Name.special("<init>") val NAME = Name.special("<init>")
} }
@@ -10,9 +10,13 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
@@ -21,6 +25,7 @@ import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -39,6 +44,8 @@ abstract class FirDefaultPropertyAccessor(
abstract override var returnTypeRef: FirTypeRef abstract override var returnTypeRef: FirTypeRef
final override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) { override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) {
returnTypeRef = returnTypeRef.transformSingle(transformer, data) returnTypeRef = returnTypeRef.transformSingle(transformer, data)
} }
@@ -46,6 +53,10 @@ abstract class FirDefaultPropertyAccessor(
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirDefaultPropertyAccessor { override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirDefaultPropertyAccessor {
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirFunction<FirPropertyAccessor> {
return this
}
} }
class FirDefaultPropertyGetter( class FirDefaultPropertyGetter(
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.symbols.impl.FirErrorFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirErrorFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -44,6 +46,8 @@ class FirErrorFunction(
override val body: FirBlock? override val body: FirBlock?
get() = null get() = null
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override var resolvePhase = FirResolvePhase.BODY_RESOLVE override var resolvePhase = FirResolvePhase.BODY_RESOLVE
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
@@ -54,4 +58,8 @@ class FirErrorFunction(
} }
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) {} override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) {}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirErrorFunction {
return this
}
} }
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
@@ -74,9 +76,12 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember<FirNamedFunction>,
override var body: FirBlock? = null override var body: FirBlock? = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data) body = body?.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return super<FirAbstractCallableMember>.transformChildren(transformer, data) return super<FirAbstractCallableMember>.transformChildren(transformer, data)
} }
@@ -85,4 +90,9 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember<FirNamedFunction>,
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirMemberFunctionImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
} }
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
@@ -52,6 +54,8 @@ class FirMemberPropertyImpl(
override var setter: FirPropertyAccessor? = null override var setter: FirPropertyAccessor? = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
init { init {
symbol.bind(this) symbol.bind(this)
backingFieldSymbol.bind(this) backingFieldSymbol.bind(this)
@@ -68,6 +72,7 @@ class FirMemberPropertyImpl(
typeParameters.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data)
status = status.transformSingle(transformer, data) status = status.transformSingle(transformer, data)
annotations.transformInplace(transformer, data) annotations.transformInplace(transformer, data)
transformControlFlowGraphReference(transformer, data)
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
@@ -77,4 +82,9 @@ class FirMemberPropertyImpl(
// Everything other (annotations, etc.) is done above // Everything other (annotations, etc.) is done above
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirMemberPropertyImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
} }
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
@@ -32,11 +34,14 @@ class FirPropertyAccessorImpl(
override val valueParameters = mutableListOf<FirValueParameter>() override val valueParameters = mutableListOf<FirValueParameter>()
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data) returnTypeRef = returnTypeRef.transformSingle(transformer, data)
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data) body = body?.transformSingle(transformer, data)
status = status.transformSingle(transformer, data) status = status.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return super.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
@@ -48,4 +53,9 @@ class FirPropertyAccessorImpl(
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl { override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
return this return this
} }
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
} }
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2019 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.references
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
abstract class FirControlFlowGraphReference : FirPureAbstractElement(), @VisitedSupertype FirReference {
override val psi: PsiElement? get() = null
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return visitor.visitControlFlowGraphReference(this, data)
}
}
@@ -0,0 +1,8 @@
/*
* Copyright 2010-2019 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.references
class FirEmptyControlFlowGraphReference : FirControlFlowGraphReference()
@@ -6,9 +6,11 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -152,6 +154,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(reference, data) return transformElement(reference, data)
} }
open fun transformControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: D): CompositeTransformResult<FirControlFlowGraphReference> {
return transformReference(controlFlowGraphReference, data)
}
open fun transformNamedReference(namedReference: FirNamedReference, data: D): CompositeTransformResult<FirNamedReference> { open fun transformNamedReference(namedReference: FirNamedReference, data: D): CompositeTransformResult<FirNamedReference> {
return transformReference(namedReference, data) return transformReference(namedReference, data)
} }
@@ -564,6 +570,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformContinueExpression(continueExpression, data) return transformContinueExpression(continueExpression, data)
} }
final override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: D): CompositeTransformResult<FirElement> {
return transformControlFlowGraphReference(controlFlowGraphReference, data)
}
final override fun visitDeclaration(declaration: FirDeclaration, data: D): CompositeTransformResult<FirElement> { final override fun visitDeclaration(declaration: FirDeclaration, data: D): CompositeTransformResult<FirElement> {
return transformDeclaration(declaration, data) return transformDeclaration(declaration, data)
} }
@@ -6,9 +6,11 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -152,6 +154,10 @@ abstract class FirVisitor<out R, in D> {
return visitElement(reference, data) return visitElement(reference, data)
} }
open fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: D): R {
return visitReference(controlFlowGraphReference, data)
}
open fun visitNamedReference(namedReference: FirNamedReference, data: D): R { open fun visitNamedReference(namedReference: FirNamedReference, data: D): R {
return visitReference(namedReference, data) return visitReference(namedReference, data)
} }
@@ -6,9 +6,11 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -152,6 +154,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(reference, null) visitElement(reference, null)
} }
open fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference) {
visitReference(controlFlowGraphReference, null)
}
open fun visitNamedReference(namedReference: FirNamedReference) { open fun visitNamedReference(namedReference: FirNamedReference) {
visitReference(namedReference, null) visitReference(namedReference, null)
} }
@@ -564,6 +570,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitContinueExpression(continueExpression) visitContinueExpression(continueExpression)
} }
final override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: Nothing?) {
visitControlFlowGraphReference(controlFlowGraphReference)
}
final override fun visitDeclaration(declaration: FirDeclaration, data: Nothing?) { final override fun visitDeclaration(declaration: FirDeclaration, data: Nothing?) {
visitDeclaration(declaration) visitDeclaration(declaration)
} }