From 9f0781c9de606748dc54e71db40ae62f21f9c428 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 22 Aug 2019 12:59:52 +0300 Subject: [PATCH] [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 --- .../java/declarations/FirJavaConstructor.kt | 8 ++++ .../src/org/jetbrains/kotlin/fir/CopyUtils.kt | 5 ++- .../dfa/FirControlFlowGraphReferenceImpl.kt | 11 +++++ .../ControlFlowGraphReferenceTransformer.kt | 41 +++++++++++++++++++ .../transformers/FirBodyResolveTransformer.kt | 8 ++-- .../fir/declarations/FirAnonymousFunction.kt | 6 +++ .../kotlin/fir/declarations/FirConstructor.kt | 1 + .../kotlin/fir/declarations/FirFunction.kt | 5 +++ .../fir/declarations/FirMemberFunction.kt | 1 + .../kotlin/fir/declarations/FirProperty.kt | 6 +++ .../impl/FirAnonymousFunctionImpl.kt | 10 +++++ .../declarations/impl/FirConstructorImpl.kt | 11 +++++ .../impl/FirDefaultPropertyAccessor.kt | 11 +++++ .../fir/declarations/impl/FirErrorFunction.kt | 8 ++++ .../impl/FirMemberFunctionImpl.kt | 10 +++++ .../impl/FirMemberPropertyImpl.kt | 10 +++++ .../impl/FirPropertyAccessorImpl.kt | 10 +++++ .../FirControlFlowGraphReference.kt | 23 +++++++++++ .../FirEmptyControlFlowGraphReference.kt | 8 ++++ .../fir/visitors/FirTransformerGenerated.kt | 12 +++++- .../fir/visitors/FirVisitorGenerated.kt | 8 +++- .../fir/visitors/FirVisitorVoidGenerated.kt | 12 +++++- 22 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirControlFlowGraphReferenceImpl.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ControlFlowGraphReferenceTransformer.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirControlFlowGraphReference.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirEmptyControlFlowGraphReference.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt index c61fb81c8f2..31c6ec399b2 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt @@ -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() + override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null + override fun transformValueParameters(transformer: FirTransformer, data: D): FirJavaConstructor { valueParameters.transformInplace(transformer, data) return this } + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirJavaConstructor { + return this + } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt index 9987d64fdc4..37816e19331 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt @@ -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 = 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 } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirControlFlowGraphReferenceImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirControlFlowGraphReferenceImpl.kt new file mode 100644 index 00000000000..4119978eb53 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirControlFlowGraphReferenceImpl.kt @@ -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() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ControlFlowGraphReferenceTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ControlFlowGraphReferenceTransformer.kt new file mode 100644 index 00000000000..43dfdd8ad35 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ControlFlowGraphReferenceTransformer.kt @@ -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() { + override fun transformElement(element: E, data: ControlFlowGraph): CompositeTransformResult { + return element.compose() + } + + override fun > transformFunction( + function: FirFunction, + data: ControlFlowGraph + ): CompositeTransformResult { + return (function.transformChildren(this, data) as FirFunction<*>).compose() + } + + override fun transformControlFlowGraphReference( + controlFlowGraphReference: FirControlFlowGraphReference, + data: ControlFlowGraph + ): CompositeTransformResult { + return if (controlFlowGraphReference is FirEmptyControlFlowGraphReference) { + FirControlFlowGraphReferenceImpl(data).compose() + } else { + controlFlowGraphReference.compose() + } + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index 3ee226e0bac..89ef7522c9f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -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() } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt index 06f90d393ac..a8c5c2d937e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt @@ -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 accept(visitor: FirVisitor, data: D): R = visitor.visitAnonymousFunction(this, data) @@ -33,4 +37,6 @@ abstract class FirAnonymousFunction( } abstract fun replaceReceiverTypeRef(receiverTypeRef: FirTypeRef) + + abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirAnonymousFunction } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt index 480f9411c45..0a9cded974d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt @@ -31,5 +31,6 @@ interface FirConstructor : @VisitedSupertype FirMemberFunction { } returnTypeRef.accept(visitor, data) body?.accept(visitor, data) + controlFlowGraphReference?.accept(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt index 6469cc4b13b..b63e1b9d50a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt @@ -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> : @VisitedSupertype FirDeclarationWith FirTargetElement, FirStatement, FirSymbolOwner { val valueParameters: List + val controlFlowGraphReference: FirControlFlowGraphReference? override val symbol: FirFunctionSymbol @@ -30,8 +32,11 @@ interface FirFunction> : @VisitedSupertype FirDeclarationWith for (parameter in valueParameters) { parameter.accept(visitor, data) } + controlFlowGraphReference?.accept(visitor, data) super.acceptChildren(visitor, data) } fun transformValueParameters(transformer: FirTransformer, data: D): FirFunction + + fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirFunction } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt index dd0b24f7e37..27625631728 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt @@ -24,5 +24,6 @@ interface FirMemberFunction> : parameter.accept(visitor, data) } body?.accept(visitor, data) + controlFlowGraphReference?.accept(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt index b521a60bb49..b2d45f5cbd7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt @@ -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 accept(visitor: FirVisitor, 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 transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirProperty } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt index ee41bb145d6..126e74da282 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt @@ -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 transformChildren(transformer: FirTransformer, 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.transformChildren(transformer, data) } @@ -56,4 +61,9 @@ class FirAnonymousFunctionImpl( valueParameters.transformInplace(transformer, data) return this } + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirAnonymousFunction { + controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt index c9a551013f0..ed421b4a659 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt @@ -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, FirCo override var body: FirBlock? = null + override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference() + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { annotations.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data) @@ -68,6 +72,7 @@ open class FirConstructorImpl : FirAbstractCallableMember, 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, FirCo status.accept(visitor, data) delegatedConstructor?.accept(visitor, data) body?.accept(visitor, data) + controlFlowGraphReference.accept(visitor, data) } override fun transformValueParameters(transformer: FirTransformer, data: D): FirConstructorImpl { @@ -86,6 +92,11 @@ open class FirConstructorImpl : FirAbstractCallableMember, FirCo return this } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirConstructorImpl { + controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) + return this + } + companion object { val NAME = Name.special("") } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt index d293812702d..08d8f1445e2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt @@ -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 transformReturnTypeRef(transformer: FirTransformer, data: D) { returnTypeRef = returnTypeRef.transformSingle(transformer, data) } @@ -46,6 +53,10 @@ abstract class FirDefaultPropertyAccessor( override fun transformValueParameters(transformer: FirTransformer, data: D): FirDefaultPropertyAccessor { return this } + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirFunction { + return this + } } class FirDefaultPropertyGetter( diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunction.kt index e6cdbb34f3c..49f67c93bb7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunction.kt @@ -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 accept(visitor: FirVisitor, data: D): R = @@ -54,4 +58,8 @@ class FirErrorFunction( } override fun transformReturnTypeRef(transformer: FirTransformer, data: D) {} + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirErrorFunction { + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt index 45138c0500f..d91d8aeefa5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt @@ -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, override var body: FirBlock? = null + override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference() + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { valueParameters.transformInplace(transformer, data) body = body?.transformSingle(transformer, data) + transformControlFlowGraphReference(transformer, data) return super.transformChildren(transformer, data) } @@ -85,4 +90,9 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, valueParameters.transformInplace(transformer, data) return this } + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirMemberFunctionImpl { + controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt index 7382c8192cb..d303c89b02b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt @@ -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 transformChildren(transformer: FirTransformer, data: D): FirElement { @@ -77,4 +82,9 @@ class FirMemberPropertyImpl( // Everything other (annotations, etc.) is done above return this } + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirMemberPropertyImpl { + controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt index 81a774a4bf3..5db8dab8696 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt @@ -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() + override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference() + override fun transformChildren(transformer: FirTransformer, 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 transformValueParameters(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { return this } + + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { + controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirControlFlowGraphReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirControlFlowGraphReference.kt new file mode 100644 index 00000000000..0b460134f00 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirControlFlowGraphReference.kt @@ -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 accept(visitor: FirVisitor, data: D): R { + return visitor.visitControlFlowGraphReference(this, data) + } +} + diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirEmptyControlFlowGraphReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirEmptyControlFlowGraphReference.kt new file mode 100644 index 00000000000..55449d1f675 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirEmptyControlFlowGraphReference.kt @@ -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() \ No newline at end of file diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt index 4dfa20f74a4..3aca69513e2 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt @@ -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 : FirVisitor { + return transformReference(controlFlowGraphReference, data) + } + open fun transformNamedReference(namedReference: FirNamedReference, data: D): CompositeTransformResult { return transformReference(namedReference, data) } @@ -564,6 +570,10 @@ abstract class FirTransformer : FirVisitor { + return transformControlFlowGraphReference(controlFlowGraphReference, data) + } + final override fun visitDeclaration(declaration: FirDeclaration, data: D): CompositeTransformResult { return transformDeclaration(declaration, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt index 0d3c90f44bc..089ea8f0880 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt @@ -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 { 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) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt index 8a0b039e134..59cda450bf8 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt @@ -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() { 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() { visitContinueExpression(continueExpression) } + final override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference, data: Nothing?) { + visitControlFlowGraphReference(controlFlowGraphReference) + } + final override fun visitDeclaration(declaration: FirDeclaration, data: Nothing?) { visitDeclaration(declaration) }