@@ -575,34 +575,49 @@ ast::ExpressionPtr Translator::desugarMlhs(core::LocOffsets loc, PrismNode *lhs,
575575 auto callTargetNode = down_cast<pm_call_target_node>(c);
576576 auto receiverNode = callTargetNode->receiver ;
577577
578+ auto methodName = translateConstantName (callTargetNode->name );
579+ auto methodNameLoc = translateLoc (callTargetNode->message_loc );
580+
578581 if (PM_NODE_FLAG_P (callTargetNode, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
579- categoryCounterInc (" Prism fallback" , " PM_CALL_TARGET_NODE with PM_CALL_NODE_FLAGS_SAFE_NAVIGATION" );
580- throw PrismFallback{};
581- }
582+ auto body = [&val](ast::ExpressionPtr receiverTempLocal, core::LocOffsets parentLoc,
583+ core::NameRef methodName, core::LocOffsets methodNameLoc) {
584+ ast::Send::ARGS_store arguments;
585+ arguments.emplace_back (move (val));
582586
583- ast::ExpressionPtr receiver;
584- if (receiverNode == nullptr ) { // Convert `foo()` to `self.foo()`
585- receiver = MK::Self (zcloc);
586- } else {
587- receiver = desugar (receiverNode);
588- }
587+ return MK::Send (parentLoc, move (receiverTempLocal), methodName, methodNameLoc, 1 , move (arguments));
588+ };
589589
590- // Unsupported nodes are desugared to an empty tree.
591- // Treat them as if they were `self` to match `Desugar.cc`.
592- // TODO: Clean up after direct desugaring is complete.
593- // https://github.com/Shopify/sorbet/issues/671
594- ast::Send::Flags flags;
595- if (ast::isa_tree<ast::EmptyTree>(receiver)) {
596- receiver = MK::Self (zcloc);
597- flags.isPrivateOk = true ;
590+ auto recvLoc = translateLoc (receiverNode->location );
591+ auto csendRecvExpr = desugar (receiverNode);
592+ auto expr = desugarConditionalSend (cloc, move (csendRecvExpr), recvLoc,
593+ callTargetNode->name , callTargetNode->message_loc , body);
594+ stats.emplace_back (move (expr));
598595 } else {
599- flags.isPrivateOk = PM_NODE_FLAG_P (callTargetNode, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY);
600- }
596+ ast::ExpressionPtr receiver;
597+ if (receiverNode == nullptr ) { // Convert `foo()` to `self.foo()`
598+ receiver = MK::Self (zcloc);
599+ } else {
600+ receiver = desugar (receiverNode);
601+ }
601602
602- auto methodName = translateConstantName (callTargetNode->name );
603- auto methodNameLoc = translateLoc (callTargetNode->message_loc );
604- ast::Send::ARGS_store emptyArgs;
605- stats.emplace_back (MK::Send (cloc, move (receiver), methodName, methodNameLoc, 0 , move (emptyArgs), flags));
603+ // Unsupported nodes are desugared to an empty tree.
604+ // Treat them as if they were `self` to match `Desugar.cc`.
605+ // TODO: Clean up after direct desugaring is complete.
606+ // https://github.com/Shopify/sorbet/issues/671
607+ ast::Send::Flags flags;
608+ if (ast::isa_tree<ast::EmptyTree>(receiver)) {
609+ receiver = MK::Self (zcloc);
610+ flags.isPrivateOk = true ;
611+ } else {
612+ flags.isPrivateOk = PM_NODE_FLAG_P (callTargetNode, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY);
613+ }
614+
615+ ast::Send::ARGS_store arguments;
616+ arguments.emplace_back (move (val));
617+
618+ stats.emplace_back (
619+ MK::Send (cloc, move (receiver), methodName, methodNameLoc, 1 , move (arguments), flags));
620+ }
606621 } else {
607622 ast::ExpressionPtr lh = desugar (c);
608623 if (auto restParam = ast::cast_tree<ast::RestParam>(lh)) {
0 commit comments