Implement support for synthetic script params in IR:

implicit receivers and provided properties
also support script imports
This commit is contained in:
Ilya Chernikov
2020-10-15 22:58:16 +02:00
parent 7572b50385
commit de340e9bc8
6 changed files with 184 additions and 110 deletions
@@ -24,9 +24,11 @@ abstract class IrScript :
abstract var explicitCallParameters: List<IrValueParameter>
abstract var implicitReceivers: List<IrValueParameter>
abstract var implicitReceiversParameters: List<IrValueParameter>
abstract var providedProperties: List<IrPropertySymbol>
abstract var providedProperties: List<Pair<IrValueParameter, IrPropertySymbol>>
abstract var resultProperty: IrPropertySymbol?
abstract var earlierScripts: List<IrScriptSymbol>?
}
@@ -46,9 +46,10 @@ class IrScriptImpl(
override lateinit var baseClass: IrType
override lateinit var explicitCallParameters: List<IrValueParameter>
override lateinit var implicitReceivers: List<IrValueParameter>
override lateinit var providedProperties: List<IrPropertySymbol>
override lateinit var implicitReceiversParameters: List<IrValueParameter>
override lateinit var providedProperties: List<Pair<IrValueParameter, IrPropertySymbol>>
override var resultProperty: IrPropertySymbol? = null
override var earlierScripts: List<IrScriptSymbol>? = null
@ObsoleteDescriptorBasedAPI
override val descriptor: ScriptDescriptor
@@ -68,10 +69,16 @@ class IrScriptImpl(
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
statements.forEach { it.accept(visitor, data) }
thisReceiver.accept(visitor, data)
explicitCallParameters.forEach { it.accept(visitor, data) }
implicitReceiversParameters.forEach { it.accept(visitor, data) }
providedProperties.forEach { it.first.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
statements.transformInPlace(transformer, data)
thisReceiver = thisReceiver.transform(transformer, data)
explicitCallParameters = explicitCallParameters.map { it.transform(transformer, data) }
implicitReceiversParameters = implicitReceiversParameters.map { it.transform(transformer, data) }
providedProperties = providedProperties.map { it.first.transform(transformer, data) to it.second }
}
}
@@ -119,6 +119,9 @@ open class DeepCopyIrTreeWithSymbols(
).also { scriptCopy ->
scriptCopy.thisReceiver = declaration.thisReceiver.transform()
declaration.statements.mapTo(scriptCopy.statements) { it.transform() }
scriptCopy.explicitCallParameters = declaration.explicitCallParameters.map { it.transform() }
scriptCopy.implicitReceiversParameters = declaration.implicitReceiversParameters.map { it.transform() }
scriptCopy.providedProperties = declaration.providedProperties.map { it.first.transform() to it.second }
}
}