[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.backend.js.utils.*
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor 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.expressions.*
import org.jetbrains.kotlin.ir.types.isUnit import org.jetbrains.kotlin.ir.types.isUnit
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
@@ -85,7 +87,7 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
} }
override fun visitGetValue(expression: IrGetValue, context: JsGenerationContext): JsExpression { 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() return context.getNameForValueDeclaration(expression.symbol.owner).makeRef()
} }
@@ -271,4 +273,10 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
expression.left.accept(this, data), expression.left.accept(this, data),
expression.right.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) 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) { override fun visitDeclaration(declaration: IrDeclaration) {
if (declaration is IrDeclarationWithName && declaration is IrSymbolOwner) { if (declaration is IrDeclarationWithName && declaration is IrSymbolOwner) {
table.declareFreshName(declaration, declaration.name.asString()) table.declareFreshName(declaration, declaration.name.asString())