From 4fae9cbdb076f765df3de895303ccca6918989f0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 9 Oct 2020 11:30:01 +0300 Subject: [PATCH] FIR: introduce FirLazyBlock node --- .../fir/declarations/FirAnonymousFunction.kt | 2 + .../kotlin/fir/declarations/FirConstructor.kt | 2 + .../fir/declarations/FirErrorFunction.kt | 2 + .../kotlin/fir/declarations/FirFunction.kt | 2 + .../fir/declarations/FirPropertyAccessor.kt | 2 + .../fir/declarations/FirSimpleFunction.kt | 2 + .../impl/FirAnonymousFunctionImpl.kt | 4 ++ .../declarations/impl/FirConstructorImpl.kt | 4 ++ .../declarations/impl/FirErrorFunctionImpl.kt | 2 + .../impl/FirPrimaryConstructor.kt | 4 ++ .../impl/FirPropertyAccessorImpl.kt | 4 ++ .../impl/FirSimpleFunctionImpl.kt | 4 ++ .../builder/FirLazyBlockBuilder.kt | 55 +++++++++++++++++++ .../fir/expressions/impl/FirLazyBlock.kt | 49 +++++++++++++++++ .../org/jetbrains/kotlin/fir/FirRenderer.kt | 7 ++- .../synthetic/FirSyntheticPropertyAccessor.kt | 4 ++ .../kotlin/fir/tree/generator/FieldSets.kt | 4 +- .../generator/ImplementationConfigurator.kt | 17 ++++++ .../fir/tree/generator/NodeConfigurator.kt | 2 +- 19 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt index 0f437464fd9..37e427ba79c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt @@ -53,6 +53,8 @@ abstract class FirAnonymousFunction : FirFunction, FirExpr abstract override fun replaceValueParameters(newValueParameters: List) + abstract override fun replaceBody(newBody: FirBlock?) + abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) abstract fun replaceInvocationKind(newInvocationKind: EventOccurrencesRange?) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt index 3d10652333f..ef918088b7d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt @@ -53,6 +53,8 @@ abstract class FirConstructor : FirPureAbstractElement(), FirFunction) + abstract override fun replaceBody(newBody: FirBlock?) + abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirConstructor abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirConstructor diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt index bb98e8d4886..7277f4bac30 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt @@ -50,6 +50,8 @@ abstract class FirErrorFunction : FirPureAbstractElement(), FirFunction) + abstract override fun replaceBody(newBody: FirBlock?) + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirErrorFunction abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirErrorFunction diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFunction.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFunction.kt index fbcf22836c5..e16231f64b7 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFunction.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFunction.kt @@ -48,6 +48,8 @@ interface FirFunction> : FirCallableDeclaration, FirTarget fun replaceValueParameters(newValueParameters: List) + fun replaceBody(newBody: FirBlock?) + override fun transformAnnotations(transformer: FirTransformer, data: D): FirFunction override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirFunction diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt index b8b4246ffbf..d298bf54368 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt @@ -54,6 +54,8 @@ abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction) + abstract override fun replaceBody(newBody: FirBlock?) + abstract override fun replaceContractDescription(newContractDescription: FirContractDescription) abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirPropertyAccessor diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt index 8abdc47b7a9..c7de7cb3a43 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt @@ -54,6 +54,8 @@ abstract class FirSimpleFunction : FirPureAbstractElement(), FirFunction) + abstract override fun replaceBody(newBody: FirBlock?) + abstract override fun replaceContractDescription(newContractDescription: FirContractDescription) abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirSimpleFunction diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt index ca861801eda..c07f6d27440 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt @@ -127,6 +127,10 @@ internal class FirAnonymousFunctionImpl( valueParameters.addAll(newValueParameters) } + override fun replaceBody(newBody: FirBlock?) { + body = newBody + } + override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt index 08416413019..305393d8cc8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt @@ -137,4 +137,8 @@ internal class FirConstructorImpl( valueParameters.clear() valueParameters.addAll(newValueParameters) } + + override fun replaceBody(newBody: FirBlock?) { + body = newBody + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt index 169c37784f2..ae94171c95f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt @@ -111,4 +111,6 @@ internal class FirErrorFunctionImpl( valueParameters.clear() valueParameters.addAll(newValueParameters) } + + override fun replaceBody(newBody: FirBlock?) {} } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt index f28365f8810..e2d5f646029 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt @@ -137,4 +137,8 @@ internal class FirPrimaryConstructor( valueParameters.clear() valueParameters.addAll(newValueParameters) } + + override fun replaceBody(newBody: FirBlock?) { + body = newBody + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt index 77cf8f6e661..d436ddd44a1 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt @@ -136,6 +136,10 @@ open class FirPropertyAccessorImpl @FirImplementationDetail constructor( valueParameters.addAll(newValueParameters) } + override fun replaceBody(newBody: FirBlock?) { + body = newBody + } + override fun replaceContractDescription(newContractDescription: FirContractDescription) { contractDescription = newContractDescription } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt index 9b332bf7b92..85d9d03abf0 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt @@ -140,6 +140,10 @@ open class FirSimpleFunctionImpl @FirImplementationDetail constructor( valueParameters.addAll(newValueParameters) } + override fun replaceBody(newBody: FirBlock?) { + body = newBody + } + override fun replaceContractDescription(newContractDescription: FirContractDescription) { contractDescription = newContractDescription } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt new file mode 100644 index 00000000000..34fad2b5a6f --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2020 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.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirImplementationDetail +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder +import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirLazyBlockBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { + override var source: FirSourceElement? = null + + @OptIn(FirImplementationDetail::class) + override fun build(): FirBlock { + return FirLazyBlock( + source, + ) + } + + + @Deprecated("Modification of 'annotations' has no impact for FirLazyBlockBuilder", level = DeprecationLevel.HIDDEN) + override val annotations: MutableList = mutableListOf() + + @Deprecated("Modification of 'typeRef' has no impact for FirLazyBlockBuilder", level = DeprecationLevel.HIDDEN) + override var typeRef: FirTypeRef + get() = throw IllegalStateException() + set(value) { + throw IllegalStateException() + } +} + +@OptIn(ExperimentalContracts::class) +inline fun buildLazyBlock(init: FirLazyBlockBuilder.() -> Unit = {}): FirBlock { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirLazyBlockBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt new file mode 100644 index 00000000000..91591c41e48 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2020 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.impl + +import org.jetbrains.kotlin.fir.FirImplementationDetail +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +class FirLazyBlock @FirImplementationDetail constructor( + override val source: FirSourceElement?, +) : FirBlock() { + override val annotations: List get() = error("FirLazyBlock should be calculated before accessing") + override val statements: List get() = error("FirLazyBlock should be calculated before accessing") + override val typeRef: FirTypeRef get() = error("FirLazyBlock should be calculated before accessing") + + override fun acceptChildren(visitor: FirVisitor, data: D) { + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirLazyBlock { + transformOtherChildren(transformer, data) + return this + } + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirLazyBlock { + return this + } + + override fun transformStatements(transformer: FirTransformer, data: D): FirLazyBlock { + return this + } + + override fun transformOtherChildren(transformer: FirTransformer, data: D): FirLazyBlock { + return this + } + + override fun replaceTypeRef(newTypeRef: FirTypeRef) {} +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 5f0ad60132c..8fc9cee586f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -503,8 +503,11 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM anonymousInitializer.body?.renderBody() } - private fun FirBlock.renderBody(additionalStatements: List = emptyList()) { - renderInBraces { + private fun FirBlock.renderBody(additionalStatements: List = emptyList()) = when (this) { + is FirLazyBlock -> { + println(" { LAZY_BLOCK }") + } + else -> renderInBraces { for (statement in additionalStatements + statements) { statement.accept(this@FirRenderer) println() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt index 0ab7eca56b6..60382c17c45 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticPropertyAccessor.kt @@ -79,6 +79,10 @@ class FirSyntheticPropertyAccessor( contractDescription.accept(visitor, data) } + override fun replaceBody(newBody: FirBlock?) { + throw AssertionError("Transformation of synthetic property accessor isn't supported") + } + override fun transformChildren(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { throw AssertionError("Transformation of synthetic property accessor isn't supported") } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt index a1416d461a9..64f13f0dde8 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt @@ -47,8 +47,8 @@ object FieldSets { fun symbol(symbolClassName: String, argument: String? = null): Field = symbolWithPackage("fir.symbols.impl", symbolClassName, argument) - fun body(nullable: Boolean = false) = - field("body", block, nullable) + fun body(nullable: Boolean = false, withReplace: Boolean = false) = + field("body", block, nullable, withReplace = withReplace) val returnTypeRef = field("returnTypeRef", typeRef) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 9ce082e4496..e74effc6930 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -113,6 +113,23 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() publicImplementation() } + impl(block, "FirLazyBlock") { + val error = """error("FirLazyBlock should be calculated before accessing")""" + default("statements") { + value = error + withGetter = true + } + default("annotations") { + value = error + withGetter = true + } + default("typeRef") { + value = error + withGetter = true + } + publicImplementation() + } + impl(errorLoop) { default("block", "FirEmptyExpressionBlock()") default("condition", "FirErrorExpressionImpl(source, ConeStubDiagnostic(diagnostic))") diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 7850c12919a..b1ce5dcf9fe 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -102,7 +102,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild parentArg(callableDeclaration, "F", "F") +symbol("FirFunctionSymbol", "F") +fieldList(valueParameter, withReplace = true).withTransform() - +body(nullable = true).withTransform() + +body(nullable = true, withReplace = true).withTransform() } errorFunction.configure {