git.delta.rocks / jrsonnet / refs/commits / d5d04bbaa62b

difftreelog

fix incorrect expression suffix handling in rowan parser

ytytztwvYaroslav Bolyukin2026-02-10parent: #bfc3583.patch.diff
in: master

31 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -704,10 +704,12 @@
 dependencies = [
  "anyhow",
  "drop_bomb",
+ "hi-doc",
  "indoc",
  "insta",
  "logos",
  "rowan",
+ "strip-ansi-escapes",
  "thiserror",
 ]
 
@@ -1318,6 +1320,15 @@
 checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520"
 
 [[package]]
+name = "strip-ansi-escapes"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025"
+dependencies = [
+ "vte",
+]
+
+[[package]]
 name = "strsim"
 version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1471,6 +1482,15 @@
 checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
 [[package]]
+name = "vte"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
 name = "wasip2"
 version = "1.0.2+wasi-0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
modifiedcrates/jrsonnet-formatter/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-formatter/src/lib.rs
+++ b/crates/jrsonnet-formatter/src/lib.rs
@@ -685,7 +685,7 @@
 	fn print(&self, out: &mut PrintItems) {
 		match self {
 			Self::ExprBinary(b) => {
-				p!(out, {b.lhs_work()} str(" ") {b.binary_operator()} str(" ") {b.rhs_work()});
+				p!(out, {b.lhs()} str(" ") {b.binary_operator()} str(" ") {b.rhs()});
 			}
 			Self::ExprUnary(u) => p!(out, {u.unary_operator()} {u.rhs()}),
 			// Self::ExprSlice(s) => {
addedcrates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__self_super.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__self_super.snap
@@ -0,0 +1,13 @@
+---
+source: crates/jrsonnet-formatter/src/tests.rs
+expression: "reformat(indoc!(\"\n\t\t\tlocal base = {\n\t\t\t  foo: 'bar',\n\t\t\t  method():: self.foo,\n\t\t\t};\n\n\t\t\tbase {\n\t\t\t  foo: super.foo + '-extended',\n\t\t\t  result: self.method(),\n\t\t\t}\n\t\t\"))"
+---
+local base = {
+	foo: 'bar',
+	method(
+	):: self.foo,
+};
+base {
+	foo: super.foo + '-extended',
+	result: self.method(),
+}
modifiedcrates/jrsonnet-formatter/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-formatter/src/tests.rs
+++ b/crates/jrsonnet-formatter/src/tests.rs
@@ -148,3 +148,20 @@
 		"
 	)));
 }
+
+#[test]
+fn self_super() {
+	insta::assert_snapshot!(reformat(indoc!(
+		"
+			local base = {
+			  foo: 'bar',
+			  method():: self.foo,
+			};
+
+			base {
+			  foo: super.foo + '-extended',
+			  result: self.method(),
+			}
+		"
+	)));
+}
modifiedcrates/jrsonnet-rowan-parser/Cargo.tomldiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/Cargo.toml
+++ b/crates/jrsonnet-rowan-parser/Cargo.toml
@@ -12,6 +12,7 @@
 [dependencies]
 anyhow.workspace = true
 drop_bomb.workspace = true
+hi-doc.workspace = true
 indoc.workspace = true
 logos.workspace = true
 rowan.workspace = true
@@ -21,3 +22,4 @@
 indoc.workspace = true
 insta.workspace = true
 anyhow.workspace = true
+strip-ansi-escapes = "0.2.1"
modifiedcrates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/lib.rs
+++ b/crates/jrsonnet-rowan-parser/src/lib.rs
@@ -47,17 +47,6 @@
 		parse.errors,
 	)
 }
-impl ExprBinary {
-	pub fn lhs_work(&self) -> Option<Expr> {
-		support::child(self.syntax())
-	}
-	pub fn rhs_work(&self) -> Option<Expr> {
-		let mut children = support::children(self.syntax());
-		// skip lhs
-		children.next()?;
-		children.next()
-	}
-}
 impl ExprObjExtend {
 	pub fn lhs_work(&self) -> Option<Expr> {
 		support::child(self.syntax())
modifiedcrates/jrsonnet-rowan-parser/src/marker.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/marker.rs
+++ b/crates/jrsonnet-rowan-parser/src/marker.rs
@@ -140,8 +140,15 @@
 
 		new_m
 	}
-	/// Create new node around existing marker, not counting anything that comes after it
-	fn wrap_raw(self, p: &mut Parser, kind: SyntaxKind, error: Option<SyntaxError>) -> Self {
+	/// Create new node around existing marker
+	/// If previous_pos is set - the wrapping node would not include everything that happened between wrapped node end and the current position of the parser
+	fn wrap_raw(
+		self,
+		p: &mut Parser,
+		kind: SyntaxKind,
+		error: Option<SyntaxError>,
+		previous_pos: bool,
+	) -> Self {
 		let new_m = p.start();
 		match &mut p.events[self.start_event_idx] {
 			Event::Start { forward_parent, .. } => {
@@ -154,30 +161,33 @@
 
 		let completed = new_m.complete_raw(p, kind, error);
 
-		match &mut p.events[self.finish_event_idx] {
-			Event::Finish {
-				wrapper,
-				error: _error,
-			} => {
-				*wrapper = Some(
-					NonZeroUsize::new(completed.finish_event_idx - self.finish_event_idx)
-						.expect("!= 0"),
-				);
+		if previous_pos {
+			match &mut p.events[self.finish_event_idx] {
+				Event::Finish {
+					wrapper,
+					error: _error,
+				} => {
+					*wrapper = Some(
+						NonZeroUsize::new(completed.finish_event_idx - self.finish_event_idx)
+							.expect("!= 0"),
+					);
+				}
+				_ => unreachable!(),
 			}
-			_ => unreachable!(),
 		}
 		completed
 	}
-	pub fn wrap(self, p: &mut Parser, kind: SyntaxKind) -> Self {
-		self.wrap_raw(p, kind, None)
+	pub fn wrap(self, p: &mut Parser, kind: SyntaxKind, previous_pos: bool) -> Self {
+		self.wrap_raw(p, kind, None, previous_pos)
 	}
-	pub fn wrap_error(self, p: &mut Parser, msg: impl AsRef<str>) -> Self {
+	pub fn wrap_error(self, p: &mut Parser, msg: impl AsRef<str>, previous_pos: bool) -> Self {
 		self.wrap_raw(
 			p,
 			SyntaxKind::ERROR_CUSTOM,
 			Some(SyntaxError::Custom {
 				error: msg.as_ref().to_owned(),
 			}),
+			previous_pos,
 		)
 	}
 }
modifiedcrates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -45,6 +45,18 @@
 		error: String,
 	},
 }
+impl fmt::Display for SyntaxError {
+	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+		match self {
+			SyntaxError::Unexpected { expected, found } => {
+				write!(f, "unexpected {found:?}, expecting {expected}")
+			}
+			SyntaxError::Missing { expected } => write!(f, "missing {expected}"),
+			SyntaxError::Custom { error } => write!(f, "{error}"),
+			SyntaxError::Hint { error } => write!(f, "{error}"),
+		}
+	}
+}
 
 #[derive(Debug)]
 pub struct LocatedSyntaxError {
@@ -316,12 +328,14 @@
 			break;
 		}
 
+		let m = lhs.wrap(p, EXPR, false);
+
 		// Object apply is not a real operator, we dont have something to bump
 		if op != BinaryOperatorKind::MetaObjectApply {
 			p.bump();
 		}
 
-		let m = lhs.wrap(p, EXPR).precede(p);
+		let m = m.precede(p);
 		let parsed_rhs = expr_binding_power(p, right_binding_power)
 			.map(|v| v.precede(p).complete(p, EXPR))
 			.is_ok();
@@ -491,12 +505,13 @@
 			errored.wrap_error(
 				p,
 				"compspec may only be used if there is only one object element",
+				true,
 			);
 		}
 		m.complete(p, OBJ_BODY_MEMBER_LIST);
 	} else if !compspecs.is_empty() {
 		for errored in asserts {
-			errored.wrap_error(p, "asserts can't be used in object comprehensions");
+			errored.wrap_error(p, "asserts can't be used in object comprehensions", true);
 		}
 		m.complete(p, OBJ_BODY_COMP);
 	} else {
@@ -569,7 +584,7 @@
 	}
 
 	for errored in unnamed_after_named {
-		errored.wrap_error(p, "can't use positional arguments after named");
+		errored.wrap_error(p, "can't use positional arguments after named", true);
 	}
 
 	m.complete(p, ARGS_DESC);
@@ -615,6 +630,7 @@
 			spec.wrap_error(
 				p,
 				"compspec may only be used if there is only one array element",
+				true,
 			);
 		}
 
@@ -639,20 +655,20 @@
 		p.bump();
 		// End
 		if !p.at(T![']']) {
-			expr(p).wrap(p, SLICE_DESC_END);
+			expr(p).wrap(p, SLICE_DESC_END, true);
 		}
 		if p.at(T![:]) {
 			p.bump();
 			// Step
 			if !p.at(T![']']) {
-				expr(p).wrap(p, SLICE_DESC_STEP);
+				expr(p).wrap(p, SLICE_DESC_STEP, true);
 			}
 		}
 	} else if p.at(T![::]) {
 		p.bump();
 		// End
 		if !p.at(T![']']) {
-			expr(p).wrap(p, SLICE_DESC_END);
+			expr(p).wrap(p, SLICE_DESC_END, true);
 		}
 	} else {
 		// It was not a slice
@@ -865,10 +881,10 @@
 		p.bump();
 		expr(p);
 		p.expect(T![then]);
-		expr(p).wrap(p, TRUE_EXPR);
+		expr(p).wrap(p, TRUE_EXPR, true);
 		if p.at(T![else]) {
 			p.bump();
-			expr(p).wrap(p, FALSE_EXPR);
+			expr(p).wrap(p, FALSE_EXPR, true);
 		}
 		m.complete(p, EXPR_IF_THEN_ELSE)
 	} else if p.at(T!['[']) {
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems.snap
@@ -49,9 +49,5 @@
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 3..21 }
 ===
-  x syntax error
-   ,----
- 1 | [a for a in [1, 2, 3], b]
-   :    ^^^^^^^^^|^^^^^^^^
-   :             `-- compspec may only be used if there is only one array element
-   `----
+   ·    ╭──────────────────── compspec may only be used if there is only one array element
+1  │ [a for a in [1, 2, 3], b]
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems_w.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems_w.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems_w.snap
@@ -56,9 +56,5 @@
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 7..25 }
 ===
-  x syntax error
-   ,----
- 1 | [a, b, for a in [1, 2, 3], c]
-   :        ^^^^^^^^^|^^^^^^^^
-   :                 `-- compspec may only be used if there is only one array element
-   `----
+   ·        ╭──────────────────── compspec may only be used if there is only one array element
+1  │ [a, b, for a in [1, 2, 3], c]
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_no_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_no_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_no_elems.snap
@@ -39,9 +39,5 @@
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 1..1 }
 ===
-  x syntax error
-   ,----
- 1 | [for a in [1, 2, 3]]
-   :  ^
-   :  `-- missing expression
-   `----
+   ·  ╭── missing expression
+1  │ [for a in [1, 2, 3]]
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__continue_after_total_failure.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__continue_after_total_failure.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__continue_after_total_failure.snap
@@ -64,14 +64,9 @@
 LocatedSyntaxError { error: Unexpected { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA, QUESTION_MARK])), found: IDENT }, range: 14..23 }
 LocatedSyntaxError { error: Custom { error: "unexpected tokens after end" }, range: 29..67 }
 ===
-  x syntax error
-   ,-[1:15]
- 1 | ,-> local intr = $intrinsic(test);
-   : |                 ^^^^|^^^^
-   : |                     `-- expected L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK, found IDENT
- 2 | |
- 3 | |   local a = 1, b = 2, c = a + b;
- 4 | |
- 5 | |-> [c]
-   : `---- unexpected tokens after end
-   `----
+   ·                 ╭─────────── unexpected IDENT, expecting L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK
+1  │ ╭─local intr = $intrinsic(test);
+2  │ │
+3  │ │ local a = 1, b = 2, c = a + b;
+4  │ │
+5  │ ╰─[c]   🢒 unexpected tokens after end
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snap
@@ -9,9 +9,5 @@
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 1..1 }
 ===
-  x syntax error
-   ,----
- 1 |
-   :  ^
-   :  `-- missing expression
-   `----
+   ·  ╭── missing expression
+1  │
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snap
@@ -25,9 +25,5 @@
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 15..15 }
 ===
-  x syntax error
-   ,----
- 1 | function(a, b)
-   :                ^
-   :                `-- missing expression
-   `----
+   ·                ╭── missing expression
+1  │ function(a, b)
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snap
@@ -42,9 +42,5 @@
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 16..16 }
 ===
-  x syntax error
-   ,----
- 1 | function(a, b = ) a + b
-   :                 ^
-   :                 `-- missing expression
-   `----
+   ·                 ╭── missing expression
+1  │ function(a, b = ) a + b
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snap
@@ -26,10 +26,6 @@
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([R_PAREN, COMMA, ASSIGN])) }, range: 14..14 }
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 14..14 }
 ===
-  x syntax error
-   ,----
- 1 | function(a, b
-   :               ^^
-   :               |`-- missing expression
-   :               `-- missing R_PAREN, COMMA or ASSIGN
-   `----
+   ·               ╭── missing R_PAREN, COMMA or ASSIGN
+1  │ function(a, b
+   ·               ╰── missing expression
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap
@@ -39,11 +39,8 @@
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA, QUESTION_MARK])) }, range: 25..25 }
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 25..25 }
 ===
-  x syntax error
-   ,-[3:3]
- 2 | local b = 3;
- 3 | 1
-   :   ^^
-   :   |`-- missing expression
-   :   `-- missing L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK
-   `----
+1  │ local a =
+2  │ local b = 3;
+   ·   ╭── missing L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK
+3  │ 1
+   ·   ╰── missing expression
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snap
@@ -23,11 +23,7 @@
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([SEMI, COMMA])) }, range: 10..10 }
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 10..10 }
 ===
-  x syntax error
-   ,----
- 1 | local a =
-   :           ^^^
-   :           `-- missing expression
-   :           |`-- missing SEMI or COMMA
-   :           `-- missing expression
-   `----
+   ·           ╭── missing SEMI or COMMA
+   ·           ┟── missing expression
+1  │ local a =
+   ·           ╰── missing expression
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snap
@@ -68,11 +68,7 @@
 LocatedSyntaxError { error: Custom { error: "can't use positional arguments after named" }, range: 16..17 }
 LocatedSyntaxError { error: Custom { error: "can't use positional arguments after named" }, range: 27..28 }
 ===
-  x syntax error
-   ,----
- 1 | a(1, 2, b=4, 3, 5, k = 12, 6)
-   :              |  |          |
-   :              |  |          `-- can't use positional arguments after named
-   :              |  `-- can't use positional arguments after named
-   :              `-- can't use positional arguments after named
-   `----
+   ·              ╭────── can't use positional arguments after named
+   ·              │  ╭─── can't use positional arguments after named
+1  │ a(1, 2, b=4, 3, 5, k = 12, 6)
+   ·                            ╰─── can't use positional arguments after named
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snap
@@ -14,10 +14,6 @@
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 0..0 }
 LocatedSyntaxError { error: Custom { error: "unexpected tokens after end" }, range: 0..3 }
 ===
-  x syntax error
-   ,----
- 1 | + 2
-   : ^^|
-   : | `-- unexpected tokens after end
-   : `-- missing expression
-   `----
+   · ╭── missing expression
+1  │ + 2
+   · ╰───── unexpected tokens after end
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snap
@@ -13,9 +13,5 @@
 ===
 LocatedSyntaxError { error: Custom { error: "unexpected tokens after end" }, range: 2..3 }
 ===
-  x syntax error
-   ,----
- 1 | 2 2
-   :   |
-   :   `-- unexpected tokens after end
-   `----
+   ·   ╭─── unexpected tokens after end
+1  │ 2 2
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snap
@@ -16,9 +16,5 @@
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 4..4 }
 ===
-  x syntax error
-   ,----
- 1 | a +
-   :     ^
-   :     `-- missing expression
-   `----
+   ·     ╭── missing expression
+1  │ a +
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap
@@ -56,9 +56,5 @@
 ===
 LocatedSyntaxError { error: Custom { error: "asserts can't be used in object comprehensions" }, range: 1..9 }
 ===
-  x syntax error
-   ,----
- 1 | {assert 1, a: 1 for a in [1,2,3]}
-   :  ^^^^|^^^
-   :      `-- asserts can't be used in object comprehensions
-   `----
+   ·  ╭────────── asserts can't be used in object comprehensions
+1  │ {assert 1, a: 1 for a in [1,2,3]}
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snap
@@ -58,9 +58,5 @@
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one object element" }, range: 5..23 }
 ===
-  x syntax error
-   ,----
- 1 | {a:1 for a in [1, 2, 3], b:1}
-   :      ^^^^^^^^^|^^^^^^^^
-   :               `-- compspec may only be used if there is only one object element
-   `----
+   ·      ╭──────────────────── compspec may only be used if there is only one object element
+1  │ {a:1 for a in [1, 2, 3], b:1}
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snap
@@ -69,9 +69,5 @@
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one object element" }, range: 11..29 }
 ===
-  x syntax error
-   ,----
- 1 | {a:1, b:1, for a in [1, 2, 3], c:1}
-   :            ^^^^^^^^^|^^^^^^^^
-   :                     `-- compspec may only be used if there is only one object element
-   `----
+   ·            ╭──────────────────── compspec may only be used if there is only one object element
+1  │ {a:1, b:1, for a in [1, 2, 3], c:1}
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_no_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_no_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_no_elems.snap
@@ -39,9 +39,5 @@
 ===
 LocatedSyntaxError { error: Missing { expected: Named("field definition") }, range: 1..1 }
 ===
