From 33abe75a74d08081e1178a4850d6a2116e4e5953 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Tue, 13 Jun 2023 15:48:27 +0900 Subject: [PATCH] [FIR] Add FirCodeFragment --- .../expression/FirOptInUsageBaseChecker.kt | 2 +- .../DeclarationCheckersDiagnosticComponent.kt | 4 ++ .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 11 +++ .../dfa/cfg/ControlFlowGraphBuilder.kt | 10 +++ .../dfa/cfg/ControlFlowGraphNodeBuilder.kt | 6 ++ .../body/resolve/BodyResolveContext.kt | 26 +++++-- ...bstractBodyResolveTransformerDispatcher.kt | 4 ++ .../FirDeclarationsResolveTransformer.kt | 9 +++ .../kotlin/fir/resolve/DeclarationUtils.kt | 4 ++ .../kotlin/fir/resolve/dfa/cfg/CFGNode.kt | 13 ++++ .../fir/resolve/dfa/cfg/CFGNodeRenderer.kt | 3 + .../dfa/cfg/ControlFlowGraphVisitor.kt | 10 +++ .../fir/declarations/FirCodeFragment.kt | 42 +++++++++++ .../builder/FirCodeFragmentBuilder.kt | 66 +++++++++++++++++ .../declarations/impl/FirCodeFragmentImpl.kt | 71 +++++++++++++++++++ .../kotlin/fir/visitors/FirDefaultVisitor.kt | 3 + .../fir/visitors/FirDefaultVisitorVoid.kt | 3 + .../kotlin/fir/visitors/FirTransformer.kt | 9 +++ .../kotlin/fir/visitors/FirVisitor.kt | 3 + .../kotlin/fir/visitors/FirVisitorVoid.kt | 9 +++ .../fir/symbols/impl/FirCodeFragmentSymbol.kt | 11 +++ .../fir/tree/generator/FirTreeBuilder.kt | 1 + .../fir/tree/generator/NodeConfigurator.kt | 5 ++ 23 files changed, 320 insertions(+), 5 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirCodeFragment.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirCodeFragmentBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirCodeFragmentImpl.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCodeFragmentSymbol.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt index ed6dce95cd0..7fb74cbcf5e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt @@ -159,7 +159,7 @@ object FirOptInUsageBaseChecker { fir.loadCallableSpecificExperimentalities(this, context, visited, fromSetter, dispatchReceiverType, result) is FirClassLikeDeclaration -> fir.loadClassLikeSpecificExperimentalities(this, context, visited, result) - is FirAnonymousInitializer, is FirDanglingModifierList, is FirFile, is FirTypeParameter, is FirScript -> {} + is FirAnonymousInitializer, is FirDanglingModifierList, is FirFile, is FirTypeParameter, is FirScript, is FirCodeFragment -> {} } fir.loadExperimentalitiesFromAnnotationTo(session, result, fromSupertype) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt index dc802e09cc7..78f8eae47d8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt @@ -107,6 +107,10 @@ class DeclarationCheckersDiagnosticComponent( checkers.allBasicDeclarationCheckers.check(script, data) } + override fun visitCodeFragment(codeFragment: FirCodeFragment, data: CheckerContext) { + checkers.allBasicDeclarationCheckers.check(codeFragment, data) + } + private fun Collection>.check( declaration: D, context: CheckerContext diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index e3decd2e715..97979c7ffeb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -235,6 +235,17 @@ abstract class FirDataFlowAnalyzer( return graph } + // ----------------------------------- Code Fragment ------------------------------------------ + + fun enterCodeFragment(codeFragment: FirCodeFragment) { + graphBuilder.enterCodeFragment(codeFragment).mergeIncomingFlow() + } + + fun exitCodeFragment(): ControlFlowGraph { + val (node, graph) = graphBuilder.exitCodeFragment() + node.mergeIncomingFlow() + return graph + } // ----------------------------------- Value parameters (and it's defaults) ----------------------------------- fun enterValueParameter(valueParameter: FirValueParameter) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 65fe803e9d3..041628c3110 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -547,6 +547,16 @@ class ControlFlowGraphBuilder { return exitGraph() } + fun enterCodeFragment(codeFragment: FirCodeFragment): CodeFragmentEnterNode { + return enterGraph(codeFragment, "CODE_FRAGMENT_GRAPH", ControlFlowGraph.Kind.Function) { + createCodeFragmentEnterNode(it) to createCodeFragmentExitNode(it) + } + } + + fun exitCodeFragment(): Pair { + return exitGraph() + } + // ----------------------------------- Value parameters (and it's defaults) ----------------------------------- fun enterValueParameter(valueParameter: FirValueParameter): Pair? { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt index 2b919242ab5..e6754ff89d4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt @@ -229,6 +229,12 @@ fun ControlFlowGraphBuilder.createScriptEnterNode(fir: FirScript): ScriptEnterNo fun ControlFlowGraphBuilder.createScriptExitNode(fir: FirScript): ScriptExitNode = ScriptExitNode(currentGraph, fir, levelCounter) +fun ControlFlowGraphBuilder.createCodeFragmentEnterNode(fir: FirCodeFragment): CodeFragmentEnterNode = + CodeFragmentEnterNode(currentGraph, fir, levelCounter) + +fun ControlFlowGraphBuilder.createCodeFragmentExitNode(fir: FirCodeFragment): CodeFragmentExitNode = + CodeFragmentExitNode(currentGraph, fir, levelCounter) + fun ControlFlowGraphBuilder.createClassEnterNode(fir: FirClass): ClassEnterNode = ClassEnterNode(currentGraph, fir, levelCounter) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index 4b5d7f4fc31..5a34e8aca31 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -7,16 +7,13 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.PrivateForInline -import org.jetbrains.kotlin.fir.correspondingProperty +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirWhenExpression -import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ImplicitExtensionReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue @@ -532,6 +529,27 @@ class BodyResolveContext( } } + fun withScopesForCodeFragment(codeFragment: FirCodeFragment, f: () -> T): T { + val towerDataContext = codeFragment.towerDataContext ?: error("Context is not set for a code fragment") + val base = towerDataContext.addNonLocalTowerDataElements(towerDataContext.nonLocalTowerDataElements) + val baseWithLocalScope = towerDataContext.localScopes.fold(base) { acc, scope -> acc.addLocalScope(scope) } + + val newContext = FirRegularTowerDataContexts( + regular = baseWithLocalScope, + forClassHeaderAnnotations = baseWithLocalScope, + forNestedClasses = baseWithLocalScope, + forCompanionObject = baseWithLocalScope, + forConstructorHeaders = null, + forEnumEntries = null, + primaryConstructorPureParametersScope = null, + primaryConstructorAllParametersScope = null + ) + + return withTowerDataContexts(newContext) { + f() + } + } + @OptIn(PrivateForInline::class) inline fun withWhenSubjectType( subjectType: ConeKotlinType?, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformerDispatcher.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformerDispatcher.kt index 8b6201bea40..775e3b418a3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformerDispatcher.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformerDispatcher.kt @@ -64,6 +64,10 @@ abstract class FirAbstractBodyResolveTransformerDispatcher( return declarationsTransformer.transformScript(script, data) } + override fun transformCodeFragment(codeFragment: FirCodeFragment, data: ResolutionMode): FirCodeFragment { + return declarationsTransformer.transformCodeFragment(codeFragment, data) + } + override fun transformElement(element: E, data: ResolutionMode): E { @Suppress("UNCHECKED_CAST") return (element.transformChildren(this, data) as E) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 48525e0915a..4c1b0c97200 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -543,6 +543,15 @@ open class FirDeclarationsResolveTransformer( return result } + override fun transformCodeFragment(codeFragment: FirCodeFragment, data: ResolutionMode): FirCodeFragment { + dataFlowAnalyzer.enterCodeFragment(codeFragment) + context.withScopesForCodeFragment(codeFragment) { + transformBlock(codeFragment.block, data) + } + dataFlowAnalyzer.exitCodeFragment() + return codeFragment + } + override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias = whileAnalysing(session, typeAlias) { if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) { return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector) diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt index 7d9597df97d..f24293583e3 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt @@ -87,3 +87,7 @@ var FirConstructor.originalConstructorIfTypeAlias: FirConstructor? by FirDeclara val FirConstructorSymbol.isTypeAliasedConstructor: Boolean get() = fir.originalConstructorIfTypeAlias != null + +private object CodeFragmentTowerDataContext : FirDeclarationDataKey() + +var FirCodeFragment.towerDataContext: FirTowerDataContext? by FirDeclarationDataRegistry.data(CodeFragmentTowerDataContext) \ No newline at end of file diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt index 5f780cfd027..c064678f0d3 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt @@ -300,6 +300,19 @@ class ScriptExitNode(owner: ControlFlowGraph, override val fir: FirScript, level } } +// ----------------------------------- Code Fragments ------------------------------------------ + +class CodeFragmentEnterNode(owner: ControlFlowGraph, override val fir: FirCodeFragment, level: Int) : CFGNode(owner, level), GraphEnterNodeMarker { + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { + return visitor.visitCodeFragmentEnterNode(this, data) + } +} + +class CodeFragmentExitNode(owner: ControlFlowGraph, override val fir: FirCodeFragment, level: Int) : CFGNode(owner, level), GraphExitNodeMarker { + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { + return visitor.visitCodeFragmentExitNode(this, data) + } +} // ----------------------------------- Property ----------------------------------- class PropertyInitializerEnterNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int) : CFGNode(owner, level), diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt index 02c0d676dc3..a3422bbfb83 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt @@ -106,6 +106,9 @@ fun CFGNode<*>.render(): String = is ScriptEnterNode -> "Enter class ${fir.name}" is ScriptExitNode -> "Exit class ${fir.name}" + is CodeFragmentEnterNode -> "Enter code fragment" + is CodeFragmentExitNode -> "Exit code fragment" + is FakeExpressionEnterNode -> "Enter fake expression" is EnterValueParameterNode -> "Enter default value of ${fir.name}" diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt index aac9fd965bf..d00dffe3e2a 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt @@ -90,6 +90,16 @@ abstract class ControlFlowGraphVisitor { return visitNode(node, data) } + // ----------------------------------- Code Fragments ------------------------------------------ + + open fun visitCodeFragmentEnterNode(node: CodeFragmentEnterNode, data: D): R { + return visitNode(node, data) + } + + open fun visitCodeFragmentExitNode(node: CodeFragmentExitNode, data: D): R { + return visitNode(node, data) + } + // ----------------------------------- Property ----------------------------------- open fun visitPropertyInitializerEnterNode(node: PropertyInitializerEnterNode, data: D): R { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirCodeFragment.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirCodeFragment.kt new file mode 100644 index 00000000000..3465196a36c --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirCodeFragment.kt @@ -0,0 +1,42 @@ +/* + * 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.declarations + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.symbols.impl.FirCodeFragmentSymbol +import org.jetbrains.kotlin.fir.visitors.* +import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirCodeFragment : FirDeclaration() { + abstract override val source: KtSourceElement? + abstract override val annotations: List + abstract override val moduleData: FirModuleData + abstract override val origin: FirDeclarationOrigin + abstract override val attributes: FirDeclarationAttributes + abstract override val symbol: FirCodeFragmentSymbol + abstract val block: FirBlock + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitCodeFragment(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformCodeFragment(this, data) as E + + abstract override fun replaceAnnotations(newAnnotations: List) + + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirCodeFragment + + abstract fun transformBlock(transformer: FirTransformer, data: D): FirCodeFragment +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirCodeFragmentBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirCodeFragmentBuilder.kt new file mode 100644 index 00000000000..0eadd6674ec --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirCodeFragmentBuilder.kt @@ -0,0 +1,66 @@ +/* + * 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. + */ + +@file:Suppress("DuplicatedCode", "unused") + +package org.jetbrains.kotlin.fir.declarations.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment +import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.FirResolveState +import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess +import org.jetbrains.kotlin.fir.declarations.asResolveState +import org.jetbrains.kotlin.fir.declarations.impl.FirCodeFragmentImpl +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.symbols.impl.FirCodeFragmentSymbol +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirCodeFragmentBuilder : FirAnnotationContainerBuilder { + override var source: KtSourceElement? = null + var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR + override val annotations: MutableList = mutableListOf() + lateinit var moduleData: FirModuleData + lateinit var origin: FirDeclarationOrigin + var attributes: FirDeclarationAttributes = FirDeclarationAttributes() + lateinit var symbol: FirCodeFragmentSymbol + lateinit var block: FirBlock + + override fun build(): FirCodeFragment { + return FirCodeFragmentImpl( + source, + resolvePhase, + annotations.toMutableOrEmpty(), + moduleData, + origin, + attributes, + symbol, + block, + ) + } + +} + +@OptIn(ExperimentalContracts::class) +inline fun buildCodeFragment(init: FirCodeFragmentBuilder.() -> Unit): FirCodeFragment { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirCodeFragmentBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirCodeFragmentImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirCodeFragmentImpl.kt new file mode 100644 index 00000000000..bc2c256d9de --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirCodeFragmentImpl.kt @@ -0,0 +1,71 @@ +/* + * 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. + */ + +@file:Suppress("DuplicatedCode", "unused") + +package org.jetbrains.kotlin.fir.declarations.impl + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment +import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.FirResolveState +import org.jetbrains.kotlin.fir.declarations.asResolveState +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.symbols.impl.FirCodeFragmentSymbol +import org.jetbrains.kotlin.fir.visitors.* +import org.jetbrains.kotlin.fir.MutableOrEmptyList +import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty +import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirCodeFragmentImpl( + override val source: KtSourceElement?, + resolvePhase: FirResolvePhase, + override var annotations: MutableOrEmptyList, + override val moduleData: FirModuleData, + override val origin: FirDeclarationOrigin, + override val attributes: FirDeclarationAttributes, + override val symbol: FirCodeFragmentSymbol, + override var block: FirBlock, +) : FirCodeFragment() { + init { + symbol.bind(this) + @OptIn(ResolveStateAccess::class) + resolveState = resolvePhase.asResolveState() + } + + override fun acceptChildren(visitor: FirVisitor, data: D) { + annotations.forEach { it.accept(visitor, data) } + block.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirCodeFragmentImpl { + transformAnnotations(transformer, data) + transformBlock(transformer, data) + return this + } + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirCodeFragmentImpl { + annotations.transformInplace(transformer, data) + return this + } + + override fun transformBlock(transformer: FirTransformer, data: D): FirCodeFragmentImpl { + block = block.transform(transformer, data) + return this + } + + override fun replaceAnnotations(newAnnotations: List) { + annotations = newAnnotations.toMutableOrEmpty() + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index c044539fe33..c07b4c5d5f8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.fir.declarations.FirBackingField import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirScript +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment import org.jetbrains.kotlin.fir.FirPackageDirective import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression @@ -188,6 +189,8 @@ abstract class FirDefaultVisitor : FirVisitor() { override fun visitScript(script: FirScript, data: D): R = visitDeclaration(script, data) + override fun visitCodeFragment(codeFragment: FirCodeFragment, data: D): R = visitDeclaration(codeFragment, data) + override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression, data: D): R = visitExpression(anonymousFunctionExpression, data) override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: D): R = visitClass(anonymousObject, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index 030d69f8dd7..531eeef60f2 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.fir.declarations.FirBackingField import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirScript +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment import org.jetbrains.kotlin.fir.FirPackageDirective import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression @@ -188,6 +189,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() { override fun visitScript(script: FirScript) = visitDeclaration(script) + override fun visitCodeFragment(codeFragment: FirCodeFragment) = visitDeclaration(codeFragment) + override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) = visitExpression(anonymousFunctionExpression) override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) = visitClass(anonymousObject) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index 4e9d086a94f..2b9476c5aa8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.fir.declarations.FirBackingField import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirScript +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment import org.jetbrains.kotlin.fir.FirPackageDirective import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression @@ -335,6 +336,10 @@ abstract class FirTransformer : FirVisitor() { return transformElement(script, data) } + open fun transformCodeFragment(codeFragment: FirCodeFragment, data: D): FirCodeFragment { + return transformElement(codeFragment, data) + } + open fun transformPackageDirective(packageDirective: FirPackageDirective, data: D): FirPackageDirective { return transformElement(packageDirective, data) } @@ -943,6 +948,10 @@ abstract class FirTransformer : FirVisitor() { return transformScript(script, data) } + final override fun visitCodeFragment(codeFragment: FirCodeFragment, data: D): FirCodeFragment { + return transformCodeFragment(codeFragment, data) + } + final override fun visitPackageDirective(packageDirective: FirPackageDirective, data: D): FirPackageDirective { return transformPackageDirective(packageDirective, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index 2fd984e2bd8..8805192263b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.fir.declarations.FirBackingField import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirScript +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment import org.jetbrains.kotlin.fir.FirPackageDirective import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression @@ -250,6 +251,8 @@ abstract class FirVisitor { open fun visitScript(script: FirScript, data: D): R = visitElement(script, data) + open fun visitCodeFragment(codeFragment: FirCodeFragment, data: D): R = visitElement(codeFragment, data) + open fun visitPackageDirective(packageDirective: FirPackageDirective, data: D): R = visitElement(packageDirective, data) open fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): R = visitElement(anonymousFunction, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index 485bdfa9475..fc740d3f89f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.fir.declarations.FirBackingField import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirScript +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment import org.jetbrains.kotlin.fir.FirPackageDirective import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression @@ -334,6 +335,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(script) } + open fun visitCodeFragment(codeFragment: FirCodeFragment) { + visitElement(codeFragment) + } + open fun visitPackageDirective(packageDirective: FirPackageDirective) { visitElement(packageDirective) } @@ -942,6 +947,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitScript(script) } + final override fun visitCodeFragment(codeFragment: FirCodeFragment, data: Nothing?) { + visitCodeFragment(codeFragment) + } + final override fun visitPackageDirective(packageDirective: FirPackageDirective, data: Nothing?) { visitPackageDirective(packageDirective) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCodeFragmentSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCodeFragmentSymbol.kt new file mode 100644 index 00000000000..00c9ac23037 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCodeFragmentSymbol.kt @@ -0,0 +1,11 @@ +/* + * 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.symbols.impl + +import org.jetbrains.kotlin.fir.declarations.FirCodeFragment +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol + +class FirCodeFragmentSymbol : FirBasedSymbol() \ No newline at end of file diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 8b5900192bb..021653eba0c 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -64,6 +64,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val constructor by element(Declaration, function, typeParameterRefsOwner, contractDescriptionOwner) val file by element(Declaration, declaration) val script by element(Declaration, declaration) + val codeFragment by element(Declaration, declaration) val packageDirective by element(Other) val anonymousFunction by element(Declaration, function, typeParametersOwner, contractDescriptionOwner) 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 32b998b1a56..a98b2fdac30 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 @@ -495,6 +495,11 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +fieldList(contextReceiver, useMutableOrEmpty = true) } + codeFragment.configure { + +symbol("FirCodeFragmentSymbol") + +field(block).withTransform() + } + packageDirective.configure { +field("packageFqName", fqNameType) }