JS: small fixes after conversion
This commit is contained in:
+1
-1
@@ -74,7 +74,7 @@ fun VariableAccessInfo.constructAccessExpression(ref: JsExpression): JsExpressio
|
|||||||
val FunctionCallInfo.functionName: JsName
|
val FunctionCallInfo.functionName: JsName
|
||||||
get() = context.getNameForDescriptor(callableDescriptor)
|
get() = context.getNameForDescriptor(callableDescriptor)
|
||||||
|
|
||||||
fun FunctionCallInfo.hasSpreadOperator(): Boolean = argumentsInfo.isHasSpreadOperator()
|
fun FunctionCallInfo.hasSpreadOperator(): Boolean = argumentsInfo.hasSpreadOperator
|
||||||
|
|
||||||
fun TranslationContext.aliasOrValue(callableDescriptor: CallableDescriptor, value: (CallableDescriptor) -> JsExpression): JsExpression {
|
fun TranslationContext.aliasOrValue(callableDescriptor: CallableDescriptor, value: (CallableDescriptor) -> JsExpression): JsExpression {
|
||||||
val alias = getAliasForDescriptor(callableDescriptor)
|
val alias = getAliasForDescriptor(callableDescriptor)
|
||||||
|
|||||||
+19
-19
@@ -51,9 +51,9 @@ public fun addReceiverToArgs(receiver: JsExpression, arguments: List<JsExpressio
|
|||||||
object DefaultFunctionCallCase : FunctionCallCase {
|
object DefaultFunctionCallCase : FunctionCallCase {
|
||||||
// TODO: refactor after fix ArgumentsInfo - duplicate code
|
// TODO: refactor after fix ArgumentsInfo - duplicate code
|
||||||
private fun nativeSpreadFunWithDispatchOrExtensionReceiver(argumentsInfo: CallArgumentTranslator.ArgumentsInfo, functionName: JsName): JsExpression {
|
private fun nativeSpreadFunWithDispatchOrExtensionReceiver(argumentsInfo: CallArgumentTranslator.ArgumentsInfo, functionName: JsName): JsExpression {
|
||||||
val cachedReceiver = argumentsInfo.getCachedReceiver()!!
|
val cachedReceiver = argumentsInfo.cachedReceiver!!
|
||||||
val functionCallRef = Namer.getFunctionApplyRef(JsNameRef(functionName, cachedReceiver.assignmentExpression()))
|
val functionCallRef = Namer.getFunctionApplyRef(JsNameRef(functionName, cachedReceiver.assignmentExpression()))
|
||||||
return JsInvocation(functionCallRef, argumentsInfo.getTranslateArguments())
|
return JsInvocation(functionCallRef, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildDefaultCallWithDispatchReceiver(argumentsInfo: CallArgumentTranslator.ArgumentsInfo,
|
fun buildDefaultCallWithDispatchReceiver(argumentsInfo: CallArgumentTranslator.ArgumentsInfo,
|
||||||
@@ -65,7 +65,7 @@ object DefaultFunctionCallCase : FunctionCallCase {
|
|||||||
return nativeSpreadFunWithDispatchOrExtensionReceiver(argumentsInfo, functionName)
|
return nativeSpreadFunWithDispatchOrExtensionReceiver(argumentsInfo, functionName)
|
||||||
}
|
}
|
||||||
val functionRef = JsNameRef(functionName, dispatchReceiver)
|
val functionRef = JsNameRef(functionName, dispatchReceiver)
|
||||||
return JsInvocation(functionRef, argumentsInfo.getTranslateArguments())
|
return JsInvocation(functionRef, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildDefaultCallWithoutReceiver(context: TranslationContext,
|
fun buildDefaultCallWithoutReceiver(context: TranslationContext,
|
||||||
@@ -76,17 +76,17 @@ object DefaultFunctionCallCase : FunctionCallCase {
|
|||||||
hasSpreadOperator: Boolean): JsExpression {
|
hasSpreadOperator: Boolean): JsExpression {
|
||||||
if (isNative && hasSpreadOperator) {
|
if (isNative && hasSpreadOperator) {
|
||||||
val functionCallRef = Namer.getFunctionApplyRef(JsNameRef(functionName))
|
val functionCallRef = Namer.getFunctionApplyRef(JsNameRef(functionName))
|
||||||
return JsInvocation(functionCallRef, argumentsInfo.getTranslateArguments())
|
return JsInvocation(functionCallRef, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
if (isNative) {
|
if (isNative) {
|
||||||
return JsInvocation(JsNameRef(functionName), argumentsInfo.getTranslateArguments())
|
return JsInvocation(JsNameRef(functionName), argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
val functionRef = context.aliasOrValue(callableDescriptor) {
|
val functionRef = context.aliasOrValue(callableDescriptor) {
|
||||||
val qualifierForFunction = context.getQualifierForDescriptor(it)
|
val qualifierForFunction = context.getQualifierForDescriptor(it)
|
||||||
JsNameRef(functionName, qualifierForFunction)
|
JsNameRef(functionName, qualifierForFunction)
|
||||||
}
|
}
|
||||||
return JsInvocation(functionRef, argumentsInfo.getTranslateArguments())
|
return JsInvocation(functionRef, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun FunctionCallInfo.noReceivers(): JsExpression {
|
override fun FunctionCallInfo.noReceivers(): JsExpression {
|
||||||
@@ -102,7 +102,7 @@ object DefaultFunctionCallCase : FunctionCallCase {
|
|||||||
return nativeSpreadFunWithDispatchOrExtensionReceiver(argumentsInfo, functionName)
|
return nativeSpreadFunWithDispatchOrExtensionReceiver(argumentsInfo, functionName)
|
||||||
}
|
}
|
||||||
if (isNative()) {
|
if (isNative()) {
|
||||||
return JsInvocation(JsNameRef(functionName, extensionReceiver), argumentsInfo.getTranslateArguments())
|
return JsInvocation(JsNameRef(functionName, extensionReceiver), argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
val functionRef = context.aliasOrValue(callableDescriptor) {
|
val functionRef = context.aliasOrValue(callableDescriptor) {
|
||||||
@@ -118,20 +118,20 @@ object DefaultFunctionCallCase : FunctionCallCase {
|
|||||||
functionRef
|
functionRef
|
||||||
}
|
}
|
||||||
|
|
||||||
return JsInvocation(referenceToCall, addReceiverToArgs(extensionReceiver!!, argumentsInfo.getTranslateArguments()))
|
return JsInvocation(referenceToCall, addReceiverToArgs(extensionReceiver!!, argumentsInfo.translateArguments))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun FunctionCallInfo.bothReceivers(): JsExpression {
|
override fun FunctionCallInfo.bothReceivers(): JsExpression {
|
||||||
// TODO: think about crazy case: spreadOperator + native
|
// TODO: think about crazy case: spreadOperator + native
|
||||||
val functionRef = JsNameRef(functionName, dispatchReceiver!!)
|
val functionRef = JsNameRef(functionName, dispatchReceiver!!)
|
||||||
return JsInvocation(functionRef, addReceiverToArgs(extensionReceiver!!, argumentsInfo.getTranslateArguments()))
|
return JsInvocation(functionRef, addReceiverToArgs(extensionReceiver!!, argumentsInfo.translateArguments))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
object DelegateFunctionIntrinsic : DelegateIntrinsic<FunctionCallInfo> {
|
object DelegateFunctionIntrinsic : DelegateIntrinsic<FunctionCallInfo> {
|
||||||
override fun FunctionCallInfo.getArgs(): List<JsExpression> {
|
override fun FunctionCallInfo.getArgs(): List<JsExpression> {
|
||||||
return argumentsInfo.getTranslateArguments()
|
return argumentsInfo.translateArguments
|
||||||
}
|
}
|
||||||
override fun FunctionCallInfo.getDescriptor(): CallableDescriptor {
|
override fun FunctionCallInfo.getDescriptor(): CallableDescriptor {
|
||||||
return callableDescriptor
|
return callableDescriptor
|
||||||
@@ -149,17 +149,17 @@ abstract class AnnotatedAsNativeXCallCase(val annotation: PredefinedAnnotation)
|
|||||||
|
|
||||||
object NativeInvokeCallCase : AnnotatedAsNativeXCallCase(PredefinedAnnotation.NATIVE_INVOKE) {
|
object NativeInvokeCallCase : AnnotatedAsNativeXCallCase(PredefinedAnnotation.NATIVE_INVOKE) {
|
||||||
override fun translateCall(receiver: JsExpression, argumentsInfo: CallArgumentTranslator.ArgumentsInfo) =
|
override fun translateCall(receiver: JsExpression, argumentsInfo: CallArgumentTranslator.ArgumentsInfo) =
|
||||||
JsInvocation(receiver, argumentsInfo.getTranslateArguments())
|
JsInvocation(receiver, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
object NativeGetterCallCase : AnnotatedAsNativeXCallCase(PredefinedAnnotation.NATIVE_GETTER) {
|
object NativeGetterCallCase : AnnotatedAsNativeXCallCase(PredefinedAnnotation.NATIVE_GETTER) {
|
||||||
override fun translateCall(receiver: JsExpression, argumentsInfo: CallArgumentTranslator.ArgumentsInfo) =
|
override fun translateCall(receiver: JsExpression, argumentsInfo: CallArgumentTranslator.ArgumentsInfo) =
|
||||||
JsArrayAccess(receiver, argumentsInfo.getTranslateArguments()[0])
|
JsArrayAccess(receiver, argumentsInfo.translateArguments[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
object NativeSetterCallCase : AnnotatedAsNativeXCallCase(PredefinedAnnotation.NATIVE_SETTER) {
|
object NativeSetterCallCase : AnnotatedAsNativeXCallCase(PredefinedAnnotation.NATIVE_SETTER) {
|
||||||
override fun translateCall(receiver: JsExpression, argumentsInfo: CallArgumentTranslator.ArgumentsInfo): JsExpression {
|
override fun translateCall(receiver: JsExpression, argumentsInfo: CallArgumentTranslator.ArgumentsInfo): JsExpression {
|
||||||
val args = argumentsInfo.getTranslateArguments()
|
val args = argumentsInfo.translateArguments
|
||||||
return JsAstUtils.assignment(JsArrayAccess(receiver, args[0]), args[1])
|
return JsAstUtils.assignment(JsArrayAccess(receiver, args[0]), args[1])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,7 +183,7 @@ object InvokeIntrinsic : FunctionCallCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun FunctionCallInfo.dispatchReceiver(): JsExpression {
|
override fun FunctionCallInfo.dispatchReceiver(): JsExpression {
|
||||||
return JsInvocation(dispatchReceiver, argumentsInfo.getTranslateArguments())
|
return JsInvocation(dispatchReceiver, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -200,7 +200,7 @@ object InvokeIntrinsic : FunctionCallCase {
|
|||||||
* extLambda.call(obj, some, args)
|
* extLambda.call(obj, some, args)
|
||||||
*/
|
*/
|
||||||
override fun FunctionCallInfo.bothReceivers(): JsExpression {
|
override fun FunctionCallInfo.bothReceivers(): JsExpression {
|
||||||
return JsInvocation(Namer.getFunctionCallRef(dispatchReceiver!!), addReceiverToArgs(extensionReceiver!!, argumentsInfo.getTranslateArguments()))
|
return JsInvocation(Namer.getFunctionCallRef(dispatchReceiver!!), addReceiverToArgs(extensionReceiver!!, argumentsInfo.translateArguments))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ object ConstructorCallCase : FunctionCallCase {
|
|||||||
|
|
||||||
val functionRef = if (isNative()) fqName else context.aliasOrValue(callableDescriptor) { fqName }
|
val functionRef = if (isNative()) fqName else context.aliasOrValue(callableDescriptor) { fqName }
|
||||||
|
|
||||||
return JsNew(functionRef, argumentsInfo.getTranslateArguments())
|
return JsNew(functionRef, argumentsInfo.translateArguments)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ object SuperCallCase : FunctionCallCase {
|
|||||||
// TODO: spread operator
|
// TODO: spread operator
|
||||||
val prototypeClass = JsNameRef(Namer.getPrototypeName(), dispatchReceiver!!)
|
val prototypeClass = JsNameRef(Namer.getPrototypeName(), dispatchReceiver!!)
|
||||||
val functionRef = Namer.getFunctionCallRef(JsNameRef(functionName, prototypeClass))
|
val functionRef = Namer.getFunctionCallRef(JsNameRef(functionName, prototypeClass))
|
||||||
return JsInvocation(functionRef, addReceiverToArgs(JsLiteral.THIS, argumentsInfo.getTranslateArguments()))
|
return JsInvocation(functionRef, addReceiverToArgs(JsLiteral.THIS, argumentsInfo.translateArguments))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +236,7 @@ object DynamicInvokeAndBracketAccessCallCase : FunctionCallCase {
|
|||||||
callInfo.resolvedCall.getCall().getCallType() != Call.CallType.DEFAULT && callInfo.callableDescriptor.isDynamic()
|
callInfo.resolvedCall.getCall().getCallType() != Call.CallType.DEFAULT && callInfo.callableDescriptor.isDynamic()
|
||||||
|
|
||||||
override fun FunctionCallInfo.dispatchReceiver(): JsExpression {
|
override fun FunctionCallInfo.dispatchReceiver(): JsExpression {
|
||||||
val arguments = argumentsInfo.getTranslateArguments()
|
val arguments = argumentsInfo.translateArguments
|
||||||
val callType = resolvedCall.getCall().getCallType()
|
val callType = resolvedCall.getCall().getCallType()
|
||||||
return when (callType) {
|
return when (callType) {
|
||||||
Call.CallType.INVOKE ->
|
Call.CallType.INVOKE ->
|
||||||
@@ -264,7 +264,7 @@ object DynamicOperatorCallCase : FunctionCallCase {
|
|||||||
val callElement = resolvedCall.getCall().getCallElement() as JetOperationExpression
|
val callElement = resolvedCall.getCall().getCallElement() as JetOperationExpression
|
||||||
val operationToken = PsiUtils.getOperationToken(callElement)
|
val operationToken = PsiUtils.getOperationToken(callElement)
|
||||||
|
|
||||||
val arguments = argumentsInfo.getTranslateArguments()
|
val arguments = argumentsInfo.translateArguments
|
||||||
|
|
||||||
return when (callElement) {
|
return when (callElement) {
|
||||||
is JetBinaryExpression -> {
|
is JetBinaryExpression -> {
|
||||||
|
|||||||
+28
-29
@@ -33,38 +33,37 @@ import org.jetbrains.kotlin.resolve.calls.model.*
|
|||||||
|
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
|
import kotlin.platform.platformStatic
|
||||||
|
|
||||||
public class CallArgumentTranslator private(private val resolvedCall: ResolvedCall<*>, private val receiver: JsExpression?, context: TranslationContext) : AbstractTranslator(context) {
|
public class CallArgumentTranslator private (
|
||||||
|
private val resolvedCall: ResolvedCall<*>,
|
||||||
|
private val receiver: JsExpression?,
|
||||||
|
context: TranslationContext
|
||||||
|
) : AbstractTranslator(context) {
|
||||||
|
|
||||||
public class ArgumentsInfo(public val translateArguments: List<JsExpression>, private val hasSpreadOperator: Boolean, public val cachedReceiver: TemporaryConstVariable) {
|
public class ArgumentsInfo(
|
||||||
|
public val translateArguments: List<JsExpression>,
|
||||||
public fun isHasSpreadOperator(): Boolean {
|
public val hasSpreadOperator: Boolean,
|
||||||
return hasSpreadOperator
|
public val cachedReceiver: TemporaryConstVariable?
|
||||||
}
|
)
|
||||||
}
|
|
||||||
|
|
||||||
private enum class ArgumentsKind {
|
private enum class ArgumentsKind {
|
||||||
HAS_EMPTY_EXPRESSION_ARGUMENT
|
HAS_EMPTY_EXPRESSION_ARGUMENT
|
||||||
HAS_NOT_EMPTY_EXPRESSION_ARGUMENT
|
HAS_NOT_EMPTY_EXPRESSION_ARGUMENT
|
||||||
}
|
}
|
||||||
|
|
||||||
private val isNativeFunctionCall: Boolean
|
private val isNativeFunctionCall = AnnotationsUtils.isNativeObject(resolvedCall.getCandidateDescriptor())
|
||||||
|
|
||||||
{
|
private fun removeLastUndefinedArguments(result: MutableList<JsExpression>) {
|
||||||
this.isNativeFunctionCall = AnnotationsUtils.isNativeObject(resolvedCall.getCandidateDescriptor())
|
var i = result.size() - 1
|
||||||
}
|
|
||||||
|
|
||||||
private fun removeLastUndefinedArguments(result: List<JsExpression>) {
|
while (i >= 0) {
|
||||||
var i: Int
|
if (result.get(i) != context().namer().getUndefinedExpression()) {
|
||||||
run {
|
break
|
||||||
i = result.size() - 1
|
|
||||||
while (i >= 0) {
|
|
||||||
if (result.get(i) != context().namer().getUndefinedExpression()) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
i--
|
|
||||||
}
|
}
|
||||||
|
i--
|
||||||
}
|
}
|
||||||
|
|
||||||
result.subList(i + 1, result.size()).clear()
|
result.subList(i + 1, result.size()).clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,15 +96,13 @@ public class CallArgumentTranslator private(private val resolvedCall: ResolvedCa
|
|||||||
val arguments = actualArgument.getArguments()
|
val arguments = actualArgument.getArguments()
|
||||||
|
|
||||||
val size = arguments.size()
|
val size = arguments.size()
|
||||||
run {
|
var i = 0
|
||||||
var i = 0
|
while (i != size) {
|
||||||
while (i != size) {
|
if (arguments.get(i).getSpreadElement() != null) {
|
||||||
if (arguments.get(i).getSpreadElement() != null) {
|
hasSpreadOperator = true
|
||||||
hasSpreadOperator = true
|
break
|
||||||
break
|
|
||||||
}
|
|
||||||
++i
|
|
||||||
}
|
}
|
||||||
|
++i
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasSpreadOperator) {
|
if (hasSpreadOperator) {
|
||||||
@@ -149,7 +146,7 @@ public class CallArgumentTranslator private(private val resolvedCall: ResolvedCa
|
|||||||
concatArguments!!.add(0, JsArrayLiteral(argsBeforeVararg))
|
concatArguments!!.add(0, JsArrayLiteral(argsBeforeVararg))
|
||||||
}
|
}
|
||||||
|
|
||||||
result = SmartList(concatArgumentsIfNeeded(concatArguments))
|
result = SmartList(concatArgumentsIfNeeded(concatArguments!!))
|
||||||
|
|
||||||
if (receiver != null) {
|
if (receiver != null) {
|
||||||
cachedReceiver = context().getOrDeclareTemporaryConstVariable(receiver)
|
cachedReceiver = context().getOrDeclareTemporaryConstVariable(receiver)
|
||||||
@@ -166,10 +163,12 @@ public class CallArgumentTranslator private(private val resolvedCall: ResolvedCa
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
platformStatic
|
||||||
public fun translate(resolvedCall: ResolvedCall<*>, receiver: JsExpression?, context: TranslationContext): ArgumentsInfo {
|
public fun translate(resolvedCall: ResolvedCall<*>, receiver: JsExpression?, context: TranslationContext): ArgumentsInfo {
|
||||||
return translate(resolvedCall, receiver, context, context.dynamicContext().jsBlock())
|
return translate(resolvedCall, receiver, context, context.dynamicContext().jsBlock())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platformStatic
|
||||||
public fun translate(resolvedCall: ResolvedCall<*>, receiver: JsExpression?, context: TranslationContext, block: JsBlock): ArgumentsInfo {
|
public fun translate(resolvedCall: ResolvedCall<*>, receiver: JsExpression?, context: TranslationContext, block: JsBlock): ArgumentsInfo {
|
||||||
val innerContext = context.innerBlock(block)
|
val innerContext = context.innerBlock(block)
|
||||||
val argumentTranslator = CallArgumentTranslator(resolvedCall, receiver, innerContext)
|
val argumentTranslator = CallArgumentTranslator(resolvedCall, receiver, innerContext)
|
||||||
|
|||||||
Reference in New Issue
Block a user