[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.expressions.FirBlock
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.transformInplace
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -54,8 +56,14 @@ class FirJavaConstructor(
override val valueParameters = mutableListOf<FirValueParameter>()
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
valueParameters.transformInplace(transformer, data)
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.FirTryExpressionImpl
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.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -54,7 +55,8 @@ fun FirAnonymousFunction.copy(
body: FirBlock? = this.body,
annotations: List<FirAnnotationCall> = this.annotations,
typeRef: FirTypeRef = this.typeRef,
label: FirLabel? = this.label
label: FirLabel? = this.label,
controlFlowGraphReference: FirControlFlowGraphReference = this.controlFlowGraphReference
): FirAnonymousFunction {
return FirAnonymousFunctionImpl(session, psi, returnTypeRef, receiverTypeRef, symbol).apply {
this.valueParameters.addAll(valueParameters)
@@ -62,6 +64,7 @@ fun FirAnonymousFunction.copy(
this.annotations.addAll(annotations)
this.typeRef = typeRef
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()
dataFlowAnalyzer.enterFunction(function)
super.transformFunction(function, data).also {
val result = it.single
// TODO: handle graph
val controlFlowGraph = dataFlowAnalyzer.exitFunction(result as FirFunction<*>)
val result = it.single as FirFunction<*>
val controlFlowGraph = dataFlowAnalyzer.exitFunction(result)
result.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph)
}
}
}
@@ -765,8 +765,8 @@ open class FirBodyResolveTransformer(
}
}
property.resolvePhase = transformerPhase
// TODO: handle graph
val controlFlowGraph = dataFlowAnalyzer.exitProperty(property)
property.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph)
property.compose()
}
}
@@ -10,8 +10,10 @@ import org.jetbrains.kotlin.fir.FirLabeledElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype
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.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirAnonymousFunction(
@@ -22,6 +24,8 @@ abstract class FirAnonymousFunction(
abstract override val symbol: FirAnonymousFunctionSymbol
abstract override val controlFlowGraphReference: FirControlFlowGraphReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnonymousFunction(this, data)
@@ -33,4 +37,6 @@ abstract class FirAnonymousFunction(
}
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)
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.expressions.FirAnnotationContainer
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.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -19,6 +20,7 @@ interface FirFunction<F : FirFunction<F>> : @VisitedSupertype FirDeclarationWith
FirTargetElement, FirStatement, FirSymbolOwner<F> {
val valueParameters: List<FirValueParameter>
val controlFlowGraphReference: FirControlFlowGraphReference?
override val symbol: FirFunctionSymbol<F>
@@ -30,8 +32,11 @@ interface FirFunction<F : FirFunction<F>> : @VisitedSupertype FirDeclarationWith
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
controlFlowGraphReference?.accept(visitor, data)
super<FirDeclarationWithBody>.acceptChildren(visitor, data)
}
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)
}
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.VisitedSupertype
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.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@@ -30,6 +31,8 @@ interface FirProperty :
// TODO: it should be probably nullable
val backingFieldSymbol: FirBackingFieldSymbol
val controlFlowGraphReference: FirControlFlowGraphReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitProperty(this, data)
@@ -39,5 +42,8 @@ interface FirProperty :
delegate?.accept(visitor, data)
getter?.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.FirValueParameter
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.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -34,12 +36,15 @@ class FirAnonymousFunctionImpl(
override var resolvePhase = FirResolvePhase.DECLARATIONS
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data)
label = label?.transformSingle(transformer, data)
valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return super<FirAnonymousFunction>.transformChildren(transformer, data)
}
@@ -56,4 +61,9 @@ class FirAnonymousFunctionImpl(
valueParameters.transformInplace(transformer, data)
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.expressions.FirBlock
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.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
@@ -61,6 +63,8 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
override var body: FirBlock? = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
valueParameters.transformInplace(transformer, data)
@@ -68,6 +72,7 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
status = status.transformSingle(transformer, data)
delegatedConstructor?.transformSingle(transformer, data)
body = body?.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return this
}
@@ -79,6 +84,7 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
status.accept(visitor, data)
delegatedConstructor?.accept(visitor, data)
body?.accept(visitor, data)
controlFlowGraphReference.accept(visitor, data)
}
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirConstructorImpl {
@@ -86,6 +92,11 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
return this
}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirConstructorImpl {
controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data)
return this
}
companion object {
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.fir.FirElement
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.FirValueParameter
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.impl.FirPropertyAccessorSymbol
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.impl.FirImplicitUnitTypeRef
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.Name
@@ -39,6 +44,8 @@ abstract class FirDefaultPropertyAccessor(
abstract override var returnTypeRef: FirTypeRef
final override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) {
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
}
@@ -46,6 +53,10 @@ abstract class FirDefaultPropertyAccessor(
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirDefaultPropertyAccessor {
return this
}
override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirFunction<FirPropertyAccessor> {
return this
}
}
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.expressions.FirAnnotationCall
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.impl.FirErrorFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -44,6 +46,8 @@ class FirErrorFunction(
override val body: FirBlock?
get() = null
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override var resolvePhase = FirResolvePhase.BODY_RESOLVE
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> 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.FirValueParameter
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.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.transformInplace
@@ -74,9 +76,12 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember<FirNamedFunction>,
override var body: FirBlock? = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return super<FirAbstractCallableMember>.transformChildren(transformer, data)
}
@@ -85,4 +90,9 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember<FirNamedFunction>,
valueParameters.transformInplace(transformer, data)
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.FirPropertyAccessor
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.FirDelegateFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
@@ -52,6 +54,8 @@ class FirMemberPropertyImpl(
override var setter: FirPropertyAccessor? = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
init {
symbol.bind(this)
backingFieldSymbol.bind(this)
@@ -68,6 +72,7 @@ class FirMemberPropertyImpl(
typeParameters.transformInplace(transformer, data)
status = status.transformSingle(transformer, data)
annotations.transformInplace(transformer, data)
transformControlFlowGraphReference(transformer, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
@@ -77,4 +82,9 @@ class FirMemberPropertyImpl(
// Everything other (annotations, etc.) is done above
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.declarations.FirValueParameter
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.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
@@ -32,11 +34,14 @@ class FirPropertyAccessorImpl(
override val valueParameters = mutableListOf<FirValueParameter>()
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data)
status = status.transformSingle(transformer, data)
transformControlFlowGraphReference(transformer, data)
return super.transformChildren(transformer, data)
}
@@ -48,4 +53,9 @@ class FirPropertyAccessorImpl(
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
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.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.impl.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.*
@@ -152,6 +154,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
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> {
return transformReference(namedReference, data)
}
@@ -564,6 +570,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
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> {
return transformDeclaration(declaration, data)
}
@@ -6,9 +6,11 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.*
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.impl.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.*
@@ -152,6 +154,10 @@ abstract class FirVisitor<out R, in D> {
return visitElement(reference, data)
}
open fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: D): R {
return visitReference(controlFlowGraphReference, data)
}
open fun visitNamedReference(namedReference: FirNamedReference, data: D): R {
return visitReference(namedReference, data)
}
@@ -6,9 +6,11 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.*
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.impl.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.types.*
@@ -152,6 +154,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(reference, null)
}
open fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference) {
visitReference(controlFlowGraphReference, null)
}
open fun visitNamedReference(namedReference: FirNamedReference) {
visitReference(namedReference, null)
}
@@ -564,6 +570,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitContinueExpression(continueExpression)
}
final override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: Nothing?) {
visitControlFlowGraphReference(controlFlowGraphReference)
}
final override fun visitDeclaration(declaration: FirDeclaration, data: Nothing?) {
visitDeclaration(declaration)
}