JS backend: don't fail when invoke call got extension receiver implicitly
#EA-67456 Fixed
This commit is contained in:
@@ -61,4 +61,8 @@ public final class InvokeConventionTest extends AbstractExpressionTest {
|
||||
public void testInheritFromFunctionTraits() throws Exception {
|
||||
checkFooBoxIsOk();
|
||||
}
|
||||
|
||||
public void testInvokeWithImplicitDispatchReceiverAndExtensionReceiver() throws Exception {
|
||||
checkFooBoxIsOk();
|
||||
}
|
||||
}
|
||||
|
||||
+8
-4
@@ -28,11 +28,11 @@ import org.jetbrains.kotlin.psi.Call.CallType
|
||||
import org.jetbrains.kotlin.resolve.calls.CallResolverUtil
|
||||
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.scopes.receivers.ExpressionReceiver
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
import kotlin.platform.platformStatic
|
||||
import kotlin.test.assertNotNull
|
||||
|
||||
object CallTranslator {
|
||||
jvmOverloads
|
||||
@@ -131,12 +131,16 @@ fun computeExplicitReceiversForInvoke(
|
||||
val dispatchReceiver = resolvedCall.getDispatchReceiver()
|
||||
val extensionReceiver = resolvedCall.getExtensionReceiver()
|
||||
|
||||
if (dispatchReceiver.exists() && extensionReceiver.exists()) {
|
||||
assertNotNull(explicitReceivers.extensionOrDispatchReceiver, "No explicit receiver for 'invoke' resolved call with both receivers: $callElement")
|
||||
if (dispatchReceiver.exists() && extensionReceiver.exists() && resolvedCall.getExplicitReceiverKind() == ExplicitReceiverKind.BOTH_RECEIVERS) {
|
||||
assert(explicitReceivers.extensionOrDispatchReceiver != null) {
|
||||
"No explicit receiver for 'invoke' resolved call with both receivers: $callElement, text: ${callElement.getText()}" +
|
||||
"Dispatch receiver: $dispatchReceiver Extension receiver: $extensionReceiver"
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(explicitReceivers.extensionOrDispatchReceiver == null) {
|
||||
"Non trivial explicit receiver ${explicitReceivers.extensionOrDispatchReceiver}\n for 'invoke' resolved call: $callElement\n" +
|
||||
"Non trivial explicit receiver ${explicitReceivers.extensionOrDispatchReceiver}\n" +
|
||||
"for 'invoke' resolved call: $callElement, text: ${callElement.getText()}\n" +
|
||||
"Dispatch receiver: $dispatchReceiver Extension receiver: $extensionReceiver"
|
||||
}
|
||||
}
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package foo
|
||||
|
||||
fun A.f(s: String) = value + s
|
||||
|
||||
class A(val value: String) {
|
||||
fun bar(s: String) = (::f)(s)
|
||||
}
|
||||
|
||||
fun A.baz(s: String) = (::f)(s)
|
||||
|
||||
fun box(): String {
|
||||
val a = A("aaa")
|
||||
|
||||
assertEquals("aaa.bar()", a.bar(".bar()"))
|
||||
assertEquals("aaa.baz()", a.baz(".baz()"))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user