1use wdl_ast::SyntaxKind;
4
5use crate::PreToken;
6use crate::TokenStream;
7use crate::Writable as _;
8use crate::element::FormatElement;
9
10pub fn format_sep_option(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
16 let mut children = element.children().expect("sep option children");
17
18 let sep_keyword = children.next().expect("sep keyword");
19 assert!(sep_keyword.element().kind() == SyntaxKind::Ident);
20 (&sep_keyword).write(stream);
21
22 let equals = children.next().expect("sep equals");
23 assert!(equals.element().kind() == SyntaxKind::Assignment);
24 (&equals).write(stream);
25
26 let sep_value = children.next().expect("sep value");
27 assert!(sep_value.element().kind() == SyntaxKind::LiteralStringNode);
28 (&sep_value).write(stream);
29 stream.end_word();
30}
31
32pub fn format_default_option(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
38 let mut children = element.children().expect("default option children");
39
40 let default_keyword = children.next().expect("default keyword");
41 assert!(default_keyword.element().kind() == SyntaxKind::Ident);
42 (&default_keyword).write(stream);
43
44 let equals = children.next().expect("default equals");
45 assert!(equals.element().kind() == SyntaxKind::Assignment);
46 (&equals).write(stream);
47
48 let default_value = children.next().expect("default value");
49 (&default_value).write(stream);
50 stream.end_word();
51}
52
53pub fn format_true_false_option(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
59 let mut children = element.children().expect("true false option children");
60
61 let first_keyword = children.next().expect("true false option first keyword");
62 let first_keyword_kind = first_keyword.element().kind();
63 assert!(
64 first_keyword_kind == SyntaxKind::TrueKeyword
65 || first_keyword_kind == SyntaxKind::FalseKeyword
66 );
67
68 let first_equals = children.next().expect("true false option first equals");
69 assert!(first_equals.element().kind() == SyntaxKind::Assignment);
70
71 let first_value = children.next().expect("true false option first value");
72
73 let second_keyword = children.next().expect("true false option second keyword");
74 let second_keyword_kind = second_keyword.element().kind();
75 assert!(
76 second_keyword_kind == SyntaxKind::TrueKeyword
77 || second_keyword_kind == SyntaxKind::FalseKeyword
78 );
79
80 let second_equals = children.next().expect("true false option second equals");
81 assert!(second_equals.element().kind() == SyntaxKind::Assignment);
82
83 let second_value = children.next().expect("true false option second value");
84
85 if first_keyword_kind == SyntaxKind::TrueKeyword {
86 assert!(second_keyword_kind == SyntaxKind::FalseKeyword);
87 (&first_keyword).write(stream);
88 (&first_equals).write(stream);
89 (&first_value).write(stream);
90 stream.end_word();
91 (&second_keyword).write(stream);
92 (&second_equals).write(stream);
93 (&second_value).write(stream);
94 } else {
95 assert!(second_keyword_kind == SyntaxKind::TrueKeyword);
96 (&second_keyword).write(stream);
97 (&second_equals).write(stream);
98 (&second_value).write(stream);
99 stream.end_word();
100 (&first_keyword).write(stream);
101 (&first_equals).write(stream);
102 (&first_value).write(stream);
103 }
104 stream.end_word();
105}
106
107pub fn format_placeholder(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
113 let mut children = element.children().expect("placeholder children");
114
115 let open = children.next().expect("placeholder open");
116 assert!(open.element().kind() == SyntaxKind::PlaceholderOpen);
117 let syntax = open.element().inner();
118 let text = syntax.as_token().expect("token").text();
119 match text {
120 "${" => {
121 stream.push_literal_in_place_of_token(
122 open.element().as_token().expect("token"),
123 "~{".to_owned(),
124 );
125 }
126 "~{" => {
127 (&open).write(stream);
128 }
129 _ => {
130 unreachable!("unexpected placeholder open: {:?}", text);
131 }
132 }
133
134 for child in children {
135 (&child).write(stream);
136 }
137}
138
139pub fn format_literal_string(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
145 for child in element.children().expect("literal string children") {
146 match child.element().kind() {
147 SyntaxKind::SingleQuote => {
148 stream.push_literal_in_place_of_token(
149 child.element().as_token().expect("token"),
150 "\"".to_owned(),
151 );
152 }
153 SyntaxKind::OpenHeredoc | SyntaxKind::CloseHeredoc | SyntaxKind::DoubleQuote => {
154 (&child).write(stream);
155 }
156 SyntaxKind::LiteralStringText => {
157 let mut replacement = String::new();
158 let syntax = child.element().inner();
159 let mut chars = syntax.as_token().expect("token").text().chars().peekable();
160 let mut prev_c = None;
161 while let Some(c) = chars.next() {
162 match c {
163 '\\' => {
164 if let Some(next_c) = chars.peek() {
165 if *next_c == '\'' {
166 prev_c = Some(c);
170 continue;
171 }
172 }
173 replacement.push(c);
174 }
175 '"' => {
176 if let Some(pc) = prev_c {
177 if pc != '\\' {
178 replacement.push('\\');
182 }
183 }
184 replacement.push(c);
185 }
186 _ => {
187 replacement.push(c);
188 }
189 }
190 prev_c = Some(c);
191 }
192
193 stream.push_literal_in_place_of_token(
194 child.element().as_token().expect("token"),
195 replacement,
196 );
197 }
198 SyntaxKind::PlaceholderNode => {
199 (&child).write(stream);
200 }
201 _ => {
202 unreachable!(
203 "unexpected child in literal string: {:?}",
204 child.element().kind()
205 );
206 }
207 }
208 }
209}
210
211pub fn format_literal_none(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
217 let mut children = element.children().expect("literal none children");
218 let none = children.next().expect("literal none token");
219 assert!(none.element().kind() == SyntaxKind::NoneKeyword);
220 (&none).write(stream);
221}
222
223pub fn format_literal_pair(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
229 let mut children = element.children().expect("literal pair children");
230
231 let open_paren = children.next().expect("literal pair open paren");
232 assert!(open_paren.element().kind() == SyntaxKind::OpenParen);
233 (&open_paren).write(stream);
234
235 let left = children.next().expect("literal pair left");
236 (&left).write(stream);
237
238 let comma = children.next().expect("literal pair comma");
239 assert!(comma.element().kind() == SyntaxKind::Comma);
240 (&comma).write(stream);
241 stream.end_word();
242
243 let right = children.next().expect("literal pair right");
244 (&right).write(stream);
245
246 let close_paren = children.next().expect("literal pair close paren");
247 assert!(close_paren.element().kind() == SyntaxKind::CloseParen);
248 (&close_paren).write(stream);
249}
250
251pub fn format_literal_boolean(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
257 let mut children = element.children().expect("literal boolean children");
258 let bool = children.next().expect("literal boolean token");
259 (&bool).write(stream);
260}
261
262pub fn format_negation_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
268 let mut children = element.children().expect("negation expr children");
269 let minus = children.next().expect("negation expr minus");
270 assert!(minus.element().kind() == SyntaxKind::Minus);
271 (&minus).write(stream);
272
273 let expr = children.next().expect("negation expr expr");
274 (&expr).write(stream);
275}
276
277pub fn format_literal_integer(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
283 for child in element.children().expect("literal integer children") {
284 (&child).write(stream);
285 }
286}
287
288pub fn format_literal_float(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
294 for child in element.children().expect("literal float children") {
295 (&child).write(stream);
296 }
297}
298
299pub fn format_name_ref_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
305 let mut children = element.children().expect("name ref children");
306 let name = children.next().expect("name ref name");
307 (&name).write(stream);
308}
309
310pub fn format_literal_array(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
316 let mut children = element.children().expect("literal array children");
317
318 let open_bracket = children.next().expect("literal array open bracket");
319 assert!(open_bracket.element().kind() == SyntaxKind::OpenBracket);
320 (&open_bracket).write(stream);
321
322 let mut items = Vec::new();
323 let mut commas = Vec::new();
324 let mut close_bracket = None;
325
326 for child in children {
327 match child.element().kind() {
328 SyntaxKind::CloseBracket => {
329 close_bracket = Some(child.to_owned());
330 }
331 SyntaxKind::Comma => {
332 commas.push(child.to_owned());
333 }
334 _ => {
335 items.push(child.to_owned());
336 }
337 }
338 }
339
340 let empty = items.is_empty();
341 if !empty {
342 stream.increment_indent();
343 }
344 let mut commas = commas.iter();
345 for item in items {
346 (&item).write(stream);
347 if let Some(comma) = commas.next() {
348 (comma).write(stream);
349 } else {
350 stream.push_literal(",".to_string(), SyntaxKind::Comma);
351 }
352 stream.end_line();
353 }
354
355 if !empty {
356 stream.decrement_indent();
357 }
358 (&close_bracket.expect("literal array close bracket")).write(stream);
359}
360
361pub fn format_literal_map_item(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
367 let mut children = element.children().expect("literal map item children");
368
369 let key = children.next().expect("literal map item key");
370 (&key).write(stream);
371
372 let colon = children.next().expect("literal map item colon");
373 assert!(colon.element().kind() == SyntaxKind::Colon);
374 (&colon).write(stream);
375 stream.end_word();
376
377 let value = children.next().expect("literal map item value");
378 (&value).write(stream);
379}
380
381pub fn format_literal_map(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
387 let mut children = element.children().expect("literal map children");
388
389 let open_brace = children.next().expect("literal map open brace");
390 assert!(open_brace.element().kind() == SyntaxKind::OpenBrace);
391 (&open_brace).write(stream);
392 stream.increment_indent();
393
394 let mut items = Vec::new();
395 let mut commas = Vec::new();
396 let mut close_brace = None;
397
398 for child in children {
399 match child.element().kind() {
400 SyntaxKind::CloseBrace => {
401 close_brace = Some(child.to_owned());
402 }
403 SyntaxKind::Comma => {
404 commas.push(child.to_owned());
405 }
406 _ => {
407 items.push(child.to_owned());
408 }
409 }
410 }
411
412 let mut commas = commas.iter();
413 for item in items {
414 (&item).write(stream);
415 if let Some(comma) = commas.next() {
416 (comma).write(stream);
417 } else {
418 stream.push_literal(",".to_string(), SyntaxKind::Comma);
419 }
420 stream.end_line();
421 }
422
423 stream.decrement_indent();
424 (&close_brace.expect("literal map close brace")).write(stream);
425}
426
427pub fn format_literal_object_item(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
433 let mut children = element.children().expect("literal object item children");
434
435 let key = children.next().expect("literal object item key");
436 assert!(key.element().kind() == SyntaxKind::Ident);
437 (&key).write(stream);
438
439 let colon = children.next().expect("literal object item colon");
440 assert!(colon.element().kind() == SyntaxKind::Colon);
441 (&colon).write(stream);
442 stream.end_word();
443
444 let value = children.next().expect("literal object item value");
445 (&value).write(stream);
446 assert!(children.next().is_none());
447}
448
449pub fn format_literal_object(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
455 let mut children = element.children().expect("literal object children");
456
457 let open_brace = children.next().expect("literal object open brace");
458 assert!(open_brace.element().kind() == SyntaxKind::OpenBrace);
459 (&open_brace).write(stream);
460 stream.increment_indent();
461
462 let mut members = Vec::new();
463 let mut commas = Vec::new();
464 let mut close_brace = None;
465
466 for child in children {
467 match child.element().kind() {
468 SyntaxKind::CloseBrace => {
469 close_brace = Some(child.to_owned());
470 }
471 SyntaxKind::Comma => {
472 commas.push(child.to_owned());
473 }
474 _ => {
475 members.push(child.to_owned());
476 }
477 }
478 }
479
480 let mut commas = commas.iter();
481 for member in members {
482 (&member).write(stream);
483 if let Some(comma) = commas.next() {
484 (comma).write(stream);
485 } else {
486 stream.push_literal(",".to_string(), SyntaxKind::Comma);
487 }
488 stream.end_line();
489 }
490
491 stream.decrement_indent();
492 (&close_brace.expect("literal object close brace")).write(stream);
493}
494
495pub fn format_access_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
501 for child in element.children().expect("access expr children") {
502 (&child).write(stream);
503 }
504}
505
506pub fn format_call_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
512 for child in element.children().expect("call expr children") {
513 (&child).write(stream);
514 if child.element().kind() == SyntaxKind::Comma {
515 stream.end_word();
516 }
517 }
518}
519
520pub fn format_index_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
526 for child in element.children().expect("index expr children") {
527 (&child).write(stream);
528 }
529}
530
531pub fn format_addition_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
537 for child in element.children().expect("addition expr children") {
538 let whitespace_wrapped = child.element().kind() == SyntaxKind::Plus;
539 if whitespace_wrapped {
540 stream.end_word();
541 }
542 (&child).write(stream);
543 if whitespace_wrapped {
544 stream.end_word();
545 }
546 }
547}
548
549pub fn format_subtraction_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
555 for child in element.children().expect("subtraction expr children") {
556 let whitespace_wrapped = child.element().kind() == SyntaxKind::Minus;
557 if whitespace_wrapped {
558 stream.end_word();
559 }
560 (&child).write(stream);
561 if whitespace_wrapped {
562 stream.end_word();
563 }
564 }
565}
566
567pub fn format_multiplication_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
573 for child in element.children().expect("multiplication expr children") {
574 let whitespace_wrapped = child.element().kind() == SyntaxKind::Asterisk;
575 if whitespace_wrapped {
576 stream.end_word();
577 }
578 (&child).write(stream);
579 if whitespace_wrapped {
580 stream.end_word();
581 }
582 }
583}
584
585pub fn format_division_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
591 for child in element.children().expect("division expr children") {
592 let whitespace_wrapped = child.element().kind() == SyntaxKind::Slash;
593 if whitespace_wrapped {
594 stream.end_word();
595 }
596 (&child).write(stream);
597 if whitespace_wrapped {
598 stream.end_word();
599 }
600 }
601}
602
603pub fn format_modulo_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
609 for child in element.children().expect("modulo expr children") {
610 let whitespace_wrapped = child.element().kind() == SyntaxKind::Percent;
611 if whitespace_wrapped {
612 stream.end_word();
613 }
614 (&child).write(stream);
615 if whitespace_wrapped {
616 stream.end_word();
617 }
618 }
619}
620
621pub fn format_exponentiation_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
627 for child in element.children().expect("exponentiation expr children") {
628 let whitespace_wrapped = child.element().kind() == SyntaxKind::Exponentiation;
629 if whitespace_wrapped {
630 stream.end_word();
631 }
632 (&child).write(stream);
633 if whitespace_wrapped {
634 stream.end_word();
635 }
636 }
637}
638
639pub fn format_logical_and_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
645 for child in element.children().expect("logical and expr children") {
646 let whitespace_wrapped = child.element().kind() == SyntaxKind::LogicalAnd;
647 if whitespace_wrapped {
648 stream.end_word();
649 }
650 (&child).write(stream);
651 if whitespace_wrapped {
652 stream.end_word();
653 }
654 }
655}
656
657pub fn format_logical_not_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
663 let mut children = element.children().expect("logical not expr children");
664 let not = children.next().expect("logical not expr not");
665 assert!(not.element().kind() == SyntaxKind::Exclamation);
666 (¬).write(stream);
667
668 let expr = children.next().expect("logical not expr expr");
669 (&expr).write(stream);
670}
671
672pub fn format_logical_or_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
678 for child in element.children().expect("logical or expr children") {
679 let whitespace_wrapped = child.element().kind() == SyntaxKind::LogicalOr;
680 if whitespace_wrapped {
681 stream.end_word();
682 }
683 (&child).write(stream);
684 if whitespace_wrapped {
685 stream.end_word();
686 }
687 }
688}
689
690pub fn format_equality_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
696 for child in element.children().expect("equality expr children") {
697 let whitespace_wrapped = child.element().kind() == SyntaxKind::Equal;
698 if whitespace_wrapped {
699 stream.end_word();
700 }
701 (&child).write(stream);
702 if whitespace_wrapped {
703 stream.end_word();
704 }
705 }
706}
707
708pub fn format_inequality_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
714 for child in element.children().expect("inequality expr children") {
715 let whitespace_wrapped = child.element().kind() == SyntaxKind::NotEqual;
716 if whitespace_wrapped {
717 stream.end_word();
718 }
719 (&child).write(stream);
720 if whitespace_wrapped {
721 stream.end_word();
722 }
723 }
724}
725
726pub fn format_less_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
732 for child in element.children().expect("less expr children") {
733 let whitespace_wrapped = child.element().kind() == SyntaxKind::Less;
734 if whitespace_wrapped {
735 stream.end_word();
736 }
737 (&child).write(stream);
738 if whitespace_wrapped {
739 stream.end_word();
740 }
741 }
742}
743
744pub fn format_less_equal_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
750 for child in element.children().expect("less equal expr children") {
751 let whitespace_wrapped = child.element().kind() == SyntaxKind::LessEqual;
752 if whitespace_wrapped {
753 stream.end_word();
754 }
755 (&child).write(stream);
756 if whitespace_wrapped {
757 stream.end_word();
758 }
759 }
760}
761
762pub fn format_greater_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
768 for child in element.children().expect("greater expr children") {
769 let whitespace_wrapped = child.element().kind() == SyntaxKind::Greater;
770 if whitespace_wrapped {
771 stream.end_word();
772 }
773 (&child).write(stream);
774 if whitespace_wrapped {
775 stream.end_word();
776 }
777 }
778}
779
780pub fn format_greater_equal_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
786 for child in element.children().expect("greater equal expr children") {
787 let whitespace_wrapped = child.element().kind() == SyntaxKind::GreaterEqual;
788 if whitespace_wrapped {
789 stream.end_word();
790 }
791 (&child).write(stream);
792 if whitespace_wrapped {
793 stream.end_word();
794 }
795 }
796}
797
798pub fn format_parenthesized_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
804 for child in element.children().expect("parenthesized expr children") {
805 (&child).write(stream);
806 }
807}
808
809pub fn format_if_expr(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
815 for child in element.children().expect("if expr children") {
816 (&child).write(stream);
817 stream.end_word();
818 }
819 stream.trim_end(&PreToken::WordEnd);
820}