-  x syntax error
-   ,----
- 1 | {for a in [1, 2, 3]}
-   :  ^
-   :  `-- missing field definition
-   `----
+   ·  ╭── missing field definition
+1  │ {for a in [1, 2, 3]}
deletedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snap
+++ /dev/null
@@ -1,5686 +0,0 @@
----
-source: crates/jrsonnet-rowan-parser/src/tests.rs
-expression: "{\n  local std = self,\n  local id = std.id,\n\n  thisFile:: error 'std.thisFile is deprecated, to enable its support in jrsonnet - recompile it with \"legacy-this-file\" support.\\nThis will slow down stdlib caching a bit, though',\n\n  lstripChars(str, chars)::\n    if std.length(str) > 0 && std.member(chars, str[0]) then\n      std.lstripChars(str[1:], chars)\n    else\n      str,\n\n  rstripChars(str, chars)::\n    local len = std.length(str);\n    if len > 0 && std.member(chars, str[len - 1]) then\n      std.rstripChars(str[:len - 1], chars)\n    else\n      str,\n\n  stripChars(str, chars)::\n    std.lstripChars(std.rstripChars(str, chars), chars),\n\n  splitLimitR(str, c, maxsplits)::\n    if maxsplits == -1 then\n      std.splitLimit(str, c, -1)\n    else\n      local revStr(str) = std.join('', std.reverse(std.stringChars(str)));\n      std.map(function(e) revStr(e), std.reverse(std.splitLimit(revStr(str), revStr(c), maxsplits))),\n\n  split(str, c):: std.splitLimit(str, c, -1),\n\n  mapWithIndex(func, arr)::\n    if !std.isFunction(func) then\n      error ('std.mapWithIndex first param must be function, got ' + std.type(func))\n    else if !std.isArray(arr) && !std.isString(arr) then\n      error ('std.mapWithIndex second param must be array, got ' + std.type(arr))\n    else\n      std.makeArray(std.length(arr), function(i) func(i, arr[i])),\n\n  mapWithKey(func, obj)::\n    if !std.isFunction(func) then\n      error ('std.mapWithKey first param must be function, got ' + std.type(func))\n    else if !std.isObject(obj) then\n      error ('std.mapWithKey second param must be object, got ' + std.type(obj))\n    else\n      { [k]: func(k, obj[k]) for k in std.objectFields(obj) },\n\n  lines(arr)::\n    std.join('\\n', arr + ['']),\n\n  deepJoin(arr)::\n    if std.isString(arr) then\n      arr\n    else if std.isArray(arr) then\n      std.join('', [std.deepJoin(x) for x in arr])\n    else\n      error 'Expected string or array, got %s' % std.type(arr),\n\n  assertEqual(a, b)::\n    if a == b then\n      true\n    else\n      error 'Assertion failed. ' + a + ' != ' + b,\n\n  clamp(x, minVal, maxVal)::\n    if x < minVal then minVal\n    else if x > maxVal then maxVal\n    else x,\n\n  manifestIni(ini)::\n    local body_lines(body) =\n      std.join([], [\n        local value_or_values = body[k];\n        if std.isArray(value_or_values) then\n          ['%s = %s' % [k, value] for value in value_or_values]\n        else\n          ['%s = %s' % [k, value_or_values]]\n\n        for k in std.objectFields(body)\n      ]);\n\n    local section_lines(sname, sbody) = ['[%s]' % [sname]] + body_lines(sbody),\n          main_body = if std.objectHas(ini, 'main') then body_lines(ini.main) else [],\n          all_sections = [\n      section_lines(k, ini.sections[k])\n      for k in std.objectFields(ini.sections)\n    ];\n    std.join('\\n', main_body + std.flattenArrays(all_sections) + ['']),\n\n  manifestToml(value):: std.manifestTomlEx(value, '  '),\n\n  escapeStringPython(str)::\n    std.escapeStringJson(str),\n\n  escapeStringBash(str_)::\n    local str = std.toString(str_);\n    local trans(ch) =\n      if ch == \"'\" then\n        \"'\\\"'\\\"'\"\n      else\n        ch;\n    \"'%s'\" % std.join('', [trans(ch) for ch in std.stringChars(str)]),\n\n  escapeStringDollars(str_)::\n    local str = std.toString(str_);\n    local trans(ch) =\n      if ch == '$' then\n        '$$'\n      else\n        ch;\n    std.foldl(function(a, b) a + trans(b), std.stringChars(str), ''),\n\n  local xml_escapes = {\n    '<': '&lt;',\n    '>': '&gt;',\n    '&': '&amp;',\n    '\"': '&quot;',\n    \"'\": '&apos;',\n  },\n\n  escapeStringXML(str_)::\n    local str = std.toString(str_);\n    std.join('', [std.get(xml_escapes, ch, ch) for ch in std.stringChars(str)]),\n\n  manifestJson(value):: std.manifestJsonEx(value, '    ') tailstrict,\n\n  manifestJsonMinified(value):: std.manifestJsonEx(value, '', '', ':'),\n\n  manifestYamlStream(value, indent_array_in_object=false, c_document_end=true, quote_keys=true)::\n    if !std.isArray(value) then\n      error 'manifestYamlStream only takes arrays, got ' + std.type(value)\n    else\n      '---\\n' + std.join(\n        '\\n---\\n', [std.manifestYamlDoc(e, indent_array_in_object, quote_keys) for e in value]\n      ) + if c_document_end then '\\n...\\n' else '\\n',\n\n  manifestPython(v)::\n    if std.isObject(v) then\n      local fields = [\n        '%s: %s' % [std.escapeStringPython(k), std.manifestPython(v[k])]\n        for k in std.objectFields(v)\n      ];\n      '{%s}' % [std.join(', ', fields)]\n    else if std.isArray(v) then\n      '[%s]' % [std.join(', ', [std.manifestPython(v2) for v2 in v])]\n    else if std.isString(v) then\n      '%s' % [std.escapeStringPython(v)]\n    else if std.isFunction(v) then\n      error 'cannot manifest function'\n    else if std.isNumber(v) then\n      std.toString(v)\n    else if v == true then\n      'True'\n    else if v == false then\n      'False'\n    else if v == null then\n      'None',\n\n  manifestPythonVars(conf)::\n    local vars = ['%s = %s' % [k, std.manifestPython(conf[k])] for k in std.objectFields(conf)];\n    std.join('\\n', vars + ['']),\n\n  manifestXmlJsonml(value)::\n    if !std.isArray(value) then\n      error 'Expected a JSONML value (an array), got %s' % std.type(value)\n    else\n      local aux(v) =\n        if std.isString(v) then\n          v\n        else\n          local tag = v[0];\n          local has_attrs = std.length(v) > 1 && std.isObject(v[1]);\n          local attrs = if has_attrs then v[1] else {};\n          local children = if has_attrs then v[2:] else v[1:];\n          local attrs_str =\n            std.join('', [' %s=\"%s\"' % [k, attrs[k]] for k in std.objectFields(attrs)]);\n          std.deepJoin(['<', tag, attrs_str, '>', [aux(x) for x in children], '</', tag, '>']);\n\n      aux(value),\n\n  mergePatch(target, patch)::\n    if std.isObject(patch) then\n      local target_object =\n        if std.isObject(target) then target else {};\n\n      local target_fields =\n        if std.isObject(target_object) then std.objectFields(target_object) else [];\n\n      local null_fields = [k for k in std.objectFields(patch) if patch[k] == null];\n      local both_fields = std.setUnion(target_fields, std.objectFields(patch));\n\n      {\n        [k]:\n          if !std.objectHas(patch, k) then\n            target_object[k]\n          else if !std.objectHas(target_object, k) then\n            std.mergePatch(null, patch[k]) tailstrict\n          else\n            std.mergePatch(target_object[k], patch[k]) tailstrict\n        for k in std.setDiff(both_fields, null_fields)\n      }\n    else\n      patch,\n\n  get(o, f, default=null, inc_hidden=true)::\n    if std.objectHasEx(o, f, inc_hidden) then o[f] else default,\n\n  resolvePath(f, r)::\n    local arr = std.split(f, '/');\n    std.join('/', std.makeArray(std.length(arr) - 1, function(i) arr[i]) + [r]),\n\n  prune(a)::\n    local isContent(b) =\n      if b == null then\n        false\n      else if std.isArray(b) then\n        std.length(b) > 0\n      else if std.isObject(b) then\n        std.length(b) > 0\n      else\n        true;\n    if std.isArray(a) then\n      [std.prune(x) for x in a if isContent($.prune(x))]\n    else if std.isObject(a) then {\n      [x]: $.prune(a[x])\n      for x in std.objectFields(a)\n      if isContent(std.prune(a[x]))\n    } else\n      a,\n\n  find(value, arr)::\n    if !std.isArray(arr) then\n      error 'find second parameter should be an array, got ' + std.type(arr)\n    else\n      std.filter(function(i) arr[i] == value, std.range(0, std.length(arr) - 1)),\n\n  // Compat\n  __compare_array(arr1, arr2)::\n    assert std.isArray(arr1) && std.isArray(arr2);\n    std.__compare(arr1, arr2),\n  __array_less(arr1, arr2):: std.__compare_array(arr1, arr2) == -1,\n  __array_greater(arr1, arr2):: std.__compare_array(arr1, arr2) == 1,\n  __array_less_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) <= 0,\n  __array_greater_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) >= 0,\n}\n"
----
-SOURCE_FILE@0..7835
-  EXPR@0..7834
-    EXPR_OBJECT@0..7834
-      OBJ_BODY_MEMBER_LIST@0..7834
-        L_BRACE@0..1 "{"
-        WHITESPACE@1..4 "\n  "
-        MEMBER_BIND_STMT@4..20
-          OBJ_LOCAL@4..20
-            LOCAL_KW@4..9 "local"
-            WHITESPACE@9..10 " "
-            BIND_DESTRUCT@10..20
-              DESTRUCT_FULL@10..13
-                NAME@10..13
-                  IDENT@10..13 "std"
-              WHITESPACE@13..14 " "
-              ASSIGN@14..15 "="
-              WHITESPACE@15..16 " "
-              EXPR@16..20
-                EXPR_LITERAL@16..20
-                  SELF_KW@16..20 "self"
-        COMMA@20..21 ","
-        WHITESPACE@21..24 "\n  "
-        MEMBER_BIND_STMT@24..41
-          OBJ_LOCAL@24..41
-            LOCAL_KW@24..29 "local"
-            WHITESPACE@29..30 " "
-            BIND_DESTRUCT@30..41
-              DESTRUCT_FULL@30..32
-                NAME@30..32
-                  IDENT@30..32 "id"
-              WHITESPACE@32..33 " "
-              ASSIGN@33..34 "="
-              WHITESPACE@34..35 " "
-              EXPR@35..41
-                EXPR_VAR@35..38
-                  NAME@35..38
-                    IDENT@35..38 "std"
-                SUFFIX_INDEX@38..41
-                  DOT@38..39 "."
-                  NAME@39..41
-                    IDENT@39..41 "id"
-        COMMA@41..42 ","
-        WHITESPACE@42..46 "\n\n  "
-        MEMBER_FIELD_NORMAL@46..224
-          FIELD_NAME_FIXED@46..54
-            NAME@46..54
-              IDENT@46..54 "thisFile"
-          COLONCOLON@54..56 "::"
-          WHITESPACE@56..57 " "
-          EXPR@57..224
-            EXPR_ERROR@57..224
-              ERROR_KW@57..62 "error"
-              WHITESPACE@62..63 " "
-              EXPR@63..224
-                EXPR_STRING@63..224
-                  STRING_SINGLE@63..224 "'std.thisFile is depr ..."
-        COMMA@224..225 ","
-        WHITESPACE@225..229 "\n\n  "
-        MEMBER_FIELD_METHOD@229..372
-          FIELD_NAME_FIXED@229..240
-            NAME@229..240
-              IDENT@229..240 "lstripChars"
-          PARAMS_DESC@240..252
-            L_PAREN@240..241 "("
-            PARAM@241..244
-              DESTRUCT_FULL@241..244
-                NAME@241..244
-                  IDENT@241..244 "str"
-            COMMA@244..245 ","
-            WHITESPACE@245..246 " "
-            PARAM@246..251
-              DESTRUCT_FULL@246..251
-                NAME@246..251
-                  IDENT@246..251 "chars"
-            R_PAREN@251..252 ")"
-          COLONCOLON@252..254 "::"
-          WHITESPACE@254..259 "\n    "
-          EXPR@259..372
-            EXPR_IF_THEN_ELSE@259..372
-              IF_KW@259..261 "if"
-              WHITESPACE@261..262 " "
-              EXPR@262..310
-                EXPR_BINARY@262..310
-                  EXPR@262..281
-                    EXPR_BINARY@262..281
-                      EXPR@262..265
-                        EXPR_VAR@262..265
-                          NAME@262..265
-                            IDENT@262..265 "std"
-                      SUFFIX_INDEX@265..272
-                        DOT@265..266 "."
-                        NAME@266..272
-                          IDENT@266..272 "length"
-                      SUFFIX_APPLY@272..277
-                        ARGS_DESC@272..277
-                          L_PAREN@272..273 "("
-                          ARG@273..276
-                            EXPR@273..276
-                              EXPR_VAR@273..276
-                                NAME@273..276
-                                  IDENT@273..276 "str"
-                          R_PAREN@276..277 ")"
-                      WHITESPACE@277..278 " "
-                      GT@278..279 ">"
-                      WHITESPACE@279..280 " "
-                      EXPR@280..281
-                        EXPR_NUMBER@280..281
-                          FLOAT@280..281 "0"
-                  WHITESPACE@281..282 " "
-                  AND@282..284 "&&"
-                  WHITESPACE@284..285 " "
-                  EXPR@285..310
-                    EXPR_VAR@285..288
-                      NAME@285..288
-                        IDENT@285..288 "std"
-                    SUFFIX_INDEX@288..295
-                      DOT@288..289 "."
-                      NAME@289..295
-                        IDENT@289..295 "member"
-                    SUFFIX_APPLY@295..310
-                      ARGS_DESC@295..310
-                        L_PAREN@295..296 "("
-                        ARG@296..301
-                          EXPR@296..301
-                            EXPR_VAR@296..301
-                              NAME@296..301
-                                IDENT@296..301 "chars"
-                        COMMA@301..302 ","
-                        WHITESPACE@302..303 " "
-                        ARG@303..309
-                          EXPR@303..309
-                            EXPR_VAR@303..306
-                              NAME@303..306
-                                IDENT@303..306 "str"
-                            SUFFIX_INDEX_EXPR@306..309
-                              L_BRACK@306..307 "["
-                              EXPR@307..308
-                                EXPR_NUMBER@307..308
-                                  FLOAT@307..308 "0"
-                              R_BRACK@308..309 "]"
-                        R_PAREN@309..310 ")"
-              WHITESPACE@310..311 " "
-              THEN_KW@311..315 "then"
-              WHITESPACE@315..322 "\n      "
-              TRUE_EXPR@322..353
-                EXPR@322..353
-                  EXPR_VAR@322..325
-                    NAME@322..325
-                      IDENT@322..325 "std"
-                  SUFFIX_INDEX@325..337
-                    DOT@325..326 "."
-                    NAME@326..337
-                      IDENT@326..337 "lstripChars"
-                  SUFFIX_APPLY@337..353
-                    ARGS_DESC@337..353
-                      L_PAREN@337..338 "("
-                      ARG@338..345
-                        EXPR@338..345
-                          EXPR_VAR@338..341
-                            NAME@338..341
-                              IDENT@338..341 "str"
-                          SUFFIX_SLICE@341..345
-                            SLICE_DESC@341..345
-                              L_BRACK@341..342 "["
-                              EXPR@342..343
-                                EXPR_NUMBER@342..343
-                                  FLOAT@342..343 "1"
-                              COLON@343..344 ":"
-                              R_BRACK@344..345 "]"
-                      COMMA@345..346 ","
-                      WHITESPACE@346..347 " "
-                      ARG@347..352
-                        EXPR@347..352
-                          EXPR_VAR@347..352
-                            NAME@347..352
-                              IDENT@347..352 "chars"
-                      R_PAREN@352..353 ")"
-              WHITESPACE@353..358 "\n    "
-              ELSE_KW@358..362 "else"
-              WHITESPACE@362..369 "\n      "
-              FALSE_EXPR@369..372
-                EXPR@369..372
-                  EXPR_VAR@369..372
-                    NAME@369..372
-                      IDENT@369..372 "str"
-        COMMA@372..373 ","
-        WHITESPACE@373..377 "\n\n  "
-        MEMBER_FIELD_METHOD@377..553
-          FIELD_NAME_FIXED@377..388
-            NAME@377..388
-              IDENT@377..388 "rstripChars"
-          PARAMS_DESC@388..400
-            L_PAREN@388..389 "("
-            PARAM@389..392
-              DESTRUCT_FULL@389..392
-                NAME@389..392
-                  IDENT@389..392 "str"
-            COMMA@392..393 ","
-            WHITESPACE@393..394 " "
-            PARAM@394..399
-              DESTRUCT_FULL@394..399
-                NAME@394..399
-                  IDENT@394..399 "chars"
-            R_PAREN@399..400 ")"
-          COLONCOLON@400..402 "::"
-          WHITESPACE@402..407 "\n    "
-          EXPR@407..553
-            STMT_LOCAL@407..435
-              LOCAL_KW@407..412 "local"
-              WHITESPACE@412..413 " "
-              BIND_DESTRUCT@413..434
-                DESTRUCT_FULL@413..416
-                  NAME@413..416
-                    IDENT@413..416 "len"
-                WHITESPACE@416..417 " "
-                ASSIGN@417..418 "="
-                WHITESPACE@418..419 " "
-                EXPR@419..434
-                  EXPR_VAR@419..422
-                    NAME@419..422
-                      IDENT@419..422 "std"
-                  SUFFIX_INDEX@422..429
-                    DOT@422..423 "."
-                    NAME@423..429
-                      IDENT@423..429 "length"
-                  SUFFIX_APPLY@429..434
-                    ARGS_DESC@429..434
-                      L_PAREN@429..430 "("
-                      ARG@430..433
-                        EXPR@430..433
-                          EXPR_VAR@430..433
-                            NAME@430..433
-                              IDENT@430..433 "str"
-                      R_PAREN@433..434 ")"
-              SEMI@434..435 ";"
-            WHITESPACE@435..440 "\n    "
-            EXPR_IF_THEN_ELSE@440..553
-              IF_KW@440..442 "if"
-              WHITESPACE@442..443 " "
-              EXPR@443..485
-                EXPR_BINARY@443..485
-                  EXPR@443..450
-                    EXPR_BINARY@443..450
-                      EXPR@443..446
-                        EXPR_VAR@443..446
-                          NAME@443..446
-                            IDENT@443..446 "len"
-                      WHITESPACE@446..447 " "
-                      GT@447..448 ">"
-                      WHITESPACE@448..449 " "
-                      EXPR@449..450
-                        EXPR_NUMBER@449..450
-                          FLOAT@449..450 "0"
-                  WHITESPACE@450..451 " "
-                  AND@451..453 "&&"
-                  WHITESPACE@453..454 " "
-                  EXPR@454..485
-                    EXPR_VAR@454..457
-                      NAME@454..457
-                        IDENT@454..457 "std"
-                    SUFFIX_INDEX@457..464
-                      DOT@457..458 "."
-                      NAME@458..464
-                        IDENT@458..464 "member"
-                    SUFFIX_APPLY@464..485
-                      ARGS_DESC@464..485
-                        L_PAREN@464..465 "("
-                        ARG@465..470
-                          EXPR@465..470
-                            EXPR_VAR@465..470
-                              NAME@465..470
-                                IDENT@465..470 "chars"
-                        COMMA@470..471 ","
-                        WHITESPACE@471..472 " "
-                        ARG@472..484
-                          EXPR@472..484
-                            EXPR_VAR@472..475
-                              NAME@472..475
-                                IDENT@472..475 "str"
-                            SUFFIX_INDEX_EXPR@475..484
-                              L_BRACK@475..476 "["
-                              EXPR@476..483
-                                EXPR_BINARY@476..483
-                                  EXPR@476..479
-                                    EXPR_VAR@476..479
-                                      NAME@476..479
-                                        IDENT@476..479 "len"
-                                  WHITESPACE@479..480 " "
-                                  MINUS@480..481 "-"
-                                  WHITESPACE@481..482 " "
-                                  EXPR@482..483
-                                    EXPR_NUMBER@482..483
-                                      FLOAT@482..483 "1"
-                              R_BRACK@483..484 "]"
-                        R_PAREN@484..485 ")"
-              WHITESPACE@485..486 " "
-              THEN_KW@486..490 "then"
-              WHITESPACE@490..497 "\n      "
-              TRUE_EXPR@497..534
-                EXPR@497..534
-                  EXPR_VAR@497..500
-                    NAME@497..500
-                      IDENT@497..500 "std"
-                  SUFFIX_INDEX@500..512
-                    DOT@500..501 "."
-                    NAME@501..512
-                      IDENT@501..512 "rstripChars"
-                  SUFFIX_APPLY@512..534
-                    ARGS_DESC@512..534
-                      L_PAREN@512..513 "("
-                      ARG@513..526
-                        EXPR@513..526
-                          EXPR_VAR@513..516
-                            NAME@513..516
-                              IDENT@513..516 "str"
-                          SUFFIX_SLICE@516..526
-                            SLICE_DESC@516..526
-                              L_BRACK@516..517 "["
-                              COLON@517..518 ":"
-                              SLICE_DESC_END@518..525
-                                EXPR@518..525
-                                  EXPR_BINARY@518..525
-                                    EXPR@518..521
-                                      EXPR_VAR@518..521
-                                        NAME@518..521
-                                          IDENT@518..521 "len"
-                                    WHITESPACE@521..522 " "
-                                    MINUS@522..523 "-"
-                                    WHITESPACE@523..524 " "
-                                    EXPR@524..525
-                                      EXPR_NUMBER@524..525
-                                        FLOAT@524..525 "1"
-                              R_BRACK@525..526 "]"
-                      COMMA@526..527 ","
-                      WHITESPACE@527..528 " "
-                      ARG@528..533
-                        EXPR@528..533
-                          EXPR_VAR@528..533
-                            NAME@528..533
-                              IDENT@528..533 "chars"
-                      R_PAREN@533..534 ")"
-              WHITESPACE@534..539 "\n    "
-              ELSE_KW@539..543 "else"
-              WHITESPACE@543..550 "\n      "
-              FALSE_EXPR@550..553
-                EXPR@550..553
-                  EXPR_VAR@550..553
-                    NAME@550..553
-                      IDENT@550..553 "str"
-        COMMA@553..554 ","
-        WHITESPACE@554..558 "\n\n  "
-        MEMBER_FIELD_METHOD@558..638
-          FIELD_NAME_FIXED@558..568
-            NAME@558..568
-              IDENT@558..568 "stripChars"
-          PARAMS_DESC@568..580
-            L_PAREN@568..569 "("
-            PARAM@569..572
-              DESTRUCT_FULL@569..572
-                NAME@569..572
-                  IDENT@569..572 "str"
-            COMMA@572..573 ","
-            WHITESPACE@573..574 " "
-            PARAM@574..579
-              DESTRUCT_FULL@574..579
-                NAME@574..579
-                  IDENT@574..579 "chars"
-            R_PAREN@579..580 ")"
-          COLONCOLON@580..582 "::"
-          WHITESPACE@582..587 "\n    "
-          EXPR@587..638
-            EXPR_VAR@587..590
-              NAME@587..590
-                IDENT@587..590 "std"
-            SUFFIX_INDEX@590..602
-              DOT@590..591 "."
-              NAME@591..602
-                IDENT@591..602 "lstripChars"
-            SUFFIX_APPLY@602..638
-              ARGS_DESC@602..638
-                L_PAREN@602..603 "("
-                ARG@603..630
-                  EXPR@603..630
-                    EXPR_VAR@603..606
-                      NAME@603..606
-                        IDENT@603..606 "std"
-                    SUFFIX_INDEX@606..618
-                      DOT@606..607 "."
-                      NAME@607..618
-                        IDENT@607..618 "rstripChars"
-                    SUFFIX_APPLY@618..630
-                      ARGS_DESC@618..630
-                        L_PAREN@618..619 "("
-                        ARG@619..622
-                          EXPR@619..622
-                            EXPR_VAR@619..622
-                              NAME@619..622
-                                IDENT@619..622 "str"
-                        COMMA@622..623 ","
-                        WHITESPACE@623..624 " "
-                        ARG@624..629
-                          EXPR@624..629
-                            EXPR_VAR@624..629
-                              NAME@624..629
-                                IDENT@624..629 "chars"
-                        R_PAREN@629..630 ")"
-                COMMA@630..631 ","
-                WHITESPACE@631..632 " "
-                ARG@632..637
-                  EXPR@632..637
-                    EXPR_VAR@632..637
-                      NAME@632..637
-                        IDENT@632..637 "chars"
-                R_PAREN@637..638 ")"
-        COMMA@638..639 ","
-        WHITESPACE@639..643 "\n\n  "
-        MEMBER_FIELD_METHOD@643..921
-          FIELD_NAME_FIXED@643..654
-            NAME@643..654
-              IDENT@643..654 "splitLimitR"
-          PARAMS_DESC@654..673
-            L_PAREN@654..655 "("
-            PARAM@655..658
-              DESTRUCT_FULL@655..658
-                NAME@655..658
-                  IDENT@655..658 "str"
-            COMMA@658..659 ","
-            WHITESPACE@659..660 " "
-            PARAM@660..661
-              DESTRUCT_FULL@660..661
-                NAME@660..661
-                  IDENT@660..661 "c"
-            COMMA@661..662 ","
-            WHITESPACE@662..663 " "
-            PARAM@663..672
-              DESTRUCT_FULL@663..672
-                NAME@663..672
-                  IDENT@663..672 "maxsplits"
-            R_PAREN@672..673 ")"
-          COLONCOLON@673..675 "::"
-          WHITESPACE@675..680 "\n    "
-          EXPR@680..921
-            EXPR_IF_THEN_ELSE@680..921
-              IF_KW@680..682 "if"
-              WHITESPACE@682..683 " "
-              EXPR@683..698
-                EXPR_BINARY@683..698
-                  EXPR@683..692
-                    EXPR_VAR@683..692
-                      NAME@683..692
-                        IDENT@683..692 "maxsplits"
-                  WHITESPACE@692..693 " "
-                  EQ@693..695 "=="
-                  WHITESPACE@695..696 " "
-                  EXPR@696..698
-                    EXPR_UNARY@696..698
-                      MINUS@696..697 "-"
-                      EXPR_NUMBER@697..698
-                        FLOAT@697..698 "1"
-              WHITESPACE@698..699 " "
-              THEN_KW@699..703 "then"
-              WHITESPACE@703..710 "\n      "
-              TRUE_EXPR@710..736
-                EXPR@710..736
-                  EXPR_VAR@710..713
-                    NAME@710..713
-                      IDENT@710..713 "std"
-                  SUFFIX_INDEX@713..724
-                    DOT@713..714 "."
-                    NAME@714..724
-                      IDENT@714..724 "splitLimit"
-                  SUFFIX_APPLY@724..736
-                    ARGS_DESC@724..736
-                      L_PAREN@724..725 "("
-                      ARG@725..728
-                        EXPR@725..728
-                          EXPR_VAR@725..728
-                            NAME@725..728
-                              IDENT@725..728 "str"
-                      COMMA@728..729 ","
-                      WHITESPACE@729..730 " "
-                      ARG@730..731
-                        EXPR@730..731
-                          EXPR_VAR@730..731
-                            NAME@730..731
-                              IDENT@730..731 "c"
-                      COMMA@731..732 ","
-                      WHITESPACE@732..733 " "
-                      ARG@733..735
-                        EXPR@733..735
-                          EXPR_UNARY@733..735
-                            MINUS@733..734 "-"
-                            EXPR_NUMBER@734..735
-                              FLOAT@734..735 "1"
-                      R_PAREN@735..736 ")"
-              WHITESPACE@736..741 "\n    "
-              ELSE_KW@741..745 "else"
-              WHITESPACE@745..752 "\n      "
-              FALSE_EXPR@752..921
-                EXPR@752..921
-                  STMT_LOCAL@752..820
-                    LOCAL_KW@752..757 "local"
-                    WHITESPACE@757..758 " "
-                    BIND_FUNCTION@758..819
-                      NAME@758..764
-                        IDENT@758..764 "revStr"
-                      PARAMS_DESC@764..769
-                        L_PAREN@764..765 "("
-                        PARAM@765..768
-                          DESTRUCT_FULL@765..768
-                            NAME@765..768
-                              IDENT@765..768 "str"
-                        R_PAREN@768..769 ")"
-                      WHITESPACE@769..770 " "
-                      ASSIGN@770..771 "="
-                      WHITESPACE@771..772 " "
-                      EXPR@772..819
-                        EXPR_VAR@772..775
-                          NAME@772..775
-                            IDENT@772..775 "std"
-                        SUFFIX_INDEX@775..780
-                          DOT@775..776 "."
-                          NAME@776..780
-                            IDENT@776..780 "join"
-                        SUFFIX_APPLY@780..819
-                          ARGS_DESC@780..819
-                            L_PAREN@780..781 "("
-                            ARG@781..783
-                              EXPR@781..783
-                                EXPR_STRING@781..783
-                                  STRING_SINGLE@781..783 "''"
-                            COMMA@783..784 ","
-                            WHITESPACE@784..785 " "
-                            ARG@785..818
-                              EXPR@785..818
-                                EXPR_VAR@785..788
-                                  NAME@785..788
-                                    IDENT@785..788 "std"
-                                SUFFIX_INDEX@788..796
-                                  DOT@788..789 "."
-                                  NAME@789..796
-                                    IDENT@789..796 "reverse"
-                                SUFFIX_APPLY@796..818
-                                  ARGS_DESC@796..818
-                                    L_PAREN@796..797 "("
-                                    ARG@797..817
-                                      EXPR@797..817
-                                        EXPR_VAR@797..800
-                                          NAME@797..800
-                                            IDENT@797..800 "std"
-                                        SUFFIX_INDEX@800..812
-                                          DOT@800..801 "."
-                                          NAME@801..812
-                                            IDENT@801..812 "stringChars"
-                                        SUFFIX_APPLY@812..817
-                                          ARGS_DESC@812..817
-                                            L_PAREN@812..813 "("
-                                            ARG@813..816
-                                              EXPR@813..816
-                                                EXPR_VAR@813..816
-                                                  NAME@813..816
-                                                    IDENT@813..816 "str"
-                                            R_PAREN@816..817 ")"
-                                    R_PAREN@817..818 ")"
-                            R_PAREN@818..819 ")"
-                    SEMI@819..820 ";"
-                  WHITESPACE@820..827 "\n      "
-                  EXPR_VAR@827..830
-                    NAME@827..830
-                      IDENT@827..830 "std"
-                  SUFFIX_INDEX@830..834
-                    DOT@830..831 "."
-                    NAME@831..834
-                      IDENT@831..834 "map"
-                  SUFFIX_APPLY@834..921
-                    ARGS_DESC@834..921
-                      L_PAREN@834..835 "("
-                      ARG@835..856
-                        EXPR@835..856
-                          EXPR_FUNCTION@835..856
-                            FUNCTION_KW@835..843 "function"
-                            PARAMS_DESC@843..846
-                              L_PAREN@843..844 "("
-                              PARAM@844..845
-                                DESTRUCT_FULL@844..845
-                                  NAME@844..845
-                                    IDENT@844..845 "e"
-                              R_PAREN@845..846 ")"
-                            WHITESPACE@846..847 " "
-                            EXPR@847..856
-                              EXPR_VAR@847..853
-                                NAME@847..853
-                                  IDENT@847..853 "revStr"
-                              SUFFIX_APPLY@853..856
-                                ARGS_DESC@853..856
-                                  L_PAREN@853..854 "("
-                                  ARG@854..855
-                                    EXPR@854..855
-                                      EXPR_VAR@854..855
-                                        NAME@854..855
-                                          IDENT@854..855 "e"
-                                  R_PAREN@855..856 ")"
-                      COMMA@856..857 ","
-                      WHITESPACE@857..858 " "
-                      ARG@858..920
-                        EXPR@858..920
-                          EXPR_VAR@858..861
-                            NAME@858..861
-                              IDENT@858..861 "std"
-                          SUFFIX_INDEX@861..869
-                            DOT@861..862 "."
-                            NAME@862..869
-                              IDENT@862..869 "reverse"
-                          SUFFIX_APPLY@869..920
-                            ARGS_DESC@869..920
-                              L_PAREN@869..870 "("
-                              ARG@870..919
-                                EXPR@870..919
-                                  EXPR_VAR@870..873
-                                    NAME@870..873
-                                      IDENT@870..873 "std"
-                                  SUFFIX_INDEX@873..884
-                                    DOT@873..874 "."
-                                    NAME@874..884
-                                      IDENT@874..884 "splitLimit"
-                                  SUFFIX_APPLY@884..919
-                                    ARGS_DESC@884..919
-                                      L_PAREN@884..885 "("
-                                      ARG@885..896
-                                        EXPR@885..896
-                                          EXPR_VAR@885..891
-                                            NAME@885..891
-                                              IDENT@885..891 "revStr"
-                                          SUFFIX_APPLY@891..896
-                                            ARGS_DESC@891..896
-                                              L_PAREN@891..892 "("
-                                              ARG@892..895
-                                                EXPR@892..895
-                                                  EXPR_VAR@892..895
-                                                    NAME@892..895
-                                                      IDENT@892..895 "str"
-                                              R_PAREN@895..896 ")"
-                                      COMMA@896..897 ","
-                                      WHITESPACE@897..898 " "
-                                      ARG@898..907
-                                        EXPR@898..907
-                                          EXPR_VAR@898..904
-                                            NAME@898..904
-                                              IDENT@898..904 "revStr"
-                                          SUFFIX_APPLY@904..907
-                                            ARGS_DESC@904..907
-                                              L_PAREN@904..905 "("
-                                              ARG@905..906
-                                                EXPR@905..906
-                                                  EXPR_VAR@905..906
-                                                    NAME@905..906
-                                                      IDENT@905..906 "c"
-                                              R_PAREN@906..907 ")"
-                                      COMMA@907..908 ","
-                                      WHITESPACE@908..909 " "
-                                      ARG@909..918
-                                        EXPR@909..918
-                                          EXPR_VAR@909..918
-                                            NAME@909..918
-                                              IDENT@909..918 "maxsplits"
-                                      R_PAREN@918..919 ")"
-                              R_PAREN@919..920 ")"
-                      R_PAREN@920..921 ")"
-        COMMA@921..922 ","
-        WHITESPACE@922..926 "\n\n  "
-        MEMBER_FIELD_METHOD@926..968
-          FIELD_NAME_FIXED@926..931
-            NAME@926..931
-              IDENT@926..931 "split"
-          PARAMS_DESC@931..939
-            L_PAREN@931..932 "("
-            PARAM@932..935
-              DESTRUCT_FULL@932..935
-                NAME@932..935
-                  IDENT@932..935 "str"
-            COMMA@935..936 ","
-            WHITESPACE@936..937 " "
-            PARAM@937..938
-              DESTRUCT_FULL@937..938
-                NAME@937..938
-                  IDENT@937..938 "c"
-            R_PAREN@938..939 ")"
-          COLONCOLON@939..941 "::"
-          WHITESPACE@941..942 " "
-          EXPR@942..968
-            EXPR_VAR@942..945
-              NAME@942..945
-                IDENT@942..945 "std"
-            SUFFIX_INDEX@945..956
-              DOT@945..946 "."
-              NAME@946..956
-                IDENT@946..956 "splitLimit"
-            SUFFIX_APPLY@956..968
-              ARGS_DESC@956..968
-                L_PAREN@956..957 "("
-                ARG@957..960
-                  EXPR@957..960
-                    EXPR_VAR@957..960
-                      NAME@957..960
-                        IDENT@957..960 "str"
-                COMMA@960..961 ","
-                WHITESPACE@961..962 " "
-                ARG@962..963
-                  EXPR@962..963
-                    EXPR_VAR@962..963
-                      NAME@962..963
-                        IDENT@962..963 "c"
-                COMMA@963..964 ","
-                WHITESPACE@964..965 " "
-                ARG@965..967
-                  EXPR@965..967
-                    EXPR_UNARY@965..967
-                      MINUS@965..966 "-"
-                      EXPR_NUMBER@966..967
-                        FLOAT@966..967 "1"
-                R_PAREN@967..968 ")"
-        COMMA@968..969 ","
-        WHITESPACE@969..973 "\n\n  "
-        MEMBER_FIELD_METHOD@973..1331
-          FIELD_NAME_FIXED@973..985
-            NAME@973..985
-              IDENT@973..985 "mapWithIndex"
-          PARAMS_DESC@985..996
-            L_PAREN@985..986 "("
-            PARAM@986..990
-              DESTRUCT_FULL@986..990
-                NAME@986..990
-                  IDENT@986..990 "func"
-            COMMA@990..991 ","
-            WHITESPACE@991..992 " "
-            PARAM@992..995
-              DESTRUCT_FULL@992..995
-                NAME@992..995
-                  IDENT@992..995 "arr"
-            R_PAREN@995..996 ")"
-          COLONCOLON@996..998 "::"
-          WHITESPACE@998..1003 "\n    "
-          EXPR@1003..1331
-            EXPR_IF_THEN_ELSE@1003..1331
-              IF_KW@1003..1005 "if"
-              WHITESPACE@1005..1006 " "
-              EXPR@1006..1027
-                EXPR_UNARY@1006..1027
-                  NOT@1006..1007 "!"
-                  EXPR_VAR@1007..1010
-                    NAME@1007..1010
-                      IDENT@1007..1010 "std"
-                  SUFFIX_INDEX@1010..1021
-                    DOT@1010..1011 "."
-                    NAME@1011..1021
-                      IDENT@1011..1021 "isFunction"
-                  SUFFIX_APPLY@1021..1027
-                    ARGS_DESC@1021..1027
-                      L_PAREN@1021..1022 "("
-                      ARG@1022..1026
-                        EXPR@1022..1026
-                          EXPR_VAR@1022..1026
-                            NAME@1022..1026
-                              IDENT@1022..1026 "func"
-                      R_PAREN@1026..1027 ")"
-              WHITESPACE@1027..1028 " "
-              THEN_KW@1028..1032 "then"
-              WHITESPACE@1032..1039 "\n      "
-              TRUE_EXPR@1039..1117
-                EXPR@1039..1117
-                  EXPR_ERROR@1039..1117
-                    ERROR_KW@1039..1044 "error"
-                    WHITESPACE@1044..1045 " "
-                    EXPR@1045..1117
-                      EXPR_PARENED@1045..1117
-                        L_PAREN@1045..1046 "("
-                        EXPR@1046..1116
-                          EXPR_BINARY@1046..1116
-                            EXPR@1046..1099
-                              EXPR_STRING@1046..1099
-                                STRING_SINGLE@1046..1099 "'std.mapWithIndex fir ..."
-                            WHITESPACE@1099..1100 " "
-                            PLUS@1100..1101 "+"
-                            WHITESPACE@1101..1102 " "
-                            EXPR@1102..1116
-                              EXPR_VAR@1102..1105
-                                NAME@1102..1105
-                                  IDENT@1102..1105 "std"
-                              SUFFIX_INDEX@1105..1110
-                                DOT@1105..1106 "."
-                                NAME@1106..1110
-                                  IDENT@1106..1110 "type"
-                              SUFFIX_APPLY@1110..1116
-                                ARGS_DESC@1110..1116
-                                  L_PAREN@1110..1111 "("
-                                  ARG@1111..1115
-                                    EXPR@1111..1115
-                                      EXPR_VAR@1111..1115
-                                        NAME@1111..1115
-                                          IDENT@1111..1115 "func"
-                                  R_PAREN@1115..1116 ")"
-                        R_PAREN@1116..1117 ")"
-              WHITESPACE@1117..1122 "\n    "
-              ELSE_KW@1122..1126 "else"
-              WHITESPACE@1126..1127 " "
-              FALSE_EXPR@1127..1331
-                EXPR@1127..1331
-                  EXPR_IF_THEN_ELSE@1127..1331
-                    IF_KW@1127..1129 "if"
-                    WHITESPACE@1129..1130 " "
-                    EXPR@1130..1169
-                      EXPR_BINARY@1130..1169
-                        EXPR@1130..1147
-                          EXPR_UNARY@1130..1147
-                            NOT@1130..1131 "!"
-                            EXPR_VAR@1131..1134
-                              NAME@1131..1134
-                                IDENT@1131..1134 "std"
-                            SUFFIX_INDEX@1134..1142
-                              DOT@1134..1135 "."
-                              NAME@1135..1142
-                                IDENT@1135..1142 "isArray"
-                            SUFFIX_APPLY@1142..1147
-                              ARGS_DESC@1142..1147
-                                L_PAREN@1142..1143 "("
-                                ARG@1143..1146
-                                  EXPR@1143..1146
-                                    EXPR_VAR@1143..1146
-                                      NAME@1143..1146
-                                        IDENT@1143..1146 "arr"
-                                R_PAREN@1146..1147 ")"
-                        WHITESPACE@1147..1148 " "
-                        AND@1148..1150 "&&"
-                        WHITESPACE@1150..1151 " "
-                        EXPR@1151..1169
-                          EXPR_UNARY@1151..1169
-                            NOT@1151..1152 "!"
-                            EXPR_VAR@1152..1155
-                              NAME@1152..1155
-                                IDENT@1152..1155 "std"
-                            SUFFIX_INDEX@1155..1164
-                              DOT@1155..1156 "."
-                              NAME@1156..1164
-                                IDENT@1156..1164 "isString"
-                            SUFFIX_APPLY@1164..1169
-                              ARGS_DESC@1164..1169
-                                L_PAREN@1164..1165 "("
-                                ARG@1165..1168
-                                  EXPR@1165..1168
-                                    EXPR_VAR@1165..1168
-                                      NAME@1165..1168
-                                        IDENT@1165..1168 "arr"
-                                R_PAREN@1168..1169 ")"
-                    WHITESPACE@1169..1170 " "
-                    THEN_KW@1170..1174 "then"
-                    WHITESPACE@1174..1181 "\n      "
-                    TRUE_EXPR@1181..1256
-                      EXPR@1181..1256
-                        EXPR_ERROR@1181..1256
-                          ERROR_KW@1181..1186 "error"
-                          WHITESPACE@1186..1187 " "
-                          EXPR@1187..1256
-                            EXPR_PARENED@1187..1256
-                              L_PAREN@1187..1188 "("
-                              EXPR@1188..1255
-                                EXPR_BINARY@1188..1255
-                                  EXPR@1188..1239
-                                    EXPR_STRING@1188..1239
-                                      STRING_SINGLE@1188..1239 "'std.mapWithIndex sec ..."
-                                  WHITESPACE@1239..1240 " "
-                                  PLUS@1240..1241 "+"
-                                  WHITESPACE@1241..1242 " "
-                                  EXPR@1242..1255
-                                    EXPR_VAR@1242..1245
-                                      NAME@1242..1245
-                                        IDENT@1242..1245 "std"
-                                    SUFFIX_INDEX@1245..1250
-                                      DOT@1245..1246 "."
-                                      NAME@1246..1250
-                                        IDENT@1246..1250 "type"
-                                    SUFFIX_APPLY@1250..1255
-                                      ARGS_DESC@1250..1255
-                                        L_PAREN@1250..1251 "("
-                                        ARG@1251..1254
-                                          EXPR@1251..1254
-                                            EXPR_VAR@1251..1254
-                                              NAME@1251..1254
-                                                IDENT@1251..1254 "arr"
-                                        R_PAREN@1254..1255 ")"
-                              R_PAREN@1255..1256 ")"
-                    WHITESPACE@1256..1261 "\n    "
-                    ELSE_KW@1261..1265 "else"
-                    WHITESPACE@1265..1272 "\n      "
-                    FALSE_EXPR@1272..1331
-                      EXPR@1272..1331
-                        EXPR_VAR@1272..1275
-                          NAME@1272..1275
-                            IDENT@1272..1275 "std"
-                        SUFFIX_INDEX@1275..1285
-                          DOT@1275..1276 "."
-                          NAME@1276..1285
-                            IDENT@1276..1285 "makeArray"
-                        SUFFIX_APPLY@1285..1331
-                          ARGS_DESC@1285..1331
-                            L_PAREN@1285..1286 "("
-                            ARG@1286..1301
-                              EXPR@1286..1301
-                                EXPR_VAR@1286..1289
-                                  NAME@1286..1289
-                                    IDENT@1286..1289 "std"
-                                SUFFIX_INDEX@1289..1296
-                                  DOT@1289..1290 "."
-                                  NAME@1290..1296
-                                    IDENT@1290..1296 "length"
-                                SUFFIX_APPLY@1296..1301
-                                  ARGS_DESC@1296..1301
-                                    L_PAREN@1296..1297 "("
-                                    ARG@1297..1300
-                                      EXPR@1297..1300
-                                        EXPR_VAR@1297..1300
-                                          NAME@1297..1300
-                                            IDENT@1297..1300 "arr"
-                                    R_PAREN@1300..1301 ")"
-                            COMMA@1301..1302 ","
-                            WHITESPACE@1302..1303 " "
-                            ARG@1303..1330
-                              EXPR@1303..1330
-                                EXPR_FUNCTION@1303..1330
-                                  FUNCTION_KW@1303..1311 "function"
-                                  PARAMS_DESC@1311..1314
-                                    L_PAREN@1311..1312 "("
-                                    PARAM@1312..1313
-                                      DESTRUCT_FULL@1312..1313
-                                        NAME@1312..1313
-                                          IDENT@1312..1313 "i"
-                                    R_PAREN@1313..1314 ")"
-                                  WHITESPACE@1314..1315 " "
-                                  EXPR@1315..1330
-                                    EXPR_VAR@1315..1319
-                                      NAME@1315..1319
-                                        IDENT@1315..1319 "func"
-                                    SUFFIX_APPLY@1319..1330
-                                      ARGS_DESC@1319..1330
-                                        L_PAREN@1319..1320 "("
-                                        ARG@1320..1321
-                                          EXPR@1320..1321
-                                            EXPR_VAR@1320..1321
-                                              NAME@1320..1321
-                                                IDENT@1320..1321 "i"
-                                        COMMA@1321..1322 ","
-                                        WHITESPACE@1322..1323 " "
-                                        ARG@1323..1329
-                                          EXPR@1323..1329
-                                            EXPR_VAR@1323..1326
-                                              NAME@1323..1326
-                                                IDENT@1323..1326 "arr"
-                                            SUFFIX_INDEX_EXPR@1326..1329
-                                              L_BRACK@1326..1327 "["
-                                              EXPR@1327..1328
-                                                EXPR_VAR@1327..1328
-                                                  NAME@1327..1328
-                                                    IDENT@1327..1328 "i"
-                                              R_BRACK@1328..1329 "]"
-                                        R_PAREN@1329..1330 ")"
-                            R_PAREN@1330..1331 ")"
-        COMMA@1331..1332 ","
-        WHITESPACE@1332..1336 "\n\n  "
-        MEMBER_FIELD_METHOD@1336..1664
-          FIELD_NAME_FIXED@1336..1346
-            NAME@1336..1346
-              IDENT@1336..1346 "mapWithKey"
-          PARAMS_DESC@1346..1357
-            L_PAREN@1346..1347 "("
-            PARAM@1347..1351
-              DESTRUCT_FULL@1347..1351
-                NAME@1347..1351
-                  IDENT@1347..1351 "func"
-            COMMA@1351..1352 ","
-            WHITESPACE@1352..1353 " "
-            PARAM@1353..1356
-              DESTRUCT_FULL@1353..1356
-                NAME@1353..1356
-                  IDENT@1353..1356 "obj"
-            R_PAREN@1356..1357 ")"
-          COLONCOLON@1357..1359 "::"
-          WHITESPACE@1359..1364 "\n    "
-          EXPR@1364..1664
-            EXPR_IF_THEN_ELSE@1364..1664
-              IF_KW@1364..1366 "if"
-              WHITESPACE@1366..1367 " "
-              EXPR@1367..1388
-                EXPR_UNARY@1367..1388
-                  NOT@1367..1368 "!"
-                  EXPR_VAR@1368..1371
-                    NAME@1368..1371
-                      IDENT@1368..1371 "std"
-                  SUFFIX_INDEX@1371..1382
-                    DOT@1371..1372 "."
-                    NAME@1372..1382
-                      IDENT@1372..1382 "isFunction"
-                  SUFFIX_APPLY@1382..1388
-                    ARGS_DESC@1382..1388
-                      L_PAREN@1382..1383 "("
-                      ARG@1383..1387
-                        EXPR@1383..1387
-                          EXPR_VAR@1383..1387
-                            NAME@1383..1387
-                              IDENT@1383..1387 "func"
-                      R_PAREN@1387..1388 ")"
-              WHITESPACE@1388..1389 " "
-              THEN_KW@1389..1393 "then"
-              WHITESPACE@1393..1400 "\n      "
-              TRUE_EXPR@1400..1476
-                EXPR@1400..1476
-                  EXPR_ERROR@1400..1476
-                    ERROR_KW@1400..1405 "error"
-                    WHITESPACE@1405..1406 " "
-                    EXPR@1406..1476
-                      EXPR_PARENED@1406..1476
-                        L_PAREN@1406..1407 "("
-                        EXPR@1407..1475
-                          EXPR_BINARY@1407..1475
-                            EXPR@1407..1458
-                              EXPR_STRING@1407..1458
-                                STRING_SINGLE@1407..1458 "'std.mapWithKey first ..."
-                            WHITESPACE@1458..1459 " "
-                            PLUS@1459..1460 "+"
-                            WHITESPACE@1460..1461 " "
-                            EXPR@1461..1475
-                              EXPR_VAR@1461..1464
-                                NAME@1461..1464
-                                  IDENT@1461..1464 "std"
-                              SUFFIX_INDEX@1464..1469
-                                DOT@1464..1465 "."
-                                NAME@1465..1469
-                                  IDENT@1465..1469 "type"
-                              SUFFIX_APPLY@1469..1475
-                                ARGS_DESC@1469..1475
-                                  L_PAREN@1469..1470 "("
-                                  ARG@1470..1474
-                                    EXPR@1470..1474
-                                      EXPR_VAR@1470..1474
-                                        NAME@1470..1474
-                                          IDENT@1470..1474 "func"
-                                  R_PAREN@1474..1475 ")"
-                        R_PAREN@1475..1476 ")"
-              WHITESPACE@1476..1481 "\n    "
-              ELSE_KW@1481..1485 "else"
-              WHITESPACE@1485..1486 " "
-              FALSE_EXPR@1486..1664
-                EXPR@1486..1664
-                  EXPR_IF_THEN_ELSE@1486..1664
-                    IF_KW@1486..1488 "if"
-                    WHITESPACE@1488..1489 " "
-                    EXPR@1489..1507
-                      EXPR_UNARY@1489..1507
-                        NOT@1489..1490 "!"
-                        EXPR_VAR@1490..1493
-                          NAME@1490..1493
-                            IDENT@1490..1493 "std"
-                        SUFFIX_INDEX@1493..1502
-                          DOT@1493..1494 "."
-                          NAME@1494..1502
-                            IDENT@1494..1502 "isObject"
-                        SUFFIX_APPLY@1502..1507
-                          ARGS_DESC@1502..1507
-                            L_PAREN@1502..1503 "("
-                            ARG@1503..1506
-                              EXPR@1503..1506
-                                EXPR_VAR@1503..1506
-                                  NAME@1503..1506
-                                    IDENT@1503..1506 "obj"
-                            R_PAREN@1506..1507 ")"
-                    WHITESPACE@1507..1508 " "
-                    THEN_KW@1508..1512 "then"
-                    WHITESPACE@1512..1519 "\n      "
-                    TRUE_EXPR@1519..1593
-                      EXPR@1519..1593
-                        EXPR_ERROR@1519..1593
-                          ERROR_KW@1519..1524 "error"
-                          WHITESPACE@1524..1525 " "
-                          EXPR@1525..1593
-                            EXPR_PARENED@1525..1593
-                              L_PAREN@1525..1526 "("
-                              EXPR@1526..1592
-                                EXPR_BINARY@1526..1592
-                                  EXPR@1526..1576
-                                    EXPR_STRING@1526..1576
-                                      STRING_SINGLE@1526..1576 "'std.mapWithKey secon ..."
-                                  WHITESPACE@1576..1577 " "
-                                  PLUS@1577..1578 "+"
-                                  WHITESPACE@1578..1579 " "
-                                  EXPR@1579..1592
-                                    EXPR_VAR@1579..1582
-                                      NAME@1579..1582
-                                        IDENT@1579..1582 "std"
-                                    SUFFIX_INDEX@1582..1587
-                                      DOT@1582..1583 "."
-                                      NAME@1583..1587
-                                        IDENT@1583..1587 "type"
-                                    SUFFIX_APPLY@1587..1592
-                                      ARGS_DESC@1587..1592
-                                        L_PAREN@1587..1588 "("
-                                        ARG@1588..1591
-                                          EXPR@1588..1591
-                                            EXPR_VAR@1588..1591
-                                              NAME@1588..1591
-                                                IDENT@1588..1591 "obj"
-                                        R_PAREN@1591..1592 ")"
-                              R_PAREN@1592..1593 ")"
-                    WHITESPACE@1593..1598 "\n    "
-                    ELSE_KW@1598..1602 "else"
-                    WHITESPACE@1602..1609 "\n      "
-                    FALSE_EXPR@1609..1664
-                      EXPR@1609..1664
-                        EXPR_OBJECT@1609..1664
-                          OBJ_BODY_COMP@1609..1664
-                            L_BRACE@1609..1610 "{"
-                            WHITESPACE@1610..1611 " "
-                            MEMBER_FIELD_NORMAL@1611..1631
-                              FIELD_NAME_DYNAMIC@1611..1614
-                                L_BRACK@1611..1612 "["
-                                EXPR@1612..1613
-                                  EXPR_VAR@1612..1613
-                                    NAME@1612..1613
-                                      IDENT@1612..1613 "k"
-                                R_BRACK@1613..1614 "]"
-                              COLON@1614..1615 ":"
-                              WHITESPACE@1615..1616 " "
-                              EXPR@1616..1631
-                                EXPR_VAR@1616..1620
-                                  NAME@1616..1620
-                                    IDENT@1616..1620 "func"
-                                SUFFIX_APPLY@1620..1631
-                                  ARGS_DESC@1620..1631
-                                    L_PAREN@1620..1621 "("
-                                    ARG@1621..1622
-                                      EXPR@1621..1622
-                                        EXPR_VAR@1621..1622
-                                          NAME@1621..1622
-                                            IDENT@1621..1622 "k"
-                                    COMMA@1622..1623 ","
-                                    WHITESPACE@1623..1624 " "
-                                    ARG@1624..1630
-                                      EXPR@1624..1630
-                                        EXPR_VAR@1624..1627
-                                          NAME@1624..1627
-                                            IDENT@1624..1627 "obj"
-                                        SUFFIX_INDEX_EXPR@1627..1630
-                                          L_BRACK@1627..1628 "["
-                                          EXPR@1628..1629
-                                            EXPR_VAR@1628..1629
-                                              NAME@1628..1629
-                                                IDENT@1628..1629 "k"
-                                          R_BRACK@1629..1630 "]"
-                                    R_PAREN@1630..1631 ")"
-                            WHITESPACE@1631..1632 " "
-                            FOR_SPEC@1632..1662
-                              FOR_KW@1632..1635 "for"
-                              WHITESPACE@1635..1636 " "
-                              DESTRUCT_FULL@1636..1637
-                                NAME@1636..1637
-                                  IDENT@1636..1637 "k"
-                              WHITESPACE@1637..1638 " "
-                              IN_KW@1638..1640 "in"
-                              WHITESPACE@1640..1641 " "
-                              EXPR@1641..1662
-                                EXPR_VAR@1641..1644
-                                  NAME@1641..1644
-                                    IDENT@1641..1644 "std"
-                                SUFFIX_INDEX@1644..1657
-                                  DOT@1644..1645 "."
-                                  NAME@1645..1657
-                                    IDENT@1645..1657 "objectFields"
-                                SUFFIX_APPLY@1657..1662
-                                  ARGS_DESC@1657..1662
-                                    L_PAREN@1657..1658 "("
-                                    ARG@1658..1661
-                                      EXPR@1658..1661
-                                        EXPR_VAR@1658..1661
-                                          NAME@1658..1661
-                                            IDENT@1658..1661 "obj"
-                                    R_PAREN@1661..1662 ")"
-                            WHITESPACE@1662..1663 " "
-                            R_BRACE@1663..1664 "}"
-        COMMA@1664..1665 ","
-        WHITESPACE@1665..1669 "\n\n  "
-        MEMBER_FIELD_METHOD@1669..1712
-          FIELD_NAME_FIXED@1669..1674
-            NAME@1669..1674
-              IDENT@1669..1674 "lines"
-          PARAMS_DESC@1674..1679
-            L_PAREN@1674..1675 "("
-            PARAM@1675..1678
-              DESTRUCT_FULL@1675..1678
-                NAME@1675..1678
-                  IDENT@1675..1678 "arr"
-            R_PAREN@1678..1679 ")"
-          COLONCOLON@1679..1681 "::"
-          WHITESPACE@1681..1686 "\n    "
-          EXPR@1686..1712
-            EXPR_VAR@1686..1689
-              NAME@1686..1689
-                IDENT@1686..1689 "std"
-            SUFFIX_INDEX@1689..1694
-              DOT@1689..1690 "."
-              NAME@1690..1694
-                IDENT@1690..1694 "join"
-            SUFFIX_APPLY@1694..1712
-              ARGS_DESC@1694..1712
-                L_PAREN@1694..1695 "("
-                ARG@1695..1699
-                  EXPR@1695..1699
-                    EXPR_STRING@1695..1699
-                      STRING_SINGLE@1695..1699 "'\\n'"
-                COMMA@1699..1700 ","
-                WHITESPACE@1700..1701 " "
-                ARG@1701..1711
-                  EXPR@1701..1711
-                    EXPR_BINARY@1701..1711
-                      EXPR@1701..1704
-                        EXPR_VAR@1701..1704
-                          NAME@1701..1704
-                            IDENT@1701..1704 "arr"
-                      WHITESPACE@1704..1705 " "
-                      PLUS@1705..1706 "+"
-                      WHITESPACE@1706..1707 " "
-                      EXPR@1707..1711
-                        EXPR_ARRAY@1707..1711
-                          L_BRACK@1707..1708 "["
-                          EXPR@1708..1710
-                            EXPR_STRING@1708..1710
-                              STRING_SINGLE@1708..1710 "''"
-                          R_BRACK@1710..1711 "]"
-                R_PAREN@1711..1712 ")"
-        COMMA@1712..1713 ","
-        WHITESPACE@1713..1717 "\n\n  "
-        MEMBER_FIELD_METHOD@1717..1929
-          FIELD_NAME_FIXED@1717..1725
-            NAME@1717..1725
-              IDENT@1717..1725 "deepJoin"
-          PARAMS_DESC@1725..1730
-            L_PAREN@1725..1726 "("
-            PARAM@1726..1729
-              DESTRUCT_FULL@1726..1729
-                NAME@1726..1729
-                  IDENT@1726..1729 "arr"
-            R_PAREN@1729..1730 ")"
-          COLONCOLON@1730..1732 "::"
-          WHITESPACE@1732..1737 "\n    "
-          EXPR@1737..1929
-            EXPR_IF_THEN_ELSE@1737..1929
-              IF_KW@1737..1739 "if"
-              WHITESPACE@1739..1740 " "
-              EXPR@1740..1757
-                EXPR_VAR@1740..1743
-                  NAME@1740..1743
-                    IDENT@1740..1743 "std"
-                SUFFIX_INDEX@1743..1752
-                  DOT@1743..1744 "."
-                  NAME@1744..1752
-                    IDENT@1744..1752 "isString"
-                SUFFIX_APPLY@1752..1757
-                  ARGS_DESC@1752..1757
-                    L_PAREN@1752..1753 "("
-                    ARG@1753..1756
-                      EXPR@1753..1756
-                        EXPR_VAR@1753..1756
-                          NAME@1753..1756
-                            IDENT@1753..1756 "arr"
-                    R_PAREN@1756..1757 ")"
-              WHITESPACE@1757..1758 " "
-              THEN_KW@1758..1762 "then"
-              WHITESPACE@1762..1769 "\n      "
-              TRUE_EXPR@1769..1772
-                EXPR@1769..1772
-                  EXPR_VAR@1769..1772
-                    NAME@1769..1772
-                      IDENT@1769..1772 "arr"
-              WHITESPACE@1772..1777 "\n    "
-              ELSE_KW@1777..1781 "else"
-              WHITESPACE@1781..1782 " "
-              FALSE_EXPR@1782..1929
-                EXPR@1782..1929
-                  EXPR_IF_THEN_ELSE@1782..1929
-                    IF_KW@1782..1784 "if"
-                    WHITESPACE@1784..1785 " "
-                    EXPR@1785..1801
-                      EXPR_VAR@1785..1788
-                        NAME@1785..1788
-                          IDENT@1785..1788 "std"
-                      SUFFIX_INDEX@1788..1796
-                        DOT@1788..1789 "."
-                        NAME@1789..1796
-                          IDENT@1789..1796 "isArray"
-                      SUFFIX_APPLY@1796..1801
-                        ARGS_DESC@1796..1801
-                          L_PAREN@1796..1797 "("
-                          ARG@1797..1800
-                            EXPR@1797..1800
-                              EXPR_VAR@1797..1800
-                                NAME@1797..1800
-                                  IDENT@1797..1800 "arr"
-                          R_PAREN@1800..1801 ")"
-                    WHITESPACE@1801..1802 " "
-                    THEN_KW@1802..1806 "then"
-                    WHITESPACE@1806..1813 "\n      "
-                    TRUE_EXPR@1813..1857
-                      EXPR@1813..1857
-                        EXPR_VAR@1813..1816
-                          NAME@1813..1816
-                            IDENT@1813..1816 "std"
-                        SUFFIX_INDEX@1816..1821
-                          DOT@1816..1817 "."
-                          NAME@1817..1821
-                            IDENT@1817..1821 "join"
-                        SUFFIX_APPLY@1821..1857
-                          ARGS_DESC@1821..1857
-                            L_PAREN@1821..1822 "("
-                            ARG@1822..1824
-                              EXPR@1822..1824
-                                EXPR_STRING@1822..1824
-                                  STRING_SINGLE@1822..1824 "''"
-                            COMMA@1824..1825 ","
-                            WHITESPACE@1825..1826 " "
-                            ARG@1826..1856
-                              EXPR@1826..1856
-                                EXPR_ARRAY_COMP@1826..1856
-                                  L_BRACK@1826..1827 "["
-                                  EXPR@1827..1842
-                                    EXPR_VAR@1827..1830
-                                      NAME@1827..1830
-                                        IDENT@1827..1830 "std"
-                                    SUFFIX_INDEX@1830..1839
-                                      DOT@1830..1831 "."
-                                      NAME@1831..1839
-                                        IDENT@1831..1839 "deepJoin"
-                                    SUFFIX_APPLY@1839..1842
-                                      ARGS_DESC@1839..1842
-                                        L_PAREN@1839..1840 "("
-                                        ARG@1840..1841
-                                          EXPR@1840..1841
-                                            EXPR_VAR@1840..1841
-                                              NAME@1840..1841
-                                                IDENT@1840..1841 "x"
-                                        R_PAREN@1841..1842 ")"
-                                  WHITESPACE@1842..1843 " "
-                                  FOR_SPEC@1843..1855
-                                    FOR_KW@1843..1846 "for"
-                                    WHITESPACE@1846..1847 " "
-                                    DESTRUCT_FULL@1847..1848
-                                      NAME@1847..1848
-                                        IDENT@1847..1848 "x"
-                                    WHITESPACE@1848..1849 " "
-                                    IN_KW@1849..1851 "in"
-                                    WHITESPACE@1851..1852 " "
-                                    EXPR@1852..1855
-                                      EXPR_VAR@1852..1855
-                                        NAME@1852..1855
-                                          IDENT@1852..1855 "arr"
-                                  R_BRACK@1855..1856 "]"
-                            R_PAREN@1856..1857 ")"
-                    WHITESPACE@1857..1862 "\n    "
-                    ELSE_KW@1862..1866 "else"
-                    WHITESPACE@1866..1873 "\n      "
-                    FALSE_EXPR@1873..1929
-                      EXPR@1873..1929
-                        EXPR_ERROR@1873..1929
-                          ERROR_KW@1873..1878 "error"
-                          WHITESPACE@1878..1879 " "
-                          EXPR@1879..1929
-                            EXPR_BINARY@1879..1929
-                              EXPR@1879..1913
-                                EXPR_STRING@1879..1913
-                                  STRING_SINGLE@1879..1913 "'Expected string or a ..."
-                              WHITESPACE@1913..1914 " "
-                              MODULO@1914..1915 "%"
-                              WHITESPACE@1915..1916 " "
-                              EXPR@1916..1929
-                                EXPR_VAR@1916..1919
-                                  NAME@1916..1919
-                                    IDENT@1916..1919 "std"
-                                SUFFIX_INDEX@1919..1924
-                                  DOT@1919..1920 "."
-                                  NAME@1920..1924
-                                    IDENT@1920..1924 "type"
-                                SUFFIX_APPLY@1924..1929
-                                  ARGS_DESC@1924..1929
-                                    L_PAREN@1924..1925 "("
-                                    ARG@1925..1928
-                                      EXPR@1925..1928
-                                        EXPR_VAR@1925..1928
-                                          NAME@1925..1928
-                                            IDENT@1925..1928 "arr"
-                                    R_PAREN@1928..1929 ")"
-        COMMA@1929..1930 ","
-        WHITESPACE@1930..1934 "\n\n  "
-        MEMBER_FIELD_METHOD@1934..2042
-          FIELD_NAME_FIXED@1934..1945
-            NAME@1934..1945
-              IDENT@1934..1945 "assertEqual"
-          PARAMS_DESC@1945..1951
-            L_PAREN@1945..1946 "("
-            PARAM@1946..1947
-              DESTRUCT_FULL@1946..1947
-                NAME@1946..1947
-                  IDENT@1946..1947 "a"
-            COMMA@1947..1948 ","
-            WHITESPACE@1948..1949 " "
-            PARAM@1949..1950
-              DESTRUCT_FULL@1949..1950
-                NAME@1949..1950
-                  IDENT@1949..1950 "b"
-            R_PAREN@1950..1951 ")"
-          COLONCOLON@1951..1953 "::"
-          WHITESPACE@1953..1958 "\n    "
-          EXPR@1958..2042
-            EXPR_IF_THEN_ELSE@1958..2042
-              IF_KW@1958..1960 "if"
-              WHITESPACE@1960..1961 " "
-              EXPR@1961..1967
-                EXPR_BINARY@1961..1967
-                  EXPR@1961..1962
-                    EXPR_VAR@1961..1962
-                      NAME@1961..1962
-                        IDENT@1961..1962 "a"
-                  WHITESPACE@1962..1963 " "
-                  EQ@1963..1965 "=="
-                  WHITESPACE@1965..1966 " "
-                  EXPR@1966..1967
-                    EXPR_VAR@1966..1967
-                      NAME@1966..1967
-                        IDENT@1966..1967 "b"
-              WHITESPACE@1967..1968 " "
-              THEN_KW@1968..1972 "then"
-              WHITESPACE@1972..1979 "\n      "
-              TRUE_EXPR@1979..1983
-                EXPR@1979..1983
-                  EXPR_LITERAL@1979..1983
-                    TRUE_KW@1979..1983 "true"
-              WHITESPACE@1983..1988 "\n    "
-              ELSE_KW@1988..1992 "else"
-              WHITESPACE@1992..1999 "\n      "
-              FALSE_EXPR@1999..2042
-                EXPR@1999..2042
-                  EXPR_ERROR@1999..2042
-                    ERROR_KW@1999..2004 "error"
-                    WHITESPACE@2004..2005 " "
-                    EXPR@2005..2042
-                      EXPR_BINARY@2005..2042
-                        EXPR@2005..2038
-                          EXPR_BINARY@2005..2038
-                            EXPR@2005..2029
-                              EXPR_BINARY@2005..2029
-                                EXPR@2005..2025
-                                  EXPR_STRING@2005..2025
-                                    STRING_SINGLE@2005..2025 "'Assertion failed. '"
-                                WHITESPACE@2025..2026 " "
-                                PLUS@2026..2027 "+"
-                                WHITESPACE@2027..2028 " "
-                                EXPR@2028..2029
-                                  EXPR_VAR@2028..2029
-                                    NAME@2028..2029
-                                      IDENT@2028..2029 "a"
-                            WHITESPACE@2029..2030 " "
-                            PLUS@2030..2031 "+"
-                            WHITESPACE@2031..2032 " "
-                            EXPR@2032..2038
-                              EXPR_STRING@2032..2038
-                                STRING_SINGLE@2032..2038 "' != '"
-                        WHITESPACE@2038..2039 " "
-                        PLUS@2039..2040 "+"
-                        WHITESPACE@2040..2041 " "
-                        EXPR@2041..2042
-                          EXPR_VAR@2041..2042
-                            NAME@2041..2042
-                              IDENT@2041..2042 "b"
-        COMMA@2042..2043 ","
-        WHITESPACE@2043..2047 "\n\n  "
-        MEMBER_FIELD_METHOD@2047..2149
-          FIELD_NAME_FIXED@2047..2052
-            NAME@2047..2052
-              IDENT@2047..2052 "clamp"
-          PARAMS_DESC@2052..2071
-            L_PAREN@2052..2053 "("
-            PARAM@2053..2054
-              DESTRUCT_FULL@2053..2054
-                NAME@2053..2054
-                  IDENT@2053..2054 "x"
-            COMMA@2054..2055 ","
-            WHITESPACE@2055..2056 " "
-            PARAM@2056..2062
-              DESTRUCT_FULL@2056..2062
-                NAME@2056..2062
-                  IDENT@2056..2062 "minVal"
-            COMMA@2062..2063 ","
-            WHITESPACE@2063..2064 " "
-            PARAM@2064..2070
-              DESTRUCT_FULL@2064..2070
-                NAME@2064..2070
-                  IDENT@2064..2070 "maxVal"
-            R_PAREN@2070..2071 ")"
-          COLONCOLON@2071..2073 "::"
-          WHITESPACE@2073..2078 "\n    "
-          EXPR@2078..2149
-            EXPR_IF_THEN_ELSE@2078..2149
-              IF_KW@2078..2080 "if"
-              WHITESPACE@2080..2081 " "
-              EXPR@2081..2091
-                EXPR_BINARY@2081..2091
-                  EXPR@2081..2082
-                    EXPR_VAR@2081..2082
-                      NAME@2081..2082
-                        IDENT@2081..2082 "x"
-                  WHITESPACE@2082..2083 " "
-                  LT@2083..2084 "<"
-                  WHITESPACE@2084..2085 " "
-                  EXPR@2085..2091
-                    EXPR_VAR@2085..2091
-                      NAME@2085..2091
-                        IDENT@2085..2091 "minVal"
-              WHITESPACE@2091..2092 " "
-              THEN_KW@2092..2096 "then"
-              WHITESPACE@2096..2097 " "
-              TRUE_EXPR@2097..2103
-                EXPR@2097..2103
-                  EXPR_VAR@2097..2103
-                    NAME@2097..2103
-                      IDENT@2097..2103 "minVal"
-              WHITESPACE@2103..2108 "\n    "
-              ELSE_KW@2108..2112 "else"
-              WHITESPACE@2112..2113 " "
-              FALSE_EXPR@2113..2149
-                EXPR@2113..2149
-                  EXPR_IF_THEN_ELSE@2113..2149
-                    IF_KW@2113..2115 "if"
-                    WHITESPACE@2115..2116 " "
-                    EXPR@2116..2126
-                      EXPR_BINARY@2116..2126
-                        EXPR@2116..2117
-                          EXPR_VAR@2116..2117
-                            NAME@2116..2117
-                              IDENT@2116..2117 "x"
-                        WHITESPACE@2117..2118 " "
-                        GT@2118..2119 ">"
-                        WHITESPACE@2119..2120 " "
-                        EXPR@2120..2126
-                          EXPR_VAR@2120..2126
-                            NAME@2120..2126
-                              IDENT@2120..2126 "maxVal"
-                    WHITESPACE@2126..2127 " "
-                    THEN_KW@2127..2131 "then"
-                    WHITESPACE@2131..2132 " "
-                    TRUE_EXPR@2132..2138
-                      EXPR@2132..2138
-                        EXPR_VAR@2132..2138
-                          NAME@2132..2138
-                            IDENT@2132..2138 "maxVal"
-                    WHITESPACE@2138..2143 "\n    "
-                    ELSE_KW@2143..2147 "else"
-                    WHITESPACE@2147..2148 " "
-                    FALSE_EXPR@2148..2149
-                      EXPR@2148..2149
-                        EXPR_VAR@2148..2149
-                          NAME@2148..2149
-                            IDENT@2148..2149 "x"
-        COMMA@2149..2150 ","
-        WHITESPACE@2150..2154 "\n\n  "
-        MEMBER_FIELD_METHOD@2154..2840
-          FIELD_NAME_FIXED@2154..2165
-            NAME@2154..2165
-              IDENT@2154..2165 "manifestIni"
-          PARAMS_DESC@2165..2170
-            L_PAREN@2165..2166 "("
-            PARAM@2166..2169
-              DESTRUCT_FULL@2166..2169
-                NAME@2166..2169
-                  IDENT@2166..2169 "ini"
-            R_PAREN@2169..2170 ")"
-          COLONCOLON@2170..2172 "::"
-          WHITESPACE@2172..2177 "\n    "
-          EXPR@2177..2840
-            STMT_LOCAL@2177..2481
-              LOCAL_KW@2177..2182 "local"
-              WHITESPACE@2182..2183 " "
-              BIND_FUNCTION@2183..2480
-                NAME@2183..2193
-                  IDENT@2183..2193 "body_lines"
-                PARAMS_DESC@2193..2199
-                  L_PAREN@2193..2194 "("
-                  PARAM@2194..2198
-                    DESTRUCT_FULL@2194..2198
-                      NAME@2194..2198
-                        IDENT@2194..2198 "body"
-                  R_PAREN@2198..2199 ")"
-                WHITESPACE@2199..2200 " "
-                ASSIGN@2200..2201 "="
-                WHITESPACE@2201..2208 "\n      "
-                EXPR@2208..2480
-                  EXPR_VAR@2208..2211
-                    NAME@2208..2211
-                      IDENT@2208..2211 "std"
-                  SUFFIX_INDEX@2211..2216
-                    DOT@2211..2212 "."
-                    NAME@2212..2216
-                      IDENT@2212..2216 "join"
-                  SUFFIX_APPLY@2216..2480
-                    ARGS_DESC@2216..2480
-                      L_PAREN@2216..2217 "("
-                      ARG@2217..2219
-                        EXPR@2217..2219
-                          EXPR_ARRAY@2217..2219
-                            L_BRACK@2217..2218 "["
-                            R_BRACK@2218..2219 "]"
-                      COMMA@2219..2220 ","
-                      WHITESPACE@2220..2221 " "
-                      ARG@2221..2479
-                        EXPR@2221..2479
-                          EXPR_ARRAY_COMP@2221..2479
-                            L_BRACK@2221..2222 "["
-                            WHITESPACE@2222..2231 "\n        "
-                            EXPR@2231..2430
-                              STMT_LOCAL@2231..2263
-                                LOCAL_KW@2231..2236 "local"
-                                WHITESPACE@2236..2237 " "
-                                BIND_DESTRUCT@2237..2262
-                                  DESTRUCT_FULL@2237..2252
-                                    NAME@2237..2252
-                                      IDENT@2237..2252 "value_or_values"
-                                  WHITESPACE@2252..2253 " "
-                                  ASSIGN@2253..2254 "="
-                                  WHITESPACE@2254..2255 " "
-                                  EXPR@2255..2262
-                                    EXPR_VAR@2255..2259
-                                      NAME@2255..2259
-                                        IDENT@2255..2259 "body"
-                                    SUFFIX_INDEX_EXPR@2259..2262
-                                      L_BRACK@2259..2260 "["
-                                      EXPR@2260..2261
-                                        EXPR_VAR@2260..2261
-                                          NAME@2260..2261
-                                            IDENT@2260..2261 "k"
-                                      R_BRACK@2261..2262 "]"
-                                SEMI@2262..2263 ";"
-                              WHITESPACE@2263..2272 "\n        "
-                              EXPR_IF_THEN_ELSE@2272..2430
-                                IF_KW@2272..2274 "if"
-                                WHITESPACE@2274..2275 " "
-                                EXPR@2275..2303
-                                  EXPR_VAR@2275..2278
-                                    NAME@2275..2278
-                                      IDENT@2275..2278 "std"
-                                  SUFFIX_INDEX@2278..2286
-                                    DOT@2278..2279 "."
-                                    NAME@2279..2286
-                                      IDENT@2279..2286 "isArray"
-                                  SUFFIX_APPLY@2286..2303
-                                    ARGS_DESC@2286..2303
-                                      L_PAREN@2286..2287 "("
-                                      ARG@2287..2302
-                                        EXPR@2287..2302
-                                          EXPR_VAR@2287..2302
-                                            NAME@2287..2302
-                                              IDENT@2287..2302 "value_or_values"
-                                      R_PAREN@2302..2303 ")"
-                                WHITESPACE@2303..2304 " "
-                                THEN_KW@2304..2308 "then"
-                                WHITESPACE@2308..2319 "\n          "
-                                TRUE_EXPR@2319..2372
-                                  EXPR@2319..2372
-                                    EXPR_ARRAY_COMP@2319..2372
-                                      L_BRACK@2319..2320 "["
-                                      EXPR@2320..2342
-                                        EXPR_BINARY@2320..2342
-                                          EXPR@2320..2329
-                                            EXPR_STRING@2320..2329
-                                              STRING_SINGLE@2320..2329 "'%s = %s'"
-                                          WHITESPACE@2329..2330 " "
-                                          MODULO@2330..2331 "%"
-                                          WHITESPACE@2331..2332 " "
-                                          EXPR@2332..2342
-                                            EXPR_ARRAY@2332..2342
-                                              L_BRACK@2332..2333 "["
-                                              EXPR@2333..2334
-                                                EXPR_VAR@2333..2334
-                                                  NAME@2333..2334
-                                                    IDENT@2333..2334 "k"
-                                              COMMA@2334..2335 ","
-                                              WHITESPACE@2335..2336 " "
-                                              EXPR@2336..2341
-                                                EXPR_VAR@2336..2341
-                                                  NAME@2336..2341
-                                                    IDENT@2336..2341 "value"
-                                              R_BRACK@2341..2342 "]"
-                                      WHITESPACE@2342..2343 " "
-                                      FOR_SPEC@2343..2371
-                                        FOR_KW@2343..2346 "for"
-                                        WHITESPACE@2346..2347 " "
-                                        DESTRUCT_FULL@2347..2352
-                                          NAME@2347..2352
-                                            IDENT@2347..2352 "value"
-                                        WHITESPACE@2352..2353 " "
-                                        IN_KW@2353..2355 "in"
-                                        WHITESPACE@2355..2356 " "
-                                        EXPR@2356..2371
-                                          EXPR_VAR@2356..2371
-                                            NAME@2356..2371
-                                              IDENT@2356..2371 "value_or_values"
-                                      R_BRACK@2371..2372 "]"
-                                WHITESPACE@2372..2381 "\n        "
-                                ELSE_KW@2381..2385 "else"
-                                WHITESPACE@2385..2396 "\n          "
-                                FALSE_EXPR@2396..2430
-                                  EXPR@2396..2430
-                                    EXPR_ARRAY@2396..2430
-                                      L_BRACK@2396..2397 "["
-                                      EXPR@2397..2429
-                                        EXPR_BINARY@2397..2429
-                                          EXPR@2397..2406
-                                            EXPR_STRING@2397..2406
-                                              STRING_SINGLE@2397..2406 "'%s = %s'"
-                                          WHITESPACE@2406..2407 " "
-                                          MODULO@2407..2408 "%"
-                                          WHITESPACE@2408..2409 " "
-                                          EXPR@2409..2429
-                                            EXPR_ARRAY@2409..2429
-                                              L_BRACK@2409..2410 "["
-                                              EXPR@2410..2411
-                                                EXPR_VAR@2410..2411
-                                                  NAME@2410..2411
-                                                    IDENT@2410..2411 "k"
-                                              COMMA@2411..2412 ","
-                                              WHITESPACE@2412..2413 " "
-                                              EXPR@2413..2428
-                                                EXPR_VAR@2413..2428
-                                                  NAME@2413..2428
-                                                    IDENT@2413..2428 "value_or_values"
-                                              R_BRACK@2428..2429 "]"
-                                      R_BRACK@2429..2430 "]"
-                            WHITESPACE@2430..2440 "\n\n        "
-                            FOR_SPEC@2440..2471
-                              FOR_KW@2440..2443 "for"
-                              WHITESPACE@2443..2444 " "
-                              DESTRUCT_FULL@2444..2445
-                                NAME@2444..2445
-                                  IDENT@2444..2445 "k"
-                              WHITESPACE@2445..2446 " "
-                              IN_KW@2446..2448 "in"
-                              WHITESPACE@2448..2449 " "
-                              EXPR@2449..2471
-                                EXPR_VAR@2449..2452
-                                  NAME@2449..2452
-                                    IDENT@2449..2452 "std"
-                                SUFFIX_INDEX@2452..2465
-                                  DOT@2452..2453 "."
-                                  NAME@2453..2465
-                                    IDENT@2453..2465 "objectFields"
-                                SUFFIX_APPLY@2465..2471
-                                  ARGS_DESC@2465..2471
-                                    L_PAREN@2465..2466 "("
-                                    ARG@2466..2470
-                                      EXPR@2466..2470
-                                        EXPR_VAR@2466..2470
-                                          NAME@2466..2470
-                                            IDENT@2466..2470 "body"
-                                    R_PAREN@2470..2471 ")"
-                            WHITESPACE@2471..2478 "\n      "
-                            R_BRACK@2478..2479 "]"
-                      R_PAREN@2479..2480 ")"
-              SEMI@2480..2481 ";"
-            WHITESPACE@2481..2487 "\n\n    "
-            STMT_LOCAL@2487..2769
-              LOCAL_KW@2487..2492 "local"
-              WHITESPACE@2492..2493 " "
-              BIND_FUNCTION@2493..2561
-                NAME@2493..2506
-                  IDENT@2493..2506 "section_lines"
-                PARAMS_DESC@2506..2520
-                  L_PAREN@2506..2507 "("
-                  PARAM@2507..2512
-                    DESTRUCT_FULL@2507..2512
-                      NAME@2507..2512
-                        IDENT@2507..2512 "sname"
-                  COMMA@2512..2513 ","
-                  WHITESPACE@2513..2514 " "
-                  PARAM@2514..2519
-                    DESTRUCT_FULL@2514..2519
-                      NAME@2514..2519
-                        IDENT@2514..2519 "sbody"
-                  R_PAREN@2519..2520 ")"
-                WHITESPACE@2520..2521 " "
-                ASSIGN@2521..2522 "="
-                WHITESPACE@2522..2523 " "
-                EXPR@2523..2561
-                  EXPR_BINARY@2523..2561
-                    EXPR@2523..2541
-                      EXPR_ARRAY@2523..2541
-                        L_BRACK@2523..2524 "["
-                        EXPR@2524..2540
-                          EXPR_BINARY@2524..2540
-                            EXPR@2524..2530
-                              EXPR_STRING@2524..2530
-                                STRING_SINGLE@2524..2530 "'[%s]'"
-                            WHITESPACE@2530..2531 " "
-                            MODULO@2531..2532 "%"
-                            WHITESPACE@2532..2533 " "
-                            EXPR@2533..2540
-                              EXPR_ARRAY@2533..2540
-                                L_BRACK@2533..2534 "["
-                                EXPR@2534..2539
-                                  EXPR_VAR@2534..2539
-                                    NAME@2534..2539
-                                      IDENT@2534..2539 "sname"
-                                R_BRACK@2539..2540 "]"
-                        R_BRACK@2540..2541 "]"
-                    WHITESPACE@2541..2542 " "
-                    PLUS@2542..2543 "+"
-                    WHITESPACE@2543..2544 " "
-                    EXPR@2544..2561
-                      EXPR_VAR@2544..2554
-                        NAME@2544..2554
-                          IDENT@2544..2554 "body_lines"
-                      SUFFIX_APPLY@2554..2561
-                        ARGS_DESC@2554..2561
-                          L_PAREN@2554..2555 "("
-                          ARG@2555..2560
-                            EXPR@2555..2560
-                              EXPR_VAR@2555..2560
-                                NAME@2555..2560
-                                  IDENT@2555..2560 "sbody"
-                          R_PAREN@2560..2561 ")"
-              COMMA@2561..2562 ","
-              WHITESPACE@2562..2573 "\n          "
-              BIND_DESTRUCT@2573..2648
-                DESTRUCT_FULL@2573..2582
-                  NAME@2573..2582
-                    IDENT@2573..2582 "main_body"
-                WHITESPACE@2582..2583 " "
-                ASSIGN@2583..2584 "="
-                WHITESPACE@2584..2585 " "
-                EXPR@2585..2648
-                  EXPR_IF_THEN_ELSE@2585..2648
-                    IF_KW@2585..2587 "if"
-                    WHITESPACE@2587..2588 " "
-                    EXPR@2588..2614
-                      EXPR_VAR@2588..2591
-                        NAME@2588..2591
-                          IDENT@2588..2591 "std"
-                      SUFFIX_INDEX@2591..2601
-                        DOT@2591..2592 "."
-                        NAME@2592..2601
-                          IDENT@2592..2601 "objectHas"
-                      SUFFIX_APPLY@2601..2614
-                        ARGS_DESC@2601..2614
-                          L_PAREN@2601..2602 "("
-                          ARG@2602..2605
-                            EXPR@2602..2605
-                              EXPR_VAR@2602..2605
-                                NAME@2602..2605
-                                  IDENT@2602..2605 "ini"
-                          COMMA@2605..2606 ","
-                          WHITESPACE@2606..2607 " "
-                          ARG@2607..2613
-                            EXPR@2607..2613
-                              EXPR_STRING@2607..2613
-                                STRING_SINGLE@2607..2613 "'main'"
-                          R_PAREN@2613..2614 ")"
-                    WHITESPACE@2614..2615 " "
-                    THEN_KW@2615..2619 "then"
-                    WHITESPACE@2619..2620 " "
-                    TRUE_EXPR@2620..2640
-                      EXPR@2620..2640
-                        EXPR_VAR@2620..2630
-                          NAME@2620..2630
-                            IDENT@2620..2630 "body_lines"
-                        SUFFIX_APPLY@2630..2640
-                          ARGS_DESC@2630..2640
-                            L_PAREN@2630..2631 "("
-                            ARG@2631..2639
-                              EXPR@2631..2639
-                                EXPR_VAR@2631..2634
-                                  NAME@2631..2634
-                                    IDENT@2631..2634 "ini"
-                                SUFFIX_INDEX@2634..2639
-                                  DOT@2634..2635 "."
-                                  NAME@2635..2639
-                                    IDENT@2635..2639 "main"
-                            R_PAREN@2639..2640 ")"
-                    WHITESPACE@2640..2641 " "
-                    ELSE_KW@2641..2645 "else"
-                    WHITESPACE@2645..2646 " "
-                    FALSE_EXPR@2646..2648
-                      EXPR@2646..2648
-                        EXPR_ARRAY@2646..2648
-                          L_BRACK@2646..2647 "["
-                          R_BRACK@2647..2648 "]"
-              COMMA@2648..2649 ","
-              WHITESPACE@2649..2660 "\n          "
-              BIND_DESTRUCT@2660..2768
-                DESTRUCT_FULL@2660..2672
-                  NAME@2660..2672
-                    IDENT@2660..2672 "all_sections"
-                WHITESPACE@2672..2673 " "
-                ASSIGN@2673..2674 "="
-                WHITESPACE@2674..2675 " "
-                EXPR@2675..2768
-                  EXPR_ARRAY_COMP@2675..2768
-                    L_BRACK@2675..2676 "["
-                    WHITESPACE@2676..2683 "\n      "
-                    EXPR@2683..2716
-                      EXPR_VAR@2683..2696
-                        NAME@2683..2696
-                          IDENT@2683..2696 "section_lines"
-                      SUFFIX_APPLY@2696..2716
-                        ARGS_DESC@2696..2716
-                          L_PAREN@2696..2697 "("
-                          ARG@2697..2698
-                            EXPR@2697..2698
-                              EXPR_VAR@2697..2698
-                                NAME@2697..2698
-                                  IDENT@2697..2698 "k"
-                          COMMA@2698..2699 ","
-                          WHITESPACE@2699..2700 " "
-                          ARG@2700..2715
-                            EXPR@2700..2715
-                              EXPR_VAR@2700..2703
-                                NAME@2700..2703
-                                  IDENT@2700..2703 "ini"
-                              SUFFIX_INDEX@2703..2712
-                                DOT@2703..2704 "."
-                                NAME@2704..2712
-                                  IDENT@2704..2712 "sections"
-                              SUFFIX_INDEX_EXPR@2712..2715
-                                L_BRACK@2712..2713 "["
-                                EXPR@2713..2714
-                                  EXPR_VAR@2713..2714
-                                    NAME@2713..2714
-                                      IDENT@2713..2714 "k"
-                                R_BRACK@2714..2715 "]"
-                          R_PAREN@2715..2716 ")"
-                    WHITESPACE@2716..2723 "\n      "
-                    FOR_SPEC@2723..2762
-                      FOR_KW@2723..2726 "for"
-                      WHITESPACE@2726..2727 " "
-                      DESTRUCT_FULL@2727..2728
-                        NAME@2727..2728
-                          IDENT@2727..2728 "k"
-                      WHITESPACE@2728..2729 " "
-                      IN_KW@2729..2731 "in"
-                      WHITESPACE@2731..2732 " "
-                      EXPR@2732..2762
-                        EXPR_VAR@2732..2735
-                          NAME@2732..2735
-                            IDENT@2732..2735 "std"
-                        SUFFIX_INDEX@2735..2748
-                          DOT@2735..2736 "."
-                          NAME@2736..2748
-                            IDENT@2736..2748 "objectFields"
-                        SUFFIX_APPLY@2748..2762
-                          ARGS_DESC@2748..2762
-                            L_PAREN@2748..2749 "("
-                            ARG@2749..2761
-                              EXPR@2749..2761
-                                EXPR_VAR@2749..2752
-                                  NAME@2749..2752
-                                    IDENT@2749..2752 "ini"
-                                SUFFIX_INDEX@2752..2761
-                                  DOT@2752..2753 "."
-                                  NAME@2753..2761
-                                    IDENT@2753..2761 "sections"
-                            R_PAREN@2761..2762 ")"
-                    WHITESPACE@2762..2767 "\n    "
-                    R_BRACK@2767..2768 "]"
-              SEMI@2768..2769 ";"
-            WHITESPACE@2769..2774 "\n    "
-            EXPR_VAR@2774..2777
-              NAME@2774..2777
-                IDENT@2774..2777 "std"
-            SUFFIX_INDEX@2777..2782
-              DOT@2777..2778 "."
-              NAME@2778..2782
-                IDENT@2778..2782 "join"
-            SUFFIX_APPLY@2782..2840
-              ARGS_DESC@2782..2840
-                L_PAREN@2782..2783 "("
-                ARG@2783..2787
-                  EXPR@2783..2787
-                    EXPR_STRING@2783..2787
-                      STRING_SINGLE@2783..2787 "'\\n'"
-                COMMA@2787..2788 ","
-                WHITESPACE@2788..2789 " "
-                ARG@2789..2839
-                  EXPR@2789..2839
-                    EXPR_BINARY@2789..2839
-                      EXPR@2789..2832
-                        EXPR_BINARY@2789..2832
-                          EXPR@2789..2798
-                            EXPR_VAR@2789..2798
-                              NAME@2789..2798
-                                IDENT@2789..2798 "main_body"
-                          WHITESPACE@2798..2799 " "
-                          PLUS@2799..2800 "+"
-                          WHITESPACE@2800..2801 " "
-                          EXPR@2801..2832
-                            EXPR_VAR@2801..2804
-                              NAME@2801..2804
-                                IDENT@2801..2804 "std"
-                            SUFFIX_INDEX@2804..2818
-                              DOT@2804..2805 "."
-                              NAME@2805..2818
-                                IDENT@2805..2818 "flattenArrays"
-                            SUFFIX_APPLY@2818..2832
-                              ARGS_DESC@2818..2832
-                                L_PAREN@2818..2819 "("
-                                ARG@2819..2831
-                                  EXPR@2819..2831
-                                    EXPR_VAR@2819..2831
-                                      NAME@2819..2831
-                                        IDENT@2819..2831 "all_sections"
-                                R_PAREN@2831..2832 ")"
-                      WHITESPACE@2832..2833 " "
-                      PLUS@2833..2834 "+"
-                      WHITESPACE@2834..2835 " "
-                      EXPR@2835..2839
-                        EXPR_ARRAY@2835..2839
-                          L_BRACK@2835..2836 "["
-                          EXPR@2836..2838
-                            EXPR_STRING@2836..2838
-                              STRING_SINGLE@2836..2838 "''"
-                          R_BRACK@2838..2839 "]"
-                R_PAREN@2839..2840 ")"
-        COMMA@2840..2841 ","
-        WHITESPACE@2841..2845 "\n\n  "
-        MEMBER_FIELD_METHOD@2845..2898
-          FIELD_NAME_FIXED@2845..2857
-            NAME@2845..2857
-              IDENT@2845..2857 "manifestToml"
-          PARAMS_DESC@2857..2864
-            L_PAREN@2857..2858 "("
-            PARAM@2858..2863
-              DESTRUCT_FULL@2858..2863
-                NAME@2858..2863
-                  IDENT@2858..2863 "value"
-            R_PAREN@2863..2864 ")"
-          COLONCOLON@2864..2866 "::"
-          WHITESPACE@2866..2867 " "
-          EXPR@2867..2898
-            EXPR_VAR@2867..2870
-              NAME@2867..2870
-                IDENT@2867..2870 "std"
-            SUFFIX_INDEX@2870..2885
-              DOT@2870..2871 "."
-              NAME@2871..2885
-                IDENT@2871..2885 "manifestTomlEx"
-            SUFFIX_APPLY@2885..2898
-              ARGS_DESC@2885..2898
-                L_PAREN@2885..2886 "("
-                ARG@2886..2891
-                  EXPR@2886..2891
-                    EXPR_VAR@2886..2891
-                      NAME@2886..2891
-                        IDENT@2886..2891 "value"
-                COMMA@2891..2892 ","
-                WHITESPACE@2892..2893 " "
-                ARG@2893..2897
-                  EXPR@2893..2897
-                    EXPR_STRING@2893..2897
-                      STRING_SINGLE@2893..2897 "'  '"
-                R_PAREN@2897..2898 ")"
-        COMMA@2898..2899 ","
-        WHITESPACE@2899..2903 "\n\n  "
-        MEMBER_FIELD_METHOD@2903..2958
-          FIELD_NAME_FIXED@2903..2921
-            NAME@2903..2921
-              IDENT@2903..2921 "escapeStringPython"
-          PARAMS_DESC@2921..2926
-            L_PAREN@2921..2922 "("
-            PARAM@2922..2925
-              DESTRUCT_FULL@2922..2925
-                NAME@2922..2925
-                  IDENT@2922..2925 "str"
-            R_PAREN@2925..2926 ")"
-          COLONCOLON@2926..2928 "::"
-          WHITESPACE@2928..2933 "\n    "
-          EXPR@2933..2958
-            EXPR_VAR@2933..2936
-              NAME@2933..2936
-                IDENT@2933..2936 "std"
-            SUFFIX_INDEX@2936..2953
-              DOT@2936..2937 "."
-              NAME@2937..2953
-                IDENT@2937..2953 "escapeStringJson"
-            SUFFIX_APPLY@2953..2958
-              ARGS_DESC@2953..2958
-                L_PAREN@2953..2954 "("
-                ARG@2954..2957
-                  EXPR@2954..2957
-                    EXPR_VAR@2954..2957
-                      NAME@2954..2957
-                        IDENT@2954..2957 "str"
-                R_PAREN@2957..2958 ")"
-        COMMA@2958..2959 ","
-        WHITESPACE@2959..2963 "\n\n  "
-        MEMBER_FIELD_METHOD@2963..3180
-          FIELD_NAME_FIXED@2963..2979
-            NAME@2963..2979
-              IDENT@2963..2979 "escapeStringBash"
-          PARAMS_DESC@2979..2985
-            L_PAREN@2979..2980 "("
-            PARAM@2980..2984
-              DESTRUCT_FULL@2980..2984
-                NAME@2980..2984
-                  IDENT@2980..2984 "str_"
-            R_PAREN@2984..2985 ")"
-          COLONCOLON@2985..2987 "::"
-          WHITESPACE@2987..2992 "\n    "
-          EXPR@2992..3180
-            STMT_LOCAL@2992..3023
-              LOCAL_KW@2992..2997 "local"
-              WHITESPACE@2997..2998 " "
-              BIND_DESTRUCT@2998..3022
-                DESTRUCT_FULL@2998..3001
-                  NAME@2998..3001
-                    IDENT@2998..3001 "str"
-                WHITESPACE@3001..3002 " "
-                ASSIGN@3002..3003 "="
-                WHITESPACE@3003..3004 " "
-                EXPR@3004..3022
-                  EXPR_VAR@3004..3007
-                    NAME@3004..3007
-                      IDENT@3004..3007 "std"
-                  SUFFIX_INDEX@3007..3016
-                    DOT@3007..3008 "."
-                    NAME@3008..3016
-                      IDENT@3008..3016 "toString"
-                  SUFFIX_APPLY@3016..3022
-                    ARGS_DESC@3016..3022
-                      L_PAREN@3016..3017 "("
-                      ARG@3017..3021
-                        EXPR@3017..3021
-                          EXPR_VAR@3017..3021
-                            NAME@3017..3021
-                              IDENT@3017..3021 "str_"
-                      R_PAREN@3021..3022 ")"
-              SEMI@3022..3023 ";"
-            WHITESPACE@3023..3028 "\n    "
-            STMT_LOCAL@3028..3110
-              LOCAL_KW@3028..3033 "local"
-              WHITESPACE@3033..3034 " "
-              BIND_FUNCTION@3034..3109
-                NAME@3034..3039
-                  IDENT@3034..3039 "trans"
-                PARAMS_DESC@3039..3043
-                  L_PAREN@3039..3040 "("
-                  PARAM@3040..3042
-                    DESTRUCT_FULL@3040..3042
-                      NAME@3040..3042
-                        IDENT@3040..3042 "ch"
-                  R_PAREN@3042..3043 ")"
-                WHITESPACE@3043..3044 " "
-                ASSIGN@3044..3045 "="
-                WHITESPACE@3045..3052 "\n      "
-                EXPR@3052..3109
-                  EXPR_IF_THEN_ELSE@3052..3109
-                    IF_KW@3052..3054 "if"
-                    WHITESPACE@3054..3055 " "
-                    EXPR@3055..3064
-                      EXPR_BINARY@3055..3064
-                        EXPR@3055..3057
-                          EXPR_VAR@3055..3057
-                            NAME@3055..3057
-                              IDENT@3055..3057 "ch"
-                        WHITESPACE@3057..3058 " "
-                        EQ@3058..3060 "=="
-                        WHITESPACE@3060..3061 " "
-                        EXPR@3061..3064
-                          EXPR_STRING@3061..3064
-                            STRING_DOUBLE@3061..3064 "\"'\""
-                    WHITESPACE@3064..3065 " "
-                    THEN_KW@3065..3069 "then"
-                    WHITESPACE@3069..3078 "\n        "
-                    TRUE_EXPR@3078..3087
-                      EXPR@3078..3087
-                        EXPR_STRING@3078..3087
-                          STRING_DOUBLE@3078..3087 "\"'\\\"'\\\"'\""
-                    WHITESPACE@3087..3094 "\n      "
-                    ELSE_KW@3094..3098 "else"
-                    WHITESPACE@3098..3107 "\n        "
-                    FALSE_EXPR@3107..3109
-                      EXPR@3107..3109
-                        EXPR_VAR@3107..3109
-                          NAME@3107..3109
-                            IDENT@3107..3109 "ch"
-              SEMI@3109..3110 ";"
-            WHITESPACE@3110..3115 "\n    "
-            EXPR_BINARY@3115..3180
-              EXPR@3115..3121
-                EXPR_STRING@3115..3121
-                  STRING_DOUBLE@3115..3121 "\"'%s'\""
-              WHITESPACE@3121..3122 " "
-              MODULO@3122..3123 "%"
-              WHITESPACE@3123..3124 " "
-              EXPR@3124..3180
-                EXPR_VAR@3124..3127
-                  NAME@3124..3127
-                    IDENT@3124..3127 "std"
-                SUFFIX_INDEX@3127..3132
-                  DOT@3127..3128 "."
-                  NAME@3128..3132
-                    IDENT@3128..3132 "join"
-                SUFFIX_APPLY@3132..3180
-                  ARGS_DESC@3132..3180
-                    L_PAREN@3132..3133 "("
-                    ARG@3133..3135
-                      EXPR@3133..3135
-                        EXPR_STRING@3133..3135
-                          STRING_SINGLE@3133..3135 "''"
-                    COMMA@3135..3136 ","
-                    WHITESPACE@3136..3137 " "
-                    ARG@3137..3179
-                      EXPR@3137..3179
-                        EXPR_ARRAY_COMP@3137..3179
-                          L_BRACK@3137..3138 "["
-                          EXPR@3138..3147
-                            EXPR_VAR@3138..3143
-                              NAME@3138..3143
-                                IDENT@3138..3143 "trans"
-                            SUFFIX_APPLY@3143..3147
-                              ARGS_DESC@3143..3147
-                                L_PAREN@3143..3144 "("
-                                ARG@3144..3146
-                                  EXPR@3144..3146
-                                    EXPR_VAR@3144..3146
-                                      NAME@3144..3146
-                                        IDENT@3144..3146 "ch"
-                                R_PAREN@3146..3147 ")"
-                          WHITESPACE@3147..3148 " "
-                          FOR_SPEC@3148..3178
-                            FOR_KW@3148..3151 "for"
-                            WHITESPACE@3151..3152 " "
-                            DESTRUCT_FULL@3152..3154
-                              NAME@3152..3154
-                                IDENT@3152..3154 "ch"
-                            WHITESPACE@3154..3155 " "
-                            IN_KW@3155..3157 "in"
-                            WHITESPACE@3157..3158 " "
-                            EXPR@3158..3178
-                              EXPR_VAR@3158..3161
-                                NAME@3158..3161
-                                  IDENT@3158..3161 "std"
-                              SUFFIX_INDEX@3161..3173
-                                DOT@3161..3162 "."
-                                NAME@3162..3173
-                                  IDENT@3162..3173 "stringChars"
-                              SUFFIX_APPLY@3173..3178
-                                ARGS_DESC@3173..3178
-                                  L_PAREN@3173..3174 "("
-                                  ARG@3174..3177
-                                    EXPR@3174..3177
-                                      EXPR_VAR@3174..3177
-                                        NAME@3174..3177
-                                          IDENT@3174..3177 "str"
-                                  R_PAREN@3177..3178 ")"
-                          R_BRACK@3178..3179 "]"
-                    R_PAREN@3179..3180 ")"
-        COMMA@3180..3181 ","
-        WHITESPACE@3181..3185 "\n\n  "
-        MEMBER_FIELD_METHOD@3185..3399
-          FIELD_NAME_FIXED@3185..3204
-            NAME@3185..3204
-              IDENT@3185..3204 "escapeStringDollars"
-          PARAMS_DESC@3204..3210
-            L_PAREN@3204..3205 "("
-            PARAM@3205..3209
-              DESTRUCT_FULL@3205..3209
-                NAME@3205..3209
-                  IDENT@3205..3209 "str_"
-            R_PAREN@3209..3210 ")"
-          COLONCOLON@3210..3212 "::"
-          WHITESPACE@3212..3217 "\n    "
-          EXPR@3217..3399
-            STMT_LOCAL@3217..3248
-              LOCAL_KW@3217..3222 "local"
-              WHITESPACE@3222..3223 " "
-              BIND_DESTRUCT@3223..3247
-                DESTRUCT_FULL@3223..3226
-                  NAME@3223..3226
-                    IDENT@3223..3226 "str"
-                WHITESPACE@3226..3227 " "
-                ASSIGN@3227..3228 "="
-                WHITESPACE@3228..3229 " "
-                EXPR@3229..3247
-                  EXPR_VAR@3229..3232
-                    NAME@3229..3232
-                      IDENT@3229..3232 "std"
-                  SUFFIX_INDEX@3232..3241
-                    DOT@3232..3233 "."
-                    NAME@3233..3241
-                      IDENT@3233..3241 "toString"
-                  SUFFIX_APPLY@3241..3247
-                    ARGS_DESC@3241..3247
-                      L_PAREN@3241..3242 "("
-                      ARG@3242..3246
-                        EXPR@3242..3246
-                          EXPR_VAR@3242..3246
-                            NAME@3242..3246
-                              IDENT@3242..3246 "str_"
-                      R_PAREN@3246..3247 ")"
-              SEMI@3247..3248 ";"
-            WHITESPACE@3248..3253 "\n    "
-            STMT_LOCAL@3253..3330
-              LOCAL_KW@3253..3258 "local"
-              WHITESPACE@3258..3259 " "
-              BIND_FUNCTION@3259..3329
-                NAME@3259..3264
-                  IDENT@3259..3264 "trans"
-                PARAMS_DESC@3264..3268
-                  L_PAREN@3264..3265 "("
-                  PARAM@3265..3267
-                    DESTRUCT_FULL@3265..3267
-                      NAME@3265..3267
-                        IDENT@3265..3267 "ch"
-                  R_PAREN@3267..3268 ")"
-                WHITESPACE@3268..3269 " "
-                ASSIGN@3269..3270 "="
-                WHITESPACE@3270..3277 "\n      "
-                EXPR@3277..3329
-                  EXPR_IF_THEN_ELSE@3277..3329
-                    IF_KW@3277..3279 "if"
-                    WHITESPACE@3279..3280 " "
-                    EXPR@3280..3289
-                      EXPR_BINARY@3280..3289
-                        EXPR@3280..3282
-                          EXPR_VAR@3280..3282
-                            NAME@3280..3282
-                              IDENT@3280..3282 "ch"
-                        WHITESPACE@3282..3283 " "
-                        EQ@3283..3285 "=="
-                        WHITESPACE@3285..3286 " "
-                        EXPR@3286..3289
-                          EXPR_STRING@3286..3289
-                            STRING_SINGLE@3286..3289 "'$'"
-                    WHITESPACE@3289..3290 " "
-                    THEN_KW@3290..3294 "then"
-                    WHITESPACE@3294..3303 "\n        "
-                    TRUE_EXPR@3303..3307
-                      EXPR@3303..3307
-                        EXPR_STRING@3303..3307
-                          STRING_SINGLE@3303..3307 "'$$'"
-                    WHITESPACE@3307..3314 "\n      "
-                    ELSE_KW@3314..3318 "else"
-                    WHITESPACE@3318..3327 "\n        "
-                    FALSE_EXPR@3327..3329
-                      EXPR@3327..3329
-                        EXPR_VAR@3327..3329
-                          NAME@3327..3329
-                            IDENT@3327..3329 "ch"
-              SEMI@3329..3330 ";"
-            WHITESPACE@3330..3335 "\n    "
-            EXPR_VAR@3335..3338
-              NAME@3335..3338
-                IDENT@3335..3338 "std"
-            SUFFIX_INDEX@3338..3344
-              DOT@3338..3339 "."
-              NAME@3339..3344
-                IDENT@3339..3344 "foldl"
-            SUFFIX_APPLY@3344..3399
-              ARGS_DESC@3344..3399
-                L_PAREN@3344..3345 "("
-                ARG@3345..3372
-                  EXPR@3345..3372
-                    EXPR_FUNCTION@3345..3372
-                      FUNCTION_KW@3345..3353 "function"
-                      PARAMS_DESC@3353..3359
-                        L_PAREN@3353..3354 "("
-                        PARAM@3354..3355
-                          DESTRUCT_FULL@3354..3355
-                            NAME@3354..3355
-                              IDENT@3354..3355 "a"
-                        COMMA@3355..3356 ","
-                        WHITESPACE@3356..3357 " "
-                        PARAM@3357..3358
-                          DESTRUCT_FULL@3357..3358
-                            NAME@3357..3358
-                              IDENT@3357..3358 "b"
-                        R_PAREN@3358..3359 ")"
-                      WHITESPACE@3359..3360 " "
-                      EXPR@3360..3372
-                        EXPR_BINARY@3360..3372
-                          EXPR@3360..3361
-                            EXPR_VAR@3360..3361
-                              NAME@3360..3361
-                                IDENT@3360..3361 "a"
-                          WHITESPACE@3361..3362 " "
-                          PLUS@3362..3363 "+"
-                          WHITESPACE@3363..3364 " "
-                          EXPR@3364..3372
-                            EXPR_VAR@3364..3369
-                              NAME@3364..3369
-                                IDENT@3364..3369 "trans"
-                            SUFFIX_APPLY@3369..3372
-                              ARGS_DESC@3369..3372
-                                L_PAREN@3369..3370 "("
-                                ARG@3370..3371
-                                  EXPR@3370..3371
-                                    EXPR_VAR@3370..3371
-                                      NAME@3370..3371
-                                        IDENT@3370..3371 "b"
-                                R_PAREN@3371..3372 ")"
-                COMMA@3372..3373 ","
-                WHITESPACE@3373..3374 " "
-                ARG@3374..3394
-                  EXPR@3374..3394
-                    EXPR_VAR@3374..3377
-                      NAME@3374..3377
-                        IDENT@3374..3377 "std"
-                    SUFFIX_INDEX@3377..3389
-                      DOT@3377..3378 "."
-                      NAME@3378..3389
-                        IDENT@3378..3389 "stringChars"
-                    SUFFIX_APPLY@3389..3394
-                      ARGS_DESC@3389..3394
-                        L_PAREN@3389..3390 "("
-                        ARG@3390..3393
-                          EXPR@3390..3393
-                            EXPR_VAR@3390..3393
-                              NAME@3390..3393
-                                IDENT@3390..3393 "str"
-                        R_PAREN@3393..3394 ")"
-                COMMA@3394..3395 ","
-                WHITESPACE@3395..3396 " "
-                ARG@3396..3398
-                  EXPR@3396..3398
-                    EXPR_STRING@3396..3398
-                      STRING_SINGLE@3396..3398 "''"
-                R_PAREN@3398..3399 ")"
-        COMMA@3399..3400 ","
-        WHITESPACE@3400..3404 "\n\n  "
-        MEMBER_BIND_STMT@3404..3519
-          OBJ_LOCAL@3404..3519
-            LOCAL_KW@3404..3409 "local"
-            WHITESPACE@3409..3410 " "
-            BIND_DESTRUCT@3410..3519
-              DESTRUCT_FULL@3410..3421
-                NAME@3410..3421
-                  IDENT@3410..3421 "xml_escapes"
-              WHITESPACE@3421..3422 " "
-              ASSIGN@3422..3423 "="
-              WHITESPACE@3423..3424 " "
-              EXPR@3424..3519
-                EXPR_OBJECT@3424..3519
-                  OBJ_BODY_MEMBER_LIST@3424..3519
-                    L_BRACE@3424..3425 "{"
-                    WHITESPACE@3425..3430 "\n    "
-                    MEMBER_FIELD_NORMAL@3430..3441
-                      FIELD_NAME_FIXED@3430..3433
-                        STRING_SINGLE@3430..3433 "'<'"
-                      COLON@3433..3434 ":"
-                      WHITESPACE@3434..3435 " "
-                      EXPR@3435..3441
-                        EXPR_STRING@3435..3441
-                          STRING_SINGLE@3435..3441 "'&lt;'"
-                    COMMA@3441..3442 ","
-                    WHITESPACE@3442..3447 "\n    "
-                    MEMBER_FIELD_NORMAL@3447..3458
-                      FIELD_NAME_FIXED@3447..3450
-                        STRING_SINGLE@3447..3450 "'>'"
-                      COLON@3450..3451 ":"
-                      WHITESPACE@3451..3452 " "
-                      EXPR@3452..3458
-                        EXPR_STRING@3452..3458
-                          STRING_SINGLE@3452..3458 "'&gt;'"
-                    COMMA@3458..3459 ","
-                    WHITESPACE@3459..3464 "\n    "
-                    MEMBER_FIELD_NORMAL@3464..3476
-                      FIELD_NAME_FIXED@3464..3467
-                        STRING_SINGLE@3464..3467 "'&'"
-                      COLON@3467..3468 ":"
-                      WHITESPACE@3468..3469 " "
-                      EXPR@3469..3476
-                        EXPR_STRING@3469..3476
-                          STRING_SINGLE@3469..3476 "'&amp;'"
-                    COMMA@3476..3477 ","
-                    WHITESPACE@3477..3482 "\n    "
-                    MEMBER_FIELD_NORMAL@3482..3495
-                      FIELD_NAME_FIXED@3482..3485
-                        STRING_SINGLE@3482..3485 "'\"'"
-                      COLON@3485..3486 ":"
-                      WHITESPACE@3486..3487 " "
-                      EXPR@3487..3495
-                        EXPR_STRING@3487..3495
-                          STRING_SINGLE@3487..3495 "'&quot;'"
-                    COMMA@3495..3496 ","
-                    WHITESPACE@3496..3501 "\n    "
-                    MEMBER_FIELD_NORMAL@3501..3514
-                      FIELD_NAME_FIXED@3501..3504
-                        STRING_DOUBLE@3501..3504 "\"'\""
-                      COLON@3504..3505 ":"
-                      WHITESPACE@3505..3506 " "
-                      EXPR@3506..3514
-                        EXPR_STRING@3506..3514
-                          STRING_SINGLE@3506..3514 "'&apos;'"
-                    COMMA@3514..3515 ","
-                    WHITESPACE@3515..3518 "\n  "
-                    R_BRACE@3518..3519 "}"
-        COMMA@3519..3520 ","
-        WHITESPACE@3520..3524 "\n\n  "
-        MEMBER_FIELD_METHOD@3524..3663
-          FIELD_NAME_FIXED@3524..3539
-            NAME@3524..3539
-              IDENT@3524..3539 "escapeStringXML"
-          PARAMS_DESC@3539..3545
-            L_PAREN@3539..3540 "("
-            PARAM@3540..3544
-              DESTRUCT_FULL@3540..3544
-                NAME@3540..3544
-                  IDENT@3540..3544 "str_"
-            R_PAREN@3544..3545 ")"
-          COLONCOLON@3545..3547 "::"
-          WHITESPACE@3547..3552 "\n    "
-          EXPR@3552..3663
-            STMT_LOCAL@3552..3583
-              LOCAL_KW@3552..3557 "local"
-              WHITESPACE@3557..3558 " "
-              BIND_DESTRUCT@3558..3582
-                DESTRUCT_FULL@3558..3561
-                  NAME@3558..3561
-                    IDENT@3558..3561 "str"
-                WHITESPACE@3561..3562 " "
-                ASSIGN@3562..3563 "="
-                WHITESPACE@3563..3564 " "
-                EXPR@3564..3582
-                  EXPR_VAR@3564..3567
-                    NAME@3564..3567
-                      IDENT@3564..3567 "std"
-                  SUFFIX_INDEX@3567..3576
-                    DOT@3567..3568 "."
-                    NAME@3568..3576
-                      IDENT@3568..3576 "toString"
-                  SUFFIX_APPLY@3576..3582
-                    ARGS_DESC@3576..3582
-                      L_PAREN@3576..3577 "("
-                      ARG@3577..3581
-                        EXPR@3577..3581
-                          EXPR_VAR@3577..3581
-                            NAME@3577..3581
-                              IDENT@3577..3581 "str_"
-                      R_PAREN@3581..3582 ")"
-              SEMI@3582..3583 ";"
-            WHITESPACE@3583..3588 "\n    "
-            EXPR_VAR@3588..3591
-              NAME@3588..3591
-                IDENT@3588..3591 "std"
-            SUFFIX_INDEX@3591..3596
-              DOT@3591..3592 "."
-              NAME@3592..3596
-                IDENT@3592..3596 "join"
-            SUFFIX_APPLY@3596..3663
-              ARGS_DESC@3596..3663
-                L_PAREN@3596..3597 "("
-                ARG@3597..3599
-                  EXPR@3597..3599
-                    EXPR_STRING@3597..3599
-                      STRING_SINGLE@3597..3599 "''"
-                COMMA@3599..3600 ","
-                WHITESPACE@3600..3601 " "
-                ARG@3601..3662
-                  EXPR@3601..3662
-                    EXPR_ARRAY_COMP@3601..3662
-                      L_BRACK@3601..3602 "["
-                      EXPR@3602..3630
-                        EXPR_VAR@3602..3605
-                          NAME@3602..3605
-                            IDENT@3602..3605 "std"
-                        SUFFIX_INDEX@3605..3609
-                          DOT@3605..3606 "."
-                          NAME@3606..3609
-                            IDENT@3606..3609 "get"
-                        SUFFIX_APPLY@3609..3630
-                          ARGS_DESC@3609..3630
-                            L_PAREN@3609..3610 "("
-                            ARG@3610..3621
-                              EXPR@3610..3621
-                                EXPR_VAR@3610..3621
-                                  NAME@3610..3621
-                                    IDENT@3610..3621 "xml_escapes"
-                            COMMA@3621..3622 ","
-                            WHITESPACE@3622..3623 " "
-                            ARG@3623..3625
-                              EXPR@3623..3625
-                                EXPR_VAR@3623..3625
-                                  NAME@3623..3625
-                                    IDENT@3623..3625 "ch"
-                            COMMA@3625..3626 ","
-                            WHITESPACE@3626..3627 " "
-                            ARG@3627..3629
-                              EXPR@3627..3629
-                                EXPR_VAR@3627..3629
-                                  NAME@3627..3629
-                                    IDENT@3627..3629 "ch"
-                            R_PAREN@3629..3630 ")"
-                      WHITESPACE@3630..3631 " "
-                      FOR_SPEC@3631..3661
-                        FOR_KW@3631..3634 "for"
-                        WHITESPACE@3634..3635 " "
-                        DESTRUCT_FULL@3635..3637
-                          NAME@3635..3637
-                            IDENT@3635..3637 "ch"
-                        WHITESPACE@3637..3638 " "
-                        IN_KW@3638..3640 "in"
-                        WHITESPACE@3640..3641 " "
-                        EXPR@3641..3661
-                          EXPR_VAR@3641..3644
-                            NAME@3641..3644
-                              IDENT@3641..3644 "std"
-                          SUFFIX_INDEX@3644..3656
-                            DOT@3644..3645 "."
-                            NAME@3645..3656
-                              IDENT@3645..3656 "stringChars"
-                          SUFFIX_APPLY@3656..3661
-                            ARGS_DESC@3656..3661
-                              L_PAREN@3656..3657 "("
-                              ARG@3657..3660
-                                EXPR@3657..3660
-                                  EXPR_VAR@3657..3660
-                                    NAME@3657..3660
-                                      IDENT@3657..3660 "str"
-                              R_PAREN@3660..3661 ")"
-                      R_BRACK@3661..3662 "]"
-                R_PAREN@3662..3663 ")"
-        COMMA@3663..3664 ","
-        WHITESPACE@3664..3668 "\n\n  "
-        MEMBER_FIELD_METHOD@3668..3734
-          FIELD_NAME_FIXED@3668..3680
-            NAME@3668..3680
-              IDENT@3668..3680 "manifestJson"
-          PARAMS_DESC@3680..3687
-            L_PAREN@3680..3681 "("
-            PARAM@3681..3686
-              DESTRUCT_FULL@3681..3686
-                NAME@3681..3686
-                  IDENT@3681..3686 "value"
-            R_PAREN@3686..3687 ")"
-          COLONCOLON@3687..3689 "::"
-          WHITESPACE@3689..3690 " "
-          EXPR@3690..3734
-            EXPR_VAR@3690..3693
-              NAME@3690..3693
-                IDENT@3690..3693 "std"
-            SUFFIX_INDEX@3693..3708
-              DOT@3693..3694 "."
-              NAME@3694..3708
-                IDENT@3694..3708 "manifestJsonEx"
-            SUFFIX_APPLY@3708..3734
-              ARGS_DESC@3708..3734
-                L_PAREN@3708..3709 "("
-                ARG@3709..3714
-                  EXPR@3709..3714
-                    EXPR_VAR@3709..3714
-                      NAME@3709..3714
-                        IDENT@3709..3714 "value"
-                COMMA@3714..3715 ","
-                WHITESPACE@3715..3716 " "
-                ARG@3716..3722
-                  EXPR@3716..3722
-                    EXPR_STRING@3716..3722
-                      STRING_SINGLE@3716..3722 "'    '"
-                R_PAREN@3722..3723 ")"
-                WHITESPACE@3723..3724 " "
-                TAILSTRICT_KW@3724..3734 "tailstrict"
-        COMMA@3734..3735 ","
-        WHITESPACE@3735..3739 "\n\n  "
-        MEMBER_FIELD_METHOD@3739..3807
-          FIELD_NAME_FIXED@3739..3759
-            NAME@3739..3759
-              IDENT@3739..3759 "manifestJsonMinified"
-          PARAMS_DESC@3759..3766
-            L_PAREN@3759..3760 "("
-            PARAM@3760..3765
-              DESTRUCT_FULL@3760..3765
-                NAME@3760..3765
-                  IDENT@3760..3765 "value"
-            R_PAREN@3765..3766 ")"
-          COLONCOLON@3766..3768 "::"
-          WHITESPACE@3768..3769 " "
-          EXPR@3769..3807
-            EXPR_VAR@3769..3772
-              NAME@3769..3772
-                IDENT@3769..3772 "std"
-            SUFFIX_INDEX@3772..3787
-              DOT@3772..3773 "."
-              NAME@3773..3787
-                IDENT@3773..3787 "manifestJsonEx"
-            SUFFIX_APPLY@3787..3807
-              ARGS_DESC@3787..3807
-                L_PAREN@3787..3788 "("
-                ARG@3788..3793
-                  EXPR@3788..3793
-                    EXPR_VAR@3788..3793
-                      NAME@3788..3793
-                        IDENT@3788..3793 "value"
-                COMMA@3793..3794 ","
-                WHITESPACE@3794..3795 " "
-                ARG@3795..3797
-                  EXPR@3795..3797
-                    EXPR_STRING@3795..3797
-                      STRING_SINGLE@3795..3797 "''"
-                COMMA@3797..3798 ","
-                WHITESPACE@3798..3799 " "
-                ARG@3799..3801
-                  EXPR@3799..3801
-                    EXPR_STRING@3799..3801
-                      STRING_SINGLE@3799..3801 "''"
-                COMMA@3801..3802 ","
-                WHITESPACE@3802..3803 " "
-                ARG@3803..3806
-                  EXPR@3803..3806
-                    EXPR_STRING@3803..3806
-                      STRING_SINGLE@3803..3806 "':'"
-                R_PAREN@3806..3807 ")"
-        COMMA@3807..3808 ","
-        WHITESPACE@3808..3812 "\n\n  "
-        MEMBER_FIELD_METHOD@3812..4197
-          FIELD_NAME_FIXED@3812..3830
-            NAME@3812..3830
-              IDENT@3812..3830 "manifestYamlStream"
-          PARAMS_DESC@3830..3905
-            L_PAREN@3830..3831 "("
-            PARAM@3831..3836
-              DESTRUCT_FULL@3831..3836
-                NAME@3831..3836
-                  IDENT@3831..3836 "value"
-            COMMA@3836..3837 ","
-            WHITESPACE@3837..3838 " "
-            PARAM@3838..3866
-              DESTRUCT_FULL@3838..3860
-                NAME@3838..3860
-                  IDENT@3838..3860 "indent_array_in_object"
-              ASSIGN@3860..3861 "="
-              EXPR@3861..3866
-                EXPR_LITERAL@3861..3866
-                  FALSE_KW@3861..3866 "false"
-            COMMA@3866..3867 ","
-            WHITESPACE@3867..3868 " "
-            PARAM@3868..3887
-              DESTRUCT_FULL@3868..3882
-                NAME@3868..3882
-                  IDENT@3868..3882 "c_document_end"
-              ASSIGN@3882..3883 "="
-              EXPR@3883..3887
-                EXPR_LITERAL@3883..3887
-                  TRUE_KW@3883..3887 "true"
-            COMMA@3887..3888 ","
-            WHITESPACE@3888..3889 " "
-            PARAM@3889..3904
-              DESTRUCT_FULL@3889..3899
-                NAME@3889..3899
-                  IDENT@3889..3899 "quote_keys"
-              ASSIGN@3899..3900 "="
-              EXPR@3900..3904
-                EXPR_LITERAL@3900..3904
-                  TRUE_KW@3900..3904 "true"
-            R_PAREN@3904..3905 ")"
-          COLONCOLON@3905..3907 "::"
-          WHITESPACE@3907..3912 "\n    "
-          EXPR@3912..4197
-            EXPR_IF_THEN_ELSE@3912..4197
-              IF_KW@3912..3914 "if"
-              WHITESPACE@3914..3915 " "
-              EXPR@3915..3934
-                EXPR_UNARY@3915..3934
-                  NOT@3915..3916 "!"
-                  EXPR_VAR@3916..3919
-                    NAME@3916..3919
-                      IDENT@3916..3919 "std"
-                  SUFFIX_INDEX@3919..3927
-                    DOT@3919..3920 "."
-                    NAME@3920..3927
-                      IDENT@3920..3927 "isArray"
-                  SUFFIX_APPLY@3927..3934
-                    ARGS_DESC@3927..3934
-                      L_PAREN@3927..3928 "("
-                      ARG@3928..3933
-                        EXPR@3928..3933
-                          EXPR_VAR@3928..3933
-                            NAME@3928..3933
-                              IDENT@3928..3933 "value"
-                      R_PAREN@3933..3934 ")"
-              WHITESPACE@3934..3935 " "
-              THEN_KW@3935..3939 "then"
-              WHITESPACE@3939..3946 "\n      "
-              TRUE_EXPR@3946..4014
-                EXPR@3946..4014
-                  EXPR_ERROR@3946..4014
-                    ERROR_KW@3946..3951 "error"
-                    WHITESPACE@3951..3952 " "
-                    EXPR@3952..4014
-                      EXPR_BINARY@3952..4014
-                        EXPR@3952..3996
-                          EXPR_STRING@3952..3996
-                            STRING_SINGLE@3952..3996 "'manifestYamlStream o ..."
-                        WHITESPACE@3996..3997 " "
-                        PLUS@3997..3998 "+"
-                        WHITESPACE@3998..3999 " "
-                        EXPR@3999..4014
-                          EXPR_VAR@3999..4002
-                            NAME@3999..4002
-                              IDENT@3999..4002 "std"
-                          SUFFIX_INDEX@4002..4007
-                            DOT@4002..4003 "."
-                            NAME@4003..4007
-                              IDENT@4003..4007 "type"
-                          SUFFIX_APPLY@4007..4014
-                            ARGS_DESC@4007..4014
-                              L_PAREN@4007..4008 "("
-                              ARG@4008..4013
-                                EXPR@4008..4013
-                                  EXPR_VAR@4008..4013
-                                    NAME@4008..4013
-                                      IDENT@4008..4013 "value"
-                              R_PAREN@4013..4014 ")"
-              WHITESPACE@4014..4019 "\n    "
-              ELSE_KW@4019..4023 "else"
-              WHITESPACE@4023..4030 "\n      "
-              FALSE_EXPR@4030..4197
-                EXPR@4030..4197
-                  EXPR_BINARY@4030..4197
-                    EXPR@4030..4152
-                      EXPR_BINARY@4030..4152
-                        EXPR@4030..4037
-                          EXPR_STRING@4030..4037
-                            STRING_SINGLE@4030..4037 "'---\\n'"
-                        WHITESPACE@4037..4038 " "
-                        PLUS@4038..4039 "+"
-                        WHITESPACE@4039..4040 " "
-                        EXPR@4040..4152
-                          EXPR_VAR@4040..4043
-                            NAME@4040..4043
-                              IDENT@4040..4043 "std"
-                          SUFFIX_INDEX@4043..4048
-                            DOT@4043..4044 "."
-                            NAME@4044..4048
-                              IDENT@4044..4048 "join"
-                          SUFFIX_APPLY@4048..4152
-                            ARGS_DESC@4048..4152
-                              L_PAREN@4048..4049 "("
-                              WHITESPACE@4049..4058 "\n        "
-                              ARG@4058..4067
-                                EXPR@4058..4067
-                                  EXPR_STRING@4058..4067
-                                    STRING_SINGLE@4058..4067 "'\\n---\\n'"
-                              COMMA@4067..4068 ","
-                              WHITESPACE@4068..4069 " "
-                              ARG@4069..4144
-                                EXPR@4069..4144
-                                  EXPR_ARRAY_COMP@4069..4144
-                                    L_BRACK@4069..4070 "["
-                                    EXPR@4070..4128
-                                      EXPR_VAR@4070..4073
-                                        NAME@4070..4073
-                                          IDENT@4070..4073 "std"
-                                      SUFFIX_INDEX@4073..4089
-                                        DOT@4073..4074 "."
-                                        NAME@4074..4089
-                                          IDENT@4074..4089 "manifestYamlDoc"
-                                      SUFFIX_APPLY@4089..4128
-                                        ARGS_DESC@4089..4128
-                                          L_PAREN@4089..4090 "("
-                                          ARG@4090..4091
-                                            EXPR@4090..4091
-                                              EXPR_VAR@4090..4091
-                                                NAME@4090..4091
-                                                  IDENT@4090..4091 "e"
-                                          COMMA@4091..4092 ","
-                                          WHITESPACE@4092..4093 " "
-                                          ARG@4093..4115
-                                            EXPR@4093..4115
-                                              EXPR_VAR@4093..4115
-                                                NAME@4093..4115
-                                                  IDENT@4093..4115 "indent_array_in_object"
-                                          COMMA@4115..4116 ","
-                                          WHITESPACE@4116..4117 " "
-                                          ARG@4117..4127
-                                            EXPR@4117..4127
-                                              EXPR_VAR@4117..4127
-                                                NAME@4117..4127
-                                                  IDENT@4117..4127 "quote_keys"
-                                          R_PAREN@4127..4128 ")"
-                                    WHITESPACE@4128..4129 " "
-                                    FOR_SPEC@4129..4143
-                                      FOR_KW@4129..4132 "for"
-                                      WHITESPACE@4132..4133 " "
-                                      DESTRUCT_FULL@4133..4134
-                                        NAME@4133..4134
-                                          IDENT@4133..4134 "e"
-                                      WHITESPACE@4134..4135 " "
-                                      IN_KW@4135..4137 "in"
-                                      WHITESPACE@4137..4138 " "
-                                      EXPR@4138..4143
-                                        EXPR_VAR@4138..4143
-                                          NAME@4138..4143
-                                            IDENT@4138..4143 "value"
-                                    R_BRACK@4143..4144 "]"
-                              WHITESPACE@4144..4151 "\n      "
-                              R_PAREN@4151..4152 ")"
-                    WHITESPACE@4152..4153 " "
-                    PLUS@4153..4154 "+"
-                    WHITESPACE@4154..4155 " "
-                    EXPR@4155..4197
-                      EXPR_IF_THEN_ELSE@4155..4197
-                        IF_KW@4155..4157 "if"
-                        WHITESPACE@4157..4158 " "
-                        EXPR@4158..4172
-                          EXPR_VAR@4158..4172
-                            NAME@4158..4172
-                              IDENT@4158..4172 "c_document_end"
-                        WHITESPACE@4172..4173 " "
-                        THEN_KW@4173..4177 "then"
-                        WHITESPACE@4177..4178 " "
-                        TRUE_EXPR@4178..4187
-                          EXPR@4178..4187
-                            EXPR_STRING@4178..4187
-                              STRING_SINGLE@4178..4187 "'\\n...\\n'"
-                        WHITESPACE@4187..4188 " "
-                        ELSE_KW@4188..4192 "else"
-                        WHITESPACE@4192..4193 " "
-                        FALSE_EXPR@4193..4197
-                          EXPR@4193..4197
-                            EXPR_STRING@4193..4197
-                              STRING_SINGLE@4193..4197 "'\\n'"
-        COMMA@4197..4198 ","
-        WHITESPACE@4198..4202 "\n\n  "
-        MEMBER_FIELD_METHOD@4202..4858
-          FIELD_NAME_FIXED@4202..4216
-            NAME@4202..4216
-              IDENT@4202..4216 "manifestPython"
-          PARAMS_DESC@4216..4219
-            L_PAREN@4216..4217 "("
-            PARAM@4217..4218
-              DESTRUCT_FULL@4217..4218
-                NAME@4217..4218
-                  IDENT@4217..4218 "v"
-            R_PAREN@4218..4219 ")"
-          COLONCOLON@4219..4221 "::"
-          WHITESPACE@4221..4226 "\n    "
-          EXPR@4226..4858
-            EXPR_IF_THEN_ELSE@4226..4858
-              IF_KW@4226..4228 "if"
-              WHITESPACE@4228..4229 " "
-              EXPR@4229..4244
-                EXPR_VAR@4229..4232
-                  NAME@4229..4232
-                    IDENT@4229..4232 "std"
-                SUFFIX_INDEX@4232..4241
-                  DOT@4232..4233 "."
-                  NAME@4233..4241
-                    IDENT@4233..4241 "isObject"
-                SUFFIX_APPLY@4241..4244
-                  ARGS_DESC@4241..4244
-                    L_PAREN@4241..4242 "("
-                    ARG@4242..4243
-                      EXPR@4242..4243
-                        EXPR_VAR@4242..4243
-                          NAME@4242..4243
-                            IDENT@4242..4243 "v"
-                    R_PAREN@4243..4244 ")"
-              WHITESPACE@4244..4245 " "
-              THEN_KW@4245..4249 "then"
-              WHITESPACE@4249..4256 "\n      "
-              TRUE_EXPR@4256..4431
-                EXPR@4256..4431
-                  STMT_LOCAL@4256..4391
-                    LOCAL_KW@4256..4261 "local"
-                    WHITESPACE@4261..4262 " "
-                    BIND_DESTRUCT@4262..4390
-                      DESTRUCT_FULL@4262..4268
-                        NAME@4262..4268
-                          IDENT@4262..4268 "fields"
-                      WHITESPACE@4268..4269 " "
-                      ASSIGN@4269..4270 "="
-                      WHITESPACE@4270..4271 " "
-                      EXPR@4271..4390
-                        EXPR_ARRAY_COMP@4271..4390
-                          L_BRACK@4271..4272 "["
-                          WHITESPACE@4272..4281 "\n        "
-                          EXPR@4281..4345
-                            EXPR_BINARY@4281..4345
-                              EXPR@4281..4289
-                                EXPR_STRING@4281..4289
-                                  STRING_SINGLE@4281..4289 "'%s: %s'"
-                              WHITESPACE@4289..4290 " "
-                              MODULO@4290..4291 "%"
-                              WHITESPACE@4291..4292 " "
-                              EXPR@4292..4345
-                                EXPR_ARRAY@4292..4345
-                                  L_BRACK@4292..4293 "["
-                                  EXPR@4293..4318
-                                    EXPR_VAR@4293..4296
-                                      NAME@4293..4296
-                                        IDENT@4293..4296 "std"
-                                    SUFFIX_INDEX@4296..4315
-                                      DOT@4296..4297 "."
-                                      NAME@4297..4315
-                                        IDENT@4297..4315 "escapeStringPython"
-                                    SUFFIX_APPLY@4315..4318
-                                      ARGS_DESC@4315..4318
-                                        L_PAREN@4315..4316 "("
-                                        ARG@4316..4317
-                                          EXPR@4316..4317
-                                            EXPR_VAR@4316..4317
-                                              NAME@4316..4317
-                                                IDENT@4316..4317 "k"
-                                        R_PAREN@4317..4318 ")"
-                                  COMMA@4318..4319 ","
-                                  WHITESPACE@4319..4320 " "
-                                  EXPR@4320..4344
-                                    EXPR_VAR@4320..4323
-                                      NAME@4320..4323
-                                        IDENT@4320..4323 "std"
-                                    SUFFIX_INDEX@4323..4338
-                                      DOT@4323..4324 "."
-                                      NAME@4324..4338
-                                        IDENT@4324..4338 "manifestPython"
-                                    SUFFIX_APPLY@4338..4344
-                                      ARGS_DESC@4338..4344
-                                        L_PAREN@4338..4339 "("
-                                        ARG@4339..4343
-                                          EXPR@4339..4343
-                                            EXPR_VAR@4339..4340
-                                              NAME@4339..4340
-                                                IDENT@4339..4340 "v"
-                                            SUFFIX_INDEX_EXPR@4340..4343
-                                              L_BRACK@4340..4341 "["
-                                              EXPR@4341..4342
-                                                EXPR_VAR@4341..4342
-                                                  NAME@4341..4342
-                                                    IDENT@4341..4342 "k"
-                                              R_BRACK@4342..4343 "]"
-                                        R_PAREN@4343..4344 ")"
-                                  R_BRACK@4344..4345 "]"
-                          WHITESPACE@4345..4354 "\n        "
-                          FOR_SPEC@4354..4382
-                            FOR_KW@4354..4357 "for"
-                            WHITESPACE@4357..4358 " "
-                            DESTRUCT_FULL@4358..4359
-                              NAME@4358..4359
-                                IDENT@4358..4359 "k"
-                            WHITESPACE@4359..4360 " "
-                            IN_KW@4360..4362 "in"
-                            WHITESPACE@4362..4363 " "
-                            EXPR@4363..4382
-                              EXPR_VAR@4363..4366
-                                NAME@4363..4366
-                                  IDENT@4363..4366 "std"
-                              SUFFIX_INDEX@4366..4379
-                                DOT@4366..4367 "."
-                                NAME@4367..4379
-                                  IDENT@4367..4379 "objectFields"
-                              SUFFIX_APPLY@4379..4382
-                                ARGS_DESC@4379..4382
-                                  L_PAREN@4379..4380 "("
-                                  ARG@4380..4381
-                                    EXPR@4380..4381
-                                      EXPR_VAR@4380..4381
-                                        NAME@4380..4381
-                                          IDENT@4380..4381 "v"
-                                  R_PAREN@4381..4382 ")"
-                          WHITESPACE@4382..4389 "\n      "
-                          R_BRACK@4389..4390 "]"
-                    SEMI@4390..4391 ";"
-                  WHITESPACE@4391..4398 "\n      "
-                  EXPR_BINARY@4398..4431
-                    EXPR@4398..4404
-                      EXPR_STRING@4398..4404
-                        STRING_SINGLE@4398..4404 "'{%s}'"
-                    WHITESPACE@4404..4405 " "
-                    MODULO@4405..4406 "%"
-                    WHITESPACE@4406..4407 " "
-                    EXPR@4407..4431
-                      EXPR_ARRAY@4407..4431
-                        L_BRACK@4407..4408 "["
-                        EXPR@4408..4430
-                          EXPR_VAR@4408..4411
-                            NAME@4408..4411
-                              IDENT@4408..4411 "std"
-                          SUFFIX_INDEX@4411..4416
-                            DOT@4411..4412 "."
-                            NAME@4412..4416
-                              IDENT@4412..4416 "join"
-                          SUFFIX_APPLY@4416..4430
-                            ARGS_DESC@4416..4430
-                              L_PAREN@4416..4417 "("
-                              ARG@4417..4421
-                                EXPR@4417..4421
-                                  EXPR_STRING@4417..4421
-                                    STRING_SINGLE@4417..4421 "', '"
-                              COMMA@4421..4422 ","
-                              WHITESPACE@4422..4423 " "
-                              ARG@4423..4429
-                                EXPR@4423..4429
-                                  EXPR_VAR@4423..4429
-                                    NAME@4423..4429
-                                      IDENT@4423..4429 "fields"
-                              R_PAREN@4429..4430 ")"
-                        R_BRACK@4430..4431 "]"
-              WHITESPACE@4431..4436 "\n    "
-              ELSE_KW@4436..4440 "else"
-              WHITESPACE@4440..4441 " "
-              FALSE_EXPR@4441..4858
-                EXPR@4441..4858
-                  EXPR_IF_THEN_ELSE@4441..4858
-                    IF_KW@4441..4443 "if"
-                    WHITESPACE@4443..4444 " "
-                    EXPR@4444..4458
-                      EXPR_VAR@4444..4447
-                        NAME@4444..4447
-                          IDENT@4444..4447 "std"
-                      SUFFIX_INDEX@4447..4455
-                        DOT@4447..4448 "."
-                        NAME@4448..4455
-                          IDENT@4448..4455 "isArray"
-                      SUFFIX_APPLY@4455..4458
-                        ARGS_DESC@4455..4458
-                          L_PAREN@4455..4456 "("
-                          ARG@4456..4457
-                            EXPR@4456..4457
-                              EXPR_VAR@4456..4457
-                                NAME@4456..4457
-                                  IDENT@4456..4457 "v"
-                          R_PAREN@4457..4458 ")"
-                    WHITESPACE@4458..4459 " "
-                    THEN_KW@4459..4463 "then"
-                    WHITESPACE@4463..4470 "\n      "
-                    TRUE_EXPR@4470..4533
-                      EXPR@4470..4533
-                        EXPR_BINARY@4470..4533
-                          EXPR@4470..4476
-                            EXPR_STRING@4470..4476
-                              STRING_SINGLE@4470..4476 "'[%s]'"
-                          WHITESPACE@4476..4477 " "
-                          MODULO@4477..4478 "%"
-                          WHITESPACE@4478..4479 " "
-                          EXPR@4479..4533
-                            EXPR_ARRAY@4479..4533
-                              L_BRACK@4479..4480 "["
-                              EXPR@4480..4532
-                                EXPR_VAR@4480..4483
-                                  NAME@4480..4483
-                                    IDENT@4480..4483 "std"
-                                SUFFIX_INDEX@4483..4488
-                                  DOT@4483..4484 "."
-                                  NAME@4484..4488
-                                    IDENT@4484..4488 "join"
-                                SUFFIX_APPLY@4488..4532
-                                  ARGS_DESC@4488..4532
-                                    L_PAREN@4488..4489 "("
-                                    ARG@4489..4493
-                                      EXPR@4489..4493
-                                        EXPR_STRING@4489..4493
-                                          STRING_SINGLE@4489..4493 "', '"
-                                    COMMA@4493..4494 ","
-                                    WHITESPACE@4494..4495 " "
-                                    ARG@4495..4531
-                                      EXPR@4495..4531
-                                        EXPR_ARRAY_COMP@4495..4531
-                                          L_BRACK@4495..4496 "["
-                                          EXPR@4496..4518
-                                            EXPR_VAR@4496..4499
-                                              NAME@4496..4499
-                                                IDENT@4496..4499 "std"
-                                            SUFFIX_INDEX@4499..4514
-                                              DOT@4499..4500 "."
-                                              NAME@4500..4514
-                                                IDENT@4500..4514 "manifestPython"
-                                            SUFFIX_APPLY@4514..4518
-                                              ARGS_DESC@4514..4518
-                                                L_PAREN@4514..4515 "("
-                                                ARG@4515..4517
-                                                  EXPR@4515..4517
-                                                    EXPR_VAR@4515..4517
-                                                      NAME@4515..4517
-                                                        IDENT@4515..4517 "v2"
-                                                R_PAREN@4517..4518 ")"
-                                          WHITESPACE@4518..4519 " "
-                                          FOR_SPEC@4519..4530
-                                            FOR_KW@4519..4522 "for"
-                                            WHITESPACE@4522..4523 " "
-                                            DESTRUCT_FULL@4523..4525
-                                              NAME@4523..4525
-                                                IDENT@4523..4525 "v2"
-                                            WHITESPACE@4525..4526 " "
-                                            IN_KW@4526..4528 "in"
-                                            WHITESPACE@4528..4529 " "
-                                            EXPR@4529..4530
-                                              EXPR_VAR@4529..4530
-                                                NAME@4529..4530
-                                                  IDENT@4529..4530 "v"
-                                          R_BRACK@4530..4531 "]"
-                                    R_PAREN@4531..4532 ")"
-                              R_BRACK@4532..4533 "]"
-                    WHITESPACE@4533..4538 "\n    "
-                    ELSE_KW@4538..4542 "else"
-                    WHITESPACE@4542..4543 " "
-                    FALSE_EXPR@4543..4858
-                      EXPR@4543..4858
-                        EXPR_IF_THEN_ELSE@4543..4858
-                          IF_KW@4543..4545 "if"
-                          WHITESPACE@4545..4546 " "
-                          EXPR@4546..4561
-                            EXPR_VAR@4546..4549
-                              NAME@4546..4549
-                                IDENT@4546..4549 "std"
-                            SUFFIX_INDEX@4549..4558
-                              DOT@4549..4550 "."
-                              NAME@4550..4558
-                                IDENT@4550..4558 "isString"
-                            SUFFIX_APPLY@4558..4561
-                              ARGS_DESC@4558..4561
-                                L_PAREN@4558..4559 "("
-                                ARG@4559..4560
-                                  EXPR@4559..4560
-                                    EXPR_VAR@4559..4560
-                                      NAME@4559..4560
-                                        IDENT@4559..4560 "v"
-                                R_PAREN@4560..4561 ")"
-                          WHITESPACE@4561..4562 " "
-                          THEN_KW@4562..4566 "then"
-                          WHITESPACE@4566..4573 "\n      "
-                          TRUE_EXPR@4573..4607
-                            EXPR@4573..4607
-                              EXPR_BINARY@4573..4607
-                                EXPR@4573..4577
-                                  EXPR_STRING@4573..4577
-                                    STRING_SINGLE@4573..4577 "'%s'"
-                                WHITESPACE@4577..4578 " "
-                                MODULO@4578..4579 "%"
-                                WHITESPACE@4579..4580 " "
-                                EXPR@4580..4607
-                                  EXPR_ARRAY@4580..4607
-                                    L_BRACK@4580..4581 "["
-                                    EXPR@4581..4606
-                                      EXPR_VAR@4581..4584
-                                        NAME@4581..4584
-                                          IDENT@4581..4584 "std"
-                                      SUFFIX_INDEX@4584..4603
-                                        DOT@4584..4585 "."
-                                        NAME@4585..4603
-                                          IDENT@4585..4603 "escapeStringPython"
-                                      SUFFIX_APPLY@4603..4606
-                                        ARGS_DESC@4603..4606
-                                          L_PAREN@4603..4604 "("
-                                          ARG@4604..4605
-                                            EXPR@4604..4605
-                                              EXPR_VAR@4604..4605
-                                                NAME@4604..4605
-                                                  IDENT@4604..4605 "v"
-                                          R_PAREN@4605..4606 ")"
-                                    R_BRACK@4606..4607 "]"
-                          WHITESPACE@4607..4612 "\n    "
-                          ELSE_KW@4612..4616 "else"
-                          WHITESPACE@4616..4617 " "
-                          FALSE_EXPR@4617..4858
-                            EXPR@4617..4858
-                              EXPR_IF_THEN_ELSE@4617..4858
-                                IF_KW@4617..4619 "if"
-                                WHITESPACE@4619..4620 " "
-                                EXPR@4620..4637
-                                  EXPR_VAR@4620..4623
-                                    NAME@4620..4623
-                                      IDENT@4620..4623 "std"
-                                  SUFFIX_INDEX@4623..4634
-                                    DOT@4623..4624 "."
-                                    NAME@4624..4634
-                                      IDENT@4624..4634 "isFunction"
-                                  SUFFIX_APPLY@4634..4637
-                                    ARGS_DESC@4634..4637
-                                      L_PAREN@4634..4635 "("
-                                      ARG@4635..4636
-                                        EXPR@4635..4636
-                                          EXPR_VAR@4635..4636
-                                            NAME@4635..4636
-                                              IDENT@4635..4636 "v"
-                                      R_PAREN@4636..4637 ")"
-                                WHITESPACE@4637..4638 " "
-                                THEN_KW@4638..4642 "then"
-                                WHITESPACE@4642..4649 "\n      "
-                                TRUE_EXPR@4649..4681
-                                  EXPR@4649..4681
-                                    EXPR_ERROR@4649..4681
-                                      ERROR_KW@4649..4654 "error"
-                                      WHITESPACE@4654..4655 " "
-                                      EXPR@4655..4681
-                                        EXPR_STRING@4655..4681
-                                          STRING_SINGLE@4655..4681 "'cannot manifest func ..."
-                                WHITESPACE@4681..4686 "\n    "
-                                ELSE_KW@4686..4690 "else"
-                                WHITESPACE@4690..4691 " "
-                                FALSE_EXPR@4691..4858
-                                  EXPR@4691..4858
-                                    EXPR_IF_THEN_ELSE@4691..4858
-                                      IF_KW@4691..4693 "if"
-                                      WHITESPACE@4693..4694 " "
-                                      EXPR@4694..4709
-                                        EXPR_VAR@4694..4697
-                                          NAME@4694..4697
-                                            IDENT@4694..4697 "std"
-                                        SUFFIX_INDEX@4697..4706
-                                          DOT@4697..4698 "."
-                                          NAME@4698..4706
-                                            IDENT@4698..4706 "isNumber"
-                                        SUFFIX_APPLY@4706..4709
-                                          ARGS_DESC@4706..4709
-                                            L_PAREN@4706..4707 "("
-                                            ARG@4707..4708
-                                              EXPR@4707..4708
-                                                EXPR_VAR@4707..4708
-                                                  NAME@4707..4708
-                                                    IDENT@4707..4708 "v"
-                                            R_PAREN@4708..4709 ")"
-                                      WHITESPACE@4709..4710 " "
-                                      THEN_KW@4710..4714 "then"
-                                      WHITESPACE@4714..4721 "\n      "
-                                      TRUE_EXPR@4721..4736
-                                        EXPR@4721..4736
-                                          EXPR_VAR@4721..4724
-                                            NAME@4721..4724
-                                              IDENT@4721..4724 "std"
-                                          SUFFIX_INDEX@4724..4733
-                                            DOT@4724..4725 "."
-                                            NAME@4725..4733
-                                              IDENT@4725..4733 "toString"
-                                          SUFFIX_APPLY@4733..4736
-                                            ARGS_DESC@4733..4736
-                                              L_PAREN@4733..4734 "("
-                                              ARG@4734..4735
-                                                EXPR@4734..4735
-                                                  EXPR_VAR@4734..4735
-                                                    NAME@4734..4735
-                                                      IDENT@4734..4735 "v"
-                                              R_PAREN@4735..4736 ")"
-                                      WHITESPACE@4736..4741 "\n    "
-                                      ELSE_KW@4741..4745 "else"
-                                      WHITESPACE@4745..4746 " "
-                                      FALSE_EXPR@4746..4858
-                                        EXPR@4746..4858
-                                          EXPR_IF_THEN_ELSE@4746..4858
-                                            IF_KW@4746..4748 "if"
-                                            WHITESPACE@4748..4749 " "
-                                            EXPR@4749..4758
-                                              EXPR_BINARY@4749..4758
-                                                EXPR@4749..4750
-                                                  EXPR_VAR@4749..4750
-                                                    NAME@4749..4750
-                                                      IDENT@4749..4750 "v"
-                                                WHITESPACE@4750..4751 " "
-                                                EQ@4751..4753 "=="
-                                                WHITESPACE@4753..4754 " "
-                                                EXPR@4754..4758
-                                                  EXPR_LITERAL@4754..4758
-                                                    TRUE_KW@4754..4758 "true"
-                                            WHITESPACE@4758..4759 " "
-                                            THEN_KW@4759..4763 "then"
-                                            WHITESPACE@4763..4770 "\n      "
-                                            TRUE_EXPR@4770..4776
-                                              EXPR@4770..4776
-                                                EXPR_STRING@4770..4776
-                                                  STRING_SINGLE@4770..4776 "'True'"
-                                            WHITESPACE@4776..4781 "\n    "
-                                            ELSE_KW@4781..4785 "else"
-                                            WHITESPACE@4785..4786 " "
-                                            FALSE_EXPR@4786..4858
-                                              EXPR@4786..4858
-                                                EXPR_IF_THEN_ELSE@4786..4858
-                                                  IF_KW@4786..4788 "if"
-                                                  WHITESPACE@4788..4789 " "
-                                                  EXPR@4789..4799
-                                                    EXPR_BINARY@4789..4799
-                                                      EXPR@4789..4790
-                                                        EXPR_VAR@4789..4790
-                                                          NAME@4789..4790
-                                                            IDENT@4789..4790 "v"
-                                                      WHITESPACE@4790..4791 " "
-                                                      EQ@4791..4793 "=="
-                                                      WHITESPACE@4793..4794 " "
-                                                      EXPR@4794..4799
-                                                        EXPR_LITERAL@4794..4799
-                                                          FALSE_KW@4794..4799 "false"
-                                                  WHITESPACE@4799..4800 " "
-                                                  THEN_KW@4800..4804 "then"
-                                                  WHITESPACE@4804..4811 "\n      "
-                                                  TRUE_EXPR@4811..4818
-                                                    EXPR@4811..4818
-                                                      EXPR_STRING@4811..4818
-                                                        STRING_SINGLE@4811..4818 "'False'"
-                                                  WHITESPACE@4818..4823 "\n    "
-                                                  ELSE_KW@4823..4827 "else"
-                                                  WHITESPACE@4827..4828 " "
-                                                  FALSE_EXPR@4828..4858
-                                                    EXPR@4828..4858
-                                                      EXPR_IF_THEN_ELSE@4828..4858
-                                                        IF_KW@4828..4830 "if"
-                                                        WHITESPACE@4830..4831 " "
-                                                        EXPR@4831..4840
-                                                          EXPR_BINARY@4831..4840
-                                                            EXPR@4831..4832
-                                                              EXPR_VAR@4831..4832
-                                                                NAME@4831..4832
-                                                                  IDENT@4831..4832 "v"
-                                                            WHITESPACE@4832..4833 " "
-                                                            EQ@4833..4835 "=="
-                                                            WHITESPACE@4835..4836 " "
-                                                            EXPR@4836..4840
-                                                              EXPR_LITERAL@4836..4840
-                                                                NULL_KW@4836..4840 "null"
-                                                        WHITESPACE@4840..4841 " "
-                                                        THEN_KW@4841..4845 "then"
-                                                        WHITESPACE@4845..4852 "\n      "
-                                                        TRUE_EXPR@4852..4858
-                                                          EXPR@4852..4858
-                                                            EXPR_STRING@4852..4858
-                                                              STRING_SINGLE@4852..4858 "'None'"
-        COMMA@4858..4859 ","
-        WHITESPACE@4859..4863 "\n\n  "
-        MEMBER_FIELD_METHOD@4863..5018
-          FIELD_NAME_FIXED@4863..4881
-            NAME@4863..4881
-              IDENT@4863..4881 "manifestPythonVars"
-          PARAMS_DESC@4881..4887
-            L_PAREN@4881..4882 "("
-            PARAM@4882..4886
-              DESTRUCT_FULL@4882..4886
-                NAME@4882..4886
-                  IDENT@4882..4886 "conf"
-            R_PAREN@4886..4887 ")"
-          COLONCOLON@4887..4889 "::"
-          WHITESPACE@4889..4894 "\n    "
-          EXPR@4894..5018
-            STMT_LOCAL@4894..4986
-              LOCAL_KW@4894..4899 "local"
-              WHITESPACE@4899..4900 " "
-              BIND_DESTRUCT@4900..4985
-                DESTRUCT_FULL@4900..4904
-                  NAME@4900..4904
-                    IDENT@4900..4904 "vars"
-                WHITESPACE@4904..4905 " "
-                ASSIGN@4905..4906 "="
-                WHITESPACE@4906..4907 " "
-                EXPR@4907..4985
-                  EXPR_ARRAY_COMP@4907..4985
-                    L_BRACK@4907..4908 "["
-                    EXPR@4908..4952
-                      EXPR_BINARY@4908..4952
-                        EXPR@4908..4917
-                          EXPR_STRING@4908..4917
-                            STRING_SINGLE@4908..4917 "'%s = %s'"
-                        WHITESPACE@4917..4918 " "
-                        MODULO@4918..4919 "%"
-                        WHITESPACE@4919..4920 " "
-                        EXPR@4920..4952
-                          EXPR_ARRAY@4920..4952
-                            L_BRACK@4920..4921 "["
-                            EXPR@4921..4922
-                              EXPR_VAR@4921..4922
-                                NAME@4921..4922
-                                  IDENT@4921..4922 "k"
-                            COMMA@4922..4923 ","
-                            WHITESPACE@4923..4924 " "
-                            EXPR@4924..4951
-                              EXPR_VAR@4924..4927
-                                NAME@4924..4927
-                                  IDENT@4924..4927 "std"
-                              SUFFIX_INDEX@4927..4942
-                                DOT@4927..4928 "."
-                                NAME@4928..4942
-                                  IDENT@4928..4942 "manifestPython"
-                              SUFFIX_APPLY@4942..4951
-                                ARGS_DESC@4942..4951
-                                  L_PAREN@4942..4943 "("
-                                  ARG@4943..4950
-                                    EXPR@4943..4950
-                                      EXPR_VAR@4943..4947
-                                        NAME@4943..4947
-                                          IDENT@4943..4947 "conf"
-                                      SUFFIX_INDEX_EXPR@4947..4950
-                                        L_BRACK@4947..4948 "["
-                                        EXPR@4948..4949
-                                          EXPR_VAR@4948..4949
-                                            NAME@4948..4949
-                                              IDENT@4948..4949 "k"
-                                        R_BRACK@4949..4950 "]"
-                                  R_PAREN@4950..4951 ")"
-                            R_BRACK@4951..4952 "]"
-                    WHITESPACE@4952..4953 " "
-                    FOR_SPEC@4953..4984
-                      FOR_KW@4953..4956 "for"
-                      WHITESPACE@4956..4957 " "
-                      DESTRUCT_FULL@4957..4958
-                        NAME@4957..4958
-                          IDENT@4957..4958 "k"
-                      WHITESPACE@4958..4959 " "
-                      IN_KW@4959..4961 "in"
-                      WHITESPACE@4961..4962 " "
-                      EXPR@4962..4984
-                        EXPR_VAR@4962..4965
-                          NAME@4962..4965
-                            IDENT@4962..4965 "std"
-                        SUFFIX_INDEX@4965..4978
-                          DOT@4965..4966 "."
-                          NAME@4966..4978
-                            IDENT@4966..4978 "objectFields"
-                        SUFFIX_APPLY@4978..4984
-                          ARGS_DESC@4978..4984
-                            L_PAREN@4978..4979 "("
-                            ARG@4979..4983
-                              EXPR@4979..4983
-                                EXPR_VAR@4979..4983
-                                  NAME@4979..4983
-                                    IDENT@4979..4983 "conf"
-                            R_PAREN@4983..4984 ")"
-                    R_BRACK@4984..4985 "]"
-              SEMI@4985..4986 ";"
-            WHITESPACE@4986..4991 "\n    "
-            EXPR_VAR@4991..4994
-              NAME@4991..4994
-                IDENT@4991..4994 "std"
-            SUFFIX_INDEX@4994..4999
-              DOT@4994..4995 "."
-              NAME@4995..4999
-                IDENT@4995..4999 "join"
-            SUFFIX_APPLY@4999..5018
-              ARGS_DESC@4999..5018
-                L_PAREN@4999..5000 "("
-                ARG@5000..5004
-                  EXPR@5000..5004
-                    EXPR_STRING@5000..5004
-                      STRING_SINGLE@5000..5004 "'\\n'"
-                COMMA@5004..5005 ","
-                WHITESPACE@5005..5006 " "
-                ARG@5006..5017
-                  EXPR@5006..5017
-                    EXPR_BINARY@5006..5017
-                      EXPR@5006..5010
-                        EXPR_VAR@5006..5010
-                          NAME@5006..5010
-                            IDENT@5006..5010 "vars"
-                      WHITESPACE@5010..5011 " "
-                      PLUS@5011..5012 "+"
-                      WHITESPACE@5012..5013 " "
-                      EXPR@5013..5017
-                        EXPR_ARRAY@5013..5017
-                          L_BRACK@5013..5014 "["
-                          EXPR@5014..5016
-                            EXPR_STRING@5014..5016
-                              STRING_SINGLE@5014..5016 "''"
-                          R_BRACK@5016..5017 "]"
-                R_PAREN@5017..5018 ")"
-        COMMA@5018..5019 ","
-        WHITESPACE@5019..5023 "\n\n  "
-        MEMBER_FIELD_METHOD@5023..5690
-          FIELD_NAME_FIXED@5023..5040
-            NAME@5023..5040
-              IDENT@5023..5040 "manifestXmlJsonml"
-          PARAMS_DESC@5040..5047
-            L_PAREN@5040..5041 "("
-            PARAM@5041..5046
-              DESTRUCT_FULL@5041..5046
-                NAME@5041..5046
-                  IDENT@5041..5046 "value"
-            R_PAREN@5046..5047 ")"
-          COLONCOLON@5047..5049 "::"
-          WHITESPACE@5049..5054 "\n    "
-          EXPR@5054..5690
-            EXPR_IF_THEN_ELSE@5054..5690
-              IF_KW@5054..5056 "if"
-              WHITESPACE@5056..5057 " "
-              EXPR@5057..5076
-                EXPR_UNARY@5057..5076
-                  NOT@5057..5058 "!"
-                  EXPR_VAR@5058..5061
-                    NAME@5058..5061
-                      IDENT@5058..5061 "std"
-                  SUFFIX_INDEX@5061..5069
-                    DOT@5061..5062 "."
-                    NAME@5062..5069
-                      IDENT@5062..5069 "isArray"
-                  SUFFIX_APPLY@5069..5076
-                    ARGS_DESC@5069..5076
-                      L_PAREN@5069..5070 "("
-                      ARG@5070..5075
-                        EXPR@5070..5075
-                          EXPR_VAR@5070..5075
-                            NAME@5070..5075
-                              IDENT@5070..5075 "value"
-                      R_PAREN@5075..5076 ")"
-              WHITESPACE@5076..5077 " "
-              THEN_KW@5077..5081 "then"
-              WHITESPACE@5081..5088 "\n      "
-              TRUE_EXPR@5088..5156
-                EXPR@5088..5156
-                  EXPR_ERROR@5088..5156
-                    ERROR_KW@5088..5093 "error"
-                    WHITESPACE@5093..5094 " "
-                    EXPR@5094..5156
-                      EXPR_BINARY@5094..5156
-                        EXPR@5094..5138
-                          EXPR_STRING@5094..5138
-                            STRING_SINGLE@5094..5138 "'Expected a JSONML va ..."
-                        WHITESPACE@5138..5139 " "
-                        MODULO@5139..5140 "%"
-                        WHITESPACE@5140..5141 " "
-                        EXPR@5141..5156
-                          EXPR_VAR@5141..5144
-                            NAME@5141..5144
-                              IDENT@5141..5144 "std"
-                          SUFFIX_INDEX@5144..5149
-                            DOT@5144..5145 "."
-                            NAME@5145..5149
-                              IDENT@5145..5149 "type"
-                          SUFFIX_APPLY@5149..5156
-                            ARGS_DESC@5149..5156
-                              L_PAREN@5149..5150 "("
-                              ARG@5150..5155
-                                EXPR@5150..5155
-                                  EXPR_VAR@5150..5155
-                                    NAME@5150..5155
-                                      IDENT@5150..5155 "value"
-                              R_PAREN@5155..5156 ")"
-              WHITESPACE@5156..5161 "\n    "
-              ELSE_KW@5161..5165 "else"
-              WHITESPACE@5165..5172 "\n      "
-              FALSE_EXPR@5172..5690
-                EXPR@5172..5690
-                  STMT_LOCAL@5172..5672
-                    LOCAL_KW@5172..5177 "local"
-                    WHITESPACE@5177..5178 " "
-                    BIND_FUNCTION@5178..5671
-                      NAME@5178..5181
-                        IDENT@5178..5181 "aux"
-                      PARAMS_DESC@5181..5184
-                        L_PAREN@5181..5182 "("
-                        PARAM@5182..5183
-                          DESTRUCT_FULL@5182..5183
-                            NAME@5182..5183
-                              IDENT@5182..5183 "v"
-                        R_PAREN@5183..5184 ")"
-                      WHITESPACE@5184..5185 " "
-                      ASSIGN@5185..5186 "="
-                      WHITESPACE@5186..5195 "\n        "
-                      EXPR@5195..5671
-                        EXPR_IF_THEN_ELSE@5195..5671
-                          IF_KW@5195..5197 "if"
-                          WHITESPACE@5197..5198 " "
-                          EXPR@5198..5213
-                            EXPR_VAR@5198..5201
-                              NAME@5198..5201
-                                IDENT@5198..5201 "std"
-                            SUFFIX_INDEX@5201..5210
-                              DOT@5201..5202 "."
-                              NAME@5202..5210
-                                IDENT@5202..5210 "isString"
-                            SUFFIX_APPLY@5210..5213
-                              ARGS_DESC@5210..5213
-                                L_PAREN@5210..5211 "("
-                                ARG@5211..5212
-                                  EXPR@5211..5212
-                                    EXPR_VAR@5211..5212
-                                      NAME@5211..5212
-                                        IDENT@5211..5212 "v"
-                                R_PAREN@5212..5213 ")"
-                          WHITESPACE@5213..5214 " "
-                          THEN_KW@5214..5218 "then"
-                          WHITESPACE@5218..5229 "\n          "
-                          TRUE_EXPR@5229..5230
-                            EXPR@5229..5230
-                              EXPR_VAR@5229..5230
-                                NAME@5229..5230
-                                  IDENT@5229..5230 "v"
-                          WHITESPACE@5230..5239 "\n        "
-                          ELSE_KW@5239..5243 "else"
-                          WHITESPACE@5243..5254 "\n          "
-                          FALSE_EXPR@5254..5671
-                            EXPR@5254..5671
-                              STMT_LOCAL@5254..5271
-                                LOCAL_KW@5254..5259 "local"
-                                WHITESPACE@5259..5260 " "
-                                BIND_DESTRUCT@5260..5270
-                                  DESTRUCT_FULL@5260..5263
-                                    NAME@5260..5263
-                                      IDENT@5260..5263 "tag"
-                                  WHITESPACE@5263..5264 " "
-                                  ASSIGN@5264..5265 "="
-                                  WHITESPACE@5265..5266 " "
-                                  EXPR@5266..5270
-                                    EXPR_VAR@5266..5267
-                                      NAME@5266..5267
-                                        IDENT@5266..5267 "v"
-                                    SUFFIX_INDEX_EXPR@5267..5270
-                                      L_BRACK@5267..5268 "["
-                                      EXPR@5268..5269
-                                        EXPR_NUMBER@5268..5269
-                                          FLOAT@5268..5269 "0"
-                                      R_BRACK@5269..5270 "]"
-                                SEMI@5270..5271 ";"
-                              WHITESPACE@5271..5282 "\n          "
-                              STMT_LOCAL@5282..5340
-                                LOCAL_KW@5282..5287 "local"
-                                WHITESPACE@5287..5288 " "
-                                BIND_DESTRUCT@5288..5339
-                                  DESTRUCT_FULL@5288..5297
-                                    NAME@5288..5297
-                                      IDENT@5288..5297 "has_attrs"
-                                  WHITESPACE@5297..5298 " "
-                                  ASSIGN@5298..5299 "="
-                                  WHITESPACE@5299..5300 " "
-                                  EXPR@5300..5339
-                                    EXPR_BINARY@5300..5339
-                                      EXPR@5300..5317
-                                        EXPR_BINARY@5300..5317
-                                          EXPR@5300..5303
-                                            EXPR_VAR@5300..5303
-                                              NAME@5300..5303
-                                                IDENT@5300..5303 "std"
-                                          SUFFIX_INDEX@5303..5310
-                                            DOT@5303..5304 "."
-                                            NAME@5304..5310
-                                              IDENT@5304..5310 "length"
-                                          SUFFIX_APPLY@5310..5313
-                                            ARGS_DESC@5310..5313
-                                              L_PAREN@5310..5311 "("
-                                              ARG@5311..5312
-                                                EXPR@5311..5312
-                                                  EXPR_VAR@5311..5312
-                                                    NAME@5311..5312
-                                                      IDENT@5311..5312 "v"
-                                              R_PAREN@5312..5313 ")"
-                                          WHITESPACE@5313..5314 " "
-                                          GT@5314..5315 ">"
-                                          WHITESPACE@5315..5316 " "
-                                          EXPR@5316..5317
-                                            EXPR_NUMBER@5316..5317
-                                              FLOAT@5316..5317 "1"
-                                      WHITESPACE@5317..5318 " "
-                                      AND@5318..5320 "&&"
-                                      WHITESPACE@5320..5321 " "
-                                      EXPR@5321..5339
-                                        EXPR_VAR@5321..5324
-                                          NAME@5321..5324
-                                            IDENT@5321..5324 "std"
-                                        SUFFIX_INDEX@5324..5333
-                                          DOT@5324..5325 "."
-                                          NAME@5325..5333
-                                            IDENT@5325..5333 "isObject"
-                                        SUFFIX_APPLY@5333..5339
-                                          ARGS_DESC@5333..5339
-                                            L_PAREN@5333..5334 "("
-                                            ARG@5334..5338
-                                              EXPR@5334..5338
-                                                EXPR_VAR@5334..5335
-                                                  NAME@5334..5335
-                                                    IDENT@5334..5335 "v"
-                                                SUFFIX_INDEX_EXPR@5335..5338
-                                                  L_BRACK@5335..5336 "["
-                                                  EXPR@5336..5337
-                                                    EXPR_NUMBER@5336..5337
-                                                      FLOAT@5336..5337 "1"
-                                                  R_BRACK@5337..5338 "]"
-                                            R_PAREN@5338..5339 ")"
-                                SEMI@5339..5340 ";"
-                              WHITESPACE@5340..5351 "\n          "
-                              STMT_LOCAL@5351..5396
-                                LOCAL_KW@5351..5356 "local"
-                                WHITESPACE@5356..5357 " "
-                                BIND_DESTRUCT@5357..5395
-                                  DESTRUCT_FULL@5357..5362
-                                    NAME@5357..5362
-                                      IDENT@5357..5362 "attrs"
-                                  WHITESPACE@5362..5363 " "
-                                  ASSIGN@5363..5364 "="
-                                  WHITESPACE@5364..5365 " "
-                                  EXPR@5365..5395
-                                    EXPR_IF_THEN_ELSE@5365..5395
-                                      IF_KW@5365..5367 "if"
-                                      WHITESPACE@5367..5368 " "
-                                      EXPR@5368..5377
-                                        EXPR_VAR@5368..5377
-                                          NAME@5368..5377
-                                            IDENT@5368..5377 "has_attrs"
-                                      WHITESPACE@5377..5378 " "
-                                      THEN_KW@5378..5382 "then"
-                                      WHITESPACE@5382..5383 " "
-                                      TRUE_EXPR@5383..5387
-                                        EXPR@5383..5387
-                                          EXPR_VAR@5383..5384
-                                            NAME@5383..5384
-                                              IDENT@5383..5384 "v"
-                                          SUFFIX_INDEX_EXPR@5384..5387
-                                            L_BRACK@5384..5385 "["
-                                            EXPR@5385..5386
-                                              EXPR_NUMBER@5385..5386
-                                                FLOAT@5385..5386 "1"
-                                            R_BRACK@5386..5387 "]"
-                                      WHITESPACE@5387..5388 " "
-                                      ELSE_KW@5388..5392 "else"
-                                      WHITESPACE@5392..5393 " "
-                                      FALSE_EXPR@5393..5395
-                                        EXPR@5393..5395
-                                          EXPR_OBJECT@5393..5395
-                                            OBJ_BODY_MEMBER_LIST@5393..5395
-                                              L_BRACE@5393..5394 "{"
-                                              R_BRACE@5394..5395 "}"
-                                SEMI@5395..5396 ";"
-                              WHITESPACE@5396..5407 "\n          "
-                              STMT_LOCAL@5407..5459
-                                LOCAL_KW@5407..5412 "local"
-                                WHITESPACE@5412..5413 " "
-                                BIND_DESTRUCT@5413..5458
-                                  DESTRUCT_FULL@5413..5421
-                                    NAME@5413..5421
-                                      IDENT@5413..5421 "children"
-                                  WHITESPACE@5421..5422 " "
-                                  ASSIGN@5422..5423 "="
-                                  WHITESPACE@5423..5424 " "
-                                  EXPR@5424..5458
-                                    EXPR_IF_THEN_ELSE@5424..5458
-                                      IF_KW@5424..5426 "if"
-                                      WHITESPACE@5426..5427 " "
-                                      EXPR@5427..5436
-                                        EXPR_VAR@5427..5436
-                                          NAME@5427..5436
-                                            IDENT@5427..5436 "has_attrs"
-                                      WHITESPACE@5436..5437 " "
-                                      THEN_KW@5437..5441 "then"
-                                      WHITESPACE@5441..5442 " "
-                                      TRUE_EXPR@5442..5447
-                                        EXPR@5442..5447
-                                          EXPR_VAR@5442..5443
-                                            NAME@5442..5443
-                                              IDENT@5442..5443 "v"
-                                          SUFFIX_SLICE@5443..5447
-                                            SLICE_DESC@5443..5447
-                                              L_BRACK@5443..5444 "["
-                                              EXPR@5444..5445
-                                                EXPR_NUMBER@5444..5445
-                                                  FLOAT@5444..5445 "2"
-                                              COLON@5445..5446 ":"
-                                              R_BRACK@5446..5447 "]"
-                                      WHITESPACE@5447..5448 " "
-                                      ELSE_KW@5448..5452 "else"
-                                      WHITESPACE@5452..5453 " "
-                                      FALSE_EXPR@5453..5458
-                                        EXPR@5453..5458
-                                          EXPR_VAR@5453..5454
-                                            NAME@5453..5454
-                                              IDENT@5453..5454 "v"
-                                          SUFFIX_SLICE@5454..5458
-                                            SLICE_DESC@5454..5458
-                                              L_BRACK@5454..5455 "["
-                                              EXPR@5455..5456
-                                                EXPR_NUMBER@5455..5456
-                                                  FLOAT@5455..5456 "1"
-                                              COLON@5456..5457 ":"
-                                              R_BRACK@5457..5458 "]"
-                                SEMI@5458..5459 ";"
-                              WHITESPACE@5459..5470 "\n          "
-                              STMT_LOCAL@5470..5576
-                                LOCAL_KW@5470..5475 "local"
-                                WHITESPACE@5475..5476 " "
-                                BIND_DESTRUCT@5476..5575
-                                  DESTRUCT_FULL@5476..5485
-                                    NAME@5476..5485
-                                      IDENT@5476..5485 "attrs_str"
-                                  WHITESPACE@5485..5486 " "
-                                  ASSIGN@5486..5487 "="
-                                  WHITESPACE@5487..5500 "\n            "
-                                  EXPR@5500..5575
-                                    EXPR_VAR@5500..5503
-                                      NAME@5500..5503
-                                        IDENT@5500..5503 "std"
-                                    SUFFIX_INDEX@5503..5508
-                                      DOT@5503..5504 "."
-                                      NAME@5504..5508
-                                        IDENT@5504..5508 "join"
-                                    SUFFIX_APPLY@5508..5575
-                                      ARGS_DESC@5508..5575
-                                        L_PAREN@5508..5509 "("
-                                        ARG@5509..5511
-                                          EXPR@5509..5511
-                                            EXPR_STRING@5509..5511
-                                              STRING_SINGLE@5509..5511 "''"
-                                        COMMA@5511..5512 ","
-                                        WHITESPACE@5512..5513 " "
-                                        ARG@5513..5574
-                                          EXPR@5513..5574
-                                            EXPR_ARRAY_COMP@5513..5574
-                                              L_BRACK@5513..5514 "["
-                                              EXPR@5514..5540
-                                                EXPR_BINARY@5514..5540
-                                                  EXPR@5514..5524
-                                                    EXPR_STRING@5514..5524
-                                                      STRING_SINGLE@5514..5524 "' %s=\"%s\"'"
-                                                  WHITESPACE@5524..5525 " "
-                                                  MODULO@5525..5526 "%"
-                                                  WHITESPACE@5526..5527 " "
-                                                  EXPR@5527..5540
-                                                    EXPR_ARRAY@5527..5540
-                                                      L_BRACK@5527..5528 "["
-                                                      EXPR@5528..5529
-                                                        EXPR_VAR@5528..5529
-                                                          NAME@5528..5529
-                                                            IDENT@5528..5529 "k"
-                                                      COMMA@5529..5530 ","
-                                                      WHITESPACE@5530..5531 " "
-                                                      EXPR@5531..5539
-                                                        EXPR_VAR@5531..5536
-                                                          NAME@5531..5536
-                                                            IDENT@5531..5536 "attrs"
-                                                        SUFFIX_INDEX_EXPR@5536..5539
-                                                          L_BRACK@5536..5537 "["
-                                                          EXPR@5537..5538
-                                                            EXPR_VAR@5537..5538
-                                                              NAME@5537..5538
-                                                                IDENT@5537..5538 "k"
-                                                          R_BRACK@5538..5539 "]"
-                                                      R_BRACK@5539..5540 "]"
-                                              WHITESPACE@5540..5541 " "
-                                              FOR_SPEC@5541..5573
-                                                FOR_KW@5541..5544 "for"
-                                                WHITESPACE@5544..5545 " "
-                                                DESTRUCT_FULL@5545..5546
-                                                  NAME@5545..5546
-                                                    IDENT@5545..5546 "k"
-                                                WHITESPACE@5546..5547 " "
-                                                IN_KW@5547..5549 "in"
-                                                WHITESPACE@5549..5550 " "
-                                                EXPR@5550..5573
-                                                  EXPR_VAR@5550..5553
-                                                    NAME@5550..5553
-                                                      IDENT@5550..5553 "std"
-                                                  SUFFIX_INDEX@5553..5566
-                                                    DOT@5553..5554 "."
-                                                    NAME@5554..5566
-                                                      IDENT@5554..5566 "objectFields"
-                                                  SUFFIX_APPLY@5566..5573
-                                                    ARGS_DESC@5566..5573
-                                                      L_PAREN@5566..5567 "("
-                                                      ARG@5567..5572
-                                                        EXPR@5567..5572
-                                                          EXPR_VAR@5567..5572
-                                                            NAME@5567..5572
-                                                              IDENT@5567..5572 "attrs"
-                                                      R_PAREN@5572..5573 ")"
-                                              R_BRACK@5573..5574 "]"
-                                        R_PAREN@5574..5575 ")"
-                                SEMI@5575..5576 ";"
-                              WHITESPACE@5576..5587 "\n          "
-                              EXPR_VAR@5587..5590
-                                NAME@5587..5590
-                                  IDENT@5587..5590 "std"
-                              SUFFIX_INDEX@5590..5599
-                                DOT@5590..5591 "."
-                                NAME@5591..5599
-                                  IDENT@5591..5599 "deepJoin"
-                              SUFFIX_APPLY@5599..5671
-                                ARGS_DESC@5599..5671
-                                  L_PAREN@5599..5600 "("
-                                  ARG@5600..5670
-                                    EXPR@5600..5670
-                                      EXPR_ARRAY@5600..5670
-                                        L_BRACK@5600..5601 "["
-                                        EXPR@5601..5604
-                                          EXPR_STRING@5601..5604
-                                            STRING_SINGLE@5601..5604 "'<'"
-                                        COMMA@5604..5605 ","
-                                        WHITESPACE@5605..5606 " "
-                                        EXPR@5606..5609
-                                          EXPR_VAR@5606..5609
-                                            NAME@5606..5609
-                                              IDENT@5606..5609 "tag"
-                                        COMMA@5609..5610 ","
-                                        WHITESPACE@5610..5611 " "
-                                        EXPR@5611..5620
-                                          EXPR_VAR@5611..5620
-                                            NAME@5611..5620
-                                              IDENT@5611..5620 "attrs_str"
-                                        COMMA@5620..5621 ","
-                                        WHITESPACE@5621..5622 " "
-                                        EXPR@5622..5625
-                                          EXPR_STRING@5622..5625
-                                            STRING_SINGLE@5622..5625 "'>'"
-                                        COMMA@5625..5626 ","
-                                        WHITESPACE@5626..5627 " "
-                                        EXPR@5627..5653
-                                          EXPR_ARRAY_COMP@5627..5653
-                                            L_BRACK@5627..5628 "["
-                                            EXPR@5628..5634
-                                              EXPR_VAR@5628..5631
-                                                NAME@5628..5631
-                                                  IDENT@5628..5631 "aux"
-                                              SUFFIX_APPLY@5631..5634
-                                                ARGS_DESC@5631..5634
-                                                  L_PAREN@5631..5632 "("
-                                                  ARG@5632..5633
-                                                    EXPR@5632..5633
-                                                      EXPR_VAR@5632..5633
-                                                        NAME@5632..5633
-                                                          IDENT@5632..5633 "x"
-                                                  R_PAREN@5633..5634 ")"
-                                            WHITESPACE@5634..5635 " "
-                                            FOR_SPEC@5635..5652
-                                              FOR_KW@5635..5638 "for"
-                                              WHITESPACE@5638..5639 " "
-                                              DESTRUCT_FULL@5639..5640
-                                                NAME@5639..5640
-                                                  IDENT@5639..5640 "x"
-                                              WHITESPACE@5640..5641 " "
-                                              IN_KW@5641..5643 "in"
-                                              WHITESPACE@5643..5644 " "
-                                              EXPR@5644..5652
-                                                EXPR_VAR@5644..5652
-                                                  NAME@5644..5652
-                                                    IDENT@5644..5652 "children"
-                                            R_BRACK@5652..5653 "]"
-                                        COMMA@5653..5654 ","
-                                        WHITESPACE@5654..5655 " "
-                                        EXPR@5655..5659
-                                          EXPR_STRING@5655..5659
-                                            STRING_SINGLE@5655..5659 "'</'"
-                                        COMMA@5659..5660 ","
-                                        WHITESPACE@5660..5661 " "
-                                        EXPR@5661..5664
-                                          EXPR_VAR@5661..5664
-                                            NAME@5661..5664
-                                              IDENT@5661..5664 "tag"
-                                        COMMA@5664..5665 ","
-                                        WHITESPACE@5665..5666 " "
-                                        EXPR@5666..5669
-                                          EXPR_STRING@5666..5669
-                                            STRING_SINGLE@5666..5669 "'>'"
-                                        R_BRACK@5669..5670 "]"
-                                  R_PAREN@5670..5671 ")"
-                    SEMI@5671..5672 ";"
-                  WHITESPACE@5672..5680 "\n\n      "
-                  EXPR_VAR@5680..5683
-                    NAME@5680..5683
-                      IDENT@5680..5683 "aux"
-                  SUFFIX_APPLY@5683..5690
-                    ARGS_DESC@5683..5690
-                      L_PAREN@5683..5684 "("
-                      ARG@5684..5689
-                        EXPR@5684..5689
-                          EXPR_VAR@5684..5689
-                            NAME@5684..5689
-                              IDENT@5684..5689 "value"
-                      R_PAREN@5689..5690 ")"
-        COMMA@5690..5691 ","
-        WHITESPACE@5691..5695 "\n\n  "
-        MEMBER_FIELD_METHOD@5695..6483
-          FIELD_NAME_FIXED@5695..5705
-            NAME@5695..5705
-              IDENT@5695..5705 "mergePatch"
-          PARAMS_DESC@5705..5720
-            L_PAREN@5705..5706 "("
-            PARAM@5706..5712
-              DESTRUCT_FULL@5706..5712
-                NAME@5706..5712
-                  IDENT@5706..5712 "target"
-            COMMA@5712..5713 ","
-            WHITESPACE@5713..5714 " "
-            PARAM@5714..5719
-              DESTRUCT_FULL@5714..5719
-                NAME@5714..5719
-                  IDENT@5714..5719 "patch"
-            R_PAREN@5719..5720 ")"
-          COLONCOLON@5720..5722 "::"
-          WHITESPACE@5722..5727 "\n    "
-          EXPR@5727..6483
-            EXPR_IF_THEN_ELSE@5727..6483
-              IF_KW@5727..5729 "if"
-              WHITESPACE@5729..5730 " "
-              EXPR@5730..5749
-                EXPR_VAR@5730..5733
-                  NAME@5730..5733
-                    IDENT@5730..5733 "std"
-                SUFFIX_INDEX@5733..5742
-                  DOT@5733..5734 "."
-                  NAME@5734..5742
-                    IDENT@5734..5742 "isObject"
-                SUFFIX_APPLY@5742..5749
-                  ARGS_DESC@5742..5749
-                    L_PAREN@5742..5743 "("
-                    ARG@5743..5748
-                      EXPR@5743..5748
-                        EXPR_VAR@5743..5748
-                          NAME@5743..5748
-                            IDENT@5743..5748 "patch"
-                    R_PAREN@5748..5749 ")"
-              WHITESPACE@5749..5750 " "
-              THEN_KW@5750..5754 "then"
-              WHITESPACE@5754..5761 "\n      "
-              TRUE_EXPR@5761..6462
-                EXPR@5761..6462
-                  STMT_LOCAL@5761..5835
-                    LOCAL_KW@5761..5766 "local"
-                    WHITESPACE@5766..5767 " "
-                    BIND_DESTRUCT@5767..5834
-                      DESTRUCT_FULL@5767..5780
-                        NAME@5767..5780
-                          IDENT@5767..5780 "target_object"
-                      WHITESPACE@5780..5781 " "
-                      ASSIGN@5781..5782 "="
-                      WHITESPACE@5782..5791 "\n        "
-                      EXPR@5791..5834
-                        EXPR_IF_THEN_ELSE@5791..5834
-                          IF_KW@5791..5793 "if"
-                          WHITESPACE@5793..5794 " "
-                          EXPR@5794..5814
-                            EXPR_VAR@5794..5797
-                              NAME@5794..5797
-                                IDENT@5794..5797 "std"
-                            SUFFIX_INDEX@5797..5806
-                              DOT@5797..5798 "."
-                              NAME@5798..5806
-                                IDENT@5798..5806 "isObject"
-                            SUFFIX_APPLY@5806..5814
-                              ARGS_DESC@5806..5814
-                                L_PAREN@5806..5807 "("
-                                ARG@5807..5813
-                                  EXPR@5807..5813
-                                    EXPR_VAR@5807..5813
-                                      NAME@5807..5813
-                                        IDENT@5807..5813 "target"
-                                R_PAREN@5813..5814 ")"
-                          WHITESPACE@5814..5815 " "
-                          THEN_KW@5815..5819 "then"
-                          WHITESPACE@5819..5820 " "
-                          TRUE_EXPR@5820..5826
-                            EXPR@5820..5826
-                              EXPR_VAR@5820..5826
-                                NAME@5820..5826
-                                  IDENT@5820..5826 "target"
-                          WHITESPACE@5826..5827 " "
-                          ELSE_KW@5827..5831 "else"
-                          WHITESPACE@5831..5832 " "
-                          FALSE_EXPR@5832..5834
-                            EXPR@5832..5834
-                              EXPR_OBJECT@5832..5834
-                                OBJ_BODY_MEMBER_LIST@5832..5834
-                                  L_BRACE@5832..5833 "{"
-                                  R_BRACE@5833..5834 "}"
-                    SEMI@5834..5835 ";"
-                  WHITESPACE@5835..5843 "\n\n      "
-                  STMT_LOCAL@5843..5949
-                    LOCAL_KW@5843..5848 "local"
-                    WHITESPACE@5848..5849 " "
-                    BIND_DESTRUCT@5849..5948
-                      DESTRUCT_FULL@5849..5862
-                        NAME@5849..5862
-                          IDENT@5849..5862 "target_fields"
-                      WHITESPACE@5862..5863 " "
-                      ASSIGN@5863..5864 "="
-                      WHITESPACE@5864..5873 "\n        "
-                      EXPR@5873..5948
-                        EXPR_IF_THEN_ELSE@5873..5948
-                          IF_KW@5873..5875 "if"
-                          WHITESPACE@5875..5876 " "
-                          EXPR@5876..5903
-                            EXPR_VAR@5876..5879
-                              NAME@5876..5879
-                                IDENT@5876..5879 "std"
-                            SUFFIX_INDEX@5879..5888
-                              DOT@5879..5880 "."
-                              NAME@5880..5888
-                                IDENT@5880..5888 "isObject"
-                            SUFFIX_APPLY@5888..5903
-                              ARGS_DESC@5888..5903
-                                L_PAREN@5888..5889 "("
-                                ARG@5889..5902
-                                  EXPR@5889..5902
-                                    EXPR_VAR@5889..5902
-                                      NAME@5889..5902
-                                        IDENT@5889..5902 "target_object"
-                                R_PAREN@5902..5903 ")"
-                          WHITESPACE@5903..5904 " "
-                          THEN_KW@5904..5908 "then"
-                          WHITESPACE@5908..5909 " "
-                          TRUE_EXPR@5909..5940
-                            EXPR@5909..5940
-                              EXPR_VAR@5909..5912
-                                NAME@5909..5912
-                                  IDENT@5909..5912 "std"
-                              SUFFIX_INDEX@5912..5925
-                                DOT@5912..5913 "."
-                                NAME@5913..5925
-                                  IDENT@5913..5925 "objectFields"
-                              SUFFIX_APPLY@5925..5940
-                                ARGS_DESC@5925..5940
-                                  L_PAREN@5925..5926 "("
-                                  ARG@5926..5939
-                                    EXPR@5926..5939
-                                      EXPR_VAR@5926..5939
-                                        NAME@5926..5939
-                                          IDENT@5926..5939 "target_object"
-                                  R_PAREN@5939..5940 ")"
-                          WHITESPACE@5940..5941 " "
-                          ELSE_KW@5941..5945 "else"
-                          WHITESPACE@5945..5946 " "
-                          FALSE_EXPR@5946..5948
-                            EXPR@5946..5948
-                              EXPR_ARRAY@5946..5948
-                                L_BRACK@5946..5947 "["
-                                R_BRACK@5947..5948 "]"
-                    SEMI@5948..5949 ";"
-                  WHITESPACE@5949..5957 "\n\n      "
-                  STMT_LOCAL@5957..6034
-                    LOCAL_KW@5957..5962 "local"
-                    WHITESPACE@5962..5963 " "
-                    BIND_DESTRUCT@5963..6033
-                      DESTRUCT_FULL@5963..5974
-                        NAME@5963..5974
-                          IDENT@5963..5974 "null_fields"
-                      WHITESPACE@5974..5975 " "
-                      ASSIGN@5975..5976 "="
-                      WHITESPACE@5976..5977 " "
-                      EXPR@5977..6033
-                        EXPR_ARRAY_COMP@5977..6033
-                          L_BRACK@5977..5978 "["
-                          EXPR@5978..5979
-                            EXPR_VAR@5978..5979
-                              NAME@5978..5979
-                                IDENT@5978..5979 "k"
-                          WHITESPACE@5979..5980 " "
-                          FOR_SPEC@5980..6012
-                            FOR_KW@5980..5983 "for"
-                            WHITESPACE@5983..5984 " "
-                            DESTRUCT_FULL@5984..5985
-                              NAME@5984..5985
-                                IDENT@5984..5985 "k"
-                            WHITESPACE@5985..5986 " "
-                            IN_KW@5986..5988 "in"
-                            WHITESPACE@5988..5989 " "
-                            EXPR@5989..6012
-                              EXPR_VAR@5989..5992
-                                NAME@5989..5992
-                                  IDENT@5989..5992 "std"
-                              SUFFIX_INDEX@5992..6005
-                                DOT@5992..5993 "."
-                                NAME@5993..6005
-                                  IDENT@5993..6005 "objectFields"
-                              SUFFIX_APPLY@6005..6012
-                                ARGS_DESC@6005..6012
-                                  L_PAREN@6005..6006 "("
-                                  ARG@6006..6011
-                                    EXPR@6006..6011
-                                      EXPR_VAR@6006..6011
-                                        NAME@6006..6011
-                                          IDENT@6006..6011 "patch"
-                                  R_PAREN@6011..6012 ")"
-                          WHITESPACE@6012..6013 " "
-                          IF_SPEC@6013..6032
-                            IF_KW@6013..6015 "if"
-                            WHITESPACE@6015..6016 " "
-                            EXPR@6016..6032
-                              EXPR_BINARY@6016..6032
-                                EXPR@6016..6021
-                                  EXPR_VAR@6016..6021
-                                    NAME@6016..6021
-                                      IDENT@6016..6021 "patch"
-                                SUFFIX_INDEX_EXPR@6021..6024
-                                  L_BRACK@6021..6022 "["
-                                  EXPR@6022..6023
-                                    EXPR_VAR@6022..6023
-                                      NAME@6022..6023
-                                        IDENT@6022..6023 "k"
-                                  R_BRACK@6023..6024 "]"
-                                WHITESPACE@6024..6025 " "
-                                EQ@6025..6027 "=="
-                                WHITESPACE@6027..6028 " "
-                                EXPR@6028..6032
-                                  EXPR_LITERAL@6028..6032
-                                    NULL_KW@6028..6032 "null"
-                          R_BRACK@6032..6033 "]"
-                    SEMI@6033..6034 ";"
-                  WHITESPACE@6034..6041 "\n      "
-                  STMT_LOCAL@6041..6114
-                    LOCAL_KW@6041..6046 "local"
-                    WHITESPACE@6046..6047 " "
-                    BIND_DESTRUCT@6047..6113
-                      DESTRUCT_FULL@6047..6058
-                        NAME@6047..6058
-                          IDENT@6047..6058 "both_fields"
-                      WHITESPACE@6058..6059 " "
-                      ASSIGN@6059..6060 "="
-                      WHITESPACE@6060..6061 " "
-                      EXPR@6061..6113
-                        EXPR_VAR@6061..6064
-                          NAME@6061..6064
-                            IDENT@6061..6064 "std"
-                        SUFFIX_INDEX@6064..6073
-                          DOT@6064..6065 "."
-                          NAME@6065..6073
-                            IDENT@6065..6073 "setUnion"
-                        SUFFIX_APPLY@6073..6113
-                          ARGS_DESC@6073..6113
-                            L_PAREN@6073..6074 "("
-                            ARG@6074..6087
-                              EXPR@6074..6087
-                                EXPR_VAR@6074..6087
-                                  NAME@6074..6087
-                                    IDENT@6074..6087 "target_fields"
-                            COMMA@6087..6088 ","
-                            WHITESPACE@6088..6089 " "
-                            ARG@6089..6112
-                              EXPR@6089..6112
-                                EXPR_VAR@6089..6092
-                                  NAME@6089..6092
-                                    IDENT@6089..6092 "std"
-                                SUFFIX_INDEX@6092..6105
-                                  DOT@6092..6093 "."
-                                  NAME@6093..6105
-                                    IDENT@6093..6105 "objectFields"
-                                SUFFIX_APPLY@6105..6112
-                                  ARGS_DESC@6105..6112
-                                    L_PAREN@6105..6106 "("
-                                    ARG@6106..6111
-                                      EXPR@6106..6111
-                                        EXPR_VAR@6106..6111
-                                          NAME@6106..6111
-                                            IDENT@6106..6111 "patch"
-                                    R_PAREN@6111..6112 ")"
-                            R_PAREN@6112..6113 ")"
-                    SEMI@6113..6114 ";"
-                  WHITESPACE@6114..6122 "\n\n      "
-                  EXPR_OBJECT@6122..6462
-                    OBJ_BODY_COMP@6122..6462
-                      L_BRACE@6122..6123 "{"
-                      WHITESPACE@6123..6132 "\n        "
-                      MEMBER_FIELD_NORMAL@6132..6399
-                        FIELD_NAME_DYNAMIC@6132..6135
-                          L_BRACK@6132..6133 "["
-                          EXPR@6133..6134
-                            EXPR_VAR@6133..6134
-                              NAME@6133..6134
-                                IDENT@6133..6134 "k"
-                          R_BRACK@6134..6135 "]"
-                        COLON@6135..6136 ":"
-                        WHITESPACE@6136..6147 "\n          "
-                        EXPR@6147..6399
-                          EXPR_IF_THEN_ELSE@6147..6399
-                            IF_KW@6147..6149 "if"
-                            WHITESPACE@6149..6150 " "
-                            EXPR@6150..6174
-                              EXPR_UNARY@6150..6174
-                                NOT@6150..6151 "!"
-                                EXPR_VAR@6151..6154
-                                  NAME@6151..6154
-                                    IDENT@6151..6154 "std"
-                                SUFFIX_INDEX@6154..6164
-                                  DOT@6154..6155 "."
-                                  NAME@6155..6164
-                                    IDENT@6155..6164 "objectHas"
-                                SUFFIX_APPLY@6164..6174
-                                  ARGS_DESC@6164..6174
-                                    L_PAREN@6164..6165 "("
-                                    ARG@6165..6170
-                                      EXPR@6165..6170
-                                        EXPR_VAR@6165..6170
-                                          NAME@6165..6170
-                                            IDENT@6165..6170 "patch"
-                                    COMMA@6170..6171 ","
-                                    WHITESPACE@6171..6172 " "
-                                    ARG@6172..6173
-                                      EXPR@6172..6173
-                                        EXPR_VAR@6172..6173
-                                          NAME@6172..6173
-                                            IDENT@6172..6173 "k"
-                                    R_PAREN@6173..6174 ")"
-                            WHITESPACE@6174..6175 " "
-                            THEN_KW@6175..6179 "then"
-                            WHITESPACE@6179..6192 "\n            "
-                            TRUE_EXPR@6192..6208
-                              EXPR@6192..6208
-                                EXPR_VAR@6192..6205
-                                  NAME@6192..6205
-                                    IDENT@6192..6205 "target_object"
-                                SUFFIX_INDEX_EXPR@6205..6208
-                                  L_BRACK@6205..6206 "["
-                                  EXPR@6206..6207
-                                    EXPR_VAR@6206..6207
-                                      NAME@6206..6207
-                                        IDENT@6206..6207 "k"
-                                  R_BRACK@6207..6208 "]"
-                            WHITESPACE@6208..6219 "\n          "
-                            ELSE_KW@6219..6223 "else"
-                            WHITESPACE@6223..6224 " "
-                            FALSE_EXPR@6224..6399
-                              EXPR@6224..6399
-                                EXPR_IF_THEN_ELSE@6224..6399
-                                  IF_KW@6224..6226 "if"
-                                  WHITESPACE@6226..6227 " "
-                                  EXPR@6227..6259
-                                    EXPR_UNARY@6227..6259
-                                      NOT@6227..6228 "!"
-                                      EXPR_VAR@6228..6231
-                                        NAME@6228..6231
-                                          IDENT@6228..6231 "std"
-                                      SUFFIX_INDEX@6231..6241
-                                        DOT@6231..6232 "."
-                                        NAME@6232..6241
-                                          IDENT@6232..6241 "objectHas"
-                                      SUFFIX_APPLY@6241..6259
-                                        ARGS_DESC@6241..6259
-                                          L_PAREN@6241..6242 "("
-                                          ARG@6242..6255
-                                            EXPR@6242..6255
-                                              EXPR_VAR@6242..6255
-                                                NAME@6242..6255
-                                                  IDENT@6242..6255 "target_object"
-                                          COMMA@6255..6256 ","
-                                          WHITESPACE@6256..6257 " "
-                                          ARG@6257..6258
-                                            EXPR@6257..6258
-                                              EXPR_VAR@6257..6258
-                                                NAME@6257..6258
-                                                  IDENT@6257..6258 "k"
-                                          R_PAREN@6258..6259 ")"
-                                  WHITESPACE@6259..6260 " "
-                                  THEN_KW@6260..6264 "then"
-                                  WHITESPACE@6264..6277 "\n            "
-                                  TRUE_EXPR@6277..6318
-                                    EXPR@6277..6318
-                                      EXPR_VAR@6277..6280
-                                        NAME@6277..6280
-                                          IDENT@6277..6280 "std"
-                                      SUFFIX_INDEX@6280..6291
-                                        DOT@6280..6281 "."
-                                        NAME@6281..6291
-                                          IDENT@6281..6291 "mergePatch"
-                                      SUFFIX_APPLY@6291..6318
-                                        ARGS_DESC@6291..6318
-                                          L_PAREN@6291..6292 "("
-                                          ARG@6292..6296
-                                            EXPR@6292..6296
-                                              EXPR_LITERAL@6292..6296
-                                                NULL_KW@6292..6296 "null"
-                                          COMMA@6296..6297 ","
-                                          WHITESPACE@6297..6298 " "
-                                          ARG@6298..6306
-                                            EXPR@6298..6306
-                                              EXPR_VAR@6298..6303
-                                                NAME@6298..6303
-                                                  IDENT@6298..6303 "patch"
-                                              SUFFIX_INDEX_EXPR@6303..6306
-                                                L_BRACK@6303..6304 "["
-                                                EXPR@6304..6305
-                                                  EXPR_VAR@6304..6305
-                                                    NAME@6304..6305
-                                                      IDENT@6304..6305 "k"
-                                                R_BRACK@6305..6306 "]"
-                                          R_PAREN@6306..6307 ")"
-                                          WHITESPACE@6307..6308 " "
-                                          TAILSTRICT_KW@6308..6318 "tailstrict"
-                                  WHITESPACE@6318..6329 "\n          "
-                                  ELSE_KW@6329..6333 "else"
-                                  WHITESPACE@6333..6346 "\n            "
-                                  FALSE_EXPR@6346..6399
-                                    EXPR@6346..6399
-                                      EXPR_VAR@6346..6349
-                                        NAME@6346..6349
-                                          IDENT@6346..6349 "std"
-                                      SUFFIX_INDEX@6349..6360
-                                        DOT@6349..6350 "."
-                                        NAME@6350..6360
-                                          IDENT@6350..6360 "mergePatch"
-                                      SUFFIX_APPLY@6360..6399
-                                        ARGS_DESC@6360..6399
-                                          L_PAREN@6360..6361 "("
-                                          ARG@6361..6377
-                                            EXPR@6361..6377
-                                              EXPR_VAR@6361..6374
-                                                NAME@6361..6374
-                                                  IDENT@6361..6374 "target_object"
-                                              SUFFIX_INDEX_EXPR@6374..6377
-                                                L_BRACK@6374..6375 "["
-                                                EXPR@6375..6376
-                                                  EXPR_VAR@6375..6376
-                                                    NAME@6375..6376
-                                                      IDENT@6375..6376 "k"
-                                                R_BRACK@6376..6377 "]"
-                                          COMMA@6377..6378 ","
-                                          WHITESPACE@6378..6379 " "
-                                          ARG@6379..6387
-                                            EXPR@6379..6387
-                                              EXPR_VAR@6379..6384
-                                                NAME@6379..6384
-                                                  IDENT@6379..6384 "patch"
-                                              SUFFIX_INDEX_EXPR@6384..6387
-                                                L_BRACK@6384..6385 "["
-                                                EXPR@6385..6386
-                                                  EXPR_VAR@6385..6386
-                                                    NAME@6385..6386
-                                                      IDENT@6385..6386 "k"
-                                                R_BRACK@6386..6387 "]"
-                                          R_PAREN@6387..6388 ")"
-                                          WHITESPACE@6388..6389 " "
-                                          TAILSTRICT_KW@6389..6399 "tailstrict"
-                      WHITESPACE@6399..6408 "\n        "
-                      FOR_SPEC@6408..6454
-                        FOR_KW@6408..6411 "for"
-                        WHITESPACE@6411..6412 " "
-                        DESTRUCT_FULL@6412..6413
-                          NAME@6412..6413
-                            IDENT@6412..6413 "k"
-                        WHITESPACE@6413..6414 " "
-                        IN_KW@6414..6416 "in"
-                        WHITESPACE@6416..6417 " "
-                        EXPR@6417..6454
-                          EXPR_VAR@6417..6420
-                            NAME@6417..6420
-                              IDENT@6417..6420 "std"
-                          SUFFIX_INDEX@6420..6428
-                            DOT@6420..6421 "."
-                            NAME@6421..6428
-                              IDENT@6421..6428 "setDiff"
-                          SUFFIX_APPLY@6428..6454
-                            ARGS_DESC@6428..6454
-                              L_PAREN@6428..6429 "("
-                              ARG@6429..6440
-                                EXPR@6429..6440
-                                  EXPR_VAR@6429..6440
-                                    NAME@6429..6440
-                                      IDENT@6429..6440 "both_fields"
-                              COMMA@6440..6441 ","
-                              WHITESPACE@6441..6442 " "
-                              ARG@6442..6453
-                                EXPR@6442..6453
-                                  EXPR_VAR@6442..6453
-                                    NAME@6442..6453
-                                      IDENT@6442..6453 "null_fields"
-                              R_PAREN@6453..6454 ")"
-                      WHITESPACE@6454..6461 "\n      "
-                      R_BRACE@6461..6462 "}"
-              WHITESPACE@6462..6467 "\n    "
-              ELSE_KW@6467..6471 "else"
-              WHITESPACE@6471..6478 "\n      "
-              FALSE_EXPR@6478..6483
-                EXPR@6478..6483
-                  EXPR_VAR@6478..6483
-                    NAME@6478..6483
-                      IDENT@6478..6483 "patch"
-        COMMA@6483..6484 ","
-        WHITESPACE@6484..6488 "\n\n  "
-        MEMBER_FIELD_METHOD@6488..6594
-          FIELD_NAME_FIXED@6488..6491
-            NAME@6488..6491
-              IDENT@6488..6491 "get"
-          PARAMS_DESC@6491..6528
-            L_PAREN@6491..6492 "("
-            PARAM@6492..6493
-              DESTRUCT_FULL@6492..6493
-                NAME@6492..6493
-                  IDENT@6492..6493 "o"
-            COMMA@6493..6494 ","
-            WHITESPACE@6494..6495 " "
-            PARAM@6495..6496
-              DESTRUCT_FULL@6495..6496
-                NAME@6495..6496
-                  IDENT@6495..6496 "f"
-            COMMA@6496..6497 ","
-            WHITESPACE@6497..6498 " "
-            PARAM@6498..6510
-              DESTRUCT_FULL@6498..6505
-                NAME@6498..6505
-                  IDENT@6498..6505 "default"
-              ASSIGN@6505..6506 "="
-              EXPR@6506..6510
-                EXPR_LITERAL@6506..6510
-                  NULL_KW@6506..6510 "null"
-            COMMA@6510..6511 ","
-            WHITESPACE@6511..6512 " "
-            PARAM@6512..6527
-              DESTRUCT_FULL@6512..6522
-                NAME@6512..6522
-                  IDENT@6512..6522 "inc_hidden"
-              ASSIGN@6522..6523 "="
-              EXPR@6523..6527
-                EXPR_LITERAL@6523..6527
-                  TRUE_KW@6523..6527 "true"
-            R_PAREN@6527..6528 ")"
-          COLONCOLON@6528..6530 "::"
-          WHITESPACE@6530..6535 "\n    "
-          EXPR@6535..6594
-            EXPR_IF_THEN_ELSE@6535..6594
-              IF_KW@6535..6537 "if"
-              WHITESPACE@6537..6538 " "
-              EXPR@6538..6571
-                EXPR_VAR@6538..6541
-                  NAME@6538..6541
-                    IDENT@6538..6541 "std"
-                SUFFIX_INDEX@6541..6553
-                  DOT@6541..6542 "."
-                  NAME@6542..6553
-                    IDENT@6542..6553 "objectHasEx"
-                SUFFIX_APPLY@6553..6571
-                  ARGS_DESC@6553..6571
-                    L_PAREN@6553..6554 "("
-                    ARG@6554..6555
-                      EXPR@6554..6555
-                        EXPR_VAR@6554..6555
-                          NAME@6554..6555
-                            IDENT@6554..6555 "o"
-                    COMMA@6555..6556 ","
-                    WHITESPACE@6556..6557 " "
-                    ARG@6557..6558
-                      EXPR@6557..6558
-                        EXPR_VAR@6557..6558
-                          NAME@6557..6558
-                            IDENT@6557..6558 "f"
-                    COMMA@6558..6559 ","
-                    WHITESPACE@6559..6560 " "
-                    ARG@6560..6570
-                      EXPR@6560..6570
-                        EXPR_VAR@6560..6570
-                          NAME@6560..6570
-                            IDENT@6560..6570 "inc_hidden"
-                    R_PAREN@6570..6571 ")"
-              WHITESPACE@6571..6572 " "
-              THEN_KW@6572..6576 "then"
-              WHITESPACE@6576..6577 " "
-              TRUE_EXPR@6577..6581
-                EXPR@6577..6581
-                  EXPR_VAR@6577..6578
-                    NAME@6577..6578
-                      IDENT@6577..6578 "o"
-                  SUFFIX_INDEX_EXPR@6578..6581
-                    L_BRACK@6578..6579 "["
-                    EXPR@6579..6580
-                      EXPR_VAR@6579..6580
-                        NAME@6579..6580
-                          IDENT@6579..6580 "f"
-                    R_BRACK@6580..6581 "]"
-              WHITESPACE@6581..6582 " "
-              ELSE_KW@6582..6586 "else"
-              WHITESPACE@6586..6587 " "
-              FALSE_EXPR@6587..6594
-                EXPR@6587..6594
-                  EXPR_VAR@6587..6594
-                    NAME@6587..6594
-                      IDENT@6587..6594 "default"
-        COMMA@6594..6595 ","
-        WHITESPACE@6595..6599 "\n\n  "
-        MEMBER_FIELD_METHOD@6599..6733
-          FIELD_NAME_FIXED@6599..6610
-            NAME@6599..6610
-              IDENT@6599..6610 "resolvePath"
-          PARAMS_DESC@6610..6616
-            L_PAREN@6610..6611 "("
-            PARAM@6611..6612
-              DESTRUCT_FULL@6611..6612
-                NAME@6611..6612
-                  IDENT@6611..6612 "f"
-            COMMA@6612..6613 ","
-            WHITESPACE@6613..6614 " "
-            PARAM@6614..6615
-              DESTRUCT_FULL@6614..6615
-                NAME@6614..6615
-                  IDENT@6614..6615 "r"
-            R_PAREN@6615..6616 ")"
-          COLONCOLON@6616..6618 "::"
-          WHITESPACE@6618..6623 "\n    "
-          EXPR@6623..6733
-            STMT_LOCAL@6623..6653
-              LOCAL_KW@6623..6628 "local"
-              WHITESPACE@6628..6629 " "
-              BIND_DESTRUCT@6629..6652
-                DESTRUCT_FULL@6629..6632
-                  NAME@6629..6632
-                    IDENT@6629..6632 "arr"
-                WHITESPACE@6632..6633 " "
-                ASSIGN@6633..6634 "="
-                WHITESPACE@6634..6635 " "
-                EXPR@6635..6652
-                  EXPR_VAR@6635..6638
-                    NAME@6635..6638
-                      IDENT@6635..6638 "std"
-                  SUFFIX_INDEX@6638..6644
-                    DOT@6638..6639 "."
-                    NAME@6639..6644
-                      IDENT@6639..6644 "split"
-                  SUFFIX_APPLY@6644..6652
-                    ARGS_DESC@6644..6652
-                      L_PAREN@6644..6645 "("
-                      ARG@6645..6646
-                        EXPR@6645..6646
-                          EXPR_VAR@6645..6646
-                            NAME@6645..6646
-                              IDENT@6645..6646 "f"
-                      COMMA@6646..6647 ","
-                      WHITESPACE@6647..6648 " "
-                      ARG@6648..6651
-                        EXPR@6648..6651
-                          EXPR_STRING@6648..6651
-                            STRING_SINGLE@6648..6651 "'/'"
-                      R_PAREN@6651..6652 ")"
-              SEMI@6652..6653 ";"
-            WHITESPACE@6653..6658 "\n    "
-            EXPR_VAR@6658..6661
-              NAME@6658..6661
-                IDENT@6658..6661 "std"
-            SUFFIX_INDEX@6661..6666
-              DOT@6661..6662 "."
-              NAME@6662..6666
-                IDENT@6662..6666 "join"
-            SUFFIX_APPLY@6666..6733
-              ARGS_DESC@6666..6733
-                L_PAREN@6666..6667 "("
-                ARG@6667..6670
-                  EXPR@6667..6670
-                    EXPR_STRING@6667..6670
-                      STRING_SINGLE@6667..6670 "'/'"
-                COMMA@6670..6671 ","
-                WHITESPACE@6671..6672 " "
-                ARG@6672..6732
-                  EXPR@6672..6732
-                    EXPR_BINARY@6672..6732
-                      EXPR@6672..6675
-                        EXPR_VAR@6672..6675
-                          NAME@6672..6675
-                            IDENT@6672..6675 "std"
-                      SUFFIX_INDEX@6675..6685
-                        DOT@6675..6676 "."
-                        NAME@6676..6685
-                          IDENT@6676..6685 "makeArray"
-                      SUFFIX_APPLY@6685..6726
-                        ARGS_DESC@6685..6726
-                          L_PAREN@6685..6686 "("
-                          ARG@6686..6705
-                            EXPR@6686..6705
-                              EXPR_BINARY@6686..6705
-                                EXPR@6686..6689
-                                  EXPR_VAR@6686..6689
-                                    NAME@6686..6689
-                                      IDENT@6686..6689 "std"
-                                SUFFIX_INDEX@6689..6696
-                                  DOT@6689..6690 "."
-                                  NAME@6690..6696
-                                    IDENT@6690..6696 "length"
-                                SUFFIX_APPLY@6696..6701
-                                  ARGS_DESC@6696..6701
-                                    L_PAREN@6696..6697 "("
-                                    ARG@6697..6700
-                                      EXPR@6697..6700
-                                        EXPR_VAR@6697..6700
-                                          NAME@6697..6700
-                                            IDENT@6697..6700 "arr"
-                                    R_PAREN@6700..6701 ")"
-                                WHITESPACE@6701..6702 " "
-                                MINUS@6702..6703 "-"
-                                WHITESPACE@6703..6704 " "
-                                EXPR@6704..6705
-                                  EXPR_NUMBER@6704..6705
-                                    FLOAT@6704..6705 "1"
-                          COMMA@6705..6706 ","
-                          WHITESPACE@6706..6707 " "
-                          ARG@6707..6725
-                            EXPR@6707..6725
-                              EXPR_FUNCTION@6707..6725
-                                FUNCTION_KW@6707..6715 "function"
-                                PARAMS_DESC@6715..6718
-                                  L_PAREN@6715..6716 "("
-                                  PARAM@6716..6717
-                                    DESTRUCT_FULL@6716..6717
-                                      NAME@6716..6717
-                                        IDENT@6716..6717 "i"
-                                  R_PAREN@6717..6718 ")"
-                                WHITESPACE@6718..6719 " "
-                                EXPR@6719..6725
-                                  EXPR_VAR@6719..6722
-                                    NAME@6719..6722
-                                      IDENT@6719..6722 "arr"
-                                  SUFFIX_INDEX_EXPR@6722..6725
-                                    L_BRACK@6722..6723 "["
-                                    EXPR@6723..6724
-                                      EXPR_VAR@6723..6724
-                                        NAME@6723..6724
-                                          IDENT@6723..6724 "i"
-                                    R_BRACK@6724..6725 "]"
-                          R_PAREN@6725..6726 ")"
-                      WHITESPACE@6726..6727 " "
-                      PLUS@6727..6728 "+"
-                      WHITESPACE@6728..6729 " "
-                      EXPR@6729..6732
-                        EXPR_ARRAY@6729..6732
-                          L_BRACK@6729..6730 "["
-                          EXPR@6730..6731
-                            EXPR_VAR@6730..6731
-                              NAME@6730..6731
-                                IDENT@6730..6731 "r"
-                          R_BRACK@6731..6732 "]"
-                R_PAREN@6732..6733 ")"
-        COMMA@6733..6734 ","
-        WHITESPACE@6734..6738 "\n\n  "
-        MEMBER_FIELD_METHOD@6738..7191
-          FIELD_NAME_FIXED@6738..6743
-            NAME@6738..6743
-              IDENT@6738..6743 "prune"
-          PARAMS_DESC@6743..6746
-            L_PAREN@6743..6744 "("
-            PARAM@6744..6745
-              DESTRUCT_FULL@6744..6745
-                NAME@6744..6745
-                  IDENT@6744..6745 "a"
-            R_PAREN@6745..6746 ")"
-          COLONCOLON@6746..6748 "::"
-          WHITESPACE@6748..6753 "\n    "
-          EXPR@6753..7191
-            STMT_LOCAL@6753..6957
-              LOCAL_KW@6753..6758 "local"
-              WHITESPACE@6758..6759 " "
-              BIND_FUNCTION@6759..6956
-                NAME@6759..6768
-                  IDENT@6759..6768 "isContent"
-                PARAMS_DESC@6768..6771
-                  L_PAREN@6768..6769 "("
-                  PARAM@6769..6770
-                    DESTRUCT_FULL@6769..6770
-                      NAME@6769..6770
-                        IDENT@6769..6770 "b"
-                  R_PAREN@6770..6771 ")"
-                WHITESPACE@6771..6772 " "
-                ASSIGN@6772..6773 "="
-                WHITESPACE@6773..6780 "\n      "
-                EXPR@6780..6956
-                  EXPR_IF_THEN_ELSE@6780..6956
-                    IF_KW@6780..6782 "if"
-                    WHITESPACE@6782..6783 " "
-                    EXPR@6783..6792
-                      EXPR_BINARY@6783..6792
-                        EXPR@6783..6784
-                          EXPR_VAR@6783..6784
-                            NAME@6783..6784
-                              IDENT@6783..6784 "b"
-                        WHITESPACE@6784..6785 " "
-                        EQ@6785..6787 "=="
-                        WHITESPACE@6787..6788 " "
-                        EXPR@6788..6792
-                          EXPR_LITERAL@6788..6792
-                            NULL_KW@6788..6792 "null"
-                    WHITESPACE@6792..6793 " "
-                    THEN_KW@6793..6797 "then"
-                    WHITESPACE@6797..6806 "\n        "
-                    TRUE_EXPR@6806..6811
-                      EXPR@6806..6811
-                        EXPR_LITERAL@6806..6811
-                          FALSE_KW@6806..6811 "false"
-                    WHITESPACE@6811..6818 "\n      "
-                    ELSE_KW@6818..6822 "else"
-                    WHITESPACE@6822..6823 " "
-                    FALSE_EXPR@6823..6956
-                      EXPR@6823..6956
-                        EXPR_IF_THEN_ELSE@6823..6956
-                          IF_KW@6823..6825 "if"
-                          WHITESPACE@6825..6826 " "
-                          EXPR@6826..6840
-                            EXPR_VAR@6826..6829
-                              NAME@6826..6829
-                                IDENT@6826..6829 "std"
-                            SUFFIX_INDEX@6829..6837
-                              DOT@6829..6830 "."
-                              NAME@6830..6837
-                                IDENT@6830..6837 "isArray"
-                            SUFFIX_APPLY@6837..6840
-                              ARGS_DESC@6837..6840
-                                L_PAREN@6837..6838 "("
-                                ARG@6838..6839
-                                  EXPR@6838..6839
-                                    EXPR_VAR@6838..6839
-                                      NAME@6838..6839
-                                        IDENT@6838..6839 "b"
-                                R_PAREN@6839..6840 ")"
-                          WHITESPACE@6840..6841 " "
-                          THEN_KW@6841..6845 "then"
-                          WHITESPACE@6845..6854 "\n        "
-                          TRUE_EXPR@6854..6871
-                            EXPR@6854..6871
-                              EXPR_BINARY@6854..6871
-                                EXPR@6854..6857
-                                  EXPR_VAR@6854..6857
-                                    NAME@6854..6857
-                                      IDENT@6854..6857 "std"
-                                SUFFIX_INDEX@6857..6864
-                                  DOT@6857..6858 "."
-                                  NAME@6858..6864
-                                    IDENT@6858..6864 "length"
-                                SUFFIX_APPLY@6864..6867
-                                  ARGS_DESC@6864..6867
-                                    L_PAREN@6864..6865 "("
-                                    ARG@6865..6866
-                                      EXPR@6865..6866
-                                        EXPR_VAR@6865..6866
-                                          NAME@6865..6866
-                                            IDENT@6865..6866 "b"
-                                    R_PAREN@6866..6867 ")"
-                                WHITESPACE@6867..6868 " "
-                                GT@6868..6869 ">"
-                                WHITESPACE@6869..6870 " "
-                                EXPR@6870..6871
-                                  EXPR_NUMBER@6870..6871
-                                    FLOAT@6870..6871 "0"
-                          WHITESPACE@6871..6878 "\n      "
-                          ELSE_KW@6878..6882 "else"
-                          WHITESPACE@6882..6883 " "
-                          FALSE_EXPR@6883..6956
-                            EXPR@6883..6956
-                              EXPR_IF_THEN_ELSE@6883..6956
-                                IF_KW@6883..6885 "if"
-                                WHITESPACE@6885..6886 " "
-                                EXPR@6886..6901
-                                  EXPR_VAR@6886..6889
-                                    NAME@6886..6889
-                                      IDENT@6886..6889 "std"
-                                  SUFFIX_INDEX@6889..6898
-                                    DOT@6889..6890 "."
-                                    NAME@6890..6898
-                                      IDENT@6890..6898 "isObject"
-                                  SUFFIX_APPLY@6898..6901
-                                    ARGS_DESC@6898..6901
-                                      L_PAREN@6898..6899 "("
-                                      ARG@6899..6900
-                                        EXPR@6899..6900
-                                          EXPR_VAR@6899..6900
-                                            NAME@6899..6900
-                                              IDENT@6899..6900 "b"
-                                      R_PAREN@6900..6901 ")"
-                                WHITESPACE@6901..6902 " "
-                                THEN_KW@6902..6906 "then"
-                                WHITESPACE@6906..6915 "\n        "
-                                TRUE_EXPR@6915..6932
-                                  EXPR@6915..6932
-                                    EXPR_BINARY@6915..6932
-                                      EXPR@6915..6918
-                                        EXPR_VAR@6915..6918
-                                          NAME@6915..6918
-                                            IDENT@6915..6918 "std"
-                                      SUFFIX_INDEX@6918..6925
-                                        DOT@6918..6919 "."
-                                        NAME@6919..6925
-                                          IDENT@6919..6925 "length"
-                                      SUFFIX_APPLY@6925..6928
-                                        ARGS_DESC@6925..6928
-                                          L_PAREN@6925..6926 "("
-                                          ARG@6926..6927
-                                            EXPR@6926..6927
-                                              EXPR_VAR@6926..6927
-                                                NAME@6926..6927
-                                                  IDENT@6926..6927 "b"
-                                          R_PAREN@6927..6928 ")"
-                                      WHITESPACE@6928..6929 " "
-                                      GT@6929..6930 ">"
-                                      WHITESPACE@6930..6931 " "
-                                      EXPR@6931..6932
-                                        EXPR_NUMBER@6931..6932
-                                          FLOAT@6931..6932 "0"
-                                WHITESPACE@6932..6939 "\n      "
-                                ELSE_KW@6939..6943 "else"
-                                WHITESPACE@6943..6952 "\n        "
-                                FALSE_EXPR@6952..6956
-                                  EXPR@6952..6956
-                                    EXPR_LITERAL@6952..6956
-                                      TRUE_KW@6952..6956 "true"
-              SEMI@6956..6957 ";"
-            WHITESPACE@6957..6962 "\n    "
-            EXPR_IF_THEN_ELSE@6962..7191
-              IF_KW@6962..6964 "if"
-              WHITESPACE@6964..6965 " "
-              EXPR@6965..6979
-                EXPR_VAR@6965..6968
-                  NAME@6965..6968
-                    IDENT@6965..6968 "std"
-                SUFFIX_INDEX@6968..6976
-                  DOT@6968..6969 "."
-                  NAME@6969..6976
-                    IDENT@6969..6976 "isArray"
-                SUFFIX_APPLY@6976..6979
-                  ARGS_DESC@6976..6979
-                    L_PAREN@6976..6977 "("
-                    ARG@6977..6978
-                      EXPR@6977..6978
-                        EXPR_VAR@6977..6978
-                          NAME@6977..6978
-                            IDENT@6977..6978 "a"
-                    R_PAREN@6978..6979 ")"
-              WHITESPACE@6979..6980 " "
-              THEN_KW@6980..6984 "then"
-              WHITESPACE@6984..6991 "\n      "
-              TRUE_EXPR@6991..7041
-                EXPR@6991..7041
-                  EXPR_ARRAY_COMP@6991..7041
-                    L_BRACK@6991..6992 "["
-                    EXPR@6992..7004
-                      EXPR_VAR@6992..6995
-                        NAME@6992..6995
-                          IDENT@6992..6995 "std"
-                      SUFFIX_INDEX@6995..7001
-                        DOT@6995..6996 "."
-                        NAME@6996..7001
-                          IDENT@6996..7001 "prune"
-                      SUFFIX_APPLY@7001..7004
-                        ARGS_DESC@7001..7004
-                          L_PAREN@7001..7002 "("
-                          ARG@7002..7003
-                            EXPR@7002..7003
-                              EXPR_VAR@7002..7003
-                                NAME@7002..7003
-                                  IDENT@7002..7003 "x"
-                          R_PAREN@7003..7004 ")"
-                    WHITESPACE@7004..7005 " "
-                    FOR_SPEC@7005..7015
-                      FOR_KW@7005..7008 "for"
-                      WHITESPACE@7008..7009 " "
-                      DESTRUCT_FULL@7009..7010
-                        NAME@7009..7010
-                          IDENT@7009..7010 "x"
-                      WHITESPACE@7010..7011 " "
-                      IN_KW@7011..7013 "in"
-                      WHITESPACE@7013..7014 " "
-                      EXPR@7014..7015
-                        EXPR_VAR@7014..7015
-                          NAME@7014..7015
-                            IDENT@7014..7015 "a"
-                    WHITESPACE@7015..7016 " "
-                    IF_SPEC@7016..7040
-                      IF_KW@7016..7018 "if"
-                      WHITESPACE@7018..7019 " "
-                      EXPR@7019..7040
-                        EXPR_VAR@7019..7028
-                          NAME@7019..7028
-                            IDENT@7019..7028 "isContent"
-                        SUFFIX_APPLY@7028..7040
-                          ARGS_DESC@7028..7040
-                            L_PAREN@7028..7029 "("
-                            ARG@7029..7039
-                              EXPR@7029..7039
-                                EXPR_LITERAL@7029..7030
-                                  DOLLAR@7029..7030 "$"
-                                SUFFIX_INDEX@7030..7036
-                                  DOT@7030..7031 "."
-                                  NAME@7031..7036
-                                    IDENT@7031..7036 "prune"
-                                SUFFIX_APPLY@7036..7039
-                                  ARGS_DESC@7036..7039
-                                    L_PAREN@7036..7037 "("
-                                    ARG@7037..7038
-                                      EXPR@7037..7038
-                                        EXPR_VAR@7037..7038
-                                          NAME@7037..7038
-                                            IDENT@7037..7038 "x"
-                                    R_PAREN@7038..7039 ")"
-                            R_PAREN@7039..7040 ")"
-                    R_BRACK@7040..7041 "]"
-              WHITESPACE@7041..7046 "\n    "
-              ELSE_KW@7046..7050 "else"
-              WHITESPACE@7050..7051 " "
-              FALSE_EXPR@7051..7191
-                EXPR@7051..7191
-                  EXPR_IF_THEN_ELSE@7051..7191
-                    IF_KW@7051..7053 "if"
-                    WHITESPACE@7053..7054 " "
-                    EXPR@7054..7069
-                      EXPR_VAR@7054..7057
-                        NAME@7054..7057
-                          IDENT@7054..7057 "std"
-                      SUFFIX_INDEX@7057..7066
-                        DOT@7057..7058 "."
-                        NAME@7058..7066
-                          IDENT@7058..7066 "isObject"
-                      SUFFIX_APPLY@7066..7069
-                        ARGS_DESC@7066..7069
-                          L_PAREN@7066..7067 "("
-                          ARG@7067..7068
-                            EXPR@7067..7068
-                              EXPR_VAR@7067..7068
-                                NAME@7067..7068
-                                  IDENT@7067..7068 "a"
-                          R_PAREN@7068..7069 ")"
-                    WHITESPACE@7069..7070 " "
-                    THEN_KW@7070..7074 "then"
-                    WHITESPACE@7074..7075 " "
-                    TRUE_EXPR@7075..7178
-                      EXPR@7075..7178
-                        EXPR_OBJECT@7075..7178
-                          OBJ_BODY_COMP@7075..7178
-                            L_BRACE@7075..7076 "{"
-                            WHITESPACE@7076..7083 "\n      "
-                            MEMBER_FIELD_NORMAL@7083..7101
-                              FIELD_NAME_DYNAMIC@7083..7086
-                                L_BRACK@7083..7084 "["
-                                EXPR@7084..7085
-                                  EXPR_VAR@7084..7085
-                                    NAME@7084..7085
-                                      IDENT@7084..7085 "x"
-                                R_BRACK@7085..7086 "]"
-                              COLON@7086..7087 ":"
-                              WHITESPACE@7087..7088 " "
-                              EXPR@7088..7101
-                                EXPR_LITERAL@7088..7089
-                                  DOLLAR@7088..7089 "$"
-                                SUFFIX_INDEX@7089..7095
-                                  DOT@7089..7090 "."
-                                  NAME@7090..7095
-                                    IDENT@7090..7095 "prune"
-                                SUFFIX_APPLY@7095..7101
-                                  ARGS_DESC@7095..7101
-                                    L_PAREN@7095..7096 "("
-                                    ARG@7096..7100
-                                      EXPR@7096..7100
-                                        EXPR_VAR@7096..7097
-                                          NAME@7096..7097
-                                            IDENT@7096..7097 "a"
-                                        SUFFIX_INDEX_EXPR@7097..7100
-                                          L_BRACK@7097..7098 "["
-                                          EXPR@7098..7099
-                                            EXPR_VAR@7098..7099
-                                              NAME@7098..7099
-                                                IDENT@7098..7099 "x"
-                                          R_BRACK@7099..7100 "]"
-                                    R_PAREN@7100..7101 ")"
-                            WHITESPACE@7101..7108 "\n      "
-                            FOR_SPEC@7108..7136
-                              FOR_KW@7108..7111 "for"
-                              WHITESPACE@7111..7112 " "
-                              DESTRUCT_FULL@7112..7113
-                                NAME@7112..7113
-                                  IDENT@7112..7113 "x"
-                              WHITESPACE@7113..7114 " "
-                              IN_KW@7114..7116 "in"
-                              WHITESPACE@7116..7117 " "
-                              EXPR@7117..7136
-                                EXPR_VAR@7117..7120
-                                  NAME@7117..7120
-                                    IDENT@7117..7120 "std"
-                                SUFFIX_INDEX@7120..7133
-                                  DOT@7120..7121 "."
-                                  NAME@7121..7133
-                                    IDENT@7121..7133 "objectFields"
-                                SUFFIX_APPLY@7133..7136
-                                  ARGS_DESC@7133..7136
-                                    L_PAREN@7133..7134 "("
-                                    ARG@7134..7135
-                                      EXPR@7134..7135
-                                        EXPR_VAR@7134..7135
-                                          NAME@7134..7135
-                                            IDENT@7134..7135 "a"
-                                    R_PAREN@7135..7136 ")"
-                            WHITESPACE@7136..7143 "\n      "
-                            IF_SPEC@7143..7172
-                              IF_KW@7143..7145 "if"
-                              WHITESPACE@7145..7146 " "
-                              EXPR@7146..7172
-                                EXPR_VAR@7146..7155
-                                  NAME@7146..7155
-                                    IDENT@7146..7155 "isContent"
-                                SUFFIX_APPLY@7155..7172
-                                  ARGS_DESC@7155..7172
-                                    L_PAREN@7155..7156 "("
-                                    ARG@7156..7171
-                                      EXPR@7156..7171
-                                        EXPR_VAR@7156..7159
-                                          NAME@7156..7159
-                                            IDENT@7156..7159 "std"
-                                        SUFFIX_INDEX@7159..7165
-                                          DOT@7159..7160 "."
-                                          NAME@7160..7165
-                                            IDENT@7160..7165 "prune"
-                                        SUFFIX_APPLY@7165..7171
-                                          ARGS_DESC@7165..7171
-                                            L_PAREN@7165..7166 "("
-                                            ARG@7166..7170
-                                              EXPR@7166..7170
-                                                EXPR_VAR@7166..7167
-                                                  NAME@7166..7167
-                                                    IDENT@7166..7167 "a"
-                                                SUFFIX_INDEX_EXPR@7167..7170
-                                                  L_BRACK@7167..7168 "["
-                                                  EXPR@7168..7169
-                                                    EXPR_VAR@7168..7169
-                                                      NAME@7168..7169
-                                                        IDENT@7168..7169 "x"
-                                                  R_BRACK@7169..7170 "]"
-                                            R_PAREN@7170..7171 ")"
-                                    R_PAREN@7171..7172 ")"
-                            WHITESPACE@7172..7177 "\n    "
-                            R_BRACE@7177..7178 "}"
-                    WHITESPACE@7178..7179 " "
-                    ELSE_KW@7179..7183 "else"
-                    WHITESPACE@7183..7190 "\n      "
-                    FALSE_EXPR@7190..7191
-                      EXPR@7190..7191
-                        EXPR_VAR@7190..7191
-                          NAME@7190..7191
-                            IDENT@7190..7191 "a"
-        COMMA@7191..7192 ","
-        WHITESPACE@7192..7196 "\n\n  "
-        MEMBER_FIELD_METHOD@7196..7411
-          FIELD_NAME_FIXED@7196..7200
-            NAME@7196..7200
-              IDENT@7196..7200 "find"
-          PARAMS_DESC@7200..7212
-            L_PAREN@7200..7201 "("
-            PARAM@7201..7206
-              DESTRUCT_FULL@7201..7206
-                NAME@7201..7206
-                  IDENT@7201..7206 "value"
-            COMMA@7206..7207 ","
-            WHITESPACE@7207..7208 " "
-            PARAM@7208..7211
-              DESTRUCT_FULL@7208..7211
-                NAME@7208..7211
-                  IDENT@7208..7211 "arr"
-            R_PAREN@7211..7212 ")"
-          COLONCOLON@7212..7214 "::"
-          WHITESPACE@7214..7219 "\n    "
-          EXPR@7219..7411
-            EXPR_IF_THEN_ELSE@7219..7411
-              IF_KW@7219..7221 "if"
-              WHITESPACE@7221..7222 " "
-              EXPR@7222..7239
-                EXPR_UNARY@7222..7239
-                  NOT@7222..7223 "!"
-                  EXPR_VAR@7223..7226
-                    NAME@7223..7226
-                      IDENT@7223..7226 "std"
-                  SUFFIX_INDEX@7226..7234
-                    DOT@7226..7227 "."
-                    NAME@7227..7234
-                      IDENT@7227..7234 "isArray"
-                  SUFFIX_APPLY@7234..7239
-                    ARGS_DESC@7234..7239
-                      L_PAREN@7234..7235 "("
-                      ARG@7235..7238
-                        EXPR@7235..7238
-                          EXPR_VAR@7235..7238
-                            NAME@7235..7238
-                              IDENT@7235..7238 "arr"
-                      R_PAREN@7238..7239 ")"
-              WHITESPACE@7239..7240 " "
-              THEN_KW@7240..7244 "then"
-              WHITESPACE@7244..7251 "\n      "
-              TRUE_EXPR@7251..7321
-                EXPR@7251..7321
-                  EXPR_ERROR@7251..7321
-                    ERROR_KW@7251..7256 "error"
-                    WHITESPACE@7256..7257 " "
-                    EXPR@7257..7321
-                      EXPR_BINARY@7257..7321
-                        EXPR@7257..7305
-                          EXPR_STRING@7257..7305
-                            STRING_SINGLE@7257..7305 "'find second paramete ..."
-                        WHITESPACE@7305..7306 " "
-                        PLUS@7306..7307 "+"
-                        WHITESPACE@7307..7308 " "
-                        EXPR@7308..7321
-                          EXPR_VAR@7308..7311
-                            NAME@7308..7311
-                              IDENT@7308..7311 "std"
-                          SUFFIX_INDEX@7311..7316
-                            DOT@7311..7312 "."
-                            NAME@7312..7316
-                              IDENT@7312..7316 "type"
-                          SUFFIX_APPLY@7316..7321
-                            ARGS_DESC@7316..7321
-                              L_PAREN@7316..7317 "("
-                              ARG@7317..7320
-                                EXPR@7317..7320
-                                  EXPR_VAR@7317..7320
-                                    NAME@7317..7320
-                                      IDENT@7317..7320 "arr"
-                              R_PAREN@7320..7321 ")"
-              WHITESPACE@7321..7326 "\n    "
-              ELSE_KW@7326..7330 "else"
-              WHITESPACE@7330..7337 "\n      "
-              FALSE_EXPR@7337..7411
-                EXPR@7337..7411
-                  EXPR_VAR@7337..7340
-                    NAME@7337..7340
-                      IDENT@7337..7340 "std"
-                  SUFFIX_INDEX@7340..7347
-                    DOT@7340..7341 "."
-                    NAME@7341..7347
-                      IDENT@7341..7347 "filter"
-                  SUFFIX_APPLY@7347..7411
-                    ARGS_DESC@7347..7411
-                      L_PAREN@7347..7348 "("
-                      ARG@7348..7375
-                        EXPR@7348..7375
-                          EXPR_FUNCTION@7348..7375
-                            FUNCTION_KW@7348..7356 "function"
-                            PARAMS_DESC@7356..7359
-                              L_PAREN@7356..7357 "("
-                              PARAM@7357..7358
-                                DESTRUCT_FULL@7357..7358
-                                  NAME@7357..7358
-                                    IDENT@7357..7358 "i"
-                              R_PAREN@7358..7359 ")"
-                            WHITESPACE@7359..7360 " "
-                            EXPR@7360..7375
-                              EXPR_BINARY@7360..7375
-                                EXPR@7360..7363
-                                  EXPR_VAR@7360..7363
-                                    NAME@7360..7363
-                                      IDENT@7360..7363 "arr"
-                                SUFFIX_INDEX_EXPR@7363..7366
-                                  L_BRACK@7363..7364 "["
-                                  EXPR@7364..7365
-                                    EXPR_VAR@7364..7365
-                                      NAME@7364..7365
-                                        IDENT@7364..7365 "i"
-                                  R_BRACK@7365..7366 "]"
-                                WHITESPACE@7366..7367 " "
-                                EQ@7367..7369 "=="
-                                WHITESPACE@7369..7370 " "
-                                EXPR@7370..7375
-                                  EXPR_VAR@7370..7375
-                                    NAME@7370..7375
-                                      IDENT@7370..7375 "value"
-                      COMMA@7375..7376 ","
-                      WHITESPACE@7376..7377 " "
-                      ARG@7377..7410
-                        EXPR@7377..7410
-                          EXPR_VAR@7377..7380
-                            NAME@7377..7380
-                              IDENT@7377..7380 "std"
-                          SUFFIX_INDEX@7380..7386
-                            DOT@7380..7381 "."
-                            NAME@7381..7386
-                              IDENT@7381..7386 "range"
-                          SUFFIX_APPLY@7386..7410
-                            ARGS_DESC@7386..7410
-                              L_PAREN@7386..7387 "("
-                              ARG@7387..7388
-                                EXPR@7387..7388
-                                  EXPR_NUMBER@7387..7388
-                                    FLOAT@7387..7388 "0"
-                              COMMA@7388..7389 ","
-                              WHITESPACE@7389..7390 " "
-                              ARG@7390..7409
-                                EXPR@7390..7409
-                                  EXPR_BINARY@7390..7409
-                                    EXPR@7390..7393
-                                      EXPR_VAR@7390..7393
-                                        NAME@7390..7393
-                                          IDENT@7390..7393 "std"
-                                    SUFFIX_INDEX@7393..7400
-                                      DOT@7393..7394 "."
-                                      NAME@7394..7400
-                                        IDENT@7394..7400 "length"
-                                    SUFFIX_APPLY@7400..7405
-                                      ARGS_DESC@7400..7405
-                                        L_PAREN@7400..7401 "("
-                                        ARG@7401..7404
-                                          EXPR@7401..7404
-                                            EXPR_VAR@7401..7404
-                                              NAME@7401..7404
-                                                IDENT@7401..7404 "arr"
-                                        R_PAREN@7404..7405 ")"
-                                    WHITESPACE@7405..7406 " "
-                                    MINUS@7406..7407 "-"
-                                    WHITESPACE@7407..7408 " "
-                                    EXPR@7408..7409
-                                      EXPR_NUMBER@7408..7409
-                                        FLOAT@7408..7409 "1"
-                              R_PAREN@7409..7410 ")"
-                      R_PAREN@7410..7411 ")"
-        COMMA@7411..7412 ","
-        WHITESPACE@7412..7416 "\n\n  "
-        SINGLE_LINE_SLASH_COMMENT@7416..7426 "// Compat\n"
-        WHITESPACE@7426..7428 "  "
-        MEMBER_FIELD_METHOD@7428..7538
-          FIELD_NAME_FIXED@7428..7443
-            NAME@7428..7443
-              IDENT@7428..7443 "__compare_array"
-          PARAMS_DESC@7443..7455
-            L_PAREN@7443..7444 "("
-            PARAM@7444..7448
-              DESTRUCT_FULL@7444..7448
-                NAME@7444..7448
-                  IDENT@7444..7448 "arr1"
-            COMMA@7448..7449 ","
-            WHITESPACE@7449..7450 " "
-            PARAM@7450..7454
-              DESTRUCT_FULL@7450..7454
-                NAME@7450..7454
-                  IDENT@7450..7454 "arr2"
-            R_PAREN@7454..7455 ")"
-          COLONCOLON@7455..7457 "::"
-          WHITESPACE@7457..7462 "\n    "
-          EXPR@7462..7538
-            STMT_ASSERT@7462..7508
-              ASSERTION@7462..7507
-                ASSERT_KW@7462..7468 "assert"
-                WHITESPACE@7468..7469 " "
-                EXPR@7469..7507
-                  EXPR_BINARY@7469..7507
-                    EXPR@7469..7472
-                      EXPR_VAR@7469..7472
-                        NAME@7469..7472
-                          IDENT@7469..7472 "std"
-                    SUFFIX_INDEX@7472..7480
-                      DOT@7472..7473 "."
-                      NAME@7473..7480
-                        IDENT@7473..7480 "isArray"
-                    SUFFIX_APPLY@7480..7486
-                      ARGS_DESC@7480..7486
-                        L_PAREN@7480..7481 "("
-                        ARG@7481..7485
-                          EXPR@7481..7485
-                            EXPR_VAR@7481..7485
-                              NAME@7481..7485
-                                IDENT@7481..7485 "arr1"
-                        R_PAREN@7485..7486 ")"
-                    WHITESPACE@7486..7487 " "
-                    AND@7487..7489 "&&"
-                    WHITESPACE@7489..7490 " "
-                    EXPR@7490..7507
-                      EXPR_VAR@7490..7493
-                        NAME@7490..7493
-                          IDENT@7490..7493 "std"
-                      SUFFIX_INDEX@7493..7501
-                        DOT@7493..7494 "."
-                        NAME@7494..7501
-                          IDENT@7494..7501 "isArray"
-                      SUFFIX_APPLY@7501..7507
-                        ARGS_DESC@7501..7507
-                          L_PAREN@7501..7502 "("
-                          ARG@7502..7506
-                            EXPR@7502..7506
-                              EXPR_VAR@7502..7506
-                                NAME@7502..7506
-                                  IDENT@7502..7506 "arr2"
-                          R_PAREN@7506..7507 ")"
-              SEMI@7507..7508 ";"
-            WHITESPACE@7508..7513 "\n    "
-            EXPR_VAR@7513..7516
-              NAME@7513..7516
-                IDENT@7513..7516 "std"
-            SUFFIX_INDEX@7516..7526
-              DOT@7516..7517 "."
-              NAME@7517..7526
-                IDENT@7517..7526 "__compare"
-            SUFFIX_APPLY@7526..7538
-              ARGS_DESC@7526..7538
-                L_PAREN@7526..7527 "("
-                ARG@7527..7531
-                  EXPR@7527..7531
-                    EXPR_VAR@7527..7531
-                      NAME@7527..7531
-                        IDENT@7527..7531 "arr1"
-                COMMA@7531..7532 ","
-                WHITESPACE@7532..7533 " "
-                ARG@7533..7537
-                  EXPR@7533..7537
-                    EXPR_VAR@7533..7537
-                      NAME@7533..7537
-                        IDENT@7533..7537 "arr2"
-                R_PAREN@7537..7538 ")"
-        COMMA@7538..7539 ","
-        WHITESPACE@7539..7542 "\n  "
-        MEMBER_FIELD_METHOD@7542..7606
-          FIELD_NAME_FIXED@7542..7554
-            NAME@7542..7554
-              IDENT@7542..7554 "__array_less"
-          PARAMS_DESC@7554..7566
-            L_PAREN@7554..7555 "("
-            PARAM@7555..7559
-              DESTRUCT_FULL@7555..7559
-                NAME@7555..7559
-                  IDENT@7555..7559 "arr1"
-            COMMA@7559..7560 ","
-            WHITESPACE@7560..7561 " "
-            PARAM@7561..7565
-              DESTRUCT_FULL@7561..7565
-                NAME@7561..7565
-                  IDENT@7561..7565 "arr2"
-            R_PAREN@7565..7566 ")"
-          COLONCOLON@7566..7568 "::"
-          WHITESPACE@7568..7569 " "
-          EXPR@7569..7606
-            EXPR_BINARY@7569..7606
-              EXPR@7569..7572
-                EXPR_VAR@7569..7572
-                  NAME@7569..7572
-                    IDENT@7569..7572 "std"
-              SUFFIX_INDEX@7572..7588
-                DOT@7572..7573 "."
-                NAME@7573..7588
-                  IDENT@7573..7588 "__compare_array"
-              SUFFIX_APPLY@7588..7600
-                ARGS_DESC@7588..7600
-                  L_PAREN@7588..7589 "("
-                  ARG@7589..7593
-                    EXPR@7589..7593
-                      EXPR_VAR@7589..7593
-                        NAME@7589..7593
-                          IDENT@7589..7593 "arr1"
-                  COMMA@7593..7594 ","
-                  WHITESPACE@7594..7595 " "
-                  ARG@7595..7599
-                    EXPR@7595..7599
-                      EXPR_VAR@7595..7599
-                        NAME@7595..7599
-                          IDENT@7595..7599 "arr2"
-                  R_PAREN@7599..7600 ")"
-              WHITESPACE@7600..7601 " "
-              EQ@7601..7603 "=="
-              WHITESPACE@7603..7604 " "
-              EXPR@7604..7606
-                EXPR_UNARY@7604..7606
-                  MINUS@7604..7605 "-"
-                  EXPR_NUMBER@7605..7606
-                    FLOAT@7605..7606 "1"
-        COMMA@7606..7607 ","
-        WHITESPACE@7607..7610 "\n  "
-        MEMBER_FIELD_METHOD@7610..7676
-          FIELD_NAME_FIXED@7610..7625
-            NAME@7610..7625
-              IDENT@7610..7625 "__array_greater"
-          PARAMS_DESC@7625..7637
-            L_PAREN@7625..7626 "("
-            PARAM@7626..7630
-              DESTRUCT_FULL@7626..7630
-                NAME@7626..7630
-                  IDENT@7626..7630 "arr1"
-            COMMA@7630..7631 ","
-            WHITESPACE@7631..7632 " "
-            PARAM@7632..7636
-              DESTRUCT_FULL@7632..7636
-                NAME@7632..7636
-                  IDENT@7632..7636 "arr2"
-            R_PAREN@7636..7637 ")"
-          COLONCOLON@7637..7639 "::"
-          WHITESPACE@7639..7640 " "
-          EXPR@7640..7676
-            EXPR_BINARY@7640..7676
-              EXPR@7640..7643
-                EXPR_VAR@7640..7643
-                  NAME@7640..7643
-                    IDENT@7640..7643 "std"
-              SUFFIX_INDEX@7643..7659
-                DOT@7643..7644 "."
-                NAME@7644..7659
-                  IDENT@7644..7659 "__compare_array"
-              SUFFIX_APPLY@7659..7671
-                ARGS_DESC@7659..7671
-                  L_PAREN@7659..7660 "("
-                  ARG@7660..7664
-                    EXPR@7660..7664
-                      EXPR_VAR@7660..7664
-                        NAME@7660..7664
-                          IDENT@7660..7664 "arr1"
-                  COMMA@7664..7665 ","
-                  WHITESPACE@7665..7666 " "
-                  ARG@7666..7670
-                    EXPR@7666..7670
-                      EXPR_VAR@7666..7670
-                        NAME@7666..7670
-                          IDENT@7666..7670 "arr2"
-                  R_PAREN@7670..7671 ")"
-              WHITESPACE@7671..7672 " "
-              EQ@7672..7674 "=="
-              WHITESPACE@7674..7675 " "
-              EXPR@7675..7676
-                EXPR_NUMBER@7675..7676
-                  FLOAT@7675..7676 "1"
-        COMMA@7676..7677 ","
-        WHITESPACE@7677..7680 "\n  "
-        MEMBER_FIELD_METHOD@7680..7752
-          FIELD_NAME_FIXED@7680..7701
-            NAME@7680..7701
-              IDENT@7680..7701 "__array_less_or_equal"
-          PARAMS_DESC@7701..7713
-            L_PAREN@7701..7702 "("
-            PARAM@7702..7706
-              DESTRUCT_FULL@7702..7706
-                NAME@7702..7706
-                  IDENT@7702..7706 "arr1"
-            COMMA@7706..7707 ","
-            WHITESPACE@7707..7708 " "
-            PARAM@7708..7712
-              DESTRUCT_FULL@7708..7712
-                NAME@7708..7712
-                  IDENT@7708..7712 "arr2"
-            R_PAREN@7712..7713 ")"
-          COLONCOLON@7713..7715 "::"
-          WHITESPACE@7715..7716 " "
-          EXPR@7716..7752
-            EXPR_BINARY@7716..7752
-              EXPR@7716..7719
-                EXPR_VAR@7716..7719
-                  NAME@7716..7719
-                    IDENT@7716..7719 "std"
-              SUFFIX_INDEX@7719..7735
-                DOT@7719..7720 "."
-                NAME@7720..7735
-                  IDENT@7720..7735 "__compare_array"
-              SUFFIX_APPLY@7735..7747
-                ARGS_DESC@7735..7747
-                  L_PAREN@7735..7736 "("
-                  ARG@7736..7740
-                    EXPR@7736..7740
-                      EXPR_VAR@7736..7740
-                        NAME@7736..7740
-                          IDENT@7736..7740 "arr1"
-                  COMMA@7740..7741 ","
-                  WHITESPACE@7741..7742 " "
-                  ARG@7742..7746
-                    EXPR@7742..7746
-                      EXPR_VAR@7742..7746
-                        NAME@7742..7746
-                          IDENT@7742..7746 "arr2"
-                  R_PAREN@7746..7747 ")"
-              WHITESPACE@7747..7748 " "
-              LE@7748..7750 "<="
-              WHITESPACE@7750..7751 " "
-              EXPR@7751..7752
-                EXPR_NUMBER@7751..7752
-                  FLOAT@7751..7752 "0"
-        COMMA@7752..7753 ","
-        WHITESPACE@7753..7756 "\n  "
-        MEMBER_FIELD_METHOD@7756..7831
-          FIELD_NAME_FIXED@7756..7780
-            NAME@7756..7780
-              IDENT@7756..7780 "__array_greater_or_equal"
-          PARAMS_DESC@7780..7792
-            L_PAREN@7780..7781 "("
-            PARAM@7781..7785
-              DESTRUCT_FULL@7781..7785
-                NAME@7781..7785
-                  IDENT@7781..7785 "arr1"
-            COMMA@7785..7786 ","
-            WHITESPACE@7786..7787 " "
-            PARAM@7787..7791
-              DESTRUCT_FULL@7787..7791
-                NAME@7787..7791
-                  IDENT@7787..7791 "arr2"
-            R_PAREN@7791..7792 ")"
-          COLONCOLON@7792..7794 "::"
-          WHITESPACE@7794..7795 " "
-          EXPR@7795..7831
-            EXPR_BINARY@7795..7831
-              EXPR@7795..7798
-                EXPR_VAR@7795..7798
-                  NAME@7795..7798
-                    IDENT@7795..7798 "std"
-              SUFFIX_INDEX@7798..7814
-                DOT@7798..7799 "."
-                NAME@7799..7814
-                  IDENT@7799..7814 "__compare_array"
-              SUFFIX_APPLY@7814..7826
-                ARGS_DESC@7814..7826
-                  L_PAREN@7814..7815 "("
-                  ARG@7815..7819
-                    EXPR@7815..7819
-                      EXPR_VAR@7815..7819
-                        NAME@7815..7819
-                          IDENT@7815..7819 "arr1"
-                  COMMA@7819..7820 ","
-                  WHITESPACE@7820..7821 " "
-                  ARG@7821..7825
-                    EXPR@7821..7825
-                      EXPR_VAR@7821..7825
-                        NAME@7821..7825
-                          IDENT@7821..7825 "arr2"
-                  R_PAREN@7825..7826 ")"
-              WHITESPACE@7826..7827 " "
-              GE@7827..7829 ">="
-              WHITESPACE@7829..7830 " "
-              EXPR@7830..7831
-                EXPR_NUMBER@7830..7831
-                  FLOAT@7830..7831 "0"
-        COMMA@7831..7832 ","
-        WHITESPACE@7832..7833 "\n"
-        R_BRACE@7833..7834 "}"
-  WHITESPACE@7834..7835 "\n"
addedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__super_nesting.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__super_nesting.snap
@@ -0,0 +1,25 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "super.a + super.b\n"
+---
+SOURCE_FILE@0..18
+  EXPR@0..17
+    EXPR_BINARY@0..17
+      EXPR@0..7
+        EXPR_LITERAL@0..5
+          SUPER_KW@0..5 "super"
+        SUFFIX_INDEX@5..7
+          DOT@5..6 "."
+          NAME@6..7
+            IDENT@6..7 "a"
+      WHITESPACE@7..8 " "
+      PLUS@8..9 "+"
+      WHITESPACE@9..10 " "
+      EXPR@10..17
+        EXPR_LITERAL@10..15
+          SUPER_KW@10..15 "super"
+        SUFFIX_INDEX@15..17
+          DOT@15..16 "."
+          NAME@16..17
+            IDENT@16..17 "b"
+  WHITESPACE@17..18 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__unexpected_destruct.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__unexpected_destruct.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__unexpected_destruct.snap
@@ -25,10 +25,6 @@
 ===
 LocatedSyntaxError { error: Unexpected { expected: Named("destruction specifier"), found: MUL }, range: 6..7 }
 ===
