K2 scripting: add initial scripting support to K2 frontend
This commit is contained in:
committed by
Space Team
parent
7ec6608e29
commit
a3a1550933
@@ -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}"
|
||||
|
||||
+10
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user