K2 Scripting: add support for script args to FIR part
This commit is contained in:
committed by
Space Team
parent
533a5671bc
commit
a89dfdce03
@@ -357,7 +357,15 @@ class Fir2IrConverter(
|
||||
}
|
||||
is FirScript -> {
|
||||
assert(parent is IrFile)
|
||||
declarationStorage.getOrCreateIrScript(declaration)
|
||||
declarationStorage.getOrCreateIrScript(declaration).also { irScript ->
|
||||
declarationStorage.enterScope(irScript)
|
||||
for (scriptStatement in declaration.statements) {
|
||||
if (scriptStatement is FirDeclaration) {
|
||||
processMemberDeclaration(scriptStatement, null, irScript)
|
||||
}
|
||||
}
|
||||
declarationStorage.leaveScope(irScript)
|
||||
}
|
||||
}
|
||||
is FirSimpleFunction -> {
|
||||
declarationStorage.getOrCreateIrFunction(
|
||||
|
||||
+5
-4
@@ -194,7 +194,8 @@ class Fir2IrDeclarationStorage(
|
||||
declaration is IrConstructor ||
|
||||
declaration is IrAnonymousInitializer ||
|
||||
declaration is IrProperty ||
|
||||
declaration is IrEnumEntry
|
||||
declaration is IrEnumEntry ||
|
||||
declaration is IrScript
|
||||
) {
|
||||
localStorage.enterCallable()
|
||||
}
|
||||
@@ -205,7 +206,8 @@ class Fir2IrDeclarationStorage(
|
||||
declaration is IrConstructor ||
|
||||
declaration is IrAnonymousInitializer ||
|
||||
declaration is IrProperty ||
|
||||
declaration is IrEnumEntry
|
||||
declaration is IrEnumEntry ||
|
||||
declaration is IrScript
|
||||
) {
|
||||
localStorage.leaveCallable()
|
||||
}
|
||||
@@ -768,7 +770,7 @@ class Fir2IrDeclarationStorage(
|
||||
name, inferredType,
|
||||
visibility, isFinal = isFinal,
|
||||
isExternal = property.isExternal,
|
||||
isStatic = property.isStatic || parent !is IrClass,
|
||||
isStatic = property.isStatic || !(parent is IrClass || parent is IrScript),
|
||||
).also {
|
||||
it.correspondingPropertySymbol = this@createBackingField.symbol
|
||||
}.apply {
|
||||
@@ -1579,7 +1581,6 @@ class Fir2IrDeclarationStorage(
|
||||
IrScriptImpl(symbol, script.name, irFactory, startOffset, endOffset).also { irScript ->
|
||||
irScript.origin = SCRIPT_K2_ORIGIN
|
||||
irScript.metadata = FirMetadataSource.Script(script)
|
||||
irScript.explicitCallParameters = emptyList()
|
||||
irScript.implicitReceiversParameters = emptyList()
|
||||
irScript.providedProperties = emptyList()
|
||||
irScript.providedPropertiesParameters = emptyList()
|
||||
|
||||
@@ -193,7 +193,10 @@ class Fir2IrVisitor(
|
||||
override fun visitScript(script: FirScript, data: Any?): IrElement {
|
||||
return declarationStorage.getCachedIrScript(script)!!.also { irScript ->
|
||||
irScript.parent = conversionScope.parentFromStack()
|
||||
symbolTable.enterScope(irScript)
|
||||
declarationStorage.enterScope(irScript)
|
||||
irScript.explicitCallParameters = script.parameters.map { parameter ->
|
||||
declarationStorage.createIrVariable(parameter, irScript)
|
||||
}
|
||||
conversionScope.withParent(irScript) {
|
||||
for (statement in script.statements) {
|
||||
if (statement is FirDeclaration) {
|
||||
@@ -205,7 +208,7 @@ class Fir2IrVisitor(
|
||||
}
|
||||
}
|
||||
}
|
||||
symbolTable.leaveScope(irScript)
|
||||
declarationStorage.leaveScope(irScript)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -561,6 +561,7 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(
|
||||
FirDeclarationOrigin.DynamicScope -> null
|
||||
FirDeclarationOrigin.RenamedForOverride -> null
|
||||
FirDeclarationOrigin.WrappedIntegerOperator -> null
|
||||
FirDeclarationOrigin.ScriptCustomization -> null
|
||||
is FirDeclarationOrigin.Plugin -> null // TODO: figure out what to do with plugin generated functions
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -502,8 +502,13 @@ class BodyResolveContext(
|
||||
val statics = base
|
||||
.addNonLocalScopeIfNotNull(towerElementsForScript.staticScope)
|
||||
|
||||
val parameterScope = owner.parameters.fold(FirLocalScope(holder.session)) { scope, parameter ->
|
||||
scope.storeVariable(parameter, holder.session)
|
||||
}
|
||||
|
||||
val forMembersResolution =
|
||||
statics
|
||||
.addLocalScope(parameterScope)
|
||||
.addContextReceiverGroup(towerElementsForScript.implicitReceivers)
|
||||
|
||||
val newContexts = FirRegularTowerDataContexts(
|
||||
|
||||
@@ -29,6 +29,7 @@ abstract class FirScript : FirDeclaration() {
|
||||
abstract val name: Name
|
||||
abstract val statements: List<FirStatement>
|
||||
abstract override val symbol: FirScriptSymbol
|
||||
abstract val parameters: List<FirVariable>
|
||||
abstract val contextReceivers: List<FirContextReceiver>
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitScript(this, data)
|
||||
|
||||
+3
@@ -18,6 +18,7 @@ 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.FirScript
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirScriptImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
@@ -41,6 +42,7 @@ class FirScriptBuilder : FirAnnotationContainerBuilder {
|
||||
lateinit var name: Name
|
||||
val statements: MutableList<FirStatement> = mutableListOf()
|
||||
lateinit var symbol: FirScriptSymbol
|
||||
val parameters: MutableList<FirVariable> = mutableListOf()
|
||||
val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
|
||||
|
||||
override fun build(): FirScript {
|
||||
@@ -54,6 +56,7 @@ class FirScriptBuilder : FirAnnotationContainerBuilder {
|
||||
name,
|
||||
statements,
|
||||
symbol,
|
||||
parameters,
|
||||
contextReceivers.toMutableOrEmpty(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ 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.FirScript
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol
|
||||
@@ -38,6 +39,7 @@ internal class FirScriptImpl(
|
||||
override val name: Name,
|
||||
override val statements: MutableList<FirStatement>,
|
||||
override val symbol: FirScriptSymbol,
|
||||
override val parameters: MutableList<FirVariable>,
|
||||
override var contextReceivers: MutableOrEmptyList<FirContextReceiver>,
|
||||
) : FirScript() {
|
||||
init {
|
||||
@@ -47,12 +49,14 @@ internal class FirScriptImpl(
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
annotations.forEach { it.accept(visitor, data) }
|
||||
statements.forEach { it.accept(visitor, data) }
|
||||
parameters.forEach { it.accept(visitor, data) }
|
||||
contextReceivers.forEach { it.accept(visitor, data) }
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirScriptImpl {
|
||||
transformAnnotations(transformer, data)
|
||||
transformStatements(transformer, data)
|
||||
parameters.transformInplace(transformer, data)
|
||||
contextReceivers.transformInplace(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ sealed class FirDeclarationOrigin(
|
||||
object Delegated : FirDeclarationOrigin()
|
||||
object RenamedForOverride : FirDeclarationOrigin()
|
||||
object WrappedIntegerOperator : FirDeclarationOrigin()
|
||||
|
||||
object ScriptCustomization : FirDeclarationOrigin()
|
||||
class Plugin(val key: GeneratedDeclarationKey) : FirDeclarationOrigin(displayName = "Plugin[$key]", generated = true)
|
||||
|
||||
override fun toString(): String {
|
||||
|
||||
+1
@@ -471,6 +471,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
+name
|
||||
+fieldList(statement).withTransform()
|
||||
+symbol("FirScriptSymbol")
|
||||
+FieldList("parameters", variable, withReplace = false)
|
||||
+fieldList(contextReceiver, useMutableOrEmpty = true)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user