[FIR][tree] introduce lazy expression to simplify code

^KT-56543
This commit is contained in:
Dmitrii Gridin
2023-03-22 14:22:22 +01:00
committed by Space Team
parent bc5c1b2a6c
commit a643dfbe83
19 changed files with 185 additions and 46 deletions
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2023 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. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@@ -14,9 +14,7 @@ import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.getExplicitBackingField import org.jetbrains.kotlin.fir.declarations.utils.getExplicitBackingField
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.impl.FirLazyDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression
import org.jetbrains.kotlin.fir.extensions.registeredPluginAnnotations import org.jetbrains.kotlin.fir.extensions.registeredPluginAnnotations
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationsHelper import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationsHelper
import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.Analys
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.renderer.FirRenderer import org.jetbrains.kotlin.fir.renderer.FirRenderer
import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2023 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. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2023 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. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.PrivateForInline import org.jetbrains.kotlin.fir.PrivateForInline
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
@@ -35,4 +38,12 @@ abstract class FirPartialBodyResolveTransformer(
override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E { override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E {
return element.transform(transformer, data) return element.transform(transformer, data)
} }
override fun transformLazyExpression(lazyExpression: FirLazyExpression, data: ResolutionMode): FirStatement {
error("FirLazyExpression should be calculated before accessing")
}
override fun transformLazyBlock(lazyBlock: FirLazyBlock, data: ResolutionMode): FirStatement {
error("FirLazyBlock should be calculated before accessing")
}
} }
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2023 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.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirLazyBlock : FirBlock() {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val statements: List<FirStatement>
abstract override val typeRef: FirTypeRef
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitLazyBlock(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformLazyBlock(this, data) as E
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyBlock
abstract override fun <D> transformStatements(transformer: FirTransformer<D>, data: D): FirLazyBlock
abstract override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirLazyBlock
}
@@ -0,0 +1,34 @@
/*
* Copyright 2010-2023 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.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirLazyExpression : FirExpression() {
abstract override val source: KtSourceElement?
abstract override val typeRef: FirTypeRef
abstract override val annotations: List<FirAnnotation>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitLazyExpression(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformLazyExpression(this, data) as E
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyExpression
}
@@ -9,15 +9,14 @@ package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.* import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlockImpl
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -26,7 +25,6 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
@OptIn(FirImplementationDetail::class) fun buildLazyBlock(): FirLazyBlock {
fun buildLazyBlock(): FirBlock { return FirLazyBlockImpl()
return FirLazyBlock()
} }
@@ -9,13 +9,13 @@ package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.* import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpressionImpl
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -25,23 +25,29 @@ import org.jetbrains.kotlin.fir.visitors.*
*/ */
@FirBuilderDsl @FirBuilderDsl
class FirLazyExpressionBuilder : FirAnnotationContainerBuilder { class FirLazyExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder {
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
@OptIn(FirImplementationDetail::class) override fun build(): FirLazyExpression {
override fun build(): FirExpression { return FirLazyExpressionImpl(
return FirLazyExpression(
source, source,
) )
} }
@Deprecated("Modification of 'typeRef' has no impact for FirLazyExpressionBuilder", level = DeprecationLevel.HIDDEN)
override var typeRef: FirTypeRef
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'annotations' has no impact for FirLazyExpressionBuilder", level = DeprecationLevel.HIDDEN) @Deprecated("Modification of 'annotations' has no impact for FirLazyExpressionBuilder", level = DeprecationLevel.HIDDEN)
override val annotations: MutableList<FirAnnotation> = mutableListOf() override val annotations: MutableList<FirAnnotation> = mutableListOf()
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
inline fun buildLazyExpression(init: FirLazyExpressionBuilder.() -> Unit = {}): FirExpression { inline fun buildLazyExpression(init: FirLazyExpressionBuilder.() -> Unit = {}): FirLazyExpression {
contract { contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
} }
@@ -8,9 +8,8 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -22,7 +21,7 @@ import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
class FirLazyBlock : FirBlock() { internal class FirLazyBlockImpl : FirLazyBlock() {
override val source: KtSourceElement? get() = error("FirLazyBlock should be calculated before accessing") override val source: KtSourceElement? get() = error("FirLazyBlock should be calculated before accessing")
override val annotations: List<FirAnnotation> get() = error("FirLazyBlock should be calculated before accessing") override val annotations: List<FirAnnotation> get() = error("FirLazyBlock should be calculated before accessing")
override val statements: List<FirStatement> get() = error("FirLazyBlock should be calculated before accessing") override val statements: List<FirStatement> get() = error("FirLazyBlock should be calculated before accessing")
@@ -31,20 +30,20 @@ class FirLazyBlock : FirBlock() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLazyBlock { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLazyBlockImpl {
transformOtherChildren(transformer, data) transformOtherChildren(transformer, data)
return this return this
} }
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyBlock { override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyBlockImpl {
return this return this
} }
override fun <D> transformStatements(transformer: FirTransformer<D>, data: D): FirLazyBlock { override fun <D> transformStatements(transformer: FirTransformer<D>, data: D): FirLazyBlockImpl {
return this return this
} }
override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirLazyBlock { override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirLazyBlockImpl {
return this return this
} }
@@ -8,9 +8,8 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.fir.MutableOrEmptyList import org.jetbrains.kotlin.fir.MutableOrEmptyList
@@ -21,20 +20,20 @@ import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
class FirLazyExpression @FirImplementationDetail constructor( internal class FirLazyExpressionImpl(
override val source: KtSourceElement?, override val source: KtSourceElement?,
) : FirExpression() { ) : FirLazyExpression() {
override val typeRef: FirTypeRef get() = error("FirLazyExpression should be calculated before accessing") override val typeRef: FirTypeRef get() = error("FirLazyExpression should be calculated before accessing")
override val annotations: List<FirAnnotation> get() = error("FirLazyExpression should be calculated before accessing") override val annotations: List<FirAnnotation> get() = error("FirLazyExpression should be calculated before accessing")
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLazyExpression { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLazyExpressionImpl {
return this return this
} }
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyExpression { override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyExpressionImpl {
return this return this
} }
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.FirElementWithResolvePhase import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression
import org.jetbrains.kotlin.fir.expressions.FirJump import org.jetbrains.kotlin.fir.expressions.FirJump
import org.jetbrains.kotlin.fir.expressions.FirLoopJump import org.jetbrains.kotlin.fir.expressions.FirLoopJump
@@ -166,6 +168,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitExpression(expression: FirExpression, data: D): R = visitStatement(expression, data) override fun visitExpression(expression: FirExpression, data: D): R = visitStatement(expression, data)
override fun visitLazyExpression(lazyExpression: FirLazyExpression, data: D): R = visitExpression(lazyExpression, data)
override fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner, data: D): R = visitTypeParameterRefsOwner(typeParametersOwner, data) override fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner, data: D): R = visitTypeParameterRefsOwner(typeParametersOwner, data)
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): R = visitMemberDeclaration(callableDeclaration, data) override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): R = visitMemberDeclaration(callableDeclaration, data)
@@ -190,6 +194,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitBlock(block: FirBlock, data: D): R = visitExpression(block, data) override fun visitBlock(block: FirBlock, data: D): R = visitExpression(block, data)
override fun visitLazyBlock(lazyBlock: FirLazyBlock, data: D): R = visitBlock(lazyBlock, data)
override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): R = visitExpression(binaryLogicExpression, data) override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): R = visitExpression(binaryLogicExpression, data)
override fun <E : FirTargetElement> visitJump(jump: FirJump<E>, data: D): R = visitExpression(jump, data) override fun <E : FirTargetElement> visitJump(jump: FirJump<E>, data: D): R = visitExpression(jump, data)
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.FirElementWithResolvePhase import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression
import org.jetbrains.kotlin.fir.expressions.FirJump import org.jetbrains.kotlin.fir.expressions.FirJump
import org.jetbrains.kotlin.fir.expressions.FirLoopJump import org.jetbrains.kotlin.fir.expressions.FirLoopJump
@@ -166,6 +168,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitExpression(expression: FirExpression) = visitStatement(expression) override fun visitExpression(expression: FirExpression) = visitStatement(expression)
override fun visitLazyExpression(lazyExpression: FirLazyExpression) = visitExpression(lazyExpression)
override fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner) = visitTypeParameterRefsOwner(typeParametersOwner) override fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner) = visitTypeParameterRefsOwner(typeParametersOwner)
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) = visitMemberDeclaration(callableDeclaration) override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) = visitMemberDeclaration(callableDeclaration)
@@ -190,6 +194,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitBlock(block: FirBlock) = visitExpression(block) override fun visitBlock(block: FirBlock) = visitExpression(block)
override fun visitLazyBlock(lazyBlock: FirLazyBlock) = visitBlock(lazyBlock)
override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) = visitExpression(binaryLogicExpression) override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) = visitExpression(binaryLogicExpression)
override fun <E : FirTargetElement> visitJump(jump: FirJump<E>) = visitExpression(jump) override fun <E : FirTargetElement> visitJump(jump: FirJump<E>) = visitExpression(jump)
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.FirElementWithResolvePhase import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression
import org.jetbrains.kotlin.fir.expressions.FirJump import org.jetbrains.kotlin.fir.expressions.FirJump
import org.jetbrains.kotlin.fir.expressions.FirLoopJump import org.jetbrains.kotlin.fir.expressions.FirLoopJump
@@ -205,6 +207,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(expression, data) return transformElement(expression, data)
} }
open fun transformLazyExpression(lazyExpression: FirLazyExpression, data: D): FirStatement {
return transformElement(lazyExpression, data)
}
open fun transformContextReceiver(contextReceiver: FirContextReceiver, data: D): FirContextReceiver { open fun transformContextReceiver(contextReceiver: FirContextReceiver, data: D): FirContextReceiver {
return transformElement(contextReceiver, data) return transformElement(contextReceiver, data)
} }
@@ -381,6 +387,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(block, data) return transformElement(block, data)
} }
open fun transformLazyBlock(lazyBlock: FirLazyBlock, data: D): FirStatement {
return transformElement(lazyBlock, data)
}
open fun transformBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): FirStatement { open fun transformBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): FirStatement {
return transformElement(binaryLogicExpression, data) return transformElement(binaryLogicExpression, data)
} }
@@ -789,6 +799,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformExpression(expression, data) return transformExpression(expression, data)
} }
final override fun visitLazyExpression(lazyExpression: FirLazyExpression, data: D): FirStatement {
return transformLazyExpression(lazyExpression, data)
}
final override fun visitContextReceiver(contextReceiver: FirContextReceiver, data: D): FirContextReceiver { final override fun visitContextReceiver(contextReceiver: FirContextReceiver, data: D): FirContextReceiver {
return transformContextReceiver(contextReceiver, data) return transformContextReceiver(contextReceiver, data)
} }
@@ -965,6 +979,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformBlock(block, data) return transformBlock(block, data)
} }
final override fun visitLazyBlock(lazyBlock: FirLazyBlock, data: D): FirStatement {
return transformLazyBlock(lazyBlock, data)
}
final override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): FirStatement { final override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): FirStatement {
return transformBinaryLogicExpression(binaryLogicExpression, data) return transformBinaryLogicExpression(binaryLogicExpression, data)
} }
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.FirElementWithResolvePhase import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression
import org.jetbrains.kotlin.fir.expressions.FirJump import org.jetbrains.kotlin.fir.expressions.FirJump
import org.jetbrains.kotlin.fir.expressions.FirLoopJump import org.jetbrains.kotlin.fir.expressions.FirLoopJump
@@ -182,6 +184,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitExpression(expression: FirExpression, data: D): R = visitElement(expression, data) open fun visitExpression(expression: FirExpression, data: D): R = visitElement(expression, data)
open fun visitLazyExpression(lazyExpression: FirLazyExpression, data: D): R = visitElement(lazyExpression, data)
open fun visitContextReceiver(contextReceiver: FirContextReceiver, data: D): R = visitElement(contextReceiver, data) open fun visitContextReceiver(contextReceiver: FirContextReceiver, data: D): R = visitElement(contextReceiver, data)
open fun visitElementWithResolvePhase(elementWithResolvePhase: FirElementWithResolvePhase, data: D): R = visitElement(elementWithResolvePhase, data) open fun visitElementWithResolvePhase(elementWithResolvePhase: FirElementWithResolvePhase, data: D): R = visitElement(elementWithResolvePhase, data)
@@ -270,6 +274,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitBlock(block: FirBlock, data: D): R = visitElement(block, data) open fun visitBlock(block: FirBlock, data: D): R = visitElement(block, data)
open fun visitLazyBlock(lazyBlock: FirLazyBlock, data: D): R = visitElement(lazyBlock, data)
open fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): R = visitElement(binaryLogicExpression, data) open fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): R = visitElement(binaryLogicExpression, data)
open fun <E : FirTargetElement> visitJump(jump: FirJump<E>, data: D): R = visitElement(jump, data) open fun <E : FirTargetElement> visitJump(jump: FirJump<E>, data: D): R = visitElement(jump, data)
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner import org.jetbrains.kotlin.fir.declarations.FirControlFlowGraphOwner
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLazyExpression
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.FirElementWithResolvePhase import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression
import org.jetbrains.kotlin.fir.expressions.FirJump import org.jetbrains.kotlin.fir.expressions.FirJump
import org.jetbrains.kotlin.fir.expressions.FirLoopJump import org.jetbrains.kotlin.fir.expressions.FirLoopJump
@@ -204,6 +206,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(expression) visitElement(expression)
} }
open fun visitLazyExpression(lazyExpression: FirLazyExpression) {
visitElement(lazyExpression)
}
open fun visitContextReceiver(contextReceiver: FirContextReceiver) { open fun visitContextReceiver(contextReceiver: FirContextReceiver) {
visitElement(contextReceiver) visitElement(contextReceiver)
} }
@@ -380,6 +386,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(block) visitElement(block)
} }
open fun visitLazyBlock(lazyBlock: FirLazyBlock) {
visitElement(lazyBlock)
}
open fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) { open fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) {
visitElement(binaryLogicExpression) visitElement(binaryLogicExpression)
} }
@@ -788,6 +798,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitExpression(expression) visitExpression(expression)
} }
final override fun visitLazyExpression(lazyExpression: FirLazyExpression, data: Nothing?) {
visitLazyExpression(lazyExpression)
}
final override fun visitContextReceiver(contextReceiver: FirContextReceiver, data: Nothing?) { final override fun visitContextReceiver(contextReceiver: FirContextReceiver, data: Nothing?) {
visitContextReceiver(contextReceiver) visitContextReceiver(contextReceiver)
} }
@@ -964,6 +978,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitBlock(block) visitBlock(block)
} }
final override fun visitLazyBlock(lazyBlock: FirLazyBlock, data: Nothing?) {
visitLazyBlock(lazyBlock)
}
final override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: Nothing?) { final override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: Nothing?) {
visitBinaryLogicExpression(binaryLogicExpression) visitBinaryLogicExpression(binaryLogicExpression)
} }
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
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.expressions.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock
class FirBodyRenderer { class FirBodyRenderer {
@@ -595,13 +595,10 @@ class FirRenderer(
} }
override fun visitExpression(expression: FirExpression) { override fun visitExpression(expression: FirExpression) {
if (expression !is FirLazyExpression) { annotationRenderer?.render(expression)
annotationRenderer?.render(expression)
}
print( print(
when (expression) { when (expression) {
is FirExpressionStub -> "STUB" is FirExpressionStub -> "STUB"
is FirLazyExpression -> "LAZY_EXPRESSION"
is FirUnitExpression -> "Unit" is FirUnitExpression -> "Unit"
is FirElseIfTrueCondition -> "else" is FirElseIfTrueCondition -> "else"
is FirNoReceiverExpression -> "" is FirNoReceiverExpression -> ""
@@ -610,6 +607,10 @@ class FirRenderer(
) )
} }
override fun visitLazyExpression(lazyExpression: FirLazyExpression) {
print("LAZY_EXPRESSION")
}
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>) { override fun <T> visitConstExpression(constExpression: FirConstExpression<T>) {
annotationRenderer?.render(constExpression) annotationRenderer?.render(constExpression)
val kind = constExpression.kind val kind = constExpression.kind
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2023 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. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@@ -26,6 +26,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val statement by element(Expression, annotationContainer) val statement by element(Expression, annotationContainer)
val expression by element(Expression, statement) val expression by element(Expression, statement)
val lazyExpression by element(Expression, expression)
val contextReceiver by element(Declaration) val contextReceiver by element(Declaration)
@@ -83,6 +84,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val whileLoop by element(Expression, loop) val whileLoop by element(Expression, loop)
val block by element(Expression, expression) val block by element(Expression, expression)
val lazyBlock by element(Expression, block)
val binaryLogicExpression by element(Expression, expression) val binaryLogicExpression by element(Expression, expression)
val jump by sealedElement(Expression, expression) val jump by sealedElement(Expression, expression)
val loopJump by element(Expression, jump) val loopJump by element(Expression, jump)
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2023 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. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@@ -173,7 +173,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
publicImplementation() publicImplementation()
} }
impl(block, "FirLazyBlock") { impl(lazyBlock) {
val error = """error("FirLazyBlock should be calculated before accessing")""" val error = """error("FirLazyBlock should be calculated before accessing")"""
default("source") { default("source") {
value = error value = error
@@ -191,7 +191,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = error value = error
withGetter = true withGetter = true
} }
publicImplementation()
} }
impl(errorLoop) { impl(errorLoop) {
@@ -204,7 +203,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
publicImplementation() publicImplementation()
} }
impl(expression, "FirLazyExpression") { impl(lazyExpression) {
val error = """error("FirLazyExpression should be calculated before accessing")""" val error = """error("FirLazyExpression should be calculated before accessing")"""
default("typeRef") { default("typeRef") {
value = error value = error
@@ -214,7 +213,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = error value = error
withGetter = true withGetter = true
} }
publicImplementation()
} }
impl(functionCall) { impl(functionCall) {