-  x syntax error
-   ,-[1:7]
- 1 | local * = 1;
-   :       |
-   :       `-- expected destruction specifier, found MUL
- 2 | a
-   `----
+   ·       ╭─── unexpected MUL, expecting destruction specifier
+1  │ local * = 1;
+2  │ a
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap
@@ -38,14 +38,9 @@
 LocatedSyntaxError { error: Unexpected { expected: Named("comma"), found: SEMI }, range: 7..8 }
 LocatedSyntaxError { error: Unexpected { expected: Named("comma"), found: SEMI }, range: 14..15 }
 ===
-  x syntax error
-   ,-[2:6]
- 1 | {
- 2 |     a: 1;
-   :         |
-   :         `-- expected comma, found SEMI
- 3 |     b: 2;
-   :         |
-   :         `-- expected comma, found SEMI
- 4 | }
-   `----
+1  │ {
+   ·         ╭─── unexpected SEMI, expecting comma
+2  │     a: 1;
+   ·         ╭─── unexpected SEMI, expecting comma
+3  │     b: 2;
+4  │ }
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
1// `never`1// `never`
2#![cfg(any())]2#![cfg(test)]
33
4use miette::{4use hi_doc::{Formatting, SnippetBuilder, Text};
5 Diagnostic, GraphicalReportHandler, GraphicalTheme, LabeledSpan, ThemeCharacters, ThemeStyles,
6};
7use thiserror::Error;5use thiserror::Error;
86
9use crate::{parse, AstNode};7use crate::{parse, AstNode};
10
11#[derive(Debug, Error)]
12#[error("syntax error")]
13struct MyDiagnostic {
14 code: String,
15 spans: Vec<LabeledSpan>,
16}
17impl Diagnostic for MyDiagnostic {
18 fn code<'a>(&'a self) -> Option<Box<dyn std::fmt::Display + 'a>> {
19 None
20 }
21
22 fn severity(&self) -> Option<miette::Severity> {
23 None
24 }
25
26 fn help<'a>(&'a self) -> Option<Box<dyn std::fmt::Display + 'a>> {
27 None
28 }
29
30 fn url<'a>(&'a self) -> Option<Box<dyn std::fmt::Display + 'a>> {
31 None
32 }
33
34 fn source_code(&self) -> Option<&dyn miette::SourceCode> {
35 Some(&self.code)
36 }
37
38 fn labels(&self) -> Option<Box<dyn Iterator<Item = miette::LabeledSpan> + '_>> {
39 Some(Box::new(self.spans.clone().into_iter()))
40 }
41
42 fn related<'a>(&'a self) -> Option<Box<dyn Iterator<Item = &'a dyn Diagnostic> + 'a>> {
43 None
44 }
45}
468
47fn process(text: &str) -> String {9fn process(text: &str) -> String {
48 use std::fmt::Write;10 use std::fmt::Write;
63 }25 }
64 code += " ";26 code += " ";
6527
66 let diag = MyDiagnostic {28 let mut s = SnippetBuilder::new(code);
67 code,29
30 for error in errors {
68 spans: errors.into_iter().map(|e| e.into()).collect(),31 s.error(Text::fragment(
32 format!("{}", error.error),
33 Formatting::default(),
34 ))
35 .range(error.range.start().into()..=error.range.end().into())
36 .build();
69 };37 }
7038
39 writeln!(out, "===").unwrap();
71 let handler = GraphicalReportHandler::new_themed(GraphicalTheme {40 let ansi = hi_doc::source_to_ansi(&s.build());
72 characters: ThemeCharacters::ascii(),
73 styles: ThemeStyles::none(),
74 });
75
76 writeln!(out, "===").unwrap();41 let text = strip_ansi_escapes::strip_str(&ansi);
77 handler
78 .render_report(&mut out, &diag)42 out.push_str(&text);
79 .expect("fmt error?..");
80 }43 }
81 out.split('\n')44 out.split('\n')
82 .map(|s| s.trim_end().to_string())45 .map(|s| s.trim_end().to_string())
238 [c]201 [c]
239 "#202 "#
203
204 super_nesting => r#"
205 super.a + super.b
206 "#
240);207);
241208
242#[test]
243fn stdlib() {
244 let src = include_str!("../../jrsonnet-stdlib/src/std.jsonnet");
245 let result = process(src);
246 insta::assert_snapshot!("stdlib", result, src);
247}
248#[test]209#[test]
249fn eval_simple() {210fn eval_simple() {
250 let src = "local a = 1, b = 2; a + local c = 1; c";211 let src = "local a = 1, b = 2; a + local c = 1; c";