docs: private void handleMsgIdCall(FunctionNode fn, MsgFallbackGroupNode msgNode) {
      ExprNode msgIdNode;
      long primaryMsgId = MsgUtils.computeMsgIdForDualFormat(msgNode.getChild(0));
      if (msgNode.numChildren() == 1) {
        // easy peasy
        msgIdNode = createMsgIdNode(primaryMsgId, fn.getSourceLocation());
      } else {
        long fallbackMsgId = MsgUtils.computeMsgIdForDualFormat(msgNode.getChild(1));
        ConditionalOpNode condOpNode = new ConditionalOpNode(fn.getSourceLocation());
        FunctionNode isPrimaryMsgInUse =
            new FunctionNode(
                Identifier.create(
                    BuiltinFunction.IS_PRIMARY_MSG_IN_USE.getName(), fn.getSourceLocation()),
                BuiltinFunction.IS_PRIMARY_MSG_IN_USE,
                fn.getSourceLocation());
        // We add the varRef, and the 2 message ids to the funcitonnode as arguments so they are
        // trivial to access in the backends.  This is a little hacky however since we never generate
        // code for these things.
        // We could formalize the hack by providing a way to stash arbitrary data in the FunctionNode
        // and then just pack this up in a non-AST datastructure.
        isPrimaryMsgInUse.addChild(fn.getChild(0).copy(new CopyState()));
        isPrimaryMsgInUse.addChild(new IntegerNode(primaryMsgId, fn.getSourceLocation()));
        isPrimaryMsgInUse.addChild(new IntegerNode(fallbackMsgId, fn.getSourceLocation()));
        condOpNode.addChild(isPrimaryMsgInUse);
        condOpNode.addChild(createMsgIdNode(primaryMsgId, fn.getSourceLocation()));
        condOpNode.addChild(createMsgIdNode(fallbackMsgId, fn.getSourceLocation()));
        msgIdNode = condOpNode;
      }
      // We need to generate a record literal
      // This map literal has 2 keys: 'id' and 'msg'
      RecordLiteralNode recordLiteral =
          new RecordLiteralNode(
              Identifier.create("record", fn.getSourceLocation()),
              ImmutableList.of(
                  Identifier.create("id", fn.getSourceLocation()),
                  Identifier.create("msg", fn.getSourceLocation())),
              fn.getSourceLocation());
      recordLiteral.addChildren(ImmutableList.of(msgIdNode, fn.getChild(0).copy(new CopyState())));
      fn.getParent().replaceChild(fn, recordLiteral);
    }