[JS IR] Use JsThisRef node for dispatch/instance receivers

This commit is contained in:
Roman Artemev
2020-03-02 13:52:21 +03:00
committed by romanart
parent 62c86f2813
commit c4efd5a09b
2 changed files with 9 additions and 11 deletions
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.backend.js.utils.*
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.types.isUnit
import org.jetbrains.kotlin.ir.util.*
@@ -85,7 +87,7 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
}
override fun visitGetValue(expression: IrGetValue, context: JsGenerationContext): JsExpression {
if (expression.symbol.owner === context.currentFunction?.dispatchReceiverParameter) return JsThisRef()
if (expression.symbol.owner.isThisReceiver()) return JsThisRef()
return context.getNameForValueDeclaration(expression.symbol.owner).makeRef()
}
@@ -271,4 +273,10 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
expression.left.accept(this, data),
expression.right.accept(this, data)
)
private fun IrValueDeclaration.isThisReceiver(): Boolean = when (val p = parent) {
is IrSimpleFunction -> this === p.dispatchReceiverParameter
is IrClass -> this === p.thisReceiver
else -> false
}
}
@@ -372,16 +372,6 @@ class NameTables(
element.acceptChildrenVoid(this)
}
override fun visitValueParameter(declaration: IrValueParameter) {
val parentFunction = declaration.parent as? IrFunction
if ((declaration.origin == IrDeclarationOrigin.INSTANCE_RECEIVER && declaration.name.isSpecial) ||
(parentFunction != null && declaration == parentFunction.dispatchReceiverParameter)
)
table.declareStableName(declaration, Namer.IMPLICIT_RECEIVER_NAME)
else
super.visitValueParameter(declaration)
}
override fun visitDeclaration(declaration: IrDeclaration) {
if (declaration is IrDeclarationWithName && declaration is IrSymbolOwner) {
table.declareFreshName(declaration, declaration.name.asString())