///|
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)
}
}