[JS IR] Use JsThisRef node for dispatch/instance receivers
This commit is contained in:
+9
-1
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user