[JS IR BE] Fix invoke on dynamic types

This commit is contained in:
Roman Artemev
2018-10-17 19:19:39 +03:00
committed by romanart
parent ecba862dc9
commit 79f7cb11f0
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrDynamicType
import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -107,15 +108,11 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
return it(expression, context)
}
val dispatchReceiver = expression.dispatchReceiver
val jsDispatchReceiver = expression.dispatchReceiver?.accept(this, context)
val jsExtensionReceiver = expression.extensionReceiver?.accept(this, context)
val arguments = translateCallArguments(expression, context)
val isSuspend = (symbol.owner as? IrSimpleFunction)?.isSuspend ?: false
if (dispatchReceiver != null && symbol.owner.name == OperatorNameConventions.INVOKE && !isSuspend && dispatchReceiver.type.isFunctionTypeOrSubtype()
) {
if (isNativeInvoke(expression)) {
return JsInvocation(jsDispatchReceiver!!, arguments)
}
@@ -147,4 +144,15 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
else -> throw IllegalStateException("All type operator calls except IMPLICIT_CAST should be lowered at this point")
}
}
private fun isNativeInvoke(call: IrCall): Boolean {
val simpleFunction = call.symbol.owner as? IrSimpleFunction ?: return false
val receiverType = simpleFunction.dispatchReceiverParameter?.type ?: return false
if (simpleFunction.isSuspend) return false
if (receiverType is IrDynamicType) return call.origin == IrStatementOrigin.INVOKE
return simpleFunction.name == OperatorNameConventions.INVOKE && receiverType.isFunctionTypeOrSubtype()
}
}