JS: fix translation of invoke convention call when it is declared as extension member inside class. See KT-15073
This commit is contained in:
@@ -1,6 +1,3 @@
|
||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||
// IGNORE_BACKEND: JS
|
||||
|
||||
class A
|
||||
|
||||
class B {
|
||||
|
||||
+1
-7
@@ -8744,13 +8744,7 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
@TestMetadata("extensionInvokeOnExpr.kt")
|
||||
public void testExtensionInvokeOnExpr() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/invoke/extensionInvokeOnExpr.kt");
|
||||
try {
|
||||
doTest(fileName);
|
||||
}
|
||||
catch (Throwable ignore) {
|
||||
return;
|
||||
}
|
||||
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("invoke.kt")
|
||||
|
||||
+7
-7
@@ -38,7 +38,7 @@ import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isInvokeCallOnVariabl
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.*
|
||||
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
@@ -194,12 +194,12 @@ fun computeExplicitReceiversForInvoke(
|
||||
}
|
||||
}
|
||||
|
||||
val dispatchReceiverExpression = translateReceiverAsExpression(dispatchReceiver)
|
||||
return when (Pair(dispatchReceiver != null, extensionReceiver != null)) {
|
||||
Pair(true, true) -> ExplicitReceivers(dispatchReceiverExpression, explicitReceivers.extensionOrDispatchReceiver)
|
||||
Pair(true, false) -> ExplicitReceivers(dispatchReceiverExpression)
|
||||
Pair(false, true) -> ExplicitReceivers(translateReceiverAsExpression(extensionReceiver))
|
||||
else -> throw AssertionError("'Invoke' resolved call without receivers: $callElement")
|
||||
return when (resolvedCall.explicitReceiverKind) {
|
||||
NO_EXPLICIT_RECEIVER -> ExplicitReceivers(null)
|
||||
DISPATCH_RECEIVER -> ExplicitReceivers(translateReceiverAsExpression(dispatchReceiver))
|
||||
EXTENSION_RECEIVER -> ExplicitReceivers(translateReceiverAsExpression(extensionReceiver))
|
||||
BOTH_RECEIVERS -> ExplicitReceivers(translateReceiverAsExpression(dispatchReceiver),
|
||||
translateReceiverAsExpression(extensionReceiver))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user