///|
fn print_argument_kind(
  kind : @syntax.ArgumentKind,
  value : @syntax.Expr,
  logger : StringBuilder,
) -> Unit {
  match kind {
    Positional => print_expr(value, logger)
    Labelled(label) => {
      print_label(label, logger)
      logger.write_string("=")
      print_expr(value, logger)
    }
    LabelledPun(label) => {
      print_label(label, logger)
      logger.write_string("~")
    }
    LabelledOption(label~, ..) => {
      print_label(label, logger)
      logger.write_string("?=")
      print_expr(value, logger)
    }
    LabelledOptionPun(label~, ..) => {
      print_label(label, logger)
      logger.write_string("?~")
    }
  }
}

///|
fn print_argument(arg : @syntax.Argument, logger : StringBuilder) -> Unit {
  // Special case: if we have Apply(Ident(name), [], Question) as a positional argument,
  // treat it as a labelled optional pun (name?~name)
  match (arg.kind, arg.value) {
    (Positional, Apply(func~, args~, attr~, ..)) =>
      match (func, args.is_empty(), attr) {
        (Ident(id~, ..), true, Question) => {
          // Convert to labelled optional pun format
          let name_str = match id.name {
            Ident(name~) => name
            Dot(pkg~, id~) => {
              let _ = pkg
              id
            }
          }
          logger.write_string(name_str)
          logger.write_string("?~")
          logger.write_string(name_str)
          return
        }
        _ => print_argument_kind(arg.kind, arg.value, logger)
      }
    _ => print_argument_kind(arg.kind, arg.value, logger)
  }
}

///|
fn print_spreadable_elem(
  elem : @syntax.SpreadableElem,
  logger : StringBuilder,
) -> Unit {
  match elem {
    Regular(expr) => print_expr(expr, logger)
    Spread(expr~, ..) => {
      logger.write_string(".. ")
      print_expr(expr, logger)
    }
  }
}

///|
fn print_field_def(field : @syntax.FieldDef, logger : StringBuilder) -> Unit {
  if field.is_pun {
    print_label(field.label, logger)
  } else {
    print_label(field.label, logger)
    logger.write_string(": ")
    print_expr(field.expr, logger)
  }
}