K2 scripting: add initial scripting support to K2 frontend

This commit is contained in:
Ilya Chernikov
2022-11-08 10:42:10 +01:00
committed by Space Team
parent 7ec6608e29
commit a3a1550933
27 changed files with 513 additions and 9 deletions
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2022 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.fir.labelName
import org.jetbrains.kotlin.fir.resolve.SessionHolder
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValueForScript
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirScriptDeclarationsScope
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneType
class TowerElementsForScript(
val implicitReceivers: List<ImplicitReceiverValueForScript>,
val staticScope: FirScope?,
)
fun SessionHolder.collectTowerDataElementsForScript(owner: FirScript): TowerElementsForScript {
val contextReceivers = owner.contextReceivers.mapIndexed { index, receiver ->
ImplicitReceiverValueForScript(
owner.symbol, receiver.typeRef.coneType, receiver.labelName, session, scopeSession,
contextReceiverNumber = index,
)
}
return TowerElementsForScript(
contextReceivers,
FirScriptDeclarationsScope(session, owner),
)
}
@@ -303,6 +303,20 @@ class AnonymousObjectExpressionExitNode(owner: ControlFlowGraph, override val fi
}
}
// ----------------------------------- Scripts ------------------------------------------
class ScriptEnterNode(owner: ControlFlowGraph, override val fir: FirScript, level: Int, id: Int) : CFGNode<FirScript>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitScriptEnterNode(this, data)
}
}
class ScriptExitNode(owner: ControlFlowGraph, override val fir: FirScript, level: Int, id: Int) : CFGNode<FirScript>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitScriptExitNode(this, data)
}
}
// ----------------------------------- Initialization -----------------------------------
class PartOfClassInitializationNode(owner: ControlFlowGraph, override val fir: FirControlFlowGraphOwner, level: Int, id: Int) : CFGNodeWithCfgOwner<FirControlFlowGraphOwner>(owner, level, id) {
@@ -112,6 +112,9 @@ fun CFGNode<*>.render(): String =
is AnonymousObjectExitNode -> "Exit anonymous object"
is AnonymousObjectExpressionExitNode -> "Exit anonymous object expression"
is ScriptEnterNode -> "Enter class ${fir.name}"
is ScriptExitNode -> "Exit class ${fir.name}"
is ContractDescriptionEnterNode -> "Enter contract description"
is EnterDefaultArgumentsNode -> "Enter default value of ${fir.name}"
@@ -80,6 +80,16 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
return visitNode(node, data)
}
// ----------------------------------- Scripts ------------------------------------------
open fun visitScriptEnterNode(node: ScriptEnterNode, data: D): R {
return visitNode(node, data)
}
open fun visitScriptExitNode(node: ScriptExitNode, data: D): R {
return visitNode(node, data)
}
// ----------------------------------- Initialization -----------------------------------
open fun visitPartOfClassInitializationNode(node: PartOfClassInitializationNode, data: D): R {