K2 Scripting, IR: non-class based scripts support in IR

This commit is contained in:
Ilya Chernikov
2022-11-17 15:26:15 +01:00
committed by Space Team
parent cc9a7480a2
commit 4af32b8d36
8 changed files with 71 additions and 23 deletions
@@ -26,9 +26,9 @@ abstract class IrScript : IrDeclarationBase(), IrDeclarationWithName, IrDeclarat
IrStatementContainer, IrMetadataSourceOwner {
abstract override val symbol: IrScriptSymbol
abstract var thisReceiver: IrValueParameter
abstract var thisReceiver: IrValueParameter?
abstract var baseClass: IrType
abstract var baseClass: IrType?
abstract var explicitCallParameters: List<IrValueParameter>
@@ -53,7 +53,7 @@ abstract class IrScript : IrDeclarationBase(), IrDeclarationWithName, IrDeclarat
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
statements.forEach { it.accept(visitor, data) }
thisReceiver.accept(visitor, data)
thisReceiver?.accept(visitor, data)
explicitCallParameters.forEach { it.accept(visitor, data) }
implicitReceiversParameters.forEach { it.accept(visitor, data) }
providedPropertiesParameters.forEach { it.accept(visitor, data) }
@@ -62,7 +62,7 @@ abstract class IrScript : IrDeclarationBase(), IrDeclarationWithName, IrDeclarat
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
statements.transformInPlace(transformer, data)
thisReceiver = thisReceiver.transform(transformer, data)
thisReceiver = thisReceiver?.transform(transformer, data)
explicitCallParameters = explicitCallParameters.transformIfNeeded(transformer, data)
implicitReceiversParameters = implicitReceiversParameters.transformIfNeeded(transformer,
data)
@@ -43,9 +43,9 @@ class IrScriptImpl(
override var metadata: MetadataSource? = null
override lateinit var thisReceiver: IrValueParameter
override var thisReceiver: IrValueParameter? = null
override var baseClass: IrType? = null
override lateinit var baseClass: IrType
override lateinit var explicitCallParameters: List<IrValueParameter>
override lateinit var implicitReceiversParameters: List<IrValueParameter>
override lateinit var providedProperties: List<IrPropertySymbol>
@@ -130,7 +130,7 @@ open class DeepCopyIrTreeWithSymbols(
declaration.startOffset,
declaration.endOffset
).also { scriptCopy ->
scriptCopy.thisReceiver = declaration.thisReceiver.transform()
scriptCopy.thisReceiver = declaration.thisReceiver?.transform()
declaration.statements.mapTo(scriptCopy.statements) { it.transform() }
scriptCopy.earlierScripts = declaration.earlierScripts
scriptCopy.earlierScriptsParameter = declaration.earlierScriptsParameter
@@ -398,8 +398,8 @@ object IrTree : AbstractTreeBuilder() {
+symbol(scriptSymbolType)
// NOTE: is the result of the FE conversion, because there script interpreted as a class and has receiver
// TODO: consider removing from here and handle appropriately in the lowering
+field("thisReceiver", valueParameter, mutable = true, isChild = true)
+field("baseClass", irTypeType, mutable = true)
+field("thisReceiver", valueParameter, mutable = true, isChild = true, nullable = true) // K1
+field("baseClass", irTypeType, mutable = true, nullable = true) // K1
+listField("explicitCallParameters", valueParameter, mutability = Var, isChild = true)
+listField("implicitReceiversParameters", valueParameter, mutability = Var, isChild = true)
+listField("providedProperties", propertySymbolType, mutability = Var)
@@ -408,7 +408,7 @@ object IrTree : AbstractTreeBuilder() {
+field("earlierScriptsParameter", valueParameter, mutable = true, nullable = true, isChild = true)
+listField("earlierScripts", scriptSymbolType, mutability = Var, nullable = true)
+field("targetClass", classSymbolType, mutable = true, nullable = true)
+field("constructor", constructor, mutable = true, nullable = true)
+field("constructor", constructor, mutable = true, nullable = true) // K1
}
val simpleFunction: ElementConfig by element(Declaration) {
visitorParent = function