git.delta.rocks / jrsonnet / refs/commits / 3248f25fe079

difftreelog

refactor support new jrsonnet features in rowan parser

Yaroslav Bolyukin2023-09-11parent: #a7bbbb4.patch.diff
in: master

43 files changed

modifiedcrates/jrsonnet-rowan-parser/jsonnet.ungramdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/jsonnet.ungram
+++ b/crates/jrsonnet-rowan-parser/jsonnet.ungram
@@ -5,32 +5,47 @@
 
 SourceFile = Expr
 
-ExprBinary =
-    lhs:LhsExpr
-    BinaryOperator
-    rhs:Expr
-ExprUnary =
-    UnaryOperator
-    rhs:Expr
-ExprSlice =
-    Expr
-    SliceDesc
-ExprIndex =
-    Expr
+SuffixIndex =
+    '?'?
     '.'
     index:Name
-ExprIndexExpr =
-    base:LhsExpr
+SuffixIndexExpr =
+    ('?' '.')?
     '['
     index:Expr
     ']'
-ExprApply =
-    Expr
+SuffixSlice =
+    SliceDesc
+SuffixApply =
     ArgsDesc
     'tailstrict'?
+Suffix =
+    SuffixIndex
+|   SuffixIndexExpr
+|   SuffixSlice
+|   SuffixApply
+
+StmtLocal =
+    'local'
+    (Bind (',' Bind)* ','?)
+    ';'
+StmtAssert =
+    Assertion
+    ';'
+Stmt =
+    StmtLocal
+|   StmtAssert
+
+ExprBinary =
+    lhs:Expr
+    BinaryOperator
+    rhs:Expr
+ExprUnary =
+    UnaryOperator
+    rhs:Expr
 ExprObjExtend =
-    LhsExpr
     Expr
+    Expr
 ExprParened =
     '('
     Expr
@@ -79,29 +94,18 @@
     ParamsDesc
     ')'
     Expr
-ExprAssert =
-    Assertion
-    ';'
-    Expr
 ExprError =
     'error'
     Expr
 
-StmtLocal =
-    'local'
-    (Bind (',' Bind)* ','?)
-    ';'
-
 Expr =
-    StmtLocal*
+    Stmt*
     ExprBase
+    Suffix*
+
 ExprBase =
     ExprBinary
 |   ExprUnary
-|   ExprSlice
-|   ExprIndex
-|   ExprIndexExpr
-|   ExprApply
 |   ExprObjExtend
 |   ExprParened
 |   ExprString
@@ -114,11 +118,10 @@
 |   ExprVar
 |   ExprIfThenElse
 |   ExprFunction
-|   ExprAssert
 |   ExprError
 
 BinaryOperator =
-    '||' | '&&'
+    '||' | '??' | '&&'
 |   '|' | '^' | '&'
 |   '==' | '!=' | '<' | '>' | '<=' | '>=' | 'in'
 |   '<<' | '>>'
@@ -242,7 +245,7 @@
 
 ForSpec =
     'for'
-    bind:Name
+    bind:Destruct
     'in'
     Expr
 IfSpec =
@@ -278,7 +281,7 @@
 
 Assertion =
     'assert'
-    condition:LhsExpr
+    condition:Expr
     (
         ':'
         message:Expr
@@ -336,7 +339,6 @@
 // Aliases used to resolve node type conflicts
 TrueExpr=Expr
 FalseExpr=Expr
-LhsExpr=Expr
 
 // Trivia - tokens which will be implicitly skipped for parser
 Trivia =
modifiedcrates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
@@ -23,61 +23,70 @@
 	pub(crate) syntax: SyntaxNode,
 }
 impl Expr {
-	pub fn stmt_locals(&self) -> AstChildren<StmtLocal> {
+	pub fn stmts(&self) -> AstChildren<Stmt> {
 		support::children(&self.syntax)
 	}
 	pub fn expr_base(&self) -> Option<ExprBase> {
 		support::child(&self.syntax)
 	}
+	pub fn suffixs(&self) -> AstChildren<Suffix> {
+		support::children(&self.syntax)
+	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprBinary {
+pub struct SuffixIndex {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprBinary {
-	pub fn lhs(&self) -> Option<LhsExpr> {
-		support::child(&self.syntax)
+impl SuffixIndex {
+	pub fn question_mark_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![?])
 	}
-	pub fn binary_operator(&self) -> Option<BinaryOperator> {
-		support::token_child(&self.syntax)
+	pub fn dot_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![.])
 	}
-	pub fn rhs(&self) -> Option<Expr> {
+	pub fn index(&self) -> Option<Name> {
 		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct LhsExpr {
+pub struct Name {
 	pub(crate) syntax: SyntaxNode,
 }
-impl LhsExpr {
-	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+impl Name {
+	pub fn ident_lit(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, IDENT)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprUnary {
+pub struct SuffixIndexExpr {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprUnary {
-	pub fn unary_operator(&self) -> Option<UnaryOperator> {
-		support::token_child(&self.syntax)
+impl SuffixIndexExpr {
+	pub fn question_mark_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![?])
 	}
-	pub fn rhs(&self) -> Option<Expr> {
+	pub fn dot_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![.])
+	}
+	pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T!['['])
+	}
+	pub fn index(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
+	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![']'])
+	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprSlice {
+pub struct SuffixSlice {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprSlice {
-	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
-	}
+impl SuffixSlice {
 	pub fn slice_desc(&self) -> Option<SliceDesc> {
 		support::child(&self.syntax)
 	}
@@ -109,79 +118,108 @@
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprIndex {
+pub struct SuffixApply {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprIndex {
-	pub fn expr(&self) -> Option<Expr> {
+impl SuffixApply {
+	pub fn args_desc(&self) -> Option<ArgsDesc> {
 		support::child(&self.syntax)
 	}
-	pub fn dot_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![.])
+	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![tailstrict])
+	}
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct ArgsDesc {
+	pub(crate) syntax: SyntaxNode,
+}
+impl ArgsDesc {
+	pub fn l_paren_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T!['('])
+	}
+	pub fn args(&self) -> AstChildren<Arg> {
+		support::children(&self.syntax)
 	}
-	pub fn index(&self) -> Option<Name> {
-		support::child(&self.syntax)
+	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![')'])
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Name {
+pub struct StmtLocal {
 	pub(crate) syntax: SyntaxNode,
 }
-impl Name {
-	pub fn ident_lit(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, IDENT)
+impl StmtLocal {
+	pub fn local_kw_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![local])
+	}
+	pub fn binds(&self) -> AstChildren<Bind> {
+		support::children(&self.syntax)
+	}
+	pub fn semi_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![;])
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprIndexExpr {
+pub struct StmtAssert {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprIndexExpr {
-	pub fn base(&self) -> Option<LhsExpr> {
+impl StmtAssert {
+	pub fn assertion(&self) -> Option<Assertion> {
 		support::child(&self.syntax)
 	}
-	pub fn l_brack_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T!['['])
+	pub fn semi_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![;])
 	}
-	pub fn index(&self) -> Option<Expr> {
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct Assertion {
+	pub(crate) syntax: SyntaxNode,
+}
+impl Assertion {
+	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![assert])
+	}
+	pub fn condition(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
-	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![']'])
+	pub fn colon_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![:])
+	}
+	pub fn message(&self) -> Option<Expr> {
+		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprApply {
+pub struct ExprBinary {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprApply {
-	pub fn expr(&self) -> Option<Expr> {
+impl ExprBinary {
+	pub fn lhs(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
-	pub fn args_desc(&self) -> Option<ArgsDesc> {
-		support::child(&self.syntax)
+	pub fn binary_operator(&self) -> Option<BinaryOperator> {
+		support::token_child(&self.syntax)
 	}
-	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![tailstrict])
+	pub fn rhs(&self) -> Option<Expr> {
+		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ArgsDesc {
+pub struct ExprUnary {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ArgsDesc {
-	pub fn l_paren_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T!['('])
-	}
-	pub fn args(&self) -> AstChildren<Arg> {
-		support::children(&self.syntax)
+impl ExprUnary {
+	pub fn unary_operator(&self) -> Option<UnaryOperator> {
+		support::token_child(&self.syntax)
 	}
-	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![')'])
+	pub fn rhs(&self) -> Option<Expr> {
+		support::child(&self.syntax)
 	}
 }
 
@@ -190,9 +228,6 @@
 	pub(crate) syntax: SyntaxNode,
 }
 impl ExprObjExtend {
-	pub fn lhs_expr(&self) -> Option<LhsExpr> {
-		support::child(&self.syntax)
-	}
 	pub fn expr(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
@@ -395,45 +430,10 @@
 	}
 	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![')'])
-	}
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprAssert {
-	pub(crate) syntax: SyntaxNode,
-}
-impl ExprAssert {
-	pub fn assertion(&self) -> Option<Assertion> {
-		support::child(&self.syntax)
-	}
-	pub fn semi_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![;])
-	}
-	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Assertion {
-	pub(crate) syntax: SyntaxNode,
-}
-impl Assertion {
-	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![assert])
-	}
-	pub fn condition(&self) -> Option<LhsExpr> {
-		support::child(&self.syntax)
-	}
-	pub fn colon_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![:])
-	}
-	pub fn message(&self) -> Option<Expr> {
-		support::child(&self.syntax)
-	}
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct ExprError {
 	pub(crate) syntax: SyntaxNode,
 }
@@ -447,22 +447,6 @@
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct StmtLocal {
-	pub(crate) syntax: SyntaxNode,
-}
-impl StmtLocal {
-	pub fn local_kw_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![local])
-	}
-	pub fn binds(&self) -> AstChildren<Bind> {
-		support::children(&self.syntax)
-	}
-	pub fn semi_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![;])
-	}
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct SliceDescEnd {
 	pub(crate) syntax: SyntaxNode,
 }
@@ -641,7 +625,7 @@
 	pub fn for_kw_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![for])
 	}
-	pub fn bind(&self) -> Option<Name> {
+	pub fn bind(&self) -> Option<Destruct> {
 		support::child(&self.syntax)
 	}
 	pub fn in_kw_token(&self) -> Option<SyntaxToken> {
@@ -820,6 +804,26 @@
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Suffix {
+	SuffixIndex(SuffixIndex),
+	SuffixIndexExpr(SuffixIndexExpr),
+	SuffixSlice(SuffixSlice),
+	SuffixApply(SuffixApply),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Bind {
+	BindDestruct(BindDestruct),
+	BindFunction(BindFunction),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Stmt {
+	StmtLocal(StmtLocal),
+	StmtAssert(StmtAssert),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum ObjBody {
 	ObjBodyComp(ObjBodyComp),
 	ObjBodyMemberList(ObjBodyMemberList),
@@ -829,22 +833,12 @@
 pub enum CompSpec {
 	ForSpec(ForSpec),
 	IfSpec(IfSpec),
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub enum Bind {
-	BindDestruct(BindDestruct),
-	BindFunction(BindFunction),
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum ExprBase {
 	ExprBinary(ExprBinary),
 	ExprUnary(ExprUnary),
-	ExprSlice(ExprSlice),
-	ExprIndex(ExprIndex),
-	ExprIndexExpr(ExprIndexExpr),
-	ExprApply(ExprApply),
 	ExprObjExtend(ExprObjExtend),
 	ExprParened(ExprParened),
 	ExprString(ExprString),
@@ -857,7 +851,6 @@
 	ExprVar(ExprVar),
 	ExprIfThenElse(ExprIfThenElse),
 	ExprFunction(ExprFunction),
-	ExprAssert(ExprAssert),
 	ExprError(ExprError),
 }
 
@@ -905,6 +898,7 @@
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub enum BinaryOperatorKind {
 	Or,
+	NullCoaelse,
 	And,
 	BitOr,
 	BitXor,
@@ -1078,9 +1072,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprBinary {
+impl AstNode for SuffixIndex {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_BINARY
+		kind == SUFFIX_INDEX
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1093,9 +1087,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for LhsExpr {
+impl AstNode for Name {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == LHS_EXPR
+		kind == NAME
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1108,9 +1102,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprUnary {
+impl AstNode for SuffixIndexExpr {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_UNARY
+		kind == SUFFIX_INDEX_EXPR
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1123,9 +1117,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprSlice {
+impl AstNode for SuffixSlice {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_SLICE
+		kind == SUFFIX_SLICE
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1153,9 +1147,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprIndex {
+impl AstNode for SuffixApply {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_INDEX
+		kind == SUFFIX_APPLY
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1168,9 +1162,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for Name {
+impl AstNode for ArgsDesc {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == NAME
+		kind == ARGS_DESC
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1183,9 +1177,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprIndexExpr {
+impl AstNode for StmtLocal {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_INDEX_EXPR
+		kind == STMT_LOCAL
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1198,9 +1192,39 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprApply {
+impl AstNode for StmtAssert {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		kind == STMT_ASSERT
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		if Self::can_cast(syntax.kind()) {
+			Some(Self { syntax })
+		} else {
+			None
+		}
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		&self.syntax
+	}
+}
+impl AstNode for Assertion {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		kind == ASSERTION
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		if Self::can_cast(syntax.kind()) {
+			Some(Self { syntax })
+		} else {
+			None
+		}
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		&self.syntax
+	}
+}
+impl AstNode for ExprBinary {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_APPLY
+		kind == EXPR_BINARY
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1213,9 +1237,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ArgsDesc {
+impl AstNode for ExprUnary {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == ARGS_DESC
+		kind == EXPR_UNARY
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1441,21 +1465,6 @@
 impl AstNode for ParamsDesc {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		kind == PARAMS_DESC
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		if Self::can_cast(syntax.kind()) {
-			Some(Self { syntax })
-		} else {
-			None
-		}
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		&self.syntax
-	}
-}
-impl AstNode for ExprAssert {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_ASSERT
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1468,21 +1477,6 @@
 		&self.syntax
 	}
 }
-impl AstNode for Assertion {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == ASSERTION
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		if Self::can_cast(syntax.kind()) {
-			Some(Self { syntax })
-		} else {
-			None
-		}
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		&self.syntax
-	}
-}
 impl AstNode for ExprError {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		kind == EXPR_ERROR
@@ -1498,21 +1492,6 @@
 		&self.syntax
 	}
 }
-impl AstNode for StmtLocal {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == STMT_LOCAL
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		if Self::can_cast(syntax.kind()) {
-			Some(Self { syntax })
-		} else {
-			None
-		}
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		&self.syntax
-	}
-}
 impl AstNode for SliceDescEnd {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		kind == SLICE_DESC_END
@@ -1873,6 +1852,116 @@
 		&self.syntax
 	}
 }
+impl From<SuffixIndex> for Suffix {
+	fn from(node: SuffixIndex) -> Suffix {
+		Suffix::SuffixIndex(node)
+	}
+}
+impl From<SuffixIndexExpr> for Suffix {
+	fn from(node: SuffixIndexExpr) -> Suffix {
+		Suffix::SuffixIndexExpr(node)
+	}
+}
+impl From<SuffixSlice> for Suffix {
+	fn from(node: SuffixSlice) -> Suffix {
+		Suffix::SuffixSlice(node)
+	}
+}
+impl From<SuffixApply> for Suffix {
+	fn from(node: SuffixApply) -> Suffix {
+		Suffix::SuffixApply(node)
+	}
+}
+impl AstNode for Suffix {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		match kind {
+			SUFFIX_INDEX | SUFFIX_INDEX_EXPR | SUFFIX_SLICE | SUFFIX_APPLY => true,
+			_ => false,
+		}
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		let res = match syntax.kind() {
+			SUFFIX_INDEX => Suffix::SuffixIndex(SuffixIndex { syntax }),
+			SUFFIX_INDEX_EXPR => Suffix::SuffixIndexExpr(SuffixIndexExpr { syntax }),
+			SUFFIX_SLICE => Suffix::SuffixSlice(SuffixSlice { syntax }),
+			SUFFIX_APPLY => Suffix::SuffixApply(SuffixApply { syntax }),
+			_ => return None,
+		};
+		Some(res)
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		match self {
+			Suffix::SuffixIndex(it) => &it.syntax,
+			Suffix::SuffixIndexExpr(it) => &it.syntax,
+			Suffix::SuffixSlice(it) => &it.syntax,
+			Suffix::SuffixApply(it) => &it.syntax,
+		}
+	}
+}
+impl From<BindDestruct> for Bind {
+	fn from(node: BindDestruct) -> Bind {
+		Bind::BindDestruct(node)
+	}
+}
+impl From<BindFunction> for Bind {
+	fn from(node: BindFunction) -> Bind {
+		Bind::BindFunction(node)
+	}
+}
+impl AstNode for Bind {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		match kind {
+			BIND_DESTRUCT | BIND_FUNCTION => true,
+			_ => false,
+		}
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		let res = match syntax.kind() {
+			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),
+			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),
+			_ => return None,
+		};
+		Some(res)
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		match self {
+			Bind::BindDestruct(it) => &it.syntax,
+			Bind::BindFunction(it) => &it.syntax,
+		}
+	}
+}
+impl From<StmtLocal> for Stmt {
+	fn from(node: StmtLocal) -> Stmt {
+		Stmt::StmtLocal(node)
+	}
+}
+impl From<StmtAssert> for Stmt {
+	fn from(node: StmtAssert) -> Stmt {
+		Stmt::StmtAssert(node)
+	}
+}
+impl AstNode for Stmt {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		match kind {
+			STMT_LOCAL | STMT_ASSERT => true,
+			_ => false,
+		}
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		let res = match syntax.kind() {
+			STMT_LOCAL => Stmt::StmtLocal(StmtLocal { syntax }),
+			STMT_ASSERT => Stmt::StmtAssert(StmtAssert { syntax }),
+			_ => return None,
+		};
+		Some(res)
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		match self {
+			Stmt::StmtLocal(it) => &it.syntax,
+			Stmt::StmtAssert(it) => &it.syntax,
+		}
+	}
+}
 impl From<ObjBodyComp> for ObjBody {
 	fn from(node: ObjBodyComp) -> ObjBody {
 		ObjBody::ObjBodyComp(node)
@@ -1935,40 +2024,8 @@
 			CompSpec::ForSpec(it) => &it.syntax,
 			CompSpec::IfSpec(it) => &it.syntax,
 		}
-	}
-}
-impl From<BindDestruct> for Bind {
-	fn from(node: BindDestruct) -> Bind {
-		Bind::BindDestruct(node)
-	}
-}
-impl From<BindFunction> for Bind {
-	fn from(node: BindFunction) -> Bind {
-		Bind::BindFunction(node)
 	}
 }
-impl AstNode for Bind {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		match kind {
-			BIND_DESTRUCT | BIND_FUNCTION => true,
-			_ => false,
-		}
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		let res = match syntax.kind() {
-			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),
-			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),
-			_ => return None,
-		};
-		Some(res)
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		match self {
-			Bind::BindDestruct(it) => &it.syntax,
-			Bind::BindFunction(it) => &it.syntax,
-		}
-	}
-}
 impl From<ExprBinary> for ExprBase {
 	fn from(node: ExprBinary) -> ExprBase {
 		ExprBase::ExprBinary(node)
@@ -1977,28 +2034,8 @@
 impl From<ExprUnary> for ExprBase {
 	fn from(node: ExprUnary) -> ExprBase {
 		ExprBase::ExprUnary(node)
-	}
-}
-impl From<ExprSlice> for ExprBase {
-	fn from(node: ExprSlice) -> ExprBase {
-		ExprBase::ExprSlice(node)
 	}
 }
-impl From<ExprIndex> for ExprBase {
-	fn from(node: ExprIndex) -> ExprBase {
-		ExprBase::ExprIndex(node)
-	}
-}
-impl From<ExprIndexExpr> for ExprBase {
-	fn from(node: ExprIndexExpr) -> ExprBase {
-		ExprBase::ExprIndexExpr(node)
-	}
-}
-impl From<ExprApply> for ExprBase {
-	fn from(node: ExprApply) -> ExprBase {
-		ExprBase::ExprApply(node)
-	}
-}
 impl From<ExprObjExtend> for ExprBase {
 	fn from(node: ExprObjExtend) -> ExprBase {
 		ExprBase::ExprObjExtend(node)
@@ -2057,11 +2094,6 @@
 impl From<ExprFunction> for ExprBase {
 	fn from(node: ExprFunction) -> ExprBase {
 		ExprBase::ExprFunction(node)
-	}
-}
-impl From<ExprAssert> for ExprBase {
-	fn from(node: ExprAssert) -> ExprBase {
-		ExprBase::ExprAssert(node)
 	}
 }
 impl From<ExprError> for ExprBase {
@@ -2072,10 +2104,9 @@
 impl AstNode for ExprBase {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		match kind {
-			EXPR_BINARY | EXPR_UNARY | EXPR_SLICE | EXPR_INDEX | EXPR_INDEX_EXPR | EXPR_APPLY
-			| EXPR_OBJ_EXTEND | EXPR_PARENED | EXPR_STRING | EXPR_NUMBER | EXPR_LITERAL
-			| EXPR_ARRAY | EXPR_OBJECT | EXPR_ARRAY_COMP | EXPR_IMPORT | EXPR_VAR
-			| EXPR_IF_THEN_ELSE | EXPR_FUNCTION | EXPR_ASSERT | EXPR_ERROR => true,
+			EXPR_BINARY | EXPR_UNARY | EXPR_OBJ_EXTEND | EXPR_PARENED | EXPR_STRING
+			| EXPR_NUMBER | EXPR_LITERAL | EXPR_ARRAY | EXPR_OBJECT | EXPR_ARRAY_COMP
+			| EXPR_IMPORT | EXPR_VAR | EXPR_IF_THEN_ELSE | EXPR_FUNCTION | EXPR_ERROR => true,
 			_ => false,
 		}
 	}
@@ -2083,10 +2114,6 @@
 		let res = match syntax.kind() {
 			EXPR_BINARY => ExprBase::ExprBinary(ExprBinary { syntax }),
 			EXPR_UNARY => ExprBase::ExprUnary(ExprUnary { syntax }),
-			EXPR_SLICE => ExprBase::ExprSlice(ExprSlice { syntax }),
-			EXPR_INDEX => ExprBase::ExprIndex(ExprIndex { syntax }),
-			EXPR_INDEX_EXPR => ExprBase::ExprIndexExpr(ExprIndexExpr { syntax }),
-			EXPR_APPLY => ExprBase::ExprApply(ExprApply { syntax }),
 			EXPR_OBJ_EXTEND => ExprBase::ExprObjExtend(ExprObjExtend { syntax }),
 			EXPR_PARENED => ExprBase::ExprParened(ExprParened { syntax }),
 			EXPR_STRING => ExprBase::ExprString(ExprString { syntax }),
@@ -2099,7 +2126,6 @@
 			EXPR_VAR => ExprBase::ExprVar(ExprVar { syntax }),
 			EXPR_IF_THEN_ELSE => ExprBase::ExprIfThenElse(ExprIfThenElse { syntax }),
 			EXPR_FUNCTION => ExprBase::ExprFunction(ExprFunction { syntax }),
-			EXPR_ASSERT => ExprBase::ExprAssert(ExprAssert { syntax }),
 			EXPR_ERROR => ExprBase::ExprError(ExprError { syntax }),
 			_ => return None,
 		};
@@ -2109,10 +2135,6 @@
 		match self {
 			ExprBase::ExprBinary(it) => &it.syntax,
 			ExprBase::ExprUnary(it) => &it.syntax,
-			ExprBase::ExprSlice(it) => &it.syntax,
-			ExprBase::ExprIndex(it) => &it.syntax,
-			ExprBase::ExprIndexExpr(it) => &it.syntax,
-			ExprBase::ExprApply(it) => &it.syntax,
 			ExprBase::ExprObjExtend(it) => &it.syntax,
 			ExprBase::ExprParened(it) => &it.syntax,
 			ExprBase::ExprString(it) => &it.syntax,
@@ -2125,7 +2147,6 @@
 			ExprBase::ExprVar(it) => &it.syntax,
 			ExprBase::ExprIfThenElse(it) => &it.syntax,
 			ExprBase::ExprFunction(it) => &it.syntax,
-			ExprBase::ExprAssert(it) => &it.syntax,
 			ExprBase::ExprError(it) => &it.syntax,
 		}
 	}
@@ -2344,14 +2365,16 @@
 impl BinaryOperatorKind {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		match kind {
-			OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | IN_KW | LHS
-			| RHS | PLUS | MINUS | MUL | DIV | MODULO | META_OBJECT_APPLY | ERROR_NO_OPERATOR => true,
+			OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE
+			| IN_KW | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | META_OBJECT_APPLY
+			| ERROR_NO_OPERATOR => true,
 			_ => false,
 		}
 	}
 	pub fn cast(kind: SyntaxKind) -> Option<Self> {
 		let res = match kind {
 			OR => Self::Or,
+			NULL_COAELSE => Self::NullCoaelse,
 			AND => Self::And,
 			BIT_OR => Self::BitOr,
 			BIT_XOR => Self::BitXor,
@@ -2742,21 +2765,31 @@
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ObjBody {
+impl std::fmt::Display for Suffix {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
+impl std::fmt::Display for Bind {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for CompSpec {
+impl std::fmt::Display for Stmt {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for Bind {
+impl std::fmt::Display for ObjBody {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
+impl std::fmt::Display for CompSpec {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
 impl std::fmt::Display for ExprBase {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
@@ -2797,22 +2830,22 @@
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprBinary {
+impl std::fmt::Display for SuffixIndex {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for LhsExpr {
+impl std::fmt::Display for Name {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprUnary {
+impl std::fmt::Display for SuffixIndexExpr {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprSlice {
+impl std::fmt::Display for SuffixSlice {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
@@ -2822,31 +2855,41 @@
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprIndex {
+impl std::fmt::Display for SuffixApply {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for Name {
+impl std::fmt::Display for ArgsDesc {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprIndexExpr {
+impl std::fmt::Display for StmtLocal {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprApply {
+impl std::fmt::Display for StmtAssert {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ArgsDesc {
+impl std::fmt::Display for Assertion {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
+impl std::fmt::Display for ExprBinary {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
+impl std::fmt::Display for ExprUnary {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
 impl std::fmt::Display for ExprObjExtend {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
@@ -2918,26 +2961,11 @@
 	}
 }
 impl std::fmt::Display for ParamsDesc {
-	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-		std::fmt::Display::fmt(self.syntax(), f)
-	}
-}
-impl std::fmt::Display for ExprAssert {
-	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-		std::fmt::Display::fmt(self.syntax(), f)
-	}
-}
-impl std::fmt::Display for Assertion {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
 impl std::fmt::Display for ExprError {
-	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-		std::fmt::Display::fmt(self.syntax(), f)
-	}
-}
-impl std::fmt::Display for StmtLocal {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
modifiedcrates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
@@ -19,6 +19,8 @@
 	EOF,
 	#[token("||")]
 	OR,
+	#[token("??")]
+	NULL_COAELSE,
 	#[token("&&")]
 	AND,
 	#[token("|")]
@@ -137,6 +139,8 @@
 	ERROR_COMMENT_UNTERMINATED,
 	#[token("tailstrict")]
 	TAILSTRICT_KW,
+	#[token("local")]
+	LOCAL_KW,
 	#[token("importstr")]
 	IMPORTSTR_KW,
 	#[token("importbin")]
@@ -153,8 +157,6 @@
 	FUNCTION_KW,
 	#[token("error")]
 	ERROR_KW,
-	#[token("local")]
-	LOCAL_KW,
 	#[token("in")]
 	IN_KW,
 	META_OBJECT_APPLY,
@@ -181,16 +183,18 @@
 	LEXING_ERROR,
 	SOURCE_FILE,
 	EXPR,
-	EXPR_BINARY,
-	LHS_EXPR,
-	EXPR_UNARY,
-	EXPR_SLICE,
-	SLICE_DESC,
-	EXPR_INDEX,
+	SUFFIX_INDEX,
 	NAME,
-	EXPR_INDEX_EXPR,
-	EXPR_APPLY,
+	SUFFIX_INDEX_EXPR,
+	SUFFIX_SLICE,
+	SLICE_DESC,
+	SUFFIX_APPLY,
 	ARGS_DESC,
+	STMT_LOCAL,
+	STMT_ASSERT,
+	ASSERTION,
+	EXPR_BINARY,
+	EXPR_UNARY,
 	EXPR_OBJ_EXTEND,
 	EXPR_PARENED,
 	EXPR_LITERAL,
@@ -206,10 +210,7 @@
 	FALSE_EXPR,
 	EXPR_FUNCTION,
 	PARAMS_DESC,
-	EXPR_ASSERT,
-	ASSERTION,
 	EXPR_ERROR,
-	STMT_LOCAL,
 	SLICE_DESC_END,
 	SLICE_DESC_STEP,
 	ARG,
@@ -234,9 +235,11 @@
 	DESTRUCT_OBJECT_FIELD,
 	DESTRUCT_REST,
 	DESTRUCT_ARRAY_ELEMENT,
+	SUFFIX,
+	BIND,
+	STMT,
 	OBJ_BODY,
 	COMP_SPEC,
-	BIND,
 	EXPR_BASE,
 	MEMBER_COMP,
 	MEMBER,
@@ -259,21 +262,21 @@
 impl SyntaxKind {
 	pub fn is_keyword(self) -> bool {
 		match self {
-			OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | LHS | RHS
-			| PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK | L_PAREN
-			| R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON | SEMI | DOT
-			| DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW
-			| IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW | FUNCTION_KW
-			| ERROR_KW | LOCAL_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | SUPER_KW
-			| FOR_KW | ASSERT_KW => true,
+			OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE
+			| LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK
+			| L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON
+			| SEMI | DOT | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW
+			| LOCAL_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW
+			| FUNCTION_KW | ERROR_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW
+			| SUPER_KW | FOR_KW | ASSERT_KW => true,
 			_ => false,
 		}
 	}
 	pub fn is_enum(self) -> bool {
 		match self {
-			OBJ_BODY | COMP_SPEC | BIND | EXPR_BASE | MEMBER_COMP | MEMBER | FIELD_NAME
-			| DESTRUCT | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR | LITERAL
-			| TEXT | NUMBER | IMPORT_KIND | VISIBILITY | TRIVIA | CUSTOM_ERROR => true,
+			SUFFIX | BIND | STMT | OBJ_BODY | COMP_SPEC | EXPR_BASE | MEMBER_COMP | MEMBER
+			| FIELD_NAME | DESTRUCT | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR
+			| LITERAL | TEXT | NUMBER | IMPORT_KIND | VISIBILITY | TRIVIA | CUSTOM_ERROR => true,
 			_ => false,
 		}
 	}
@@ -286,5 +289,5 @@
 	}
 }
 #[macro_export]
-macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } }
+macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } }
 pub use T;
modifiedcrates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/lib.rs
+++ b/crates/jrsonnet-rowan-parser/src/lib.rs
@@ -23,6 +23,11 @@
 pub use language::*;
 pub use token_set::SyntaxKindSet;
 
+use self::{
+	ast::support,
+	generated::nodes::{Expr, ExprBinary, ExprObjExtend},
+};
+
 pub fn parse(input: &str) -> (SourceFile, Vec<LocatedSyntaxError>) {
 	let lexemes = lex(input);
 	let kinds = lexemes
@@ -42,3 +47,25 @@
 		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())
+	}
+	pub fn rhs_work(&self) -> Option<Expr> {
+		let mut children = support::children(self.syntax());
+		// skip lhs
+		children.next()?;
+		children.next()
+	}
+}
modifiedcrates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -293,30 +293,38 @@
 }
 
 fn expr(p: &mut Parser) -> CompletedMarker {
-	while p.at(T![local]) {
+	let m = p.start();
+	while p.at(T![local]) || p.at(T![assert]) {
 		let m = p.start();
 
-		p.bump();
-		loop {
-			if p.at(T![;]) {
-				p.bump();
+		if p.at(T![local]) {
+			p.bump();
+			loop {
+				if p.at(T![;]) {
+					p.bump();
+					break;
+				}
+				bind(p);
+
+				if p.at(T![,]) {
+					p.bump();
+					continue;
+				}
+				p.expect(T![;]);
 				break;
 			}
-			bind(p);
-
-			if p.at(T![,]) {
-				p.bump();
-				continue;
-			}
+			m.complete(p, STMT_LOCAL);
+		} else {
+			assertion(p);
 			p.expect(T![;]);
-			break;
+			m.complete(p, STMT_ASSERT);
 		}
-		m.complete(p, STMT_LOCAL);
 	}
 	match expr_binding_power(p, 0) {
 		Ok(m) => m,
 		Err(m) => m,
-	}
+	};
+	m.complete(p, EXPR)
 }
 fn expr_binding_power(
 	p: &mut Parser,
@@ -337,8 +345,10 @@
 			p.bump();
 		}
 
-		let m = lhs.wrap(p, LHS_EXPR).precede(p);
-		let parsed_rhs = expr_binding_power(p, right_binding_power).is_ok();
+		let m = lhs.wrap(p, EXPR).precede(p);
+		let parsed_rhs = expr_binding_power(p, right_binding_power)
+			.map(|v| v.precede(p).complete(p, EXPR))
+			.is_ok();
 		lhs = m.complete(
 			p,
 			if op == BinaryOperatorKind::MetaObjectApply {
@@ -361,7 +371,7 @@
 	if p.at(T![for]) {
 		let m = p.start();
 		p.bump();
-		name(p);
+		destruct(p);
 		p.expect(T![in]);
 		expr(p);
 		m.complete(p, FOR_SPEC)
@@ -420,7 +430,7 @@
 fn assertion(p: &mut Parser) {
 	let m = p.start();
 	p.bump_assert(T![assert]);
-	expr(p).wrap(p, LHS_EXPR);
+	expr(p);
 	if p.at(T![:]) {
 		p.bump();
 		expr(p);
@@ -504,7 +514,7 @@
 		for errored in compspecs {
 			errored.wrap_error(
 				p,
-				"compspec may only be used if there is only one array element",
+				"compspec may only be used if there is only one object element",
 			);
 		}
 		m.complete(p, OBJ_BODY_MEMBER_LIST);
@@ -612,8 +622,8 @@
 			p.expect(T![']']);
 			break;
 		}
-		elems += 1;
 		expr(p);
+		elems += 1;
 		while p.at_ts(COMPSPEC) {
 			compspecs.push(compspec(p));
 		}
@@ -679,32 +689,47 @@
 	true
 }
 
-fn lhs(p: &mut Parser) -> Result<CompletedMarker, CompletedMarker> {
-	let mut lhs = lhs_basic(p)?;
-
+fn suffix(p: &mut Parser) {
 	loop {
-		if p.at(T![.]) {
-			let m = lhs.precede(p);
+		let start = p.start();
+		let _marker: CompletedMarker = if p.at(T![?]) {
 			p.bump();
+			p.expect(T![.]);
+			if p.at(IDENT) {
+				name(p);
+				start.complete(p, SUFFIX_INDEX)
+			} else if p.at(T!['[']) {
+				p.bump();
+				expr(p);
+				p.expect(T![']']);
+				start.complete(p, SUFFIX_INDEX_EXPR)
+			} else {
+				start.complete_missing(p, ExpectedSyntax::Named("index"))
+			}
+		} else if p.at(T![.]) {
+			p.bump();
 			name(p);
-			lhs = m.complete(p, EXPR_INDEX);
+			start.complete(p, SUFFIX_INDEX)
 		} else if p.at(T!['[']) {
 			if slice_desc_or_index(p) {
-				lhs = lhs.precede(p).complete(p, EXPR_SLICE);
+				start.complete(p, SUFFIX_SLICE)
 			} else {
-				lhs = lhs
-					.wrap(p, LHS_EXPR)
-					.precede(p)
-					.complete(p, EXPR_INDEX_EXPR);
+				start.complete(p, SUFFIX_INDEX_EXPR)
 			}
 		} else if p.at(T!['(']) {
-			let m = lhs.precede(p);
 			args_desc(p);
-			lhs = m.complete(p, EXPR_APPLY);
+			start.complete(p, SUFFIX_APPLY)
 		} else {
+			start.forget(p);
 			break;
-		}
+		};
 	}
+}
+
+fn lhs(p: &mut Parser) -> Result<CompletedMarker, CompletedMarker> {
+	let lhs = lhs_basic(p)?;
+
+	suffix(p);
 
 	Ok(lhs)
 }
@@ -885,12 +910,6 @@
 		p.bump();
 		expr(p);
 		m.complete(p, EXPR_ERROR)
-	} else if p.at(T![assert]) {
-		let m = p.start();
-		assertion(p);
-		p.expect(T![;]);
-		expr(p);
-		m.complete(p, EXPR_ASSERT)
 	} else if p.at(T![import]) || p.at(T![importstr]) || p.at(T![importbin]) {
 		let m = p.start();
 		p.bump();
modifiedcrates/jrsonnet-rowan-parser/src/precedence.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/precedence.rs
+++ b/crates/jrsonnet-rowan-parser/src/precedence.rs
@@ -13,6 +13,7 @@
 			Self::BitXor => (8, 9),
 			Self::BitOr => (6, 7),
 			Self::And => (4, 5),
+			Self::NullCoaelse => (2, 3),
 			Self::Or => (2, 3),
 			Self::ErrorNoOperator => (0, 1),
 		}
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec.snap
@@ -3,32 +3,39 @@
 expression: "[a for a in [1, 2, 3]]\n"
 ---
 SOURCE_FILE@0..23
-  EXPR_ARRAY_COMP@0..22
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    WHITESPACE@2..3 " "
-    FOR_SPEC@3..21
-      FOR_KW@3..6 "for"
-      WHITESPACE@6..7 " "
-      NAME@7..8
-        IDENT@7..8 "a"
-      WHITESPACE@8..9 " "
-      IN_KW@9..11 "in"
-      WHITESPACE@11..12 " "
-      EXPR_ARRAY@12..21
-        L_BRACK@12..13 "["
-        EXPR_NUMBER@13..14
-          FLOAT@13..14 "1"
-        COMMA@14..15 ","
-        WHITESPACE@15..16 " "
-        EXPR_NUMBER@16..17
-          FLOAT@16..17 "2"
-        COMMA@17..18 ","
-        WHITESPACE@18..19 " "
-        EXPR_NUMBER@19..20
-          FLOAT@19..20 "3"
-        R_BRACK@20..21 "]"
-    R_BRACK@21..22 "]"
+  EXPR@0..22
+    EXPR_ARRAY_COMP@0..22
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      WHITESPACE@2..3 " "
+      FOR_SPEC@3..21
+        FOR_KW@3..6 "for"
+        WHITESPACE@6..7 " "
+        DESTRUCT_FULL@7..8
+          NAME@7..8
+            IDENT@7..8 "a"
+        WHITESPACE@8..9 " "
+        IN_KW@9..11 "in"
+        WHITESPACE@11..12 " "
+        EXPR@12..21
+          EXPR_ARRAY@12..21
+            L_BRACK@12..13 "["
+            EXPR@13..14
+              EXPR_NUMBER@13..14
+                FLOAT@13..14 "1"
+            COMMA@14..15 ","
+            WHITESPACE@15..16 " "
+            EXPR@16..17
+              EXPR_NUMBER@16..17
+                FLOAT@16..17 "2"
+            COMMA@17..18 ","
+            WHITESPACE@18..19 " "
+            EXPR@19..20
+              EXPR_NUMBER@19..20
+                FLOAT@19..20 "3"
+            R_BRACK@20..21 "]"
+      R_BRACK@21..22 "]"
   WHITESPACE@22..23 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_comma.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_comma.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_comma.snap
@@ -3,33 +3,40 @@
 expression: "[a, for a in [1, 2, 3]]\n"
 ---
 SOURCE_FILE@0..24
-  EXPR_ARRAY_COMP@0..23
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    COMMA@2..3 ","
-    WHITESPACE@3..4 " "
-    FOR_SPEC@4..22
-      FOR_KW@4..7 "for"
-      WHITESPACE@7..8 " "
-      NAME@8..9
-        IDENT@8..9 "a"
-      WHITESPACE@9..10 " "
-      IN_KW@10..12 "in"
-      WHITESPACE@12..13 " "
-      EXPR_ARRAY@13..22
-        L_BRACK@13..14 "["
-        EXPR_NUMBER@14..15
-          FLOAT@14..15 "1"
-        COMMA@15..16 ","
-        WHITESPACE@16..17 " "
-        EXPR_NUMBER@17..18
-          FLOAT@17..18 "2"
-        COMMA@18..19 ","
-        WHITESPACE@19..20 " "
-        EXPR_NUMBER@20..21
-          FLOAT@20..21 "3"
-        R_BRACK@21..22 "]"
-    R_BRACK@22..23 "]"
+  EXPR@0..23
+    EXPR_ARRAY_COMP@0..23
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      COMMA@2..3 ","
+      WHITESPACE@3..4 " "
+      FOR_SPEC@4..22
+        FOR_KW@4..7 "for"
+        WHITESPACE@7..8 " "
+        DESTRUCT_FULL@8..9
+          NAME@8..9
+            IDENT@8..9 "a"
+        WHITESPACE@9..10 " "
+        IN_KW@10..12 "in"
+        WHITESPACE@12..13 " "
+        EXPR@13..22
+          EXPR_ARRAY@13..22
+            L_BRACK@13..14 "["
+            EXPR@14..15
+              EXPR_NUMBER@14..15
+                FLOAT@14..15 "1"
+            COMMA@15..16 ","
+            WHITESPACE@16..17 " "
+            EXPR@17..18
+              EXPR_NUMBER@17..18
+                FLOAT@17..18 "2"
+            COMMA@18..19 ","
+            WHITESPACE@19..20 " "
+            EXPR@20..21
+              EXPR_NUMBER@20..21
+                FLOAT@20..21 "3"
+            R_BRACK@21..22 "]"
+      R_BRACK@22..23 "]"
   WHITESPACE@23..24 "\n"
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
@@ -3,40 +3,48 @@
 expression: "[a for a in [1, 2, 3], b]\n"
 ---
 SOURCE_FILE@0..26
-  EXPR_ARRAY@0..25
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    WHITESPACE@2..3 " "
-    ERROR_CUSTOM@3..21
-      FOR_SPEC@3..21
-        FOR_KW@3..6 "for"
-        WHITESPACE@6..7 " "
-        NAME@7..8
-          IDENT@7..8 "a"
-        WHITESPACE@8..9 " "
-        IN_KW@9..11 "in"
-        WHITESPACE@11..12 " "
-        EXPR_ARRAY@12..21
-          L_BRACK@12..13 "["
-          EXPR_NUMBER@13..14
-            FLOAT@13..14 "1"
-          COMMA@14..15 ","
-          WHITESPACE@15..16 " "
-          EXPR_NUMBER@16..17
-            FLOAT@16..17 "2"
-          COMMA@17..18 ","
-          WHITESPACE@18..19 " "
-          EXPR_NUMBER@19..20
-            FLOAT@19..20 "3"
-          R_BRACK@20..21 "]"
-    COMMA@21..22 ","
-    WHITESPACE@22..23 " "
-    EXPR_VAR@23..24
-      NAME@23..24
-        IDENT@23..24 "b"
-    R_BRACK@24..25 "]"
+  EXPR@0..25
+    EXPR_ARRAY@0..25
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      WHITESPACE@2..3 " "
+      ERROR_CUSTOM@3..21
+        FOR_SPEC@3..21
+          FOR_KW@3..6 "for"
+          WHITESPACE@6..7 " "
+          DESTRUCT_FULL@7..8
+            NAME@7..8
+              IDENT@7..8 "a"
+          WHITESPACE@8..9 " "
+          IN_KW@9..11 "in"
+          WHITESPACE@11..12 " "
+          EXPR@12..21
+            EXPR_ARRAY@12..21
+              L_BRACK@12..13 "["
+              EXPR@13..14
+                EXPR_NUMBER@13..14
+                  FLOAT@13..14 "1"
+              COMMA@14..15 ","
+              WHITESPACE@15..16 " "
+              EXPR@16..17
+                EXPR_NUMBER@16..17
+                  FLOAT@16..17 "2"
+              COMMA@17..18 ","
+              WHITESPACE@18..19 " "
+              EXPR@19..20
+                EXPR_NUMBER@19..20
+                  FLOAT@19..20 "3"
+              R_BRACK@20..21 "]"
+      COMMA@21..22 ","
+      WHITESPACE@22..23 " "
+      EXPR@23..24
+        EXPR_VAR@23..24
+          NAME@23..24
+            IDENT@23..24 "b"
+      R_BRACK@24..25 "]"
   WHITESPACE@25..26 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 3..21 }
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
@@ -3,46 +3,55 @@
 expression: "[a, b, for a in [1, 2, 3], c]\n"
 ---
 SOURCE_FILE@0..30
-  EXPR_ARRAY@0..29
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    COMMA@2..3 ","
-    WHITESPACE@3..4 " "
-    EXPR_VAR@4..5
-      NAME@4..5
-        IDENT@4..5 "b"
-    COMMA@5..6 ","
-    WHITESPACE@6..7 " "
-    ERROR_CUSTOM@7..25
-      FOR_SPEC@7..25
-        FOR_KW@7..10 "for"
-        WHITESPACE@10..11 " "
-        NAME@11..12
-          IDENT@11..12 "a"
-        WHITESPACE@12..13 " "
-        IN_KW@13..15 "in"
-        WHITESPACE@15..16 " "
-        EXPR_ARRAY@16..25
-          L_BRACK@16..17 "["
-          EXPR_NUMBER@17..18
-            FLOAT@17..18 "1"
-          COMMA@18..19 ","
-          WHITESPACE@19..20 " "
-          EXPR_NUMBER@20..21
-            FLOAT@20..21 "2"
-          COMMA@21..22 ","
-          WHITESPACE@22..23 " "
-          EXPR_NUMBER@23..24
-            FLOAT@23..24 "3"
-          R_BRACK@24..25 "]"
-    COMMA@25..26 ","
-    WHITESPACE@26..27 " "
-    EXPR_VAR@27..28
-      NAME@27..28
-        IDENT@27..28 "c"
-    R_BRACK@28..29 "]"
+  EXPR@0..29
+    EXPR_ARRAY@0..29
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      COMMA@2..3 ","
+      WHITESPACE@3..4 " "
+      EXPR@4..5
+        EXPR_VAR@4..5
+          NAME@4..5
+            IDENT@4..5 "b"
+      COMMA@5..6 ","
+      WHITESPACE@6..7 " "
+      ERROR_CUSTOM@7..25
+        FOR_SPEC@7..25
+          FOR_KW@7..10 "for"
+          WHITESPACE@10..11 " "
+          DESTRUCT_FULL@11..12
+            NAME@11..12
+              IDENT@11..12 "a"
+          WHITESPACE@12..13 " "
+          IN_KW@13..15 "in"
+          WHITESPACE@15..16 " "
+          EXPR@16..25
+            EXPR_ARRAY@16..25
+              L_BRACK@16..17 "["
+              EXPR@17..18
+                EXPR_NUMBER@17..18
+                  FLOAT@17..18 "1"
+              COMMA@18..19 ","
+              WHITESPACE@19..20 " "
+              EXPR@20..21
+                EXPR_NUMBER@20..21
+                  FLOAT@20..21 "2"
+              COMMA@21..22 ","
+              WHITESPACE@22..23 " "
+              EXPR@23..24
+                EXPR_NUMBER@23..24
+                  FLOAT@23..24 "3"
+              R_BRACK@24..25 "]"
+      COMMA@25..26 ","
+      WHITESPACE@26..27 " "
+      EXPR@27..28
+        EXPR_VAR@27..28
+          NAME@27..28
+            IDENT@27..28 "c"
+      R_BRACK@28..29 "]"
   WHITESPACE@29..30 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 7..25 }
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
@@ -3,31 +3,38 @@
 expression: "[for a in [1, 2, 3]]\n"
 ---
 SOURCE_FILE@0..21
-  EXPR_ARRAY_COMP@0..20
-    L_BRACK@0..1 "["
-    ERROR_MISSING_TOKEN@1..1
-    FOR_SPEC@1..19
-      FOR_KW@1..4 "for"
-      WHITESPACE@4..5 " "
-      NAME@5..6
-        IDENT@5..6 "a"
-      WHITESPACE@6..7 " "
-      IN_KW@7..9 "in"
-      WHITESPACE@9..10 " "
-      EXPR_ARRAY@10..19
-        L_BRACK@10..11 "["
-        EXPR_NUMBER@11..12
-          FLOAT@11..12 "1"
-        COMMA@12..13 ","
-        WHITESPACE@13..14 " "
-        EXPR_NUMBER@14..15
-          FLOAT@14..15 "2"
-        COMMA@15..16 ","
-        WHITESPACE@16..17 " "
-        EXPR_NUMBER@17..18
-          FLOAT@17..18 "3"
-        R_BRACK@18..19 "]"
-    R_BRACK@19..20 "]"
+  EXPR@0..20
+    EXPR_ARRAY_COMP@0..20
+      L_BRACK@0..1 "["
+      EXPR@1..1
+        ERROR_MISSING_TOKEN@1..1
+      FOR_SPEC@1..19
+        FOR_KW@1..4 "for"
+        WHITESPACE@4..5 " "
+        DESTRUCT_FULL@5..6
+          NAME@5..6
+            IDENT@5..6 "a"
+        WHITESPACE@6..7 " "
+        IN_KW@7..9 "in"
+        WHITESPACE@9..10 " "
+        EXPR@10..19
+          EXPR_ARRAY@10..19
+            L_BRACK@10..11 "["
+            EXPR@11..12
+              EXPR_NUMBER@11..12
+                FLOAT@11..12 "1"
+            COMMA@12..13 ","
+            WHITESPACE@13..14 " "
+            EXPR@14..15
+              EXPR_NUMBER@14..15
+                FLOAT@14..15 "2"
+            COMMA@15..16 ","
+            WHITESPACE@16..17 " "
+            EXPR@17..18
+              EXPR_NUMBER@17..18
+                FLOAT@17..18 "3"
+            R_BRACK@18..19 "]"
+      R_BRACK@19..20 "]"
   WHITESPACE@20..21 "\n"
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 1..1 }
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
@@ -3,26 +3,29 @@
 expression: "local intr = $intrinsic(test);\n\nlocal a = 1, b = 2, c = a + b;\n\n[c]\n"
 ---
 SOURCE_FILE@0..68
-  STMT_LOCAL@0..23
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..14
-      DESTRUCT_FULL@6..10
-        NAME@6..10
-          IDENT@6..10 "intr"
-      WHITESPACE@10..11 " "
-      ASSIGN@11..12 "="
-      WHITESPACE@12..13 " "
-      EXPR_LITERAL@13..14
-        DOLLAR@13..14 "$"
-    ERROR_UNEXPECTED_TOKEN@14..23
-      IDENT@14..23 "intrinsic"
-  EXPR_PARENED@23..29
-    L_PAREN@23..24 "("
-    EXPR_VAR@24..28
-      NAME@24..28
-        IDENT@24..28 "test"
-    R_PAREN@28..29 ")"
+  EXPR@0..29
+    STMT_LOCAL@0..23
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..14
+        DESTRUCT_FULL@6..10
+          NAME@6..10
+            IDENT@6..10 "intr"
+        WHITESPACE@10..11 " "
+        ASSIGN@11..12 "="
+        WHITESPACE@12..13 " "
+        EXPR@13..14
+          EXPR_LITERAL@13..14
+            DOLLAR@13..14 "$"
+      ERROR_UNEXPECTED_TOKEN@14..23
+        IDENT@14..23 "intrinsic"
+    EXPR_PARENED@23..29
+      L_PAREN@23..24 "("
+      EXPR@24..28
+        EXPR_VAR@24..28
+          NAME@24..28
+            IDENT@24..28 "test"
+      R_PAREN@28..29 ")"
   ERROR_CUSTOM@29..67
     SEMI@29..30 ";"
     WHITESPACE@30..32 "\n\n"
@@ -58,14 +61,14 @@
     R_BRACK@66..67 "]"
   WHITESPACE@67..68 "\n"
 ===
-LocatedSyntaxError { error: Unexpected { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA])), found: IDENT }, range: 14..23 }
+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:1]
  1 | ,-> local intr = $intrinsic(test);
    : ||              ^^^^|^^^^
-   : ||                  `-- expected L_BRACK, L_PAREN, L_BRACE, SEMI, DOT or COMMA, found IDENT
+   : ||                  `-- 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 | |
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__destruct.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__destruct.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__destruct.snap
@@ -3,252 +3,263 @@
 expression: "local [a, b, c] = arr;\nlocal [a, ...] = arr_rest;\nlocal [..., a] = rest_arr;\nlocal [...] = rest_in_arr;\nlocal [a, ...n] = arr_rest_n;\nlocal [...n, a] = rest_arr_n;\nlocal [...n] = rest_in_arr_n;\n\nlocal {a, b, c} = obj;\nlocal {a, b, c, ...} = obj_rest;\nlocal {a, b, c, ...n} = obj_rest_n;\n\nnull\n"
 ---
 SOURCE_FILE@0..293
-  STMT_LOCAL@0..22
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..21
-      DESTRUCT_ARRAY@6..15
-        L_BRACK@6..7 "["
-        DESTRUCT_FULL@7..8
-          NAME@7..8
-            IDENT@7..8 "a"
-        COMMA@8..9 ","
-        WHITESPACE@9..10 " "
-        DESTRUCT_FULL@10..11
-          NAME@10..11
-            IDENT@10..11 "b"
-        COMMA@11..12 ","
-        WHITESPACE@12..13 " "
-        DESTRUCT_FULL@13..14
-          NAME@13..14
-            IDENT@13..14 "c"
-        R_BRACK@14..15 "]"
-      WHITESPACE@15..16 " "
-      ASSIGN@16..17 "="
-      WHITESPACE@17..18 " "
-      EXPR_VAR@18..21
-        NAME@18..21
-          IDENT@18..21 "arr"
-    SEMI@21..22 ";"
-  WHITESPACE@22..23 "\n"
-  STMT_LOCAL@23..49
-    LOCAL_KW@23..28 "local"
-    WHITESPACE@28..29 " "
-    BIND_DESTRUCT@29..48
-      DESTRUCT_ARRAY@29..37
-        L_BRACK@29..30 "["
-        DESTRUCT_FULL@30..31
-          NAME@30..31
-            IDENT@30..31 "a"
-        COMMA@31..32 ","
-        WHITESPACE@32..33 " "
-        DESTRUCT_REST@33..36
-          DOTDOTDOT@33..36 "..."
-        R_BRACK@36..37 "]"
-      WHITESPACE@37..38 " "
-      ASSIGN@38..39 "="
-      WHITESPACE@39..40 " "
-      EXPR_VAR@40..48
-        NAME@40..48
-          IDENT@40..48 "arr_rest"
-    SEMI@48..49 ";"
-  WHITESPACE@49..50 "\n"
-  STMT_LOCAL@50..76
-    LOCAL_KW@50..55 "local"
-    WHITESPACE@55..56 " "
-    BIND_DESTRUCT@56..75
-      DESTRUCT_ARRAY@56..64
-        L_BRACK@56..57 "["
-        DESTRUCT_REST@57..60
-          DOTDOTDOT@57..60 "..."
-        COMMA@60..61 ","
-        WHITESPACE@61..62 " "
-        DESTRUCT_FULL@62..63
-          NAME@62..63
-            IDENT@62..63 "a"
-        R_BRACK@63..64 "]"
-      WHITESPACE@64..65 " "
-      ASSIGN@65..66 "="
-      WHITESPACE@66..67 " "
-      EXPR_VAR@67..75
-        NAME@67..75
-          IDENT@67..75 "rest_arr"
-    SEMI@75..76 ";"
-  WHITESPACE@76..77 "\n"
-  STMT_LOCAL@77..103
-    LOCAL_KW@77..82 "local"
-    WHITESPACE@82..83 " "
-    BIND_DESTRUCT@83..102
-      DESTRUCT_ARRAY@83..88
-        L_BRACK@83..84 "["
-        DESTRUCT_REST@84..87
-          DOTDOTDOT@84..87 "..."
-        R_BRACK@87..88 "]"
-      WHITESPACE@88..89 " "
-      ASSIGN@89..90 "="
-      WHITESPACE@90..91 " "
-      EXPR_VAR@91..102
-        NAME@91..102
-          IDENT@91..102 "rest_in_arr"
-    SEMI@102..103 ";"
-  WHITESPACE@103..104 "\n"
-  STMT_LOCAL@104..133
-    LOCAL_KW@104..109 "local"
-    WHITESPACE@109..110 " "
-    BIND_DESTRUCT@110..132
-      DESTRUCT_ARRAY@110..119
-        L_BRACK@110..111 "["
-        DESTRUCT_FULL@111..112
-          NAME@111..112
-            IDENT@111..112 "a"
-        COMMA@112..113 ","
-        WHITESPACE@113..114 " "
-        DESTRUCT_REST@114..118
-          DOTDOTDOT@114..117 "..."
-          IDENT@117..118 "n"
-        R_BRACK@118..119 "]"
-      WHITESPACE@119..120 " "
-      ASSIGN@120..121 "="
-      WHITESPACE@121..122 " "
-      EXPR_VAR@122..132
-        NAME@122..132
-          IDENT@122..132 "arr_rest_n"
-    SEMI@132..133 ";"
-  WHITESPACE@133..134 "\n"
-  STMT_LOCAL@134..163
-    LOCAL_KW@134..139 "local"
-    WHITESPACE@139..140 " "
-    BIND_DESTRUCT@140..162
-      DESTRUCT_ARRAY@140..149
-        L_BRACK@140..141 "["
-        DESTRUCT_REST@141..145
-          DOTDOTDOT@141..144 "..."
-          IDENT@144..145 "n"
-        COMMA@145..146 ","
-        WHITESPACE@146..147 " "
-        DESTRUCT_FULL@147..148
-          NAME@147..148
-            IDENT@147..148 "a"
-        R_BRACK@148..149 "]"
-      WHITESPACE@149..150 " "
-      ASSIGN@150..151 "="
-      WHITESPACE@151..152 " "
-      EXPR_VAR@152..162
-        NAME@152..162
-          IDENT@152..162 "rest_arr_n"
-    SEMI@162..163 ";"
-  WHITESPACE@163..164 "\n"
-  STMT_LOCAL@164..193
-    LOCAL_KW@164..169 "local"
-    WHITESPACE@169..170 " "
-    BIND_DESTRUCT@170..192
-      DESTRUCT_ARRAY@170..176
-        L_BRACK@170..171 "["
-        DESTRUCT_REST@171..175
-          DOTDOTDOT@171..174 "..."
-          IDENT@174..175 "n"
-        R_BRACK@175..176 "]"
-      WHITESPACE@176..177 " "
-      ASSIGN@177..178 "="
-      WHITESPACE@178..179 " "
-      EXPR_VAR@179..192
-        NAME@179..192
-          IDENT@179..192 "rest_in_arr_n"
-    SEMI@192..193 ";"
-  WHITESPACE@193..195 "\n\n"
-  STMT_LOCAL@195..217
-    LOCAL_KW@195..200 "local"
-    WHITESPACE@200..201 " "
-    BIND_DESTRUCT@201..216
-      DESTRUCT_OBJECT@201..210
-        L_BRACE@201..202 "{"
-        DESTRUCT_OBJECT_FIELD@202..203
-          NAME@202..203
-            IDENT@202..203 "a"
-        COMMA@203..204 ","
-        WHITESPACE@204..205 " "
-        DESTRUCT_OBJECT_FIELD@205..206
-          NAME@205..206
-            IDENT@205..206 "b"
-        COMMA@206..207 ","
-        WHITESPACE@207..208 " "
-        DESTRUCT_OBJECT_FIELD@208..209
-          NAME@208..209
-            IDENT@208..209 "c"
-        R_BRACE@209..210 "}"
-      WHITESPACE@210..211 " "
-      ASSIGN@211..212 "="
-      WHITESPACE@212..213 " "
-      EXPR_VAR@213..216
-        NAME@213..216
-          IDENT@213..216 "obj"
-    SEMI@216..217 ";"
-  WHITESPACE@217..218 "\n"
-  STMT_LOCAL@218..250
-    LOCAL_KW@218..223 "local"
-    WHITESPACE@223..224 " "
-    BIND_DESTRUCT@224..249
-      DESTRUCT_OBJECT@224..238
-        L_BRACE@224..225 "{"
-        DESTRUCT_OBJECT_FIELD@225..226
-          NAME@225..226
-            IDENT@225..226 "a"
-        COMMA@226..227 ","
-        WHITESPACE@227..228 " "
-        DESTRUCT_OBJECT_FIELD@228..229
-          NAME@228..229
-            IDENT@228..229 "b"
-        COMMA@229..230 ","
-        WHITESPACE@230..231 " "
-        DESTRUCT_OBJECT_FIELD@231..232
-          NAME@231..232
-            IDENT@231..232 "c"
-        COMMA@232..233 ","
-        WHITESPACE@233..234 " "
-        DESTRUCT_REST@234..237
-          DOTDOTDOT@234..237 "..."
-        R_BRACE@237..238 "}"
-      WHITESPACE@238..239 " "
-      ASSIGN@239..240 "="
-      WHITESPACE@240..241 " "
-      EXPR_VAR@241..249
-        NAME@241..249
-          IDENT@241..249 "obj_rest"
-    SEMI@249..250 ";"
-  WHITESPACE@250..251 "\n"
-  STMT_LOCAL@251..286
-    LOCAL_KW@251..256 "local"
-    WHITESPACE@256..257 " "
-    BIND_DESTRUCT@257..285
-      DESTRUCT_OBJECT@257..272
-        L_BRACE@257..258 "{"
-        DESTRUCT_OBJECT_FIELD@258..259
-          NAME@258..259
-            IDENT@258..259 "a"
-        COMMA@259..260 ","
-        WHITESPACE@260..261 " "
-        DESTRUCT_OBJECT_FIELD@261..262
-          NAME@261..262
-            IDENT@261..262 "b"
-        COMMA@262..263 ","
-        WHITESPACE@263..264 " "
-        DESTRUCT_OBJECT_FIELD@264..265
-          NAME@264..265
-            IDENT@264..265 "c"
-        COMMA@265..266 ","
-        WHITESPACE@266..267 " "
-        DESTRUCT_REST@267..271
-          DOTDOTDOT@267..270 "..."
-          IDENT@270..271 "n"
-        R_BRACE@271..272 "}"
-      WHITESPACE@272..273 " "
-      ASSIGN@273..274 "="
-      WHITESPACE@274..275 " "
-      EXPR_VAR@275..285
-        NAME@275..285
-          IDENT@275..285 "obj_rest_n"
-    SEMI@285..286 ";"
-  WHITESPACE@286..288 "\n\n"
-  EXPR_LITERAL@288..292
-    NULL_KW@288..292 "null"
+  EXPR@0..292
+    STMT_LOCAL@0..22
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..21
+        DESTRUCT_ARRAY@6..15
+          L_BRACK@6..7 "["
+          DESTRUCT_FULL@7..8
+            NAME@7..8
+              IDENT@7..8 "a"
+          COMMA@8..9 ","
+          WHITESPACE@9..10 " "
+          DESTRUCT_FULL@10..11
+            NAME@10..11
+              IDENT@10..11 "b"
+          COMMA@11..12 ","
+          WHITESPACE@12..13 " "
+          DESTRUCT_FULL@13..14
+            NAME@13..14
+              IDENT@13..14 "c"
+          R_BRACK@14..15 "]"
+        WHITESPACE@15..16 " "
+        ASSIGN@16..17 "="
+        WHITESPACE@17..18 " "
+        EXPR@18..21
+          EXPR_VAR@18..21
+            NAME@18..21
+              IDENT@18..21 "arr"
+      SEMI@21..22 ";"
+    WHITESPACE@22..23 "\n"
+    STMT_LOCAL@23..49
+      LOCAL_KW@23..28 "local"
+      WHITESPACE@28..29 " "
+      BIND_DESTRUCT@29..48
+        DESTRUCT_ARRAY@29..37
+          L_BRACK@29..30 "["
+          DESTRUCT_FULL@30..31
+            NAME@30..31
+              IDENT@30..31 "a"
+          COMMA@31..32 ","
+          WHITESPACE@32..33 " "
+          DESTRUCT_REST@33..36
+            DOTDOTDOT@33..36 "..."
+          R_BRACK@36..37 "]"
+        WHITESPACE@37..38 " "
+        ASSIGN@38..39 "="
+        WHITESPACE@39..40 " "
+        EXPR@40..48
+          EXPR_VAR@40..48
+            NAME@40..48
+              IDENT@40..48 "arr_rest"
+      SEMI@48..49 ";"
+    WHITESPACE@49..50 "\n"
+    STMT_LOCAL@50..76
+      LOCAL_KW@50..55 "local"
+      WHITESPACE@55..56 " "
+      BIND_DESTRUCT@56..75
+        DESTRUCT_ARRAY@56..64
+          L_BRACK@56..57 "["
+          DESTRUCT_REST@57..60
+            DOTDOTDOT@57..60 "..."
+          COMMA@60..61 ","
+          WHITESPACE@61..62 " "
+          DESTRUCT_FULL@62..63
+            NAME@62..63
+              IDENT@62..63 "a"
+          R_BRACK@63..64 "]"
+        WHITESPACE@64..65 " "
+        ASSIGN@65..66 "="
+        WHITESPACE@66..67 " "
+        EXPR@67..75
+          EXPR_VAR@67..75
+            NAME@67..75
+              IDENT@67..75 "rest_arr"
+      SEMI@75..76 ";"
+    WHITESPACE@76..77 "\n"
+    STMT_LOCAL@77..103
+      LOCAL_KW@77..82 "local"
+      WHITESPACE@82..83 " "
+      BIND_DESTRUCT@83..102
+        DESTRUCT_ARRAY@83..88
+          L_BRACK@83..84 "["
+          DESTRUCT_REST@84..87
+            DOTDOTDOT@84..87 "..."
+          R_BRACK@87..88 "]"
+        WHITESPACE@88..89 " "
+        ASSIGN@89..90 "="
+        WHITESPACE@90..91 " "
+        EXPR@91..102
+          EXPR_VAR@91..102
+            NAME@91..102
+              IDENT@91..102 "rest_in_arr"
+      SEMI@102..103 ";"
+    WHITESPACE@103..104 "\n"
+    STMT_LOCAL@104..133
+      LOCAL_KW@104..109 "local"
+      WHITESPACE@109..110 " "
+      BIND_DESTRUCT@110..132
+        DESTRUCT_ARRAY@110..119
+          L_BRACK@110..111 "["
+          DESTRUCT_FULL@111..112
+            NAME@111..112
+              IDENT@111..112 "a"
+          COMMA@112..113 ","
+          WHITESPACE@113..114 " "
+          DESTRUCT_REST@114..118
+            DOTDOTDOT@114..117 "..."
+            IDENT@117..118 "n"
+          R_BRACK@118..119 "]"
+        WHITESPACE@119..120 " "
+        ASSIGN@120..121 "="
+        WHITESPACE@121..122 " "
+        EXPR@122..132
+          EXPR_VAR@122..132
+            NAME@122..132
+              IDENT@122..132 "arr_rest_n"
+      SEMI@132..133 ";"
+    WHITESPACE@133..134 "\n"
+    STMT_LOCAL@134..163
+      LOCAL_KW@134..139 "local"
+      WHITESPACE@139..140 " "
+      BIND_DESTRUCT@140..162
+        DESTRUCT_ARRAY@140..149
+          L_BRACK@140..141 "["
+          DESTRUCT_REST@141..145
+            DOTDOTDOT@141..144 "..."
+            IDENT@144..145 "n"
+          COMMA@145..146 ","
+          WHITESPACE@146..147 " "
+          DESTRUCT_FULL@147..148
+            NAME@147..148
+              IDENT@147..148 "a"
+          R_BRACK@148..149 "]"
+        WHITESPACE@149..150 " "
+        ASSIGN@150..151 "="
+        WHITESPACE@151..152 " "
+        EXPR@152..162
+          EXPR_VAR@152..162
+            NAME@152..162
+              IDENT@152..162 "rest_arr_n"
+      SEMI@162..163 ";"
+    WHITESPACE@163..164 "\n"
+    STMT_LOCAL@164..193
+      LOCAL_KW@164..169 "local"
+      WHITESPACE@169..170 " "
+      BIND_DESTRUCT@170..192
+        DESTRUCT_ARRAY@170..176
+          L_BRACK@170..171 "["
+          DESTRUCT_REST@171..175
+            DOTDOTDOT@171..174 "..."
+            IDENT@174..175 "n"
+          R_BRACK@175..176 "]"
+        WHITESPACE@176..177 " "
+        ASSIGN@177..178 "="
+        WHITESPACE@178..179 " "
+        EXPR@179..192
+          EXPR_VAR@179..192
+            NAME@179..192
+              IDENT@179..192 "rest_in_arr_n"
+      SEMI@192..193 ";"
+    WHITESPACE@193..195 "\n\n"
+    STMT_LOCAL@195..217
+      LOCAL_KW@195..200 "local"
+      WHITESPACE@200..201 " "
+      BIND_DESTRUCT@201..216
+        DESTRUCT_OBJECT@201..210
+          L_BRACE@201..202 "{"
+          DESTRUCT_OBJECT_FIELD@202..203
+            NAME@202..203
+              IDENT@202..203 "a"
+          COMMA@203..204 ","
+          WHITESPACE@204..205 " "
+          DESTRUCT_OBJECT_FIELD@205..206
+            NAME@205..206
+              IDENT@205..206 "b"
+          COMMA@206..207 ","
+          WHITESPACE@207..208 " "
+          DESTRUCT_OBJECT_FIELD@208..209
+            NAME@208..209
+              IDENT@208..209 "c"
+          R_BRACE@209..210 "}"
+        WHITESPACE@210..211 " "
+        ASSIGN@211..212 "="
+        WHITESPACE@212..213 " "
+        EXPR@213..216
+          EXPR_VAR@213..216
+            NAME@213..216
+              IDENT@213..216 "obj"
+      SEMI@216..217 ";"
+    WHITESPACE@217..218 "\n"
+    STMT_LOCAL@218..250
+      LOCAL_KW@218..223 "local"
+      WHITESPACE@223..224 " "
+      BIND_DESTRUCT@224..249
+        DESTRUCT_OBJECT@224..238
+          L_BRACE@224..225 "{"
+          DESTRUCT_OBJECT_FIELD@225..226
+            NAME@225..226
+              IDENT@225..226 "a"
+          COMMA@226..227 ","
+          WHITESPACE@227..228 " "
+          DESTRUCT_OBJECT_FIELD@228..229
+            NAME@228..229
+              IDENT@228..229 "b"
+          COMMA@229..230 ","
+          WHITESPACE@230..231 " "
+          DESTRUCT_OBJECT_FIELD@231..232
+            NAME@231..232
+              IDENT@231..232 "c"
+          COMMA@232..233 ","
+          WHITESPACE@233..234 " "
+          DESTRUCT_REST@234..237
+            DOTDOTDOT@234..237 "..."
+          R_BRACE@237..238 "}"
+        WHITESPACE@238..239 " "
+        ASSIGN@239..240 "="
+        WHITESPACE@240..241 " "
+        EXPR@241..249
+          EXPR_VAR@241..249
+            NAME@241..249
+              IDENT@241..249 "obj_rest"
+      SEMI@249..250 ";"
+    WHITESPACE@250..251 "\n"
+    STMT_LOCAL@251..286
+      LOCAL_KW@251..256 "local"
+      WHITESPACE@256..257 " "
+      BIND_DESTRUCT@257..285
+        DESTRUCT_OBJECT@257..272
+          L_BRACE@257..258 "{"
+          DESTRUCT_OBJECT_FIELD@258..259
+            NAME@258..259
+              IDENT@258..259 "a"
+          COMMA@259..260 ","
+          WHITESPACE@260..261 " "
+          DESTRUCT_OBJECT_FIELD@261..262
+            NAME@261..262
+              IDENT@261..262 "b"
+          COMMA@262..263 ","
+          WHITESPACE@263..264 " "
+          DESTRUCT_OBJECT_FIELD@264..265
+            NAME@264..265
+              IDENT@264..265 "c"
+          COMMA@265..266 ","
+          WHITESPACE@266..267 " "
+          DESTRUCT_REST@267..271
+            DOTDOTDOT@267..270 "..."
+            IDENT@270..271 "n"
+          R_BRACE@271..272 "}"
+        WHITESPACE@272..273 " "
+        ASSIGN@273..274 "="
+        WHITESPACE@274..275 " "
+        EXPR@275..285
+          EXPR_VAR@275..285
+            NAME@275..285
+              IDENT@275..285 "obj_rest_n"
+      SEMI@285..286 ";"
+    WHITESPACE@286..288 "\n\n"
+    EXPR_LITERAL@288..292
+      NULL_KW@288..292 "null"
   WHITESPACE@292..293 "\n"
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
@@ -4,7 +4,8 @@
 ---
 SOURCE_FILE@0..1
   WHITESPACE@0..1 " "
-  ERROR_MISSING_TOKEN@1..1
+  EXPR@1..1
+    ERROR_MISSING_TOKEN@1..1
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 1..1 }
 ===
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function.snap
@@ -3,37 +3,40 @@
 expression: "function(a, b = 1) a + b\n"
 ---
 SOURCE_FILE@0..25
-  EXPR_FUNCTION@0..24
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..18
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..17
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-        WHITESPACE@13..14 " "
-        ASSIGN@14..15 "="
-        WHITESPACE@15..16 " "
-        EXPR_NUMBER@16..17
-          FLOAT@16..17 "1"
-      R_PAREN@17..18 ")"
-    WHITESPACE@18..19 " "
-    EXPR_BINARY@19..24
-      LHS_EXPR@19..20
-        EXPR_VAR@19..20
-          NAME@19..20
-            IDENT@19..20 "a"
-      WHITESPACE@20..21 " "
-      PLUS@21..22 "+"
-      WHITESPACE@22..23 " "
-      EXPR_VAR@23..24
-        NAME@23..24
-          IDENT@23..24 "b"
+  EXPR@0..24
+    EXPR_FUNCTION@0..24
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..18
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..17
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+          WHITESPACE@13..14 " "
+          ASSIGN@14..15 "="
+          WHITESPACE@15..16 " "
+          EXPR@16..17
+            EXPR_NUMBER@16..17
+              FLOAT@16..17 "1"
+        R_PAREN@17..18 ")"
+      WHITESPACE@18..19 " "
+      EXPR@19..24
+        EXPR_BINARY@19..24
+          EXPR@19..20
+            EXPR_VAR@19..20
+              NAME@19..20
+                IDENT@19..20 "a"
+          WHITESPACE@20..21 " "
+          PLUS@21..22 "+"
+          WHITESPACE@22..23 " "
+          EXPR@23..24
+            EXPR_VAR@23..24
+              NAME@23..24
+                IDENT@23..24 "b"
   WHITESPACE@24..25 "\n"
-
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
@@ -3,23 +3,25 @@
 expression: "function(a, b)\n"
 ---
 SOURCE_FILE@0..15
-  EXPR_FUNCTION@0..15
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..14
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..13
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-      R_PAREN@13..14 ")"
-    WHITESPACE@14..15 "\n"
-    ERROR_MISSING_TOKEN@15..15
+  EXPR@0..15
+    EXPR_FUNCTION@0..15
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..14
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..13
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+        R_PAREN@13..14 ")"
+      WHITESPACE@14..15 "\n"
+      EXPR@15..15
+        ERROR_MISSING_TOKEN@15..15
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 15..15 }
 ===
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
@@ -3,37 +3,41 @@
 expression: "function(a, b = ) a + b\n"
 ---
 SOURCE_FILE@0..24
-  EXPR_FUNCTION@0..23
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..17
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..16
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-        WHITESPACE@13..14 " "
-        ASSIGN@14..15 "="
-        WHITESPACE@15..16 " "
-        ERROR_MISSING_TOKEN@16..16
-      R_PAREN@16..17 ")"
-    WHITESPACE@17..18 " "
-    EXPR_BINARY@18..23
-      LHS_EXPR@18..19
-        EXPR_VAR@18..19
-          NAME@18..19
-            IDENT@18..19 "a"
-      WHITESPACE@19..20 " "
-      PLUS@20..21 "+"
-      WHITESPACE@21..22 " "
-      EXPR_VAR@22..23
-        NAME@22..23
-          IDENT@22..23 "b"
+  EXPR@0..23
+    EXPR_FUNCTION@0..23
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..17
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..16
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+          WHITESPACE@13..14 " "
+          ASSIGN@14..15 "="
+          WHITESPACE@15..16 " "
+          EXPR@16..16
+            ERROR_MISSING_TOKEN@16..16
+        R_PAREN@16..17 ")"
+      WHITESPACE@17..18 " "
+      EXPR@18..23
+        EXPR_BINARY@18..23
+          EXPR@18..19
+            EXPR_VAR@18..19
+              NAME@18..19
+                IDENT@18..19 "a"
+          WHITESPACE@19..20 " "
+          PLUS@20..21 "+"
+          WHITESPACE@21..22 " "
+          EXPR@22..23
+            EXPR_VAR@22..23
+              NAME@22..23
+                IDENT@22..23 "b"
   WHITESPACE@23..24 "\n"
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 16..16 }
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
@@ -3,23 +3,25 @@
 expression: "function(a, b\n"
 ---
 SOURCE_FILE@0..14
-  EXPR_FUNCTION@0..14
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..14
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..13
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-      WHITESPACE@13..14 "\n"
-      ERROR_MISSING_TOKEN@14..14
-    ERROR_MISSING_TOKEN@14..14
+  EXPR@0..14
+    EXPR_FUNCTION@0..14
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..14
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..13
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+        WHITESPACE@13..14 "\n"
+        ERROR_MISSING_TOKEN@14..14
+      EXPR@14..14
+        ERROR_MISSING_TOKEN@14..14
 ===
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([R_PAREN, COMMA, ASSIGN])) }, range: 14..14 }
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 14..14 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_method.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_method.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_method.snap
@@ -3,50 +3,53 @@
 expression: "local\n\ta(x) = x,\n\ta = function(x) x,\n; c\n"
 ---
 SOURCE_FILE@0..41
-  STMT_LOCAL@0..38
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..7 "\n\t"
-    BIND_FUNCTION@7..15
-      NAME@7..8
-        IDENT@7..8 "a"
-      PARAMS_DESC@8..11
-        L_PAREN@8..9 "("
-        PARAM@9..10
-          DESTRUCT_FULL@9..10
-            NAME@9..10
-              IDENT@9..10 "x"
-        R_PAREN@10..11 ")"
-      WHITESPACE@11..12 " "
-      ASSIGN@12..13 "="
-      WHITESPACE@13..14 " "
-      EXPR_VAR@14..15
-        NAME@14..15
-          IDENT@14..15 "x"
-    COMMA@15..16 ","
-    WHITESPACE@16..18 "\n\t"
-    BIND_FUNCTION@18..35
-      NAME@18..19
-        IDENT@18..19 "a"
-      WHITESPACE@19..20 " "
-      ASSIGN@20..21 "="
-      WHITESPACE@21..22 " "
-      FUNCTION_KW@22..30 "function"
-      PARAMS_DESC@30..33
-        L_PAREN@30..31 "("
-        PARAM@31..32
-          DESTRUCT_FULL@31..32
-            NAME@31..32
-              IDENT@31..32 "x"
-        R_PAREN@32..33 ")"
-      WHITESPACE@33..34 " "
-      EXPR_VAR@34..35
-        NAME@34..35
-          IDENT@34..35 "x"
-    COMMA@35..36 ","
-    WHITESPACE@36..37 "\n"
-    SEMI@37..38 ";"
-  WHITESPACE@38..39 " "
-  EXPR_VAR@39..40
-    NAME@39..40
-      IDENT@39..40 "c"
+  EXPR@0..40
+    STMT_LOCAL@0..38
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..7 "\n\t"
+      BIND_FUNCTION@7..15
+        NAME@7..8
+          IDENT@7..8 "a"
+        PARAMS_DESC@8..11
+          L_PAREN@8..9 "("
+          PARAM@9..10
+            DESTRUCT_FULL@9..10
+              NAME@9..10
+                IDENT@9..10 "x"
+          R_PAREN@10..11 ")"
+        WHITESPACE@11..12 " "
+        ASSIGN@12..13 "="
+        WHITESPACE@13..14 " "
+        EXPR@14..15
+          EXPR_VAR@14..15
+            NAME@14..15
+              IDENT@14..15 "x"
+      COMMA@15..16 ","
+      WHITESPACE@16..18 "\n\t"
+      BIND_FUNCTION@18..35
+        NAME@18..19
+          IDENT@18..19 "a"
+        WHITESPACE@19..20 " "
+        ASSIGN@20..21 "="
+        WHITESPACE@21..22 " "
+        FUNCTION_KW@22..30 "function"
+        PARAMS_DESC@30..33
+          L_PAREN@30..31 "("
+          PARAM@31..32
+            DESTRUCT_FULL@31..32
+              NAME@31..32
+                IDENT@31..32 "x"
+          R_PAREN@32..33 ")"
+        WHITESPACE@33..34 " "
+        EXPR@34..35
+          EXPR_VAR@34..35
+            NAME@34..35
+              IDENT@34..35 "x"
+      COMMA@35..36 ","
+      WHITESPACE@36..37 "\n"
+      SEMI@37..38 ";"
+    WHITESPACE@38..39 " "
+    EXPR_VAR@39..40
+      NAME@39..40
+        IDENT@39..40 "c"
   WHITESPACE@40..41 "\n"
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
@@ -3,37 +3,40 @@
 expression: "local a =\nlocal b = 3;\n1\n"
 ---
 SOURCE_FILE@0..25
-  STMT_LOCAL@0..25
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..24
-      DESTRUCT_FULL@6..7
-        NAME@6..7
-          IDENT@6..7 "a"
-      WHITESPACE@7..8 " "
-      ASSIGN@8..9 "="
-      WHITESPACE@9..10 "\n"
-      STMT_LOCAL@10..22
-        LOCAL_KW@10..15 "local"
-        WHITESPACE@15..16 " "
-        BIND_DESTRUCT@16..21
-          DESTRUCT_FULL@16..17
-            NAME@16..17
-              IDENT@16..17 "b"
-          WHITESPACE@17..18 " "
-          ASSIGN@18..19 "="
-          WHITESPACE@19..20 " "
-          EXPR_NUMBER@20..21
-            FLOAT@20..21 "3"
-        SEMI@21..22 ";"
-      WHITESPACE@22..23 "\n"
-      EXPR_NUMBER@23..24
-        FLOAT@23..24 "1"
-    WHITESPACE@24..25 "\n"
+  EXPR@0..25
+    STMT_LOCAL@0..25
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..24
+        DESTRUCT_FULL@6..7
+          NAME@6..7
+            IDENT@6..7 "a"
+        WHITESPACE@7..8 " "
+        ASSIGN@8..9 "="
+        WHITESPACE@9..10 "\n"
+        EXPR@10..24
+          STMT_LOCAL@10..22
+            LOCAL_KW@10..15 "local"
+            WHITESPACE@15..16 " "
+            BIND_DESTRUCT@16..21
+              DESTRUCT_FULL@16..17
+                NAME@16..17
+                  IDENT@16..17 "b"
+              WHITESPACE@17..18 " "
+              ASSIGN@18..19 "="
+              WHITESPACE@19..20 " "
+              EXPR@20..21
+                EXPR_NUMBER@20..21
+                  FLOAT@20..21 "3"
+            SEMI@21..22 ";"
+          WHITESPACE@22..23 "\n"
+          EXPR_NUMBER@23..24
+            FLOAT@23..24 "1"
+      WHITESPACE@24..25 "\n"
+      ERROR_MISSING_TOKEN@25..25
     ERROR_MISSING_TOKEN@25..25
-  ERROR_MISSING_TOKEN@25..25
 ===
-LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA])) }, range: 25..25 }
+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
@@ -42,5 +45,5 @@
  3 | 1
    :   ^^
    :   |`-- missing expression
-   :   `-- missing L_BRACK, L_PAREN, L_BRACE, SEMI, DOT or COMMA
+   :   `-- missing L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK
    `----
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
@@ -3,19 +3,21 @@
 expression: "local a =\n"
 ---
 SOURCE_FILE@0..10
-  STMT_LOCAL@0..10
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..10
-      DESTRUCT_FULL@6..7
-        NAME@6..7
-          IDENT@6..7 "a"
-      WHITESPACE@7..8 " "
-      ASSIGN@8..9 "="
-      WHITESPACE@9..10 "\n"
+  EXPR@0..10
+    STMT_LOCAL@0..10
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..10
+        DESTRUCT_FULL@6..7
+          NAME@6..7
+            IDENT@6..7 "a"
+        WHITESPACE@7..8 " "
+        ASSIGN@8..9 "="
+        WHITESPACE@9..10 "\n"
+        EXPR@10..10
+          ERROR_MISSING_TOKEN@10..10
       ERROR_MISSING_TOKEN@10..10
     ERROR_MISSING_TOKEN@10..10
-  ERROR_MISSING_TOKEN@10..10
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 10..10 }
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([SEMI, COMMA])) }, range: 10..10 }
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
@@ -3,57 +3,65 @@
 expression: "a(1, 2, b=4, 3, 5, k = 12, 6)\n"
 ---
 SOURCE_FILE@0..30
-  EXPR_APPLY@0..29
+  EXPR@0..29
     EXPR_VAR@0..1
       NAME@0..1
         IDENT@0..1 "a"
-    ARGS_DESC@1..29
-      L_PAREN@1..2 "("
-      ARG@2..3
-        EXPR_NUMBER@2..3
-          FLOAT@2..3 "1"
-      COMMA@3..4 ","
-      WHITESPACE@4..5 " "
-      ARG@5..6
-        EXPR_NUMBER@5..6
-          FLOAT@5..6 "2"
-      COMMA@6..7 ","
-      WHITESPACE@7..8 " "
-      ARG@8..11
-        NAME@8..9
-          IDENT@8..9 "b"
-        ASSIGN@9..10 "="
-        EXPR_NUMBER@10..11
-          FLOAT@10..11 "4"
-      COMMA@11..12 ","
-      WHITESPACE@12..13 " "
-      ERROR_CUSTOM@13..14
-        ARG@13..14
-          EXPR_NUMBER@13..14
-            FLOAT@13..14 "3"
-      COMMA@14..15 ","
-      WHITESPACE@15..16 " "
-      ERROR_CUSTOM@16..17
-        ARG@16..17
-          EXPR_NUMBER@16..17
-            FLOAT@16..17 "5"
-      COMMA@17..18 ","
-      WHITESPACE@18..19 " "
-      ARG@19..25
-        NAME@19..20
-          IDENT@19..20 "k"
-        WHITESPACE@20..21 " "
-        ASSIGN@21..22 "="
-        WHITESPACE@22..23 " "
-        EXPR_NUMBER@23..25
-          FLOAT@23..25 "12"
-      COMMA@25..26 ","
-      WHITESPACE@26..27 " "
-      ERROR_CUSTOM@27..28
-        ARG@27..28
-          EXPR_NUMBER@27..28
-            FLOAT@27..28 "6"
-      R_PAREN@28..29 ")"
+    SUFFIX_APPLY@1..29
+      ARGS_DESC@1..29
+        L_PAREN@1..2 "("
+        ARG@2..3
+          EXPR@2..3
+            EXPR_NUMBER@2..3
+              FLOAT@2..3 "1"
+        COMMA@3..4 ","
+        WHITESPACE@4..5 " "
+        ARG@5..6
+          EXPR@5..6
+            EXPR_NUMBER@5..6
+              FLOAT@5..6 "2"
+        COMMA@6..7 ","
+        WHITESPACE@7..8 " "
+        ARG@8..11
+          NAME@8..9
+            IDENT@8..9 "b"
+          ASSIGN@9..10 "="
+          EXPR@10..11
+            EXPR_NUMBER@10..11
+              FLOAT@10..11 "4"
+        COMMA@11..12 ","
+        WHITESPACE@12..13 " "
+        ERROR_CUSTOM@13..14
+          ARG@13..14
+            EXPR@13..14
+              EXPR_NUMBER@13..14
+                FLOAT@13..14 "3"
+        COMMA@14..15 ","
+        WHITESPACE@15..16 " "
+        ERROR_CUSTOM@16..17
+          ARG@16..17
+            EXPR@16..17
+              EXPR_NUMBER@16..17
+                FLOAT@16..17 "5"
+        COMMA@17..18 ","
+        WHITESPACE@18..19 " "
+        ARG@19..25
+          NAME@19..20
+            IDENT@19..20 "k"
+          WHITESPACE@20..21 " "
+          ASSIGN@21..22 "="
+          WHITESPACE@22..23 " "
+          EXPR@23..25
+            EXPR_NUMBER@23..25
+              FLOAT@23..25 "12"
+        COMMA@25..26 ","
+        WHITESPACE@26..27 " "
+        ERROR_CUSTOM@27..28
+          ARG@27..28
+            EXPR@27..28
+              EXPR_NUMBER@27..28
+                FLOAT@27..28 "6"
+        R_PAREN@28..29 ")"
   WHITESPACE@29..30 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "can't use positional arguments after named" }, range: 13..14 }
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
@@ -3,7 +3,8 @@
 expression: "+ 2\n"
 ---
 SOURCE_FILE@0..4
-  ERROR_MISSING_TOKEN@0..0
+  EXPR@0..0
+    ERROR_MISSING_TOKEN@0..0
   ERROR_CUSTOM@0..3
     PLUS@0..1 "+"
     WHITESPACE@1..2 " "
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
@@ -3,8 +3,9 @@
 expression: "2 2\n"
 ---
 SOURCE_FILE@0..4
-  EXPR_NUMBER@0..1
-    FLOAT@0..1 "2"
+  EXPR@0..1
+    EXPR_NUMBER@0..1
+      FLOAT@0..1 "2"
   WHITESPACE@1..2 " "
   ERROR_CUSTOM@2..3
     FLOAT@2..3 "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
@@ -3,15 +3,16 @@
 expression: "a +\n"
 ---
 SOURCE_FILE@0..4
-  EXPR_BINARY@0..4
-    LHS_EXPR@0..1
-      EXPR_VAR@0..1
-        NAME@0..1
-          IDENT@0..1 "a"
-    WHITESPACE@1..2 " "
-    PLUS@2..3 "+"
-    WHITESPACE@3..4 "\n"
-    ERROR_MISSING_TOKEN@4..4
+  EXPR@0..4
+    EXPR_BINARY@0..4
+      EXPR@0..1
+        EXPR_VAR@0..1
+          NAME@0..1
+            IDENT@0..1 "a"
+      WHITESPACE@1..2 " "
+      PLUS@2..3 "+"
+      WHITESPACE@3..4 "\n"
+      ERROR_MISSING_TOKEN@4..4
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 4..4 }
 ===
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snap
@@ -3,37 +3,44 @@
 expression: "{a:1 for a in [1, 2, 3]}\n"
 ---
 SOURCE_FILE@0..25
-  EXPR_OBJECT@0..24
-    OBJ_BODY_COMP@0..24
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      WHITESPACE@4..5 " "
-      FOR_SPEC@5..23
-        FOR_KW@5..8 "for"
-        WHITESPACE@8..9 " "
-        NAME@9..10
-          IDENT@9..10 "a"
-        WHITESPACE@10..11 " "
-        IN_KW@11..13 "in"
-        WHITESPACE@13..14 " "
-        EXPR_ARRAY@14..23
-          L_BRACK@14..15 "["
-          EXPR_NUMBER@15..16
-            FLOAT@15..16 "1"
-          COMMA@16..17 ","
-          WHITESPACE@17..18 " "
-          EXPR_NUMBER@18..19
-            FLOAT@18..19 "2"
-          COMMA@19..20 ","
-          WHITESPACE@20..21 " "
-          EXPR_NUMBER@21..22
-            FLOAT@21..22 "3"
-          R_BRACK@22..23 "]"
-      R_BRACE@23..24 "}"
+  EXPR@0..24
+    EXPR_OBJECT@0..24
+      OBJ_BODY_COMP@0..24
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        WHITESPACE@4..5 " "
+        FOR_SPEC@5..23
+          FOR_KW@5..8 "for"
+          WHITESPACE@8..9 " "
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+          WHITESPACE@10..11 " "
+          IN_KW@11..13 "in"
+          WHITESPACE@13..14 " "
+          EXPR@14..23
+            EXPR_ARRAY@14..23
+              L_BRACK@14..15 "["
+              EXPR@15..16
+                EXPR_NUMBER@15..16
+                  FLOAT@15..16 "1"
+              COMMA@16..17 ","
+              WHITESPACE@17..18 " "
+              EXPR@18..19
+                EXPR_NUMBER@18..19
+                  FLOAT@18..19 "2"
+              COMMA@19..20 ","
+              WHITESPACE@20..21 " "
+              EXPR@21..22
+                EXPR_NUMBER@21..22
+                  FLOAT@21..22 "3"
+              R_BRACK@22..23 "]"
+        R_BRACE@23..24 "}"
   WHITESPACE@24..25 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snap
@@ -3,38 +3,45 @@
 expression: "{a:1, for a in [1, 2, 3]}\n"
 ---
 SOURCE_FILE@0..26
-  EXPR_OBJECT@0..25
-    OBJ_BODY_COMP@0..25
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      COMMA@4..5 ","
-      WHITESPACE@5..6 " "
-      FOR_SPEC@6..24
-        FOR_KW@6..9 "for"
-        WHITESPACE@9..10 " "
-        NAME@10..11
-          IDENT@10..11 "a"
-        WHITESPACE@11..12 " "
-        IN_KW@12..14 "in"
-        WHITESPACE@14..15 " "
-        EXPR_ARRAY@15..24
-          L_BRACK@15..16 "["
-          EXPR_NUMBER@16..17
-            FLOAT@16..17 "1"
-          COMMA@17..18 ","
-          WHITESPACE@18..19 " "
-          EXPR_NUMBER@19..20
-            FLOAT@19..20 "2"
-          COMMA@20..21 ","
-          WHITESPACE@21..22 " "
-          EXPR_NUMBER@22..23
-            FLOAT@22..23 "3"
-          R_BRACK@23..24 "]"
-      R_BRACE@24..25 "}"
+  EXPR@0..25
+    EXPR_OBJECT@0..25
+      OBJ_BODY_COMP@0..25
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        COMMA@4..5 ","
+        WHITESPACE@5..6 " "
+        FOR_SPEC@6..24
+          FOR_KW@6..9 "for"
+          WHITESPACE@9..10 " "
+          DESTRUCT_FULL@10..11
+            NAME@10..11
+              IDENT@10..11 "a"
+          WHITESPACE@11..12 " "
+          IN_KW@12..14 "in"
+          WHITESPACE@14..15 " "
+          EXPR@15..24
+            EXPR_ARRAY@15..24
+              L_BRACK@15..16 "["
+              EXPR@16..17
+                EXPR_NUMBER@16..17
+                  FLOAT@16..17 "1"
+              COMMA@17..18 ","
+              WHITESPACE@18..19 " "
+              EXPR@19..20
+                EXPR_NUMBER@19..20
+                  FLOAT@19..20 "2"
+              COMMA@20..21 ","
+              WHITESPACE@21..22 " "
+              EXPR@22..23
+                EXPR_NUMBER@22..23
+                  FLOAT@22..23 "3"
+              R_BRACK@23..24 "]"
+        R_BRACE@24..25 "}"
   WHITESPACE@25..26 "\n"
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
@@ -3,48 +3,55 @@
 expression: "{assert 1, a: 1 for a in [1,2,3]}\n"
 ---
 SOURCE_FILE@0..34
-  EXPR_OBJECT@0..33
-    OBJ_BODY_COMP@0..33
-      L_BRACE@0..1 "{"
-      ERROR_CUSTOM@1..9
-        MEMBER_ASSERT_STMT@1..9
-          ASSERTION@1..9
-            ASSERT_KW@1..7 "assert"
-            WHITESPACE@7..8 " "
-            LHS_EXPR@8..9
-              EXPR_NUMBER@8..9
-                FLOAT@8..9 "1"
-      COMMA@9..10 ","
-      WHITESPACE@10..11 " "
-      MEMBER_FIELD_NORMAL@11..15
-        FIELD_NAME_FIXED@11..12
-          NAME@11..12
-            IDENT@11..12 "a"
-        COLON@12..13 ":"
-        WHITESPACE@13..14 " "
-        EXPR_NUMBER@14..15
-          FLOAT@14..15 "1"
-      WHITESPACE@15..16 " "
-      FOR_SPEC@16..32
-        FOR_KW@16..19 "for"
-        WHITESPACE@19..20 " "
-        NAME@20..21
-          IDENT@20..21 "a"
-        WHITESPACE@21..22 " "
-        IN_KW@22..24 "in"
-        WHITESPACE@24..25 " "
-        EXPR_ARRAY@25..32
-          L_BRACK@25..26 "["
-          EXPR_NUMBER@26..27
-            FLOAT@26..27 "1"
-          COMMA@27..28 ","
-          EXPR_NUMBER@28..29
-            FLOAT@28..29 "2"
-          COMMA@29..30 ","
-          EXPR_NUMBER@30..31
-            FLOAT@30..31 "3"
-          R_BRACK@31..32 "]"
-      R_BRACE@32..33 "}"
+  EXPR@0..33
+    EXPR_OBJECT@0..33
+      OBJ_BODY_COMP@0..33
+        L_BRACE@0..1 "{"
+        ERROR_CUSTOM@1..9
+          MEMBER_ASSERT_STMT@1..9
+            ASSERTION@1..9
+              ASSERT_KW@1..7 "assert"
+              WHITESPACE@7..8 " "
+              EXPR@8..9
+                EXPR_NUMBER@8..9
+                  FLOAT@8..9 "1"
+        COMMA@9..10 ","
+        WHITESPACE@10..11 " "
+        MEMBER_FIELD_NORMAL@11..15
+          FIELD_NAME_FIXED@11..12
+            NAME@11..12
+              IDENT@11..12 "a"
+          COLON@12..13 ":"
+          WHITESPACE@13..14 " "
+          EXPR@14..15
+            EXPR_NUMBER@14..15
+              FLOAT@14..15 "1"
+        WHITESPACE@15..16 " "
+        FOR_SPEC@16..32
+          FOR_KW@16..19 "for"
+          WHITESPACE@19..20 " "
+          DESTRUCT_FULL@20..21
+            NAME@20..21
+              IDENT@20..21 "a"
+          WHITESPACE@21..22 " "
+          IN_KW@22..24 "in"
+          WHITESPACE@24..25 " "
+          EXPR@25..32
+            EXPR_ARRAY@25..32
+              L_BRACK@25..26 "["
+              EXPR@26..27
+                EXPR_NUMBER@26..27
+                  FLOAT@26..27 "1"
+              COMMA@27..28 ","
+              EXPR@28..29
+                EXPR_NUMBER@28..29
+                  FLOAT@28..29 "2"
+              COMMA@29..30 ","
+              EXPR@30..31
+                EXPR_NUMBER@30..31
+                  FLOAT@30..31 "3"
+              R_BRACK@31..32 "]"
+        R_BRACE@32..33 "}"
   WHITESPACE@33..34 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "asserts can't be used in object comprehensions" }, range: 1..9 }
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
@@ -3,56 +3,64 @@
 expression: "{a:1 for a in [1, 2, 3], b:1}\n"
 ---
 SOURCE_FILE@0..30
-  EXPR_OBJECT@0..29
-    OBJ_BODY_MEMBER_LIST@0..29
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      WHITESPACE@4..5 " "
-      ERROR_CUSTOM@5..23
-        FOR_SPEC@5..23
-          FOR_KW@5..8 "for"
-          WHITESPACE@8..9 " "
-          NAME@9..10
-            IDENT@9..10 "a"
-          WHITESPACE@10..11 " "
-          IN_KW@11..13 "in"
-          WHITESPACE@13..14 " "
-          EXPR_ARRAY@14..23
-            L_BRACK@14..15 "["
-            EXPR_NUMBER@15..16
-              FLOAT@15..16 "1"
-            COMMA@16..17 ","
-            WHITESPACE@17..18 " "
-            EXPR_NUMBER@18..19
-              FLOAT@18..19 "2"
-            COMMA@19..20 ","
-            WHITESPACE@20..21 " "
-            EXPR_NUMBER@21..22
-              FLOAT@21..22 "3"
-            R_BRACK@22..23 "]"
-      COMMA@23..24 ","
-      WHITESPACE@24..25 " "
-      MEMBER_FIELD_NORMAL@25..28
-        FIELD_NAME_FIXED@25..26
-          NAME@25..26
-            IDENT@25..26 "b"
-        COLON@26..27 ":"
-        EXPR_NUMBER@27..28
-          FLOAT@27..28 "1"
-      R_BRACE@28..29 "}"
+  EXPR@0..29
+    EXPR_OBJECT@0..29
+      OBJ_BODY_MEMBER_LIST@0..29
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        WHITESPACE@4..5 " "
+        ERROR_CUSTOM@5..23
+          FOR_SPEC@5..23
+            FOR_KW@5..8 "for"
+            WHITESPACE@8..9 " "
+            DESTRUCT_FULL@9..10
+              NAME@9..10
+                IDENT@9..10 "a"
+            WHITESPACE@10..11 " "
+            IN_KW@11..13 "in"
+            WHITESPACE@13..14 " "
+            EXPR@14..23
+              EXPR_ARRAY@14..23
+                L_BRACK@14..15 "["
+                EXPR@15..16
+                  EXPR_NUMBER@15..16
+                    FLOAT@15..16 "1"
+                COMMA@16..17 ","
+                WHITESPACE@17..18 " "
+                EXPR@18..19
+                  EXPR_NUMBER@18..19
+                    FLOAT@18..19 "2"
+                COMMA@19..20 ","
+                WHITESPACE@20..21 " "
+                EXPR@21..22
+                  EXPR_NUMBER@21..22
+                    FLOAT@21..22 "3"
+                R_BRACK@22..23 "]"
+        COMMA@23..24 ","
+        WHITESPACE@24..25 " "
+        MEMBER_FIELD_NORMAL@25..28
+          FIELD_NAME_FIXED@25..26
+            NAME@25..26
+              IDENT@25..26 "b"
+          COLON@26..27 ":"
+          EXPR@27..28
+            EXPR_NUMBER@27..28
+              FLOAT@27..28 "1"
+        R_BRACE@28..29 "}"
   WHITESPACE@29..30 "\n"
 ===
-LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 5..23 }
+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 array element
+   :               `-- compspec may only be used if there is only one object element
    `----
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
@@ -3,66 +3,75 @@
 expression: "{a:1, b:1, for a in [1, 2, 3], c:1}\n"
 ---
 SOURCE_FILE@0..36
-  EXPR_OBJECT@0..35
-    OBJ_BODY_MEMBER_LIST@0..35
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      COMMA@4..5 ","
-      WHITESPACE@5..6 " "
-      MEMBER_FIELD_NORMAL@6..9
-        FIELD_NAME_FIXED@6..7
-          NAME@6..7
-            IDENT@6..7 "b"
-        COLON@7..8 ":"
-        EXPR_NUMBER@8..9
-          FLOAT@8..9 "1"
-      COMMA@9..10 ","
-      WHITESPACE@10..11 " "
-      ERROR_CUSTOM@11..29
-        FOR_SPEC@11..29
-          FOR_KW@11..14 "for"
-          WHITESPACE@14..15 " "
-          NAME@15..16
-            IDENT@15..16 "a"
-          WHITESPACE@16..17 " "
-          IN_KW@17..19 "in"
-          WHITESPACE@19..20 " "
-          EXPR_ARRAY@20..29
-            L_BRACK@20..21 "["
-            EXPR_NUMBER@21..22
-              FLOAT@21..22 "1"
-            COMMA@22..23 ","
-            WHITESPACE@23..24 " "
-            EXPR_NUMBER@24..25
-              FLOAT@24..25 "2"
-            COMMA@25..26 ","
-            WHITESPACE@26..27 " "
-            EXPR_NUMBER@27..28
-              FLOAT@27..28 "3"
-            R_BRACK@28..29 "]"
-      COMMA@29..30 ","
-      WHITESPACE@30..31 " "
-      MEMBER_FIELD_NORMAL@31..34
-        FIELD_NAME_FIXED@31..32
-          NAME@31..32
-            IDENT@31..32 "c"
-        COLON@32..33 ":"
-        EXPR_NUMBER@33..34
-          FLOAT@33..34 "1"
-      R_BRACE@34..35 "}"
+  EXPR@0..35
+    EXPR_OBJECT@0..35
+      OBJ_BODY_MEMBER_LIST@0..35
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        COMMA@4..5 ","
+        WHITESPACE@5..6 " "
+        MEMBER_FIELD_NORMAL@6..9
+          FIELD_NAME_FIXED@6..7
+            NAME@6..7
+              IDENT@6..7 "b"
+          COLON@7..8 ":"
+          EXPR@8..9
+            EXPR_NUMBER@8..9
+              FLOAT@8..9 "1"
+        COMMA@9..10 ","
+        WHITESPACE@10..11 " "
+        ERROR_CUSTOM@11..29
+          FOR_SPEC@11..29
+            FOR_KW@11..14 "for"
+            WHITESPACE@14..15 " "
+            DESTRUCT_FULL@15..16
+              NAME@15..16
+                IDENT@15..16 "a"
+            WHITESPACE@16..17 " "
+            IN_KW@17..19 "in"
+            WHITESPACE@19..20 " "
+            EXPR@20..29
+              EXPR_ARRAY@20..29
+                L_BRACK@20..21 "["
+                EXPR@21..22
+                  EXPR_NUMBER@21..22
+                    FLOAT@21..22 "1"
+                COMMA@22..23 ","
+                WHITESPACE@23..24 " "
+                EXPR@24..25
+                  EXPR_NUMBER@24..25
+                    FLOAT@24..25 "2"
+                COMMA@25..26 ","
+                WHITESPACE@26..27 " "
+                EXPR@27..28
+                  EXPR_NUMBER@27..28
+                    FLOAT@27..28 "3"
+                R_BRACK@28..29 "]"
+        COMMA@29..30 ","
+        WHITESPACE@30..31 " "
+        MEMBER_FIELD_NORMAL@31..34
+          FIELD_NAME_FIXED@31..32
+            NAME@31..32
+              IDENT@31..32 "c"
+          COLON@32..33 ":"
+          EXPR@33..34
+            EXPR_NUMBER@33..34
+              FLOAT@33..34 "1"
+        R_BRACE@34..35 "}"
   WHITESPACE@35..36 "\n"
 ===
-LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 11..29 }
+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 array element
+   :                     `-- compspec may only be used if there is only one object element
    `----
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
@@ -3,32 +3,38 @@
 expression: "{for a in [1, 2, 3]}\n"
 ---
 SOURCE_FILE@0..21
-  EXPR_OBJECT@0..20
-    OBJ_BODY_COMP@0..20
-      L_BRACE@0..1 "{"
-      ERROR_MISSING_TOKEN@1..1
-      FOR_SPEC@1..19
-        FOR_KW@1..4 "for"
-        WHITESPACE@4..5 " "
-        NAME@5..6
-          IDENT@5..6 "a"
-        WHITESPACE@6..7 " "
-        IN_KW@7..9 "in"
-        WHITESPACE@9..10 " "
-        EXPR_ARRAY@10..19
-          L_BRACK@10..11 "["
-          EXPR_NUMBER@11..12
-            FLOAT@11..12 "1"
-          COMMA@12..13 ","
-          WHITESPACE@13..14 " "
-          EXPR_NUMBER@14..15
-            FLOAT@14..15 "2"
-          COMMA@15..16 ","
-          WHITESPACE@16..17 " "
-          EXPR_NUMBER@17..18
-            FLOAT@17..18 "3"
-          R_BRACK@18..19 "]"
-      R_BRACE@19..20 "}"
+  EXPR@0..20
+    EXPR_OBJECT@0..20
+      OBJ_BODY_COMP@0..20
+        L_BRACE@0..1 "{"
+        ERROR_MISSING_TOKEN@1..1
+        FOR_SPEC@1..19
+          FOR_KW@1..4 "for"
+          WHITESPACE@4..5 " "
+          DESTRUCT_FULL@5..6
+            NAME@5..6
+              IDENT@5..6 "a"
+          WHITESPACE@6..7 " "
+          IN_KW@7..9 "in"
+          WHITESPACE@9..10 " "
+          EXPR@10..19
+            EXPR_ARRAY@10..19
+              L_BRACK@10..11 "["
+              EXPR@11..12
+                EXPR_NUMBER@11..12
+                  FLOAT@11..12 "1"
+              COMMA@12..13 ","
+              WHITESPACE@13..14 " "
+              EXPR@14..15
+                EXPR_NUMBER@14..15
+                  FLOAT@14..15 "2"
+              COMMA@15..16 ","
+              WHITESPACE@16..17 " "
+              EXPR@17..18
+                EXPR_NUMBER@17..18
+                  FLOAT@17..18 "3"
+              R_BRACK@18..19 "]"
+        R_BRACE@19..20 "}"
   WHITESPACE@20..21 "\n"
 ===
 LocatedSyntaxError { error: Missing { expected: Named("field definition") }, range: 1..1 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snap
@@ -3,47 +3,50 @@
 expression: "{\n\ta(x): x,\n\ta: function(x) x,\n}\n"
 ---
 SOURCE_FILE@0..33
-  EXPR_OBJECT@0..32
-    OBJ_BODY_MEMBER_LIST@0..32
-      L_BRACE@0..1 "{"
-      WHITESPACE@1..3 "\n\t"
-      MEMBER_FIELD_METHOD@3..10
-        FIELD_NAME_FIXED@3..4
-          NAME@3..4
-            IDENT@3..4 "a"
-        PARAMS_DESC@4..7
-          L_PAREN@4..5 "("
-          PARAM@5..6
-            DESTRUCT_FULL@5..6
-              NAME@5..6
-                IDENT@5..6 "x"
-          R_PAREN@6..7 ")"
-        COLON@7..8 ":"
-        WHITESPACE@8..9 " "
-        EXPR_VAR@9..10
-          NAME@9..10
-            IDENT@9..10 "x"
-      COMMA@10..11 ","
-      WHITESPACE@11..13 "\n\t"
-      MEMBER_FIELD_METHOD@13..29
-        FIELD_NAME_FIXED@13..14
-          NAME@13..14
-            IDENT@13..14 "a"
-        COLON@14..15 ":"
-        WHITESPACE@15..16 " "
-        FUNCTION_KW@16..24 "function"
-        PARAMS_DESC@24..27
-          L_PAREN@24..25 "("
-          PARAM@25..26
-            DESTRUCT_FULL@25..26
-              NAME@25..26
-                IDENT@25..26 "x"
-          R_PAREN@26..27 ")"
-        WHITESPACE@27..28 " "
-        EXPR_VAR@28..29
-          NAME@28..29
-            IDENT@28..29 "x"
-      COMMA@29..30 ","
-      WHITESPACE@30..31 "\n"
-      R_BRACE@31..32 "}"
+  EXPR@0..32
+    EXPR_OBJECT@0..32
+      OBJ_BODY_MEMBER_LIST@0..32
+        L_BRACE@0..1 "{"
+        WHITESPACE@1..3 "\n\t"
+        MEMBER_FIELD_METHOD@3..10
+          FIELD_NAME_FIXED@3..4
+            NAME@3..4
+              IDENT@3..4 "a"
+          PARAMS_DESC@4..7
+            L_PAREN@4..5 "("
+            PARAM@5..6
+              DESTRUCT_FULL@5..6
+                NAME@5..6
+                  IDENT@5..6 "x"
+            R_PAREN@6..7 ")"
+          COLON@7..8 ":"
+          WHITESPACE@8..9 " "
+          EXPR@9..10
+            EXPR_VAR@9..10
+              NAME@9..10
+                IDENT@9..10 "x"
+        COMMA@10..11 ","
+        WHITESPACE@11..13 "\n\t"
+        MEMBER_FIELD_METHOD@13..29
+          FIELD_NAME_FIXED@13..14
+            NAME@13..14
+              IDENT@13..14 "a"
+          COLON@14..15 ":"
+          WHITESPACE@15..16 " "
+          FUNCTION_KW@16..24 "function"
+          PARAMS_DESC@24..27
+            L_PAREN@24..25 "("
+            PARAM@25..26
+              DESTRUCT_FULL@25..26
+                NAME@25..26
+                  IDENT@25..26 "x"
+            R_PAREN@26..27 ")"
+          WHITESPACE@27..28 " "
+          EXPR@28..29
+            EXPR_VAR@28..29
+              NAME@28..29
+                IDENT@28..29 "x"
+        COMMA@29..30 ","
+        WHITESPACE@30..31 "\n"
+        R_BRACE@31..32 "}"
   WHITESPACE@32..33 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snap
@@ -3,51 +3,56 @@
 expression: "std.substr(a, 0, std.length(b)) == b\n"
 ---
 SOURCE_FILE@0..37
-  EXPR_BINARY@0..36
-    LHS_EXPR@0..31
-      EXPR_APPLY@0..31
-        EXPR_INDEX@0..10
-          EXPR_VAR@0..3
-            NAME@0..3
-              IDENT@0..3 "std"
-          DOT@3..4 "."
-          NAME@4..10
-            IDENT@4..10 "substr"
+  EXPR@0..36
+    EXPR_BINARY@0..36
+      EXPR@0..3
+        EXPR_VAR@0..3
+          NAME@0..3
+            IDENT@0..3 "std"
+      SUFFIX_INDEX@3..10
+        DOT@3..4 "."
+        NAME@4..10
+          IDENT@4..10 "substr"
+      SUFFIX_APPLY@10..31
         ARGS_DESC@10..31
           L_PAREN@10..11 "("
           ARG@11..12
-            EXPR_VAR@11..12
-              NAME@11..12
-                IDENT@11..12 "a"
+            EXPR@11..12
+              EXPR_VAR@11..12
+                NAME@11..12
+                  IDENT@11..12 "a"
           COMMA@12..13 ","
           WHITESPACE@13..14 " "
           ARG@14..15
-            EXPR_NUMBER@14..15
-              FLOAT@14..15 "0"
+            EXPR@14..15
+              EXPR_NUMBER@14..15
+                FLOAT@14..15 "0"
           COMMA@15..16 ","
           WHITESPACE@16..17 " "
           ARG@17..30
-            EXPR_APPLY@17..30
-              EXPR_INDEX@17..27
-                EXPR_VAR@17..20
-                  NAME@17..20
-                    IDENT@17..20 "std"
+            EXPR@17..30
+              EXPR_VAR@17..20
+                NAME@17..20
+                  IDENT@17..20 "std"
+              SUFFIX_INDEX@20..27
                 DOT@20..21 "."
                 NAME@21..27
                   IDENT@21..27 "length"
-              ARGS_DESC@27..30
-                L_PAREN@27..28 "("
-                ARG@28..29
-                  EXPR_VAR@28..29
-                    NAME@28..29
-                      IDENT@28..29 "b"
-                R_PAREN@29..30 ")"
+              SUFFIX_APPLY@27..30
+                ARGS_DESC@27..30
+                  L_PAREN@27..28 "("
+                  ARG@28..29
+                    EXPR@28..29
+                      EXPR_VAR@28..29
+                        NAME@28..29
+                          IDENT@28..29 "b"
+                  R_PAREN@29..30 ")"
           R_PAREN@30..31 ")"
-    WHITESPACE@31..32 " "
-    EQ@32..34 "=="
-    WHITESPACE@34..35 " "
-    EXPR_VAR@35..36
-      NAME@35..36
-        IDENT@35..36 "b"
+      WHITESPACE@31..32 " "
+      EQ@32..34 "=="
+      WHITESPACE@34..35 " "
+      EXPR@35..36
+        EXPR_VAR@35..36
+          NAME@35..36
+            IDENT@35..36 "b"
   WHITESPACE@36..37 "\n"
-
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snapdiffbeforeafterboth
before · crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snap
1---2source: crates/jrsonnet-rowan-parser/src/tests.rs3expression: "{\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  toString(a):: '' + a,\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  stringChars(str)::\n    std.makeArray(std.length(str), function(i) str[i]),\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  filterMap(filter_func, map_func, arr)::\n    if !std.isFunction(filter_func) then\n      error ('std.filterMap first param must be function, got ' + std.type(filter_func))\n    else if !std.isFunction(map_func) then\n      error ('std.filterMap second param must be function, got ' + std.type(map_func))\n    else if !std.isArray(arr) then\n      error ('std.filterMap third param must be array, got ' + std.type(arr))\n    else\n      std.map(map_func, std.filter(filter_func, 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  flattenArrays(arrs)::\n    std.foldl(function(a, b) a + b, arrs, []),\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  setUnion(a, b, keyF=id)::\n    // NOTE: order matters, values in `a` win\n    local aux(a, b, i, j, acc) =\n      if i >= std.length(a) then\n        acc + b[j:]\n      else if j >= std.length(b) then\n        acc + a[i:]\n      else\n        local ak = keyF(a[i]);\n        local bk = keyF(b[j]);\n        if ak == bk then\n          aux(a, b, i + 1, j + 1, acc + [a[i]]) tailstrict\n        else if ak < bk then\n          aux(a, b, i + 1, j, acc + [a[i]]) tailstrict\n        else\n          aux(a, b, i, j + 1, acc + [b[j]]) tailstrict;\n    aux(a, b, 0, 0, []),\n\n  setDiff(a, b, keyF=id)::\n    local aux(a, b, i, j, acc) =\n      if i >= std.length(a) then\n        acc\n      else if j >= std.length(b) then\n        acc + a[i:]\n      else\n        if keyF(a[i]) == keyF(b[j]) then\n          aux(a, b, i + 1, j + 1, acc) tailstrict\n        else if keyF(a[i]) < keyF(b[j]) then\n          aux(a, b, i + 1, j, acc + [a[i]]) tailstrict\n        else\n          aux(a, b, i, j + 1, acc) tailstrict;\n    aux(a, b, 0, 0, []) tailstrict,\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  objectFields(o)::\n    std.objectFieldsEx(o, false),\n\n  objectFieldsAll(o)::\n    std.objectFieldsEx(o, true),\n\n  objectHas(o, f)::\n    std.objectHasEx(o, f, false),\n\n  objectHasAll(o, f)::\n    std.objectHasEx(o, f, true),\n\n  objectValues(o)::\n    [o[k] for k in std.objectFields(o)],\n\n  objectValuesAll(o)::\n    [o[k] for k in std.objectFieldsAll(o)],\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"4---5SOURCE_FILE@0..98606  EXPR_OBJECT@0..98597    OBJ_BODY_MEMBER_LIST@0..98598      L_BRACE@0..1 "{"9      WHITESPACE@1..4 "\n  "10      MEMBER_BIND_STMT@4..2011        OBJ_LOCAL@4..2012          LOCAL_KW@4..9 "local"13          WHITESPACE@9..10 " "14          BIND_DESTRUCT@10..2015            DESTRUCT_FULL@10..1316              NAME@10..1317                IDENT@10..13 "std"18            WHITESPACE@13..14 " "19            ASSIGN@14..15 "="20            WHITESPACE@15..16 " "21            EXPR_LITERAL@16..2022              SELF_KW@16..20 "self"23      COMMA@20..21 ","24      WHITESPACE@21..24 "\n  "25      MEMBER_BIND_STMT@24..4126        OBJ_LOCAL@24..4127          LOCAL_KW@24..29 "local"28          WHITESPACE@29..30 " "29          BIND_DESTRUCT@30..4130            DESTRUCT_FULL@30..3231              NAME@30..3232                IDENT@30..32 "id"33            WHITESPACE@32..33 " "34            ASSIGN@33..34 "="35            WHITESPACE@34..35 " "36            EXPR_INDEX@35..4137              EXPR_VAR@35..3838                NAME@35..3839                  IDENT@35..38 "std"40              DOT@38..39 "."41              NAME@39..4142                IDENT@39..41 "id"43      COMMA@41..42 ","44      WHITESPACE@42..46 "\n\n  "45      MEMBER_FIELD_NORMAL@46..22446        FIELD_NAME_FIXED@46..5447          NAME@46..5448            IDENT@46..54 "thisFile"49        COLONCOLON@54..56 "::"50        WHITESPACE@56..57 " "51        EXPR_ERROR@57..22452          ERROR_KW@57..62 "error"53          WHITESPACE@62..63 " "54          EXPR_STRING@63..22455            STRING_SINGLE@63..224 "'std.thisFile is depr ..."56      COMMA@224..225 ","57      WHITESPACE@225..229 "\n\n  "58      MEMBER_FIELD_METHOD@229..24959        FIELD_NAME_FIXED@229..23760          NAME@229..23761            IDENT@229..237 "toString"62        PARAMS_DESC@237..24063          L_PAREN@237..238 "("64          PARAM@238..23965            DESTRUCT_FULL@238..23966              NAME@238..23967                IDENT@238..239 "a"68          R_PAREN@239..240 ")"69        COLONCOLON@240..242 "::"70        WHITESPACE@242..243 " "71        EXPR_BINARY@243..24972          LHS_EXPR@243..24573            EXPR_STRING@243..24574              STRING_SINGLE@243..245 "''"75          WHITESPACE@245..246 " "76          PLUS@246..247 "+"77          WHITESPACE@247..248 " "78          EXPR_VAR@248..24979            NAME@248..24980              IDENT@248..249 "a"81      COMMA@249..250 ","82      WHITESPACE@250..254 "\n\n  "83      MEMBER_FIELD_METHOD@254..39784        FIELD_NAME_FIXED@254..26585          NAME@254..26586            IDENT@254..265 "lstripChars"87        PARAMS_DESC@265..27788          L_PAREN@265..266 "("89          PARAM@266..26990            DESTRUCT_FULL@266..26991              NAME@266..26992                IDENT@266..269 "str"93          COMMA@269..270 ","94          WHITESPACE@270..271 " "95          PARAM@271..27696            DESTRUCT_FULL@271..27697              NAME@271..27698                IDENT@271..276 "chars"99          R_PAREN@276..277 ")"100        COLONCOLON@277..279 "::"101        WHITESPACE@279..284 "\n    "102        EXPR_IF_THEN_ELSE@284..397103          IF_KW@284..286 "if"104          WHITESPACE@286..287 " "105          EXPR_BINARY@287..335106            LHS_EXPR@287..306107              EXPR_BINARY@287..306108                LHS_EXPR@287..302109                  EXPR_APPLY@287..302110                    EXPR_INDEX@287..297111                      EXPR_VAR@287..290112                        NAME@287..290113                          IDENT@287..290 "std"114                      DOT@290..291 "."115                      NAME@291..297116                        IDENT@291..297 "length"117                    ARGS_DESC@297..302118                      L_PAREN@297..298 "("119                      ARG@298..301120                        EXPR_VAR@298..301121                          NAME@298..301122                            IDENT@298..301 "str"123                      R_PAREN@301..302 ")"124                WHITESPACE@302..303 " "125                GT@303..304 ">"126                WHITESPACE@304..305 " "127                EXPR_NUMBER@305..306128                  FLOAT@305..306 "0"129            WHITESPACE@306..307 " "130            AND@307..309 "&&"131            WHITESPACE@309..310 " "132            EXPR_APPLY@310..335133              EXPR_INDEX@310..320134                EXPR_VAR@310..313135                  NAME@310..313136                    IDENT@310..313 "std"137                DOT@313..314 "."138                NAME@314..320139                  IDENT@314..320 "member"140              ARGS_DESC@320..335141                L_PAREN@320..321 "("142                ARG@321..326143                  EXPR_VAR@321..326144                    NAME@321..326145                      IDENT@321..326 "chars"146                COMMA@326..327 ","147                WHITESPACE@327..328 " "148                ARG@328..334149                  EXPR_INDEX_EXPR@328..334150                    LHS_EXPR@328..331151                      EXPR_VAR@328..331152                        NAME@328..331153                          IDENT@328..331 "str"154                    L_BRACK@331..332 "["155                    EXPR_NUMBER@332..333156                      FLOAT@332..333 "0"157                    R_BRACK@333..334 "]"158                R_PAREN@334..335 ")"159          WHITESPACE@335..336 " "160          THEN_KW@336..340 "then"161          WHITESPACE@340..347 "\n      "162          TRUE_EXPR@347..378163            EXPR_APPLY@347..378164              EXPR_INDEX@347..362165                EXPR_VAR@347..350166                  NAME@347..350167                    IDENT@347..350 "std"168                DOT@350..351 "."169                NAME@351..362170                  IDENT@351..362 "lstripChars"171              ARGS_DESC@362..378172                L_PAREN@362..363 "("173                ARG@363..370174                  EXPR_SLICE@363..370175                    EXPR_VAR@363..366176                      NAME@363..366177                        IDENT@363..366 "str"178                    SLICE_DESC@366..370179                      L_BRACK@366..367 "["180                      EXPR_NUMBER@367..368181                        FLOAT@367..368 "1"182                      COLON@368..369 ":"183                      R_BRACK@369..370 "]"184                COMMA@370..371 ","185                WHITESPACE@371..372 " "186                ARG@372..377187                  EXPR_VAR@372..377188                    NAME@372..377189                      IDENT@372..377 "chars"190                R_PAREN@377..378 ")"191          WHITESPACE@378..383 "\n    "192          ELSE_KW@383..387 "else"193          WHITESPACE@387..394 "\n      "194          FALSE_EXPR@394..397195            EXPR_VAR@394..397196              NAME@394..397197                IDENT@394..397 "str"198      COMMA@397..398 ","199      WHITESPACE@398..402 "\n\n  "200      MEMBER_FIELD_METHOD@402..578201        FIELD_NAME_FIXED@402..413202          NAME@402..413203            IDENT@402..413 "rstripChars"204        PARAMS_DESC@413..425205          L_PAREN@413..414 "("206          PARAM@414..417207            DESTRUCT_FULL@414..417208              NAME@414..417209                IDENT@414..417 "str"210          COMMA@417..418 ","211          WHITESPACE@418..419 " "212          PARAM@419..424213            DESTRUCT_FULL@419..424214              NAME@419..424215                IDENT@419..424 "chars"216          R_PAREN@424..425 ")"217        COLONCOLON@425..427 "::"218        WHITESPACE@427..432 "\n    "219        STMT_LOCAL@432..460220          LOCAL_KW@432..437 "local"221          WHITESPACE@437..438 " "222          BIND_DESTRUCT@438..459223            DESTRUCT_FULL@438..441224              NAME@438..441225                IDENT@438..441 "len"226            WHITESPACE@441..442 " "227            ASSIGN@442..443 "="228            WHITESPACE@443..444 " "229            EXPR_APPLY@444..459230              EXPR_INDEX@444..454231                EXPR_VAR@444..447232                  NAME@444..447233                    IDENT@444..447 "std"234                DOT@447..448 "."235                NAME@448..454236                  IDENT@448..454 "length"237              ARGS_DESC@454..459238                L_PAREN@454..455 "("239                ARG@455..458240                  EXPR_VAR@455..458241                    NAME@455..458242                      IDENT@455..458 "str"243                R_PAREN@458..459 ")"244          SEMI@459..460 ";"245        WHITESPACE@460..465 "\n    "246        EXPR_IF_THEN_ELSE@465..578247          IF_KW@465..467 "if"248          WHITESPACE@467..468 " "249          EXPR_BINARY@468..510250            LHS_EXPR@468..475251              EXPR_BINARY@468..475252                LHS_EXPR@468..471253                  EXPR_VAR@468..471254                    NAME@468..471255                      IDENT@468..471 "len"256                WHITESPACE@471..472 " "257                GT@472..473 ">"258                WHITESPACE@473..474 " "259                EXPR_NUMBER@474..475260                  FLOAT@474..475 "0"261            WHITESPACE@475..476 " "262            AND@476..478 "&&"263            WHITESPACE@478..479 " "264            EXPR_APPLY@479..510265              EXPR_INDEX@479..489266                EXPR_VAR@479..482267                  NAME@479..482268                    IDENT@479..482 "std"269                DOT@482..483 "."270                NAME@483..489271                  IDENT@483..489 "member"272              ARGS_DESC@489..510273                L_PAREN@489..490 "("274                ARG@490..495275                  EXPR_VAR@490..495276                    NAME@490..495277                      IDENT@490..495 "chars"278                COMMA@495..496 ","279                WHITESPACE@496..497 " "280                ARG@497..509281                  EXPR_INDEX_EXPR@497..509282                    LHS_EXPR@497..500283                      EXPR_VAR@497..500284                        NAME@497..500285                          IDENT@497..500 "str"286                    L_BRACK@500..501 "["287                    EXPR_BINARY@501..508288                      LHS_EXPR@501..504289                        EXPR_VAR@501..504290                          NAME@501..504291                            IDENT@501..504 "len"292                      WHITESPACE@504..505 " "293                      MINUS@505..506 "-"294                      WHITESPACE@506..507 " "295                      EXPR_NUMBER@507..508296                        FLOAT@507..508 "1"297                    R_BRACK@508..509 "]"298                R_PAREN@509..510 ")"299          WHITESPACE@510..511 " "300          THEN_KW@511..515 "then"301          WHITESPACE@515..522 "\n      "302          TRUE_EXPR@522..559303            EXPR_APPLY@522..559304              EXPR_INDEX@522..537305                EXPR_VAR@522..525306                  NAME@522..525307                    IDENT@522..525 "std"308                DOT@525..526 "."309                NAME@526..537310                  IDENT@526..537 "rstripChars"311              ARGS_DESC@537..559312                L_PAREN@537..538 "("313                ARG@538..551314                  EXPR_SLICE@538..551315                    EXPR_VAR@538..541316                      NAME@538..541317                        IDENT@538..541 "str"318                    SLICE_DESC@541..551319                      L_BRACK@541..542 "["320                      COLON@542..543 ":"321                      SLICE_DESC_END@543..550322                        EXPR_BINARY@543..550323                          LHS_EXPR@543..546324                            EXPR_VAR@543..546325                              NAME@543..546326                                IDENT@543..546 "len"327                          WHITESPACE@546..547 " "328                          MINUS@547..548 "-"329                          WHITESPACE@548..549 " "330                          EXPR_NUMBER@549..550331                            FLOAT@549..550 "1"332                      R_BRACK@550..551 "]"333                COMMA@551..552 ","334                WHITESPACE@552..553 " "335                ARG@553..558336                  EXPR_VAR@553..558337                    NAME@553..558338                      IDENT@553..558 "chars"339                R_PAREN@558..559 ")"340          WHITESPACE@559..564 "\n    "341          ELSE_KW@564..568 "else"342          WHITESPACE@568..575 "\n      "343          FALSE_EXPR@575..578344            EXPR_VAR@575..578345              NAME@575..578346                IDENT@575..578 "str"347      COMMA@578..579 ","348      WHITESPACE@579..583 "\n\n  "349      MEMBER_FIELD_METHOD@583..663350        FIELD_NAME_FIXED@583..593351          NAME@583..593352            IDENT@583..593 "stripChars"353        PARAMS_DESC@593..605354          L_PAREN@593..594 "("355          PARAM@594..597356            DESTRUCT_FULL@594..597357              NAME@594..597358                IDENT@594..597 "str"359          COMMA@597..598 ","360          WHITESPACE@598..599 " "361          PARAM@599..604362            DESTRUCT_FULL@599..604363              NAME@599..604364                IDENT@599..604 "chars"365          R_PAREN@604..605 ")"366        COLONCOLON@605..607 "::"367        WHITESPACE@607..612 "\n    "368        EXPR_APPLY@612..663369          EXPR_INDEX@612..627370            EXPR_VAR@612..615371              NAME@612..615372                IDENT@612..615 "std"373            DOT@615..616 "."374            NAME@616..627375              IDENT@616..627 "lstripChars"376          ARGS_DESC@627..663377            L_PAREN@627..628 "("378            ARG@628..655379              EXPR_APPLY@628..655380                EXPR_INDEX@628..643381                  EXPR_VAR@628..631382                    NAME@628..631383                      IDENT@628..631 "std"384                  DOT@631..632 "."385                  NAME@632..643386                    IDENT@632..643 "rstripChars"387                ARGS_DESC@643..655388                  L_PAREN@643..644 "("389                  ARG@644..647390                    EXPR_VAR@644..647391                      NAME@644..647392                        IDENT@644..647 "str"393                  COMMA@647..648 ","394                  WHITESPACE@648..649 " "395                  ARG@649..654396                    EXPR_VAR@649..654397                      NAME@649..654398                        IDENT@649..654 "chars"399                  R_PAREN@654..655 ")"400            COMMA@655..656 ","401            WHITESPACE@656..657 " "402            ARG@657..662403              EXPR_VAR@657..662404                NAME@657..662405                  IDENT@657..662 "chars"406            R_PAREN@662..663 ")"407      COMMA@663..664 ","408      WHITESPACE@664..668 "\n\n  "409      MEMBER_FIELD_METHOD@668..741410        FIELD_NAME_FIXED@668..679411          NAME@668..679412            IDENT@668..679 "stringChars"413        PARAMS_DESC@679..684414          L_PAREN@679..680 "("415          PARAM@680..683416            DESTRUCT_FULL@680..683417              NAME@680..683418                IDENT@680..683 "str"419          R_PAREN@683..684 ")"420        COLONCOLON@684..686 "::"421        WHITESPACE@686..691 "\n    "422        EXPR_APPLY@691..741423          EXPR_INDEX@691..704424            EXPR_VAR@691..694425              NAME@691..694426                IDENT@691..694 "std"427            DOT@694..695 "."428            NAME@695..704429              IDENT@695..704 "makeArray"430          ARGS_DESC@704..741431            L_PAREN@704..705 "("432            ARG@705..720433              EXPR_APPLY@705..720434                EXPR_INDEX@705..715435                  EXPR_VAR@705..708436                    NAME@705..708437                      IDENT@705..708 "std"438                  DOT@708..709 "."439                  NAME@709..715440                    IDENT@709..715 "length"441                ARGS_DESC@715..720442                  L_PAREN@715..716 "("443                  ARG@716..719444                    EXPR_VAR@716..719445                      NAME@716..719446                        IDENT@716..719 "str"447                  R_PAREN@719..720 ")"448            COMMA@720..721 ","449            WHITESPACE@721..722 " "450            ARG@722..740451              EXPR_FUNCTION@722..740452                FUNCTION_KW@722..730 "function"453                PARAMS_DESC@730..733454                  L_PAREN@730..731 "("455                  PARAM@731..732456                    DESTRUCT_FULL@731..732457                      NAME@731..732458                        IDENT@731..732 "i"459                  R_PAREN@732..733 ")"460                WHITESPACE@733..734 " "461                EXPR_INDEX_EXPR@734..740462                  LHS_EXPR@734..737463                    EXPR_VAR@734..737464                      NAME@734..737465                        IDENT@734..737 "str"466                  L_BRACK@737..738 "["467                  EXPR_VAR@738..739468                    NAME@738..739469                      IDENT@738..739 "i"470                  R_BRACK@739..740 "]"471            R_PAREN@740..741 ")"472      COMMA@741..742 ","473      WHITESPACE@742..746 "\n\n  "474      MEMBER_FIELD_METHOD@746..1024475        FIELD_NAME_FIXED@746..757476          NAME@746..757477            IDENT@746..757 "splitLimitR"478        PARAMS_DESC@757..776479          L_PAREN@757..758 "("480          PARAM@758..761481            DESTRUCT_FULL@758..761482              NAME@758..761483                IDENT@758..761 "str"484          COMMA@761..762 ","485          WHITESPACE@762..763 " "486          PARAM@763..764487            DESTRUCT_FULL@763..764488              NAME@763..764489                IDENT@763..764 "c"490          COMMA@764..765 ","491          WHITESPACE@765..766 " "492          PARAM@766..775493            DESTRUCT_FULL@766..775494              NAME@766..775495                IDENT@766..775 "maxsplits"496          R_PAREN@775..776 ")"497        COLONCOLON@776..778 "::"498        WHITESPACE@778..783 "\n    "499        EXPR_IF_THEN_ELSE@783..1024500          IF_KW@783..785 "if"501          WHITESPACE@785..786 " "502          EXPR_BINARY@786..801503            LHS_EXPR@786..795504              EXPR_VAR@786..795505                NAME@786..795506                  IDENT@786..795 "maxsplits"507            WHITESPACE@795..796 " "508            EQ@796..798 "=="509            WHITESPACE@798..799 " "510            EXPR_UNARY@799..801511              MINUS@799..800 "-"512              EXPR_NUMBER@800..801513                FLOAT@800..801 "1"514          WHITESPACE@801..802 " "515          THEN_KW@802..806 "then"516          WHITESPACE@806..813 "\n      "517          TRUE_EXPR@813..839518            EXPR_APPLY@813..839519              EXPR_INDEX@813..827520                EXPR_VAR@813..816521                  NAME@813..816522                    IDENT@813..816 "std"523                DOT@816..817 "."524                NAME@817..827525                  IDENT@817..827 "splitLimit"526              ARGS_DESC@827..839527                L_PAREN@827..828 "("528                ARG@828..831529                  EXPR_VAR@828..831530                    NAME@828..831531                      IDENT@828..831 "str"532                COMMA@831..832 ","533                WHITESPACE@832..833 " "534                ARG@833..834535                  EXPR_VAR@833..834536                    NAME@833..834537                      IDENT@833..834 "c"538                COMMA@834..835 ","539                WHITESPACE@835..836 " "540                ARG@836..838541                  EXPR_UNARY@836..838542                    MINUS@836..837 "-"543                    EXPR_NUMBER@837..838544                      FLOAT@837..838 "1"545                R_PAREN@838..839 ")"546          WHITESPACE@839..844 "\n    "547          ELSE_KW@844..848 "else"548          WHITESPACE@848..855 "\n      "549          STMT_LOCAL@855..923550            LOCAL_KW@855..860 "local"551            WHITESPACE@860..861 " "552            BIND_FUNCTION@861..922553              NAME@861..867554                IDENT@861..867 "revStr"555              PARAMS_DESC@867..872556                L_PAREN@867..868 "("557                PARAM@868..871558                  DESTRUCT_FULL@868..871559                    NAME@868..871560                      IDENT@868..871 "str"561                R_PAREN@871..872 ")"562              WHITESPACE@872..873 " "563              ASSIGN@873..874 "="564              WHITESPACE@874..875 " "565              EXPR_APPLY@875..922566                EXPR_INDEX@875..883567                  EXPR_VAR@875..878568                    NAME@875..878569                      IDENT@875..878 "std"570                  DOT@878..879 "."571                  NAME@879..883572                    IDENT@879..883 "join"573                ARGS_DESC@883..922574                  L_PAREN@883..884 "("575                  ARG@884..886576                    EXPR_STRING@884..886577                      STRING_SINGLE@884..886 "''"578                  COMMA@886..887 ","579                  WHITESPACE@887..888 " "580                  ARG@888..921581                    EXPR_APPLY@888..921582                      EXPR_INDEX@888..899583                        EXPR_VAR@888..891584                          NAME@888..891585                            IDENT@888..891 "std"586                        DOT@891..892 "."587                        NAME@892..899588                          IDENT@892..899 "reverse"589                      ARGS_DESC@899..921590                        L_PAREN@899..900 "("591                        ARG@900..920592                          EXPR_APPLY@900..920593                            EXPR_INDEX@900..915594                              EXPR_VAR@900..903595                                NAME@900..903596                                  IDENT@900..903 "std"597                              DOT@903..904 "."598                              NAME@904..915599                                IDENT@904..915 "stringChars"600                            ARGS_DESC@915..920601                              L_PAREN@915..916 "("602                              ARG@916..919603                                EXPR_VAR@916..919604                                  NAME@916..919605                                    IDENT@916..919 "str"606                              R_PAREN@919..920 ")"607                        R_PAREN@920..921 ")"608                  R_PAREN@921..922 ")"609            SEMI@922..923 ";"610          WHITESPACE@923..930 "\n      "611          FALSE_EXPR@930..1024612            EXPR_APPLY@930..1024613              EXPR_INDEX@930..937614                EXPR_VAR@930..933615                  NAME@930..933616                    IDENT@930..933 "std"617                DOT@933..934 "."618                NAME@934..937619                  IDENT@934..937 "map"620              ARGS_DESC@937..1024621                L_PAREN@937..938 "("622                ARG@938..959623                  EXPR_FUNCTION@938..959624                    FUNCTION_KW@938..946 "function"625                    PARAMS_DESC@946..949626                      L_PAREN@946..947 "("627                      PARAM@947..948628                        DESTRUCT_FULL@947..948629                          NAME@947..948630                            IDENT@947..948 "e"631                      R_PAREN@948..949 ")"632                    WHITESPACE@949..950 " "633                    EXPR_APPLY@950..959634                      EXPR_VAR@950..956635                        NAME@950..956636                          IDENT@950..956 "revStr"637                      ARGS_DESC@956..959638                        L_PAREN@956..957 "("639                        ARG@957..958640                          EXPR_VAR@957..958641                            NAME@957..958642                              IDENT@957..958 "e"643                        R_PAREN@958..959 ")"644                COMMA@959..960 ","645                WHITESPACE@960..961 " "646                ARG@961..1023647                  EXPR_APPLY@961..1023648                    EXPR_INDEX@961..972649                      EXPR_VAR@961..964650                        NAME@961..964651                          IDENT@961..964 "std"652                      DOT@964..965 "."653                      NAME@965..972654                        IDENT@965..972 "reverse"655                    ARGS_DESC@972..1023656                      L_PAREN@972..973 "("657                      ARG@973..1022658                        EXPR_APPLY@973..1022659                          EXPR_INDEX@973..987660                            EXPR_VAR@973..976661                              NAME@973..976662                                IDENT@973..976 "std"663                            DOT@976..977 "."664                            NAME@977..987665                              IDENT@977..987 "splitLimit"666                          ARGS_DESC@987..1022667                            L_PAREN@987..988 "("668                            ARG@988..999669                              EXPR_APPLY@988..999670                                EXPR_VAR@988..994671                                  NAME@988..994672                                    IDENT@988..994 "revStr"673                                ARGS_DESC@994..999674                                  L_PAREN@994..995 "("675                                  ARG@995..998676                                    EXPR_VAR@995..998677                                      NAME@995..998678                                        IDENT@995..998 "str"679                                  R_PAREN@998..999 ")"680                            COMMA@999..1000 ","681                            WHITESPACE@1000..1001 " "682                            ARG@1001..1010683                              EXPR_APPLY@1001..1010684                                EXPR_VAR@1001..1007685                                  NAME@1001..1007686                                    IDENT@1001..1007 "revStr"687                                ARGS_DESC@1007..1010688                                  L_PAREN@1007..1008 "("689                                  ARG@1008..1009690                                    EXPR_VAR@1008..1009691                                      NAME@1008..1009692                                        IDENT@1008..1009 "c"693                                  R_PAREN@1009..1010 ")"694                            COMMA@1010..1011 ","695                            WHITESPACE@1011..1012 " "696                            ARG@1012..1021697                              EXPR_VAR@1012..1021698                                NAME@1012..1021699                                  IDENT@1012..1021 "maxsplits"700                            R_PAREN@1021..1022 ")"701                      R_PAREN@1022..1023 ")"702                R_PAREN@1023..1024 ")"703      COMMA@1024..1025 ","704      WHITESPACE@1025..1029 "\n\n  "705      MEMBER_FIELD_METHOD@1029..1071706        FIELD_NAME_FIXED@1029..1034707          NAME@1029..1034708            IDENT@1029..1034 "split"709        PARAMS_DESC@1034..1042710          L_PAREN@1034..1035 "("711          PARAM@1035..1038712            DESTRUCT_FULL@1035..1038713              NAME@1035..1038714                IDENT@1035..1038 "str"715          COMMA@1038..1039 ","716          WHITESPACE@1039..1040 " "717          PARAM@1040..1041718            DESTRUCT_FULL@1040..1041719              NAME@1040..1041720                IDENT@1040..1041 "c"721          R_PAREN@1041..1042 ")"722        COLONCOLON@1042..1044 "::"723        WHITESPACE@1044..1045 " "724        EXPR_APPLY@1045..1071725          EXPR_INDEX@1045..1059726            EXPR_VAR@1045..1048727              NAME@1045..1048728                IDENT@1045..1048 "std"729            DOT@1048..1049 "."730            NAME@1049..1059731              IDENT@1049..1059 "splitLimit"732          ARGS_DESC@1059..1071733            L_PAREN@1059..1060 "("734            ARG@1060..1063735              EXPR_VAR@1060..1063736                NAME@1060..1063737                  IDENT@1060..1063 "str"738            COMMA@1063..1064 ","739            WHITESPACE@1064..1065 " "740            ARG@1065..1066741              EXPR_VAR@1065..1066742                NAME@1065..1066743                  IDENT@1065..1066 "c"744            COMMA@1066..1067 ","745            WHITESPACE@1067..1068 " "746            ARG@1068..1070747              EXPR_UNARY@1068..1070748                MINUS@1068..1069 "-"749                EXPR_NUMBER@1069..1070750                  FLOAT@1069..1070 "1"751            R_PAREN@1070..1071 ")"752      COMMA@1071..1072 ","753      WHITESPACE@1072..1076 "\n\n  "754      MEMBER_FIELD_METHOD@1076..1434755        FIELD_NAME_FIXED@1076..1088756          NAME@1076..1088757            IDENT@1076..1088 "mapWithIndex"758        PARAMS_DESC@1088..1099759          L_PAREN@1088..1089 "("760          PARAM@1089..1093761            DESTRUCT_FULL@1089..1093762              NAME@1089..1093763                IDENT@1089..1093 "func"764          COMMA@1093..1094 ","765          WHITESPACE@1094..1095 " "766          PARAM@1095..1098767            DESTRUCT_FULL@1095..1098768              NAME@1095..1098769                IDENT@1095..1098 "arr"770          R_PAREN@1098..1099 ")"771        COLONCOLON@1099..1101 "::"772        WHITESPACE@1101..1106 "\n    "773        EXPR_IF_THEN_ELSE@1106..1434774          IF_KW@1106..1108 "if"775          WHITESPACE@1108..1109 " "776          EXPR_UNARY@1109..1130777            NOT@1109..1110 "!"778            EXPR_APPLY@1110..1130779              EXPR_INDEX@1110..1124780                EXPR_VAR@1110..1113781                  NAME@1110..1113782                    IDENT@1110..1113 "std"783                DOT@1113..1114 "."784                NAME@1114..1124785                  IDENT@1114..1124 "isFunction"786              ARGS_DESC@1124..1130787                L_PAREN@1124..1125 "("788                ARG@1125..1129789                  EXPR_VAR@1125..1129790                    NAME@1125..1129791                      IDENT@1125..1129 "func"792                R_PAREN@1129..1130 ")"793          WHITESPACE@1130..1131 " "794          THEN_KW@1131..1135 "then"795          WHITESPACE@1135..1142 "\n      "796          TRUE_EXPR@1142..1220797            EXPR_ERROR@1142..1220798              ERROR_KW@1142..1147 "error"799              WHITESPACE@1147..1148 " "800              EXPR_PARENED@1148..1220801                L_PAREN@1148..1149 "("802                EXPR_BINARY@1149..1219803                  LHS_EXPR@1149..1202804                    EXPR_STRING@1149..1202805                      STRING_SINGLE@1149..1202 "'std.mapWithIndex fir ..."806                  WHITESPACE@1202..1203 " "807                  PLUS@1203..1204 "+"808                  WHITESPACE@1204..1205 " "809                  EXPR_APPLY@1205..1219810                    EXPR_INDEX@1205..1213811                      EXPR_VAR@1205..1208812                        NAME@1205..1208813                          IDENT@1205..1208 "std"814                      DOT@1208..1209 "."815                      NAME@1209..1213816                        IDENT@1209..1213 "type"817                    ARGS_DESC@1213..1219818                      L_PAREN@1213..1214 "("819                      ARG@1214..1218820                        EXPR_VAR@1214..1218821                          NAME@1214..1218822                            IDENT@1214..1218 "func"823                      R_PAREN@1218..1219 ")"824                R_PAREN@1219..1220 ")"825          WHITESPACE@1220..1225 "\n    "826          ELSE_KW@1225..1229 "else"827          WHITESPACE@1229..1230 " "828          FALSE_EXPR@1230..1434829            EXPR_IF_THEN_ELSE@1230..1434830              IF_KW@1230..1232 "if"831              WHITESPACE@1232..1233 " "832              EXPR_BINARY@1233..1272833                LHS_EXPR@1233..1250834                  EXPR_UNARY@1233..1250835                    NOT@1233..1234 "!"836                    EXPR_APPLY@1234..1250837                      EXPR_INDEX@1234..1245838                        EXPR_VAR@1234..1237839                          NAME@1234..1237840                            IDENT@1234..1237 "std"841                        DOT@1237..1238 "."842                        NAME@1238..1245843                          IDENT@1238..1245 "isArray"844                      ARGS_DESC@1245..1250845                        L_PAREN@1245..1246 "("846                        ARG@1246..1249847                          EXPR_VAR@1246..1249848                            NAME@1246..1249849                              IDENT@1246..1249 "arr"850                        R_PAREN@1249..1250 ")"851                WHITESPACE@1250..1251 " "852                AND@1251..1253 "&&"853                WHITESPACE@1253..1254 " "854                EXPR_UNARY@1254..1272855                  NOT@1254..1255 "!"856                  EXPR_APPLY@1255..1272857                    EXPR_INDEX@1255..1267858                      EXPR_VAR@1255..1258859                        NAME@1255..1258860                          IDENT@1255..1258 "std"861                      DOT@1258..1259 "."862                      NAME@1259..1267863                        IDENT@1259..1267 "isString"864                    ARGS_DESC@1267..1272865                      L_PAREN@1267..1268 "("866                      ARG@1268..1271867                        EXPR_VAR@1268..1271868                          NAME@1268..1271869                            IDENT@1268..1271 "arr"870                      R_PAREN@1271..1272 ")"871              WHITESPACE@1272..1273 " "872              THEN_KW@1273..1277 "then"873              WHITESPACE@1277..1284 "\n      "874              TRUE_EXPR@1284..1359875                EXPR_ERROR@1284..1359876                  ERROR_KW@1284..1289 "error"877                  WHITESPACE@1289..1290 " "878                  EXPR_PARENED@1290..1359879                    L_PAREN@1290..1291 "("880                    EXPR_BINARY@1291..1358881                      LHS_EXPR@1291..1342882                        EXPR_STRING@1291..1342883                          STRING_SINGLE@1291..1342 "'std.mapWithIndex sec ..."884                      WHITESPACE@1342..1343 " "885                      PLUS@1343..1344 "+"886                      WHITESPACE@1344..1345 " "887                      EXPR_APPLY@1345..1358888                        EXPR_INDEX@1345..1353889                          EXPR_VAR@1345..1348890                            NAME@1345..1348891                              IDENT@1345..1348 "std"892                          DOT@1348..1349 "."893                          NAME@1349..1353894                            IDENT@1349..1353 "type"895                        ARGS_DESC@1353..1358896                          L_PAREN@1353..1354 "("897                          ARG@1354..1357898                            EXPR_VAR@1354..1357899                              NAME@1354..1357900                                IDENT@1354..1357 "arr"901                          R_PAREN@1357..1358 ")"902                    R_PAREN@1358..1359 ")"903              WHITESPACE@1359..1364 "\n    "904              ELSE_KW@1364..1368 "else"905              WHITESPACE@1368..1375 "\n      "906              FALSE_EXPR@1375..1434907                EXPR_APPLY@1375..1434908                  EXPR_INDEX@1375..1388909                    EXPR_VAR@1375..1378910                      NAME@1375..1378911                        IDENT@1375..1378 "std"912                    DOT@1378..1379 "."913                    NAME@1379..1388914                      IDENT@1379..1388 "makeArray"915                  ARGS_DESC@1388..1434916                    L_PAREN@1388..1389 "("917                    ARG@1389..1404918                      EXPR_APPLY@1389..1404919                        EXPR_INDEX@1389..1399920                          EXPR_VAR@1389..1392921                            NAME@1389..1392922                              IDENT@1389..1392 "std"923                          DOT@1392..1393 "."924                          NAME@1393..1399925                            IDENT@1393..1399 "length"926                        ARGS_DESC@1399..1404927                          L_PAREN@1399..1400 "("928                          ARG@1400..1403929                            EXPR_VAR@1400..1403930                              NAME@1400..1403931                                IDENT@1400..1403 "arr"932                          R_PAREN@1403..1404 ")"933                    COMMA@1404..1405 ","934                    WHITESPACE@1405..1406 " "935                    ARG@1406..1433936                      EXPR_FUNCTION@1406..1433937                        FUNCTION_KW@1406..1414 "function"938                        PARAMS_DESC@1414..1417939                          L_PAREN@1414..1415 "("940                          PARAM@1415..1416941                            DESTRUCT_FULL@1415..1416942                              NAME@1415..1416943                                IDENT@1415..1416 "i"944                          R_PAREN@1416..1417 ")"945                        WHITESPACE@1417..1418 " "946                        EXPR_APPLY@1418..1433947                          EXPR_VAR@1418..1422948                            NAME@1418..1422949                              IDENT@1418..1422 "func"950                          ARGS_DESC@1422..1433951                            L_PAREN@1422..1423 "("952                            ARG@1423..1424953                              EXPR_VAR@1423..1424954                                NAME@1423..1424955                                  IDENT@1423..1424 "i"956                            COMMA@1424..1425 ","957                            WHITESPACE@1425..1426 " "958                            ARG@1426..1432959                              EXPR_INDEX_EXPR@1426..1432960                                LHS_EXPR@1426..1429961                                  EXPR_VAR@1426..1429962                                    NAME@1426..1429963                                      IDENT@1426..1429 "arr"964                                L_BRACK@1429..1430 "["965                                EXPR_VAR@1430..1431966                                  NAME@1430..1431967                                    IDENT@1430..1431 "i"968                                R_BRACK@1431..1432 "]"969                            R_PAREN@1432..1433 ")"970                    R_PAREN@1433..1434 ")"971      COMMA@1434..1435 ","972      WHITESPACE@1435..1439 "\n\n  "973      MEMBER_FIELD_METHOD@1439..1767974        FIELD_NAME_FIXED@1439..1449975          NAME@1439..1449976            IDENT@1439..1449 "mapWithKey"977        PARAMS_DESC@1449..1460978          L_PAREN@1449..1450 "("979          PARAM@1450..1454980            DESTRUCT_FULL@1450..1454981              NAME@1450..1454982                IDENT@1450..1454 "func"983          COMMA@1454..1455 ","984          WHITESPACE@1455..1456 " "985          PARAM@1456..1459986            DESTRUCT_FULL@1456..1459987              NAME@1456..1459988                IDENT@1456..1459 "obj"989          R_PAREN@1459..1460 ")"990        COLONCOLON@1460..1462 "::"991        WHITESPACE@1462..1467 "\n    "992        EXPR_IF_THEN_ELSE@1467..1767993          IF_KW@1467..1469 "if"994          WHITESPACE@1469..1470 " "995          EXPR_UNARY@1470..1491996            NOT@1470..1471 "!"997            EXPR_APPLY@1471..1491998              EXPR_INDEX@1471..1485999                EXPR_VAR@1471..14741000                  NAME@1471..14741001                    IDENT@1471..1474 "std"1002                DOT@1474..1475 "."1003                NAME@1475..14851004                  IDENT@1475..1485 "isFunction"1005              ARGS_DESC@1485..14911006                L_PAREN@1485..1486 "("1007                ARG@1486..14901008                  EXPR_VAR@1486..14901009                    NAME@1486..14901010                      IDENT@1486..1490 "func"1011                R_PAREN@1490..1491 ")"1012          WHITESPACE@1491..1492 " "1013          THEN_KW@1492..1496 "then"1014          WHITESPACE@1496..1503 "\n      "1015          TRUE_EXPR@1503..15791016            EXPR_ERROR@1503..15791017              ERROR_KW@1503..1508 "error"1018              WHITESPACE@1508..1509 " "1019              EXPR_PARENED@1509..15791020                L_PAREN@1509..1510 "("1021                EXPR_BINARY@1510..15781022                  LHS_EXPR@1510..15611023                    EXPR_STRING@1510..15611024                      STRING_SINGLE@1510..1561 "'std.mapWithKey first ..."1025                  WHITESPACE@1561..1562 " "1026                  PLUS@1562..1563 "+"1027                  WHITESPACE@1563..1564 " "1028                  EXPR_APPLY@1564..15781029                    EXPR_INDEX@1564..15721030                      EXPR_VAR@1564..15671031                        NAME@1564..15671032                          IDENT@1564..1567 "std"1033                      DOT@1567..1568 "."1034                      NAME@1568..15721035                        IDENT@1568..1572 "type"1036                    ARGS_DESC@1572..15781037                      L_PAREN@1572..1573 "("1038                      ARG@1573..15771039                        EXPR_VAR@1573..15771040                          NAME@1573..15771041                            IDENT@1573..1577 "func"1042                      R_PAREN@1577..1578 ")"1043                R_PAREN@1578..1579 ")"1044          WHITESPACE@1579..1584 "\n    "1045          ELSE_KW@1584..1588 "else"1046          WHITESPACE@1588..1589 " "1047          FALSE_EXPR@1589..17671048            EXPR_IF_THEN_ELSE@1589..17671049              IF_KW@1589..1591 "if"1050              WHITESPACE@1591..1592 " "1051              EXPR_UNARY@1592..16101052                NOT@1592..1593 "!"1053                EXPR_APPLY@1593..16101054                  EXPR_INDEX@1593..16051055                    EXPR_VAR@1593..15961056                      NAME@1593..15961057                        IDENT@1593..1596 "std"1058                    DOT@1596..1597 "."1059                    NAME@1597..16051060                      IDENT@1597..1605 "isObject"1061                  ARGS_DESC@1605..16101062                    L_PAREN@1605..1606 "("1063                    ARG@1606..16091064                      EXPR_VAR@1606..16091065                        NAME@1606..16091066                          IDENT@1606..1609 "obj"1067                    R_PAREN@1609..1610 ")"1068              WHITESPACE@1610..1611 " "1069              THEN_KW@1611..1615 "then"1070              WHITESPACE@1615..1622 "\n      "1071              TRUE_EXPR@1622..16961072                EXPR_ERROR@1622..16961073                  ERROR_KW@1622..1627 "error"1074                  WHITESPACE@1627..1628 " "1075                  EXPR_PARENED@1628..16961076                    L_PAREN@1628..1629 "("1077                    EXPR_BINARY@1629..16951078                      LHS_EXPR@1629..16791079                        EXPR_STRING@1629..16791080                          STRING_SINGLE@1629..1679 "'std.mapWithKey secon ..."1081                      WHITESPACE@1679..1680 " "1082                      PLUS@1680..1681 "+"1083                      WHITESPACE@1681..1682 " "1084                      EXPR_APPLY@1682..16951085                        EXPR_INDEX@1682..16901086                          EXPR_VAR@1682..16851087                            NAME@1682..16851088                              IDENT@1682..1685 "std"1089                          DOT@1685..1686 "."1090                          NAME@1686..16901091                            IDENT@1686..1690 "type"1092                        ARGS_DESC@1690..16951093                          L_PAREN@1690..1691 "("1094                          ARG@1691..16941095                            EXPR_VAR@1691..16941096                              NAME@1691..16941097                                IDENT@1691..1694 "obj"1098                          R_PAREN@1694..1695 ")"1099                    R_PAREN@1695..1696 ")"1100              WHITESPACE@1696..1701 "\n    "1101              ELSE_KW@1701..1705 "else"1102              WHITESPACE@1705..1712 "\n      "1103              FALSE_EXPR@1712..17671104                EXPR_OBJECT@1712..17671105                  OBJ_BODY_COMP@1712..17671106                    L_BRACE@1712..1713 "{"1107                    WHITESPACE@1713..1714 " "1108                    MEMBER_FIELD_NORMAL@1714..17341109                      FIELD_NAME_DYNAMIC@1714..17171110                        L_BRACK@1714..1715 "["1111                        EXPR_VAR@1715..17161112                          NAME@1715..17161113                            IDENT@1715..1716 "k"1114                        R_BRACK@1716..1717 "]"1115                      COLON@1717..1718 ":"1116                      WHITESPACE@1718..1719 " "1117                      EXPR_APPLY@1719..17341118                        EXPR_VAR@1719..17231119                          NAME@1719..17231120                            IDENT@1719..1723 "func"1121                        ARGS_DESC@1723..17341122                          L_PAREN@1723..1724 "("1123                          ARG@1724..17251124                            EXPR_VAR@1724..17251125                              NAME@1724..17251126                                IDENT@1724..1725 "k"1127                          COMMA@1725..1726 ","1128                          WHITESPACE@1726..1727 " "1129                          ARG@1727..17331130                            EXPR_INDEX_EXPR@1727..17331131                              LHS_EXPR@1727..17301132                                EXPR_VAR@1727..17301133                                  NAME@1727..17301134                                    IDENT@1727..1730 "obj"1135                              L_BRACK@1730..1731 "["1136                              EXPR_VAR@1731..17321137                                NAME@1731..17321138                                  IDENT@1731..1732 "k"1139                              R_BRACK@1732..1733 "]"1140                          R_PAREN@1733..1734 ")"1141                    WHITESPACE@1734..1735 " "1142                    FOR_SPEC@1735..17651143                      FOR_KW@1735..1738 "for"1144                      WHITESPACE@1738..1739 " "1145                      NAME@1739..17401146                        IDENT@1739..1740 "k"1147                      WHITESPACE@1740..1741 " "1148                      IN_KW@1741..1743 "in"1149                      WHITESPACE@1743..1744 " "1150                      EXPR_APPLY@1744..17651151                        EXPR_INDEX@1744..17601152                          EXPR_VAR@1744..17471153                            NAME@1744..17471154                              IDENT@1744..1747 "std"1155                          DOT@1747..1748 "."1156                          NAME@1748..17601157                            IDENT@1748..1760 "objectFields"1158                        ARGS_DESC@1760..17651159                          L_PAREN@1760..1761 "("1160                          ARG@1761..17641161                            EXPR_VAR@1761..17641162                              NAME@1761..17641163                                IDENT@1761..1764 "obj"1164                          R_PAREN@1764..1765 ")"1165                    WHITESPACE@1765..1766 " "1166                    R_BRACE@1766..1767 "}"1167      COMMA@1767..1768 ","1168      WHITESPACE@1768..1772 "\n\n  "1169      MEMBER_FIELD_METHOD@1772..18151170        FIELD_NAME_FIXED@1772..17771171          NAME@1772..17771172            IDENT@1772..1777 "lines"1173        PARAMS_DESC@1777..17821174          L_PAREN@1777..1778 "("1175          PARAM@1778..17811176            DESTRUCT_FULL@1778..17811177              NAME@1778..17811178                IDENT@1778..1781 "arr"1179          R_PAREN@1781..1782 ")"1180        COLONCOLON@1782..1784 "::"1181        WHITESPACE@1784..1789 "\n    "1182        EXPR_APPLY@1789..18151183          EXPR_INDEX@1789..17971184            EXPR_VAR@1789..17921185              NAME@1789..17921186                IDENT@1789..1792 "std"1187            DOT@1792..1793 "."1188            NAME@1793..17971189              IDENT@1793..1797 "join"1190          ARGS_DESC@1797..18151191            L_PAREN@1797..1798 "("1192            ARG@1798..18021193              EXPR_STRING@1798..18021194                STRING_SINGLE@1798..1802 "'\\n'"1195            COMMA@1802..1803 ","1196            WHITESPACE@1803..1804 " "1197            ARG@1804..18141198              EXPR_BINARY@1804..18141199                LHS_EXPR@1804..18071200                  EXPR_VAR@1804..18071201                    NAME@1804..18071202                      IDENT@1804..1807 "arr"1203                WHITESPACE@1807..1808 " "1204                PLUS@1808..1809 "+"1205                WHITESPACE@1809..1810 " "1206                EXPR_ARRAY@1810..18141207                  L_BRACK@1810..1811 "["1208                  EXPR_STRING@1811..18131209                    STRING_SINGLE@1811..1813 "''"1210                  R_BRACK@1813..1814 "]"1211            R_PAREN@1814..1815 ")"1212      COMMA@1815..1816 ","1213      WHITESPACE@1816..1820 "\n\n  "1214      MEMBER_FIELD_METHOD@1820..20321215        FIELD_NAME_FIXED@1820..18281216          NAME@1820..18281217            IDENT@1820..1828 "deepJoin"1218        PARAMS_DESC@1828..18331219          L_PAREN@1828..1829 "("1220          PARAM@1829..18321221            DESTRUCT_FULL@1829..18321222              NAME@1829..18321223                IDENT@1829..1832 "arr"1224          R_PAREN@1832..1833 ")"1225        COLONCOLON@1833..1835 "::"1226        WHITESPACE@1835..1840 "\n    "1227        EXPR_IF_THEN_ELSE@1840..20321228          IF_KW@1840..1842 "if"1229          WHITESPACE@1842..1843 " "1230          EXPR_APPLY@1843..18601231            EXPR_INDEX@1843..18551232              EXPR_VAR@1843..18461233                NAME@1843..18461234                  IDENT@1843..1846 "std"1235              DOT@1846..1847 "."1236              NAME@1847..18551237                IDENT@1847..1855 "isString"1238            ARGS_DESC@1855..18601239              L_PAREN@1855..1856 "("1240              ARG@1856..18591241                EXPR_VAR@1856..18591242                  NAME@1856..18591243                    IDENT@1856..1859 "arr"1244              R_PAREN@1859..1860 ")"1245          WHITESPACE@1860..1861 " "1246          THEN_KW@1861..1865 "then"1247          WHITESPACE@1865..1872 "\n      "1248          TRUE_EXPR@1872..18751249            EXPR_VAR@1872..18751250              NAME@1872..18751251                IDENT@1872..1875 "arr"1252          WHITESPACE@1875..1880 "\n    "1253          ELSE_KW@1880..1884 "else"1254          WHITESPACE@1884..1885 " "1255          FALSE_EXPR@1885..20321256            EXPR_IF_THEN_ELSE@1885..20321257              IF_KW@1885..1887 "if"1258              WHITESPACE@1887..1888 " "1259              EXPR_APPLY@1888..19041260                EXPR_INDEX@1888..18991261                  EXPR_VAR@1888..18911262                    NAME@1888..18911263                      IDENT@1888..1891 "std"1264                  DOT@1891..1892 "."1265                  NAME@1892..18991266                    IDENT@1892..1899 "isArray"1267                ARGS_DESC@1899..19041268                  L_PAREN@1899..1900 "("1269                  ARG@1900..19031270                    EXPR_VAR@1900..19031271                      NAME@1900..19031272                        IDENT@1900..1903 "arr"1273                  R_PAREN@1903..1904 ")"1274              WHITESPACE@1904..1905 " "1275              THEN_KW@1905..1909 "then"1276              WHITESPACE@1909..1916 "\n      "1277              TRUE_EXPR@1916..19601278                EXPR_APPLY@1916..19601279                  EXPR_INDEX@1916..19241280                    EXPR_VAR@1916..19191281                      NAME@1916..19191282                        IDENT@1916..1919 "std"1283                    DOT@1919..1920 "."1284                    NAME@1920..19241285                      IDENT@1920..1924 "join"1286                  ARGS_DESC@1924..19601287                    L_PAREN@1924..1925 "("1288                    ARG@1925..19271289                      EXPR_STRING@1925..19271290                        STRING_SINGLE@1925..1927 "''"1291                    COMMA@1927..1928 ","1292                    WHITESPACE@1928..1929 " "1293                    ARG@1929..19591294                      EXPR_ARRAY_COMP@1929..19591295                        L_BRACK@1929..1930 "["1296                        EXPR_APPLY@1930..19451297                          EXPR_INDEX@1930..19421298                            EXPR_VAR@1930..19331299                              NAME@1930..19331300                                IDENT@1930..1933 "std"1301                            DOT@1933..1934 "."1302                            NAME@1934..19421303                              IDENT@1934..1942 "deepJoin"1304                          ARGS_DESC@1942..19451305                            L_PAREN@1942..1943 "("1306                            ARG@1943..19441307                              EXPR_VAR@1943..19441308                                NAME@1943..19441309                                  IDENT@1943..1944 "x"1310                            R_PAREN@1944..1945 ")"1311                        WHITESPACE@1945..1946 " "1312                        FOR_SPEC@1946..19581313                          FOR_KW@1946..1949 "for"1314                          WHITESPACE@1949..1950 " "1315                          NAME@1950..19511316                            IDENT@1950..1951 "x"1317                          WHITESPACE@1951..1952 " "1318                          IN_KW@1952..1954 "in"1319                          WHITESPACE@1954..1955 " "1320                          EXPR_VAR@1955..19581321                            NAME@1955..19581322                              IDENT@1955..1958 "arr"1323                        R_BRACK@1958..1959 "]"1324                    R_PAREN@1959..1960 ")"1325              WHITESPACE@1960..1965 "\n    "1326              ELSE_KW@1965..1969 "else"1327              WHITESPACE@1969..1976 "\n      "1328              FALSE_EXPR@1976..20321329                EXPR_ERROR@1976..20321330                  ERROR_KW@1976..1981 "error"1331                  WHITESPACE@1981..1982 " "1332                  EXPR_BINARY@1982..20321333                    LHS_EXPR@1982..20161334                      EXPR_STRING@1982..20161335                        STRING_SINGLE@1982..2016 "'Expected string or a ..."1336                    WHITESPACE@2016..2017 " "1337                    MODULO@2017..2018 "%"1338                    WHITESPACE@2018..2019 " "1339                    EXPR_APPLY@2019..20321340                      EXPR_INDEX@2019..20271341                        EXPR_VAR@2019..20221342                          NAME@2019..20221343                            IDENT@2019..2022 "std"1344                        DOT@2022..2023 "."1345                        NAME@2023..20271346                          IDENT@2023..2027 "type"1347                      ARGS_DESC@2027..20321348                        L_PAREN@2027..2028 "("1349                        ARG@2028..20311350                          EXPR_VAR@2028..20311351                            NAME@2028..20311352                              IDENT@2028..2031 "arr"1353                        R_PAREN@2031..2032 ")"1354      COMMA@2032..2033 ","1355      WHITESPACE@2033..2037 "\n\n  "1356      MEMBER_FIELD_METHOD@2037..25121357        FIELD_NAME_FIXED@2037..20461358          NAME@2037..20461359            IDENT@2037..2046 "filterMap"1360        PARAMS_DESC@2046..20741361          L_PAREN@2046..2047 "("1362          PARAM@2047..20581363            DESTRUCT_FULL@2047..20581364              NAME@2047..20581365                IDENT@2047..2058 "filter_func"1366          COMMA@2058..2059 ","1367          WHITESPACE@2059..2060 " "1368          PARAM@2060..20681369            DESTRUCT_FULL@2060..20681370              NAME@2060..20681371                IDENT@2060..2068 "map_func"1372          COMMA@2068..2069 ","1373          WHITESPACE@2069..2070 " "1374          PARAM@2070..20731375            DESTRUCT_FULL@2070..20731376              NAME@2070..20731377                IDENT@2070..2073 "arr"1378          R_PAREN@2073..2074 ")"1379        COLONCOLON@2074..2076 "::"1380        WHITESPACE@2076..2081 "\n    "1381        EXPR_IF_THEN_ELSE@2081..25121382          IF_KW@2081..2083 "if"1383          WHITESPACE@2083..2084 " "1384          EXPR_UNARY@2084..21121385            NOT@2084..2085 "!"1386            EXPR_APPLY@2085..21121387              EXPR_INDEX@2085..20991388                EXPR_VAR@2085..20881389                  NAME@2085..20881390                    IDENT@2085..2088 "std"1391                DOT@2088..2089 "."1392                NAME@2089..20991393                  IDENT@2089..2099 "isFunction"1394              ARGS_DESC@2099..21121395                L_PAREN@2099..2100 "("1396                ARG@2100..21111397                  EXPR_VAR@2100..21111398                    NAME@2100..21111399                      IDENT@2100..2111 "filter_func"1400                R_PAREN@2111..2112 ")"1401          WHITESPACE@2112..2113 " "1402          THEN_KW@2113..2117 "then"1403          WHITESPACE@2117..2124 "\n      "1404          TRUE_EXPR@2124..22061405            EXPR_ERROR@2124..22061406              ERROR_KW@2124..2129 "error"1407              WHITESPACE@2129..2130 " "1408              EXPR_PARENED@2130..22061409                L_PAREN@2130..2131 "("1410                EXPR_BINARY@2131..22051411                  LHS_EXPR@2131..21811412                    EXPR_STRING@2131..21811413                      STRING_SINGLE@2131..2181 "'std.filterMap first  ..."1414                  WHITESPACE@2181..2182 " "1415                  PLUS@2182..2183 "+"1416                  WHITESPACE@2183..2184 " "1417                  EXPR_APPLY@2184..22051418                    EXPR_INDEX@2184..21921419                      EXPR_VAR@2184..21871420                        NAME@2184..21871421                          IDENT@2184..2187 "std"1422                      DOT@2187..2188 "."1423                      NAME@2188..21921424                        IDENT@2188..2192 "type"1425                    ARGS_DESC@2192..22051426                      L_PAREN@2192..2193 "("1427                      ARG@2193..22041428                        EXPR_VAR@2193..22041429                          NAME@2193..22041430                            IDENT@2193..2204 "filter_func"1431                      R_PAREN@2204..2205 ")"1432                R_PAREN@2205..2206 ")"1433          WHITESPACE@2206..2211 "\n    "1434          ELSE_KW@2211..2215 "else"1435          WHITESPACE@2215..2216 " "1436          FALSE_EXPR@2216..25121437            EXPR_IF_THEN_ELSE@2216..25121438              IF_KW@2216..2218 "if"1439              WHITESPACE@2218..2219 " "1440              EXPR_UNARY@2219..22441441                NOT@2219..2220 "!"1442                EXPR_APPLY@2220..22441443                  EXPR_INDEX@2220..22341444                    EXPR_VAR@2220..22231445                      NAME@2220..22231446                        IDENT@2220..2223 "std"1447                    DOT@2223..2224 "."1448                    NAME@2224..22341449                      IDENT@2224..2234 "isFunction"1450                  ARGS_DESC@2234..22441451                    L_PAREN@2234..2235 "("1452                    ARG@2235..22431453                      EXPR_VAR@2235..22431454                        NAME@2235..22431455                          IDENT@2235..2243 "map_func"1456                    R_PAREN@2243..2244 ")"1457              WHITESPACE@2244..2245 " "1458              THEN_KW@2245..2249 "then"1459              WHITESPACE@2249..2256 "\n      "1460              TRUE_EXPR@2256..23361461                EXPR_ERROR@2256..23361462                  ERROR_KW@2256..2261 "error"1463                  WHITESPACE@2261..2262 " "1464                  EXPR_PARENED@2262..23361465                    L_PAREN@2262..2263 "("1466                    EXPR_BINARY@2263..23351467                      LHS_EXPR@2263..23141468                        EXPR_STRING@2263..23141469                          STRING_SINGLE@2263..2314 "'std.filterMap second ..."1470                      WHITESPACE@2314..2315 " "1471                      PLUS@2315..2316 "+"1472                      WHITESPACE@2316..2317 " "1473                      EXPR_APPLY@2317..23351474                        EXPR_INDEX@2317..23251475                          EXPR_VAR@2317..23201476                            NAME@2317..23201477                              IDENT@2317..2320 "std"1478                          DOT@2320..2321 "."1479                          NAME@2321..23251480                            IDENT@2321..2325 "type"1481                        ARGS_DESC@2325..23351482                          L_PAREN@2325..2326 "("1483                          ARG@2326..23341484                            EXPR_VAR@2326..23341485                              NAME@2326..23341486                                IDENT@2326..2334 "map_func"1487                          R_PAREN@2334..2335 ")"1488                    R_PAREN@2335..2336 ")"1489              WHITESPACE@2336..2341 "\n    "1490              ELSE_KW@2341..2345 "else"1491              WHITESPACE@2345..2346 " "1492              FALSE_EXPR@2346..25121493                EXPR_IF_THEN_ELSE@2346..25121494                  IF_KW@2346..2348 "if"1495                  WHITESPACE@2348..2349 " "1496                  EXPR_UNARY@2349..23661497                    NOT@2349..2350 "!"1498                    EXPR_APPLY@2350..23661499                      EXPR_INDEX@2350..23611500                        EXPR_VAR@2350..23531501                          NAME@2350..23531502                            IDENT@2350..2353 "std"1503                        DOT@2353..2354 "."1504                        NAME@2354..23611505                          IDENT@2354..2361 "isArray"1506                      ARGS_DESC@2361..23661507                        L_PAREN@2361..2362 "("1508                        ARG@2362..23651509                          EXPR_VAR@2362..23651510                            NAME@2362..23651511                              IDENT@2362..2365 "arr"1512                        R_PAREN@2365..2366 ")"1513                  WHITESPACE@2366..2367 " "1514                  THEN_KW@2367..2371 "then"1515                  WHITESPACE@2371..2378 "\n      "1516                  TRUE_EXPR@2378..24491517                    EXPR_ERROR@2378..24491518                      ERROR_KW@2378..2383 "error"1519                      WHITESPACE@2383..2384 " "1520                      EXPR_PARENED@2384..24491521                        L_PAREN@2384..2385 "("1522                        EXPR_BINARY@2385..24481523                          LHS_EXPR@2385..24321524                            EXPR_STRING@2385..24321525                              STRING_SINGLE@2385..2432 "'std.filterMap third  ..."1526                          WHITESPACE@2432..2433 " "1527                          PLUS@2433..2434 "+"1528                          WHITESPACE@2434..2435 " "1529                          EXPR_APPLY@2435..24481530                            EXPR_INDEX@2435..24431531                              EXPR_VAR@2435..24381532                                NAME@2435..24381533                                  IDENT@2435..2438 "std"1534                              DOT@2438..2439 "."1535                              NAME@2439..24431536                                IDENT@2439..2443 "type"1537                            ARGS_DESC@2443..24481538                              L_PAREN@2443..2444 "("1539                              ARG@2444..24471540                                EXPR_VAR@2444..24471541                                  NAME@2444..24471542                                    IDENT@2444..2447 "arr"1543                              R_PAREN@2447..2448 ")"1544                        R_PAREN@2448..2449 ")"1545                  WHITESPACE@2449..2454 "\n    "1546                  ELSE_KW@2454..2458 "else"1547                  WHITESPACE@2458..2465 "\n      "1548                  FALSE_EXPR@2465..25121549                    EXPR_APPLY@2465..25121550                      EXPR_INDEX@2465..24721551                        EXPR_VAR@2465..24681552                          NAME@2465..24681553                            IDENT@2465..2468 "std"1554                        DOT@2468..2469 "."1555                        NAME@2469..24721556                          IDENT@2469..2472 "map"1557                      ARGS_DESC@2472..25121558                        L_PAREN@2472..2473 "("1559                        ARG@2473..24811560                          EXPR_VAR@2473..24811561                            NAME@2473..24811562                              IDENT@2473..2481 "map_func"1563                        COMMA@2481..2482 ","1564                        WHITESPACE@2482..2483 " "1565                        ARG@2483..25111566                          EXPR_APPLY@2483..25111567                            EXPR_INDEX@2483..24931568                              EXPR_VAR@2483..24861569                                NAME@2483..24861570                                  IDENT@2483..2486 "std"1571                              DOT@2486..2487 "."1572                              NAME@2487..24931573                                IDENT@2487..2493 "filter"1574                            ARGS_DESC@2493..25111575                              L_PAREN@2493..2494 "("1576                              ARG@2494..25051577                                EXPR_VAR@2494..25051578                                  NAME@2494..25051579                                    IDENT@2494..2505 "filter_func"1580                              COMMA@2505..2506 ","1581                              WHITESPACE@2506..2507 " "1582                              ARG@2507..25101583                                EXPR_VAR@2507..25101584                                  NAME@2507..25101585                                    IDENT@2507..2510 "arr"1586                              R_PAREN@2510..2511 ")"1587                        R_PAREN@2511..2512 ")"1588      COMMA@2512..2513 ","1589      WHITESPACE@2513..2517 "\n\n  "1590      MEMBER_FIELD_METHOD@2517..26251591        FIELD_NAME_FIXED@2517..25281592          NAME@2517..25281593            IDENT@2517..2528 "assertEqual"1594        PARAMS_DESC@2528..25341595          L_PAREN@2528..2529 "("1596          PARAM@2529..25301597            DESTRUCT_FULL@2529..25301598              NAME@2529..25301599                IDENT@2529..2530 "a"1600          COMMA@2530..2531 ","1601          WHITESPACE@2531..2532 " "1602          PARAM@2532..25331603            DESTRUCT_FULL@2532..25331604              NAME@2532..25331605                IDENT@2532..2533 "b"1606          R_PAREN@2533..2534 ")"1607        COLONCOLON@2534..2536 "::"1608        WHITESPACE@2536..2541 "\n    "1609        EXPR_IF_THEN_ELSE@2541..26251610          IF_KW@2541..2543 "if"1611          WHITESPACE@2543..2544 " "1612          EXPR_BINARY@2544..25501613            LHS_EXPR@2544..25451614              EXPR_VAR@2544..25451615                NAME@2544..25451616                  IDENT@2544..2545 "a"1617            WHITESPACE@2545..2546 " "1618            EQ@2546..2548 "=="1619            WHITESPACE@2548..2549 " "1620            EXPR_VAR@2549..25501621              NAME@2549..25501622                IDENT@2549..2550 "b"1623          WHITESPACE@2550..2551 " "1624          THEN_KW@2551..2555 "then"1625          WHITESPACE@2555..2562 "\n      "1626          TRUE_EXPR@2562..25661627            EXPR_LITERAL@2562..25661628              TRUE_KW@2562..2566 "true"1629          WHITESPACE@2566..2571 "\n    "1630          ELSE_KW@2571..2575 "else"1631          WHITESPACE@2575..2582 "\n      "1632          FALSE_EXPR@2582..26251633            EXPR_ERROR@2582..26251634              ERROR_KW@2582..2587 "error"1635              WHITESPACE@2587..2588 " "1636              EXPR_BINARY@2588..26251637                LHS_EXPR@2588..26211638                  EXPR_BINARY@2588..26211639                    LHS_EXPR@2588..26121640                      EXPR_BINARY@2588..26121641                        LHS_EXPR@2588..26081642                          EXPR_STRING@2588..26081643                            STRING_SINGLE@2588..2608 "'Assertion failed. '"1644                        WHITESPACE@2608..2609 " "1645                        PLUS@2609..2610 "+"1646                        WHITESPACE@2610..2611 " "1647                        EXPR_VAR@2611..26121648                          NAME@2611..26121649                            IDENT@2611..2612 "a"1650                    WHITESPACE@2612..2613 " "1651                    PLUS@2613..2614 "+"1652                    WHITESPACE@2614..2615 " "1653                    EXPR_STRING@2615..26211654                      STRING_SINGLE@2615..2621 "' != '"1655                WHITESPACE@2621..2622 " "1656                PLUS@2622..2623 "+"1657                WHITESPACE@2623..2624 " "1658                EXPR_VAR@2624..26251659                  NAME@2624..26251660                    IDENT@2624..2625 "b"1661      COMMA@2625..2626 ","1662      WHITESPACE@2626..2630 "\n\n  "1663      MEMBER_FIELD_METHOD@2630..27321664        FIELD_NAME_FIXED@2630..26351665          NAME@2630..26351666            IDENT@2630..2635 "clamp"1667        PARAMS_DESC@2635..26541668          L_PAREN@2635..2636 "("1669          PARAM@2636..26371670            DESTRUCT_FULL@2636..26371671              NAME@2636..26371672                IDENT@2636..2637 "x"1673          COMMA@2637..2638 ","1674          WHITESPACE@2638..2639 " "1675          PARAM@2639..26451676            DESTRUCT_FULL@2639..26451677              NAME@2639..26451678                IDENT@2639..2645 "minVal"1679          COMMA@2645..2646 ","1680          WHITESPACE@2646..2647 " "1681          PARAM@2647..26531682            DESTRUCT_FULL@2647..26531683              NAME@2647..26531684                IDENT@2647..2653 "maxVal"1685          R_PAREN@2653..2654 ")"1686        COLONCOLON@2654..2656 "::"1687        WHITESPACE@2656..2661 "\n    "1688        EXPR_IF_THEN_ELSE@2661..27321689          IF_KW@2661..2663 "if"1690          WHITESPACE@2663..2664 " "1691          EXPR_BINARY@2664..26741692            LHS_EXPR@2664..26651693              EXPR_VAR@2664..26651694                NAME@2664..26651695                  IDENT@2664..2665 "x"1696            WHITESPACE@2665..2666 " "1697            LT@2666..2667 "<"1698            WHITESPACE@2667..2668 " "1699            EXPR_VAR@2668..26741700              NAME@2668..26741701                IDENT@2668..2674 "minVal"1702          WHITESPACE@2674..2675 " "1703          THEN_KW@2675..2679 "then"1704          WHITESPACE@2679..2680 " "1705          TRUE_EXPR@2680..26861706            EXPR_VAR@2680..26861707              NAME@2680..26861708                IDENT@2680..2686 "minVal"1709          WHITESPACE@2686..2691 "\n    "1710          ELSE_KW@2691..2695 "else"1711          WHITESPACE@2695..2696 " "1712          FALSE_EXPR@2696..27321713            EXPR_IF_THEN_ELSE@2696..27321714              IF_KW@2696..2698 "if"1715              WHITESPACE@2698..2699 " "1716              EXPR_BINARY@2699..27091717                LHS_EXPR@2699..27001718                  EXPR_VAR@2699..27001719                    NAME@2699..27001720                      IDENT@2699..2700 "x"1721                WHITESPACE@2700..2701 " "1722                GT@2701..2702 ">"1723                WHITESPACE@2702..2703 " "1724                EXPR_VAR@2703..27091725                  NAME@2703..27091726                    IDENT@2703..2709 "maxVal"1727              WHITESPACE@2709..2710 " "1728              THEN_KW@2710..2714 "then"1729              WHITESPACE@2714..2715 " "1730              TRUE_EXPR@2715..27211731                EXPR_VAR@2715..27211732                  NAME@2715..27211733                    IDENT@2715..2721 "maxVal"1734              WHITESPACE@2721..2726 "\n    "1735              ELSE_KW@2726..2730 "else"1736              WHITESPACE@2730..2731 " "1737              FALSE_EXPR@2731..27321738                EXPR_VAR@2731..27321739                  NAME@2731..27321740                    IDENT@2731..2732 "x"1741      COMMA@2732..2733 ","1742      WHITESPACE@2733..2737 "\n\n  "1743      MEMBER_FIELD_METHOD@2737..28041744        FIELD_NAME_FIXED@2737..27501745          NAME@2737..27501746            IDENT@2737..2750 "flattenArrays"1747        PARAMS_DESC@2750..27561748          L_PAREN@2750..2751 "("1749          PARAM@2751..27551750            DESTRUCT_FULL@2751..27551751              NAME@2751..27551752                IDENT@2751..2755 "arrs"1753          R_PAREN@2755..2756 ")"1754        COLONCOLON@2756..2758 "::"1755        WHITESPACE@2758..2763 "\n    "1756        EXPR_APPLY@2763..28041757          EXPR_INDEX@2763..27721758            EXPR_VAR@2763..27661759              NAME@2763..27661760                IDENT@2763..2766 "std"1761            DOT@2766..2767 "."1762            NAME@2767..27721763              IDENT@2767..2772 "foldl"1764          ARGS_DESC@2772..28041765            L_PAREN@2772..2773 "("1766            ARG@2773..27931767              EXPR_FUNCTION@2773..27931768                FUNCTION_KW@2773..2781 "function"1769                PARAMS_DESC@2781..27871770                  L_PAREN@2781..2782 "("1771                  PARAM@2782..27831772                    DESTRUCT_FULL@2782..27831773                      NAME@2782..27831774                        IDENT@2782..2783 "a"1775                  COMMA@2783..2784 ","1776                  WHITESPACE@2784..2785 " "1777                  PARAM@2785..27861778                    DESTRUCT_FULL@2785..27861779                      NAME@2785..27861780                        IDENT@2785..2786 "b"1781                  R_PAREN@2786..2787 ")"1782                WHITESPACE@2787..2788 " "1783                EXPR_BINARY@2788..27931784                  LHS_EXPR@2788..27891785                    EXPR_VAR@2788..27891786                      NAME@2788..27891787                        IDENT@2788..2789 "a"1788                  WHITESPACE@2789..2790 " "1789                  PLUS@2790..2791 "+"1790                  WHITESPACE@2791..2792 " "1791                  EXPR_VAR@2792..27931792                    NAME@2792..27931793                      IDENT@2792..2793 "b"1794            COMMA@2793..2794 ","1795            WHITESPACE@2794..2795 " "1796            ARG@2795..27991797              EXPR_VAR@2795..27991798                NAME@2795..27991799                  IDENT@2795..2799 "arrs"1800            COMMA@2799..2800 ","1801            WHITESPACE@2800..2801 " "1802            ARG@2801..28031803              EXPR_ARRAY@2801..28031804                L_BRACK@2801..2802 "["1805                R_BRACK@2802..2803 "]"1806            R_PAREN@2803..2804 ")"1807      COMMA@2804..2805 ","1808      WHITESPACE@2805..2809 "\n\n  "1809      MEMBER_FIELD_METHOD@2809..34951810        FIELD_NAME_FIXED@2809..28201811          NAME@2809..28201812            IDENT@2809..2820 "manifestIni"1813        PARAMS_DESC@2820..28251814          L_PAREN@2820..2821 "("1815          PARAM@2821..28241816            DESTRUCT_FULL@2821..28241817              NAME@2821..28241818                IDENT@2821..2824 "ini"1819          R_PAREN@2824..2825 ")"1820        COLONCOLON@2825..2827 "::"1821        WHITESPACE@2827..2832 "\n    "1822        STMT_LOCAL@2832..31361823          LOCAL_KW@2832..2837 "local"1824          WHITESPACE@2837..2838 " "1825          BIND_FUNCTION@2838..31351826            NAME@2838..28481827              IDENT@2838..2848 "body_lines"1828            PARAMS_DESC@2848..28541829              L_PAREN@2848..2849 "("1830              PARAM@2849..28531831                DESTRUCT_FULL@2849..28531832                  NAME@2849..28531833                    IDENT@2849..2853 "body"1834              R_PAREN@2853..2854 ")"1835            WHITESPACE@2854..2855 " "1836            ASSIGN@2855..2856 "="1837            WHITESPACE@2856..2863 "\n      "1838            EXPR_APPLY@2863..31351839              EXPR_INDEX@2863..28711840                EXPR_VAR@2863..28661841                  NAME@2863..28661842                    IDENT@2863..2866 "std"1843                DOT@2866..2867 "."1844                NAME@2867..28711845                  IDENT@2867..2871 "join"1846              ARGS_DESC@2871..31351847                L_PAREN@2871..2872 "("1848                ARG@2872..28741849                  EXPR_ARRAY@2872..28741850                    L_BRACK@2872..2873 "["1851                    R_BRACK@2873..2874 "]"1852                COMMA@2874..2875 ","1853                WHITESPACE@2875..2876 " "1854                ARG@2876..31341855                  EXPR_ARRAY_COMP@2876..31341856                    L_BRACK@2876..2877 "["1857                    WHITESPACE@2877..2886 "\n        "1858                    STMT_LOCAL@2886..29181859                      LOCAL_KW@2886..2891 "local"1860                      WHITESPACE@2891..2892 " "1861                      BIND_DESTRUCT@2892..29171862                        DESTRUCT_FULL@2892..29071863                          NAME@2892..29071864                            IDENT@2892..2907 "value_or_values"1865                        WHITESPACE@2907..2908 " "1866                        ASSIGN@2908..2909 "="1867                        WHITESPACE@2909..2910 " "1868                        EXPR_INDEX_EXPR@2910..29171869                          LHS_EXPR@2910..29141870                            EXPR_VAR@2910..29141871                              NAME@2910..29141872                                IDENT@2910..2914 "body"1873                          L_BRACK@2914..2915 "["1874                          EXPR_VAR@2915..29161875                            NAME@2915..29161876                              IDENT@2915..2916 "k"1877                          R_BRACK@2916..2917 "]"1878                      SEMI@2917..2918 ";"1879                    WHITESPACE@2918..2927 "\n        "1880                    EXPR_IF_THEN_ELSE@2927..30851881                      IF_KW@2927..2929 "if"1882                      WHITESPACE@2929..2930 " "1883                      EXPR_APPLY@2930..29581884                        EXPR_INDEX@2930..29411885                          EXPR_VAR@2930..29331886                            NAME@2930..29331887                              IDENT@2930..2933 "std"1888                          DOT@2933..2934 "."1889                          NAME@2934..29411890                            IDENT@2934..2941 "isArray"1891                        ARGS_DESC@2941..29581892                          L_PAREN@2941..2942 "("1893                          ARG@2942..29571894                            EXPR_VAR@2942..29571895                              NAME@2942..29571896                                IDENT@2942..2957 "value_or_values"1897                          R_PAREN@2957..2958 ")"1898                      WHITESPACE@2958..2959 " "1899                      THEN_KW@2959..2963 "then"1900                      WHITESPACE@2963..2974 "\n          "1901                      TRUE_EXPR@2974..30271902                        EXPR_ARRAY_COMP@2974..30271903                          L_BRACK@2974..2975 "["1904                          EXPR_BINARY@2975..29971905                            LHS_EXPR@2975..29841906                              EXPR_STRING@2975..29841907                                STRING_SINGLE@2975..2984 "'%s = %s'"1908                            WHITESPACE@2984..2985 " "1909                            MODULO@2985..2986 "%"1910                            WHITESPACE@2986..2987 " "1911                            EXPR_ARRAY@2987..29971912                              L_BRACK@2987..2988 "["1913                              EXPR_VAR@2988..29891914                                NAME@2988..29891915                                  IDENT@2988..2989 "k"1916                              COMMA@2989..2990 ","1917                              WHITESPACE@2990..2991 " "1918                              EXPR_VAR@2991..29961919                                NAME@2991..29961920                                  IDENT@2991..2996 "value"1921                              R_BRACK@2996..2997 "]"1922                          WHITESPACE@2997..2998 " "1923                          FOR_SPEC@2998..30261924                            FOR_KW@2998..3001 "for"1925                            WHITESPACE@3001..3002 " "1926                            NAME@3002..30071927                              IDENT@3002..3007 "value"1928                            WHITESPACE@3007..3008 " "1929                            IN_KW@3008..3010 "in"1930                            WHITESPACE@3010..3011 " "1931                            EXPR_VAR@3011..30261932                              NAME@3011..30261933                                IDENT@3011..3026 "value_or_values"1934                          R_BRACK@3026..3027 "]"1935                      WHITESPACE@3027..3036 "\n        "1936                      ELSE_KW@3036..3040 "else"1937                      WHITESPACE@3040..3051 "\n          "1938                      FALSE_EXPR@3051..30851939                        EXPR_ARRAY@3051..30851940                          L_BRACK@3051..3052 "["1941                          EXPR_BINARY@3052..30841942                            LHS_EXPR@3052..30611943                              EXPR_STRING@3052..30611944                                STRING_SINGLE@3052..3061 "'%s = %s'"1945                            WHITESPACE@3061..3062 " "1946                            MODULO@3062..3063 "%"1947                            WHITESPACE@3063..3064 " "1948                            EXPR_ARRAY@3064..30841949                              L_BRACK@3064..3065 "["1950                              EXPR_VAR@3065..30661951                                NAME@3065..30661952                                  IDENT@3065..3066 "k"1953                              COMMA@3066..3067 ","1954                              WHITESPACE@3067..3068 " "1955                              EXPR_VAR@3068..30831956                                NAME@3068..30831957                                  IDENT@3068..3083 "value_or_values"1958                              R_BRACK@3083..3084 "]"1959                          R_BRACK@3084..3085 "]"1960                    WHITESPACE@3085..3095 "\n\n        "1961                    FOR_SPEC@3095..31261962                      FOR_KW@3095..3098 "for"1963                      WHITESPACE@3098..3099 " "1964                      NAME@3099..31001965                        IDENT@3099..3100 "k"1966                      WHITESPACE@3100..3101 " "1967                      IN_KW@3101..3103 "in"1968                      WHITESPACE@3103..3104 " "1969                      EXPR_APPLY@3104..31261970                        EXPR_INDEX@3104..31201971                          EXPR_VAR@3104..31071972                            NAME@3104..31071973                              IDENT@3104..3107 "std"1974                          DOT@3107..3108 "."1975                          NAME@3108..31201976                            IDENT@3108..3120 "objectFields"1977                        ARGS_DESC@3120..31261978                          L_PAREN@3120..3121 "("1979                          ARG@3121..31251980                            EXPR_VAR@3121..31251981                              NAME@3121..31251982                                IDENT@3121..3125 "body"1983                          R_PAREN@3125..3126 ")"1984                    WHITESPACE@3126..3133 "\n      "1985                    R_BRACK@3133..3134 "]"1986                R_PAREN@3134..3135 ")"1987          SEMI@3135..3136 ";"1988        WHITESPACE@3136..3142 "\n\n    "1989        STMT_LOCAL@3142..34241990          LOCAL_KW@3142..3147 "local"1991          WHITESPACE@3147..3148 " "1992          BIND_FUNCTION@3148..32161993            NAME@3148..31611994              IDENT@3148..3161 "section_lines"1995            PARAMS_DESC@3161..31751996              L_PAREN@3161..3162 "("1997              PARAM@3162..31671998                DESTRUCT_FULL@3162..31671999                  NAME@3162..31672000                    IDENT@3162..3167 "sname"2001              COMMA@3167..3168 ","2002              WHITESPACE@3168..3169 " "2003              PARAM@3169..31742004                DESTRUCT_FULL@3169..31742005                  NAME@3169..31742006                    IDENT@3169..3174 "sbody"2007              R_PAREN@3174..3175 ")"2008            WHITESPACE@3175..3176 " "2009            ASSIGN@3176..3177 "="2010            WHITESPACE@3177..3178 " "2011            EXPR_BINARY@3178..32162012              LHS_EXPR@3178..31962013                EXPR_ARRAY@3178..31962014                  L_BRACK@3178..3179 "["2015                  EXPR_BINARY@3179..31952016                    LHS_EXPR@3179..31852017                      EXPR_STRING@3179..31852018                        STRING_SINGLE@3179..3185 "'[%s]'"2019                    WHITESPACE@3185..3186 " "2020                    MODULO@3186..3187 "%"2021                    WHITESPACE@3187..3188 " "2022                    EXPR_ARRAY@3188..31952023                      L_BRACK@3188..3189 "["2024                      EXPR_VAR@3189..31942025                        NAME@3189..31942026                          IDENT@3189..3194 "sname"2027                      R_BRACK@3194..3195 "]"2028                  R_BRACK@3195..3196 "]"2029              WHITESPACE@3196..3197 " "2030              PLUS@3197..3198 "+"2031              WHITESPACE@3198..3199 " "2032              EXPR_APPLY@3199..32162033                EXPR_VAR@3199..32092034                  NAME@3199..32092035                    IDENT@3199..3209 "body_lines"2036                ARGS_DESC@3209..32162037                  L_PAREN@3209..3210 "("2038                  ARG@3210..32152039                    EXPR_VAR@3210..32152040                      NAME@3210..32152041                        IDENT@3210..3215 "sbody"2042                  R_PAREN@3215..3216 ")"2043          COMMA@3216..3217 ","2044          WHITESPACE@3217..3228 "\n          "2045          BIND_DESTRUCT@3228..33032046            DESTRUCT_FULL@3228..32372047              NAME@3228..32372048                IDENT@3228..3237 "main_body"2049            WHITESPACE@3237..3238 " "2050            ASSIGN@3238..3239 "="2051            WHITESPACE@3239..3240 " "2052            EXPR_IF_THEN_ELSE@3240..33032053              IF_KW@3240..3242 "if"2054              WHITESPACE@3242..3243 " "2055              EXPR_APPLY@3243..32692056                EXPR_INDEX@3243..32562057                  EXPR_VAR@3243..32462058                    NAME@3243..32462059                      IDENT@3243..3246 "std"2060                  DOT@3246..3247 "."2061                  NAME@3247..32562062                    IDENT@3247..3256 "objectHas"2063                ARGS_DESC@3256..32692064                  L_PAREN@3256..3257 "("2065                  ARG@3257..32602066                    EXPR_VAR@3257..32602067                      NAME@3257..32602068                        IDENT@3257..3260 "ini"2069                  COMMA@3260..3261 ","2070                  WHITESPACE@3261..3262 " "2071                  ARG@3262..32682072                    EXPR_STRING@3262..32682073                      STRING_SINGLE@3262..3268 "'main'"2074                  R_PAREN@3268..3269 ")"2075              WHITESPACE@3269..3270 " "2076              THEN_KW@3270..3274 "then"2077              WHITESPACE@3274..3275 " "2078              TRUE_EXPR@3275..32952079                EXPR_APPLY@3275..32952080                  EXPR_VAR@3275..32852081                    NAME@3275..32852082                      IDENT@3275..3285 "body_lines"2083                  ARGS_DESC@3285..32952084                    L_PAREN@3285..3286 "("2085                    ARG@3286..32942086                      EXPR_INDEX@3286..32942087                        EXPR_VAR@3286..32892088                          NAME@3286..32892089                            IDENT@3286..3289 "ini"2090                        DOT@3289..3290 "."2091                        NAME@3290..32942092                          IDENT@3290..3294 "main"2093                    R_PAREN@3294..3295 ")"2094              WHITESPACE@3295..3296 " "2095              ELSE_KW@3296..3300 "else"2096              WHITESPACE@3300..3301 " "2097              FALSE_EXPR@3301..33032098                EXPR_ARRAY@3301..33032099                  L_BRACK@3301..3302 "["2100                  R_BRACK@3302..3303 "]"2101          COMMA@3303..3304 ","2102          WHITESPACE@3304..3315 "\n          "2103          BIND_DESTRUCT@3315..34232104            DESTRUCT_FULL@3315..33272105              NAME@3315..33272106                IDENT@3315..3327 "all_sections"2107            WHITESPACE@3327..3328 " "2108            ASSIGN@3328..3329 "="2109            WHITESPACE@3329..3330 " "2110            EXPR_ARRAY_COMP@3330..34232111              L_BRACK@3330..3331 "["2112              WHITESPACE@3331..3338 "\n      "2113              EXPR_APPLY@3338..33712114                EXPR_VAR@3338..33512115                  NAME@3338..33512116                    IDENT@3338..3351 "section_lines"2117                ARGS_DESC@3351..33712118                  L_PAREN@3351..3352 "("2119                  ARG@3352..33532120                    EXPR_VAR@3352..33532121                      NAME@3352..33532122                        IDENT@3352..3353 "k"2123                  COMMA@3353..3354 ","2124                  WHITESPACE@3354..3355 " "2125                  ARG@3355..33702126                    EXPR_INDEX_EXPR@3355..33702127                      LHS_EXPR@3355..33672128                        EXPR_INDEX@3355..33672129                          EXPR_VAR@3355..33582130                            NAME@3355..33582131                              IDENT@3355..3358 "ini"2132                          DOT@3358..3359 "."2133                          NAME@3359..33672134                            IDENT@3359..3367 "sections"2135                      L_BRACK@3367..3368 "["2136                      EXPR_VAR@3368..33692137                        NAME@3368..33692138                          IDENT@3368..3369 "k"2139                      R_BRACK@3369..3370 "]"2140                  R_PAREN@3370..3371 ")"2141              WHITESPACE@3371..3378 "\n      "2142              FOR_SPEC@3378..34172143                FOR_KW@3378..3381 "for"2144                WHITESPACE@3381..3382 " "2145                NAME@3382..33832146                  IDENT@3382..3383 "k"2147                WHITESPACE@3383..3384 " "2148                IN_KW@3384..3386 "in"2149                WHITESPACE@3386..3387 " "2150                EXPR_APPLY@3387..34172151                  EXPR_INDEX@3387..34032152                    EXPR_VAR@3387..33902153                      NAME@3387..33902154                        IDENT@3387..3390 "std"2155                    DOT@3390..3391 "."2156                    NAME@3391..34032157                      IDENT@3391..3403 "objectFields"2158                  ARGS_DESC@3403..34172159                    L_PAREN@3403..3404 "("2160                    ARG@3404..34162161                      EXPR_INDEX@3404..34162162                        EXPR_VAR@3404..34072163                          NAME@3404..34072164                            IDENT@3404..3407 "ini"2165                        DOT@3407..3408 "."2166                        NAME@3408..34162167                          IDENT@3408..3416 "sections"2168                    R_PAREN@3416..3417 ")"2169              WHITESPACE@3417..3422 "\n    "2170              R_BRACK@3422..3423 "]"2171          SEMI@3423..3424 ";"2172        WHITESPACE@3424..3429 "\n    "2173        EXPR_APPLY@3429..34952174          EXPR_INDEX@3429..34372175            EXPR_VAR@3429..34322176              NAME@3429..34322177                IDENT@3429..3432 "std"2178            DOT@3432..3433 "."2179            NAME@3433..34372180              IDENT@3433..3437 "join"2181          ARGS_DESC@3437..34952182            L_PAREN@3437..3438 "("2183            ARG@3438..34422184              EXPR_STRING@3438..34422185                STRING_SINGLE@3438..3442 "'\\n'"2186            COMMA@3442..3443 ","2187            WHITESPACE@3443..3444 " "2188            ARG@3444..34942189              EXPR_BINARY@3444..34942190                LHS_EXPR@3444..34872191                  EXPR_BINARY@3444..34872192                    LHS_EXPR@3444..34532193                      EXPR_VAR@3444..34532194                        NAME@3444..34532195                          IDENT@3444..3453 "main_body"2196                    WHITESPACE@3453..3454 " "2197                    PLUS@3454..3455 "+"2198                    WHITESPACE@3455..3456 " "2199                    EXPR_APPLY@3456..34872200                      EXPR_INDEX@3456..34732201                        EXPR_VAR@3456..34592202                          NAME@3456..34592203                            IDENT@3456..3459 "std"2204                        DOT@3459..3460 "."2205                        NAME@3460..34732206                          IDENT@3460..3473 "flattenArrays"2207                      ARGS_DESC@3473..34872208                        L_PAREN@3473..3474 "("2209                        ARG@3474..34862210                          EXPR_VAR@3474..34862211                            NAME@3474..34862212                              IDENT@3474..3486 "all_sections"2213                        R_PAREN@3486..3487 ")"2214                WHITESPACE@3487..3488 " "2215                PLUS@3488..3489 "+"2216                WHITESPACE@3489..3490 " "2217                EXPR_ARRAY@3490..34942218                  L_BRACK@3490..3491 "["2219                  EXPR_STRING@3491..34932220                    STRING_SINGLE@3491..3493 "''"2221                  R_BRACK@3493..3494 "]"2222            R_PAREN@3494..3495 ")"2223      COMMA@3495..3496 ","2224      WHITESPACE@3496..3500 "\n\n  "2225      MEMBER_FIELD_METHOD@3500..35532226        FIELD_NAME_FIXED@3500..35122227          NAME@3500..35122228            IDENT@3500..3512 "manifestToml"2229        PARAMS_DESC@3512..35192230          L_PAREN@3512..3513 "("2231          PARAM@3513..35182232            DESTRUCT_FULL@3513..35182233              NAME@3513..35182234                IDENT@3513..3518 "value"2235          R_PAREN@3518..3519 ")"2236        COLONCOLON@3519..3521 "::"2237        WHITESPACE@3521..3522 " "2238        EXPR_APPLY@3522..35532239          EXPR_INDEX@3522..35402240            EXPR_VAR@3522..35252241              NAME@3522..35252242                IDENT@3522..3525 "std"2243            DOT@3525..3526 "."2244            NAME@3526..35402245              IDENT@3526..3540 "manifestTomlEx"2246          ARGS_DESC@3540..35532247            L_PAREN@3540..3541 "("2248            ARG@3541..35462249              EXPR_VAR@3541..35462250                NAME@3541..35462251                  IDENT@3541..3546 "value"2252            COMMA@3546..3547 ","2253            WHITESPACE@3547..3548 " "2254            ARG@3548..35522255              EXPR_STRING@3548..35522256                STRING_SINGLE@3548..3552 "'  '"2257            R_PAREN@3552..3553 ")"2258      COMMA@3553..3554 ","2259      WHITESPACE@3554..3558 "\n\n  "2260      MEMBER_FIELD_METHOD@3558..36132261        FIELD_NAME_FIXED@3558..35762262          NAME@3558..35762263            IDENT@3558..3576 "escapeStringPython"2264        PARAMS_DESC@3576..35812265          L_PAREN@3576..3577 "("2266          PARAM@3577..35802267            DESTRUCT_FULL@3577..35802268              NAME@3577..35802269                IDENT@3577..3580 "str"2270          R_PAREN@3580..3581 ")"2271        COLONCOLON@3581..3583 "::"2272        WHITESPACE@3583..3588 "\n    "2273        EXPR_APPLY@3588..36132274          EXPR_INDEX@3588..36082275            EXPR_VAR@3588..35912276              NAME@3588..35912277                IDENT@3588..3591 "std"2278            DOT@3591..3592 "."2279            NAME@3592..36082280              IDENT@3592..3608 "escapeStringJson"2281          ARGS_DESC@3608..36132282            L_PAREN@3608..3609 "("2283            ARG@3609..36122284              EXPR_VAR@3609..36122285                NAME@3609..36122286                  IDENT@3609..3612 "str"2287            R_PAREN@3612..3613 ")"2288      COMMA@3613..3614 ","2289      WHITESPACE@3614..3618 "\n\n  "2290      MEMBER_FIELD_METHOD@3618..38352291        FIELD_NAME_FIXED@3618..36342292          NAME@3618..36342293            IDENT@3618..3634 "escapeStringBash"2294        PARAMS_DESC@3634..36402295          L_PAREN@3634..3635 "("2296          PARAM@3635..36392297            DESTRUCT_FULL@3635..36392298              NAME@3635..36392299                IDENT@3635..3639 "str_"2300          R_PAREN@3639..3640 ")"2301        COLONCOLON@3640..3642 "::"2302        WHITESPACE@3642..3647 "\n    "2303        STMT_LOCAL@3647..36782304          LOCAL_KW@3647..3652 "local"2305          WHITESPACE@3652..3653 " "2306          BIND_DESTRUCT@3653..36772307            DESTRUCT_FULL@3653..36562308              NAME@3653..36562309                IDENT@3653..3656 "str"2310            WHITESPACE@3656..3657 " "2311            ASSIGN@3657..3658 "="2312            WHITESPACE@3658..3659 " "2313            EXPR_APPLY@3659..36772314              EXPR_INDEX@3659..36712315                EXPR_VAR@3659..36622316                  NAME@3659..36622317                    IDENT@3659..3662 "std"2318                DOT@3662..3663 "."2319                NAME@3663..36712320                  IDENT@3663..3671 "toString"2321              ARGS_DESC@3671..36772322                L_PAREN@3671..3672 "("2323                ARG@3672..36762324                  EXPR_VAR@3672..36762325                    NAME@3672..36762326                      IDENT@3672..3676 "str_"2327                R_PAREN@3676..3677 ")"2328          SEMI@3677..3678 ";"2329        WHITESPACE@3678..3683 "\n    "2330        STMT_LOCAL@3683..37652331          LOCAL_KW@3683..3688 "local"2332          WHITESPACE@3688..3689 " "2333          BIND_FUNCTION@3689..37642334            NAME@3689..36942335              IDENT@3689..3694 "trans"2336            PARAMS_DESC@3694..36982337              L_PAREN@3694..3695 "("2338              PARAM@3695..36972339                DESTRUCT_FULL@3695..36972340                  NAME@3695..36972341                    IDENT@3695..3697 "ch"2342              R_PAREN@3697..3698 ")"2343            WHITESPACE@3698..3699 " "2344            ASSIGN@3699..3700 "="2345            WHITESPACE@3700..3707 "\n      "2346            EXPR_IF_THEN_ELSE@3707..37642347              IF_KW@3707..3709 "if"2348              WHITESPACE@3709..3710 " "2349              EXPR_BINARY@3710..37192350                LHS_EXPR@3710..37122351                  EXPR_VAR@3710..37122352                    NAME@3710..37122353                      IDENT@3710..3712 "ch"2354                WHITESPACE@3712..3713 " "2355                EQ@3713..3715 "=="2356                WHITESPACE@3715..3716 " "2357                EXPR_STRING@3716..37192358                  STRING_DOUBLE@3716..3719 "\"'\""2359              WHITESPACE@3719..3720 " "2360              THEN_KW@3720..3724 "then"2361              WHITESPACE@3724..3733 "\n        "2362              TRUE_EXPR@3733..37422363                EXPR_STRING@3733..37422364                  STRING_DOUBLE@3733..3742 "\"'\\\"'\\\"'\""2365              WHITESPACE@3742..3749 "\n      "2366              ELSE_KW@3749..3753 "else"2367              WHITESPACE@3753..3762 "\n        "2368              FALSE_EXPR@3762..37642369                EXPR_VAR@3762..37642370                  NAME@3762..37642371                    IDENT@3762..3764 "ch"2372          SEMI@3764..3765 ";"2373        WHITESPACE@3765..3770 "\n    "2374        EXPR_BINARY@3770..38352375          LHS_EXPR@3770..37762376            EXPR_STRING@3770..37762377              STRING_DOUBLE@3770..3776 "\"'%s'\""2378          WHITESPACE@3776..3777 " "2379          MODULO@3777..3778 "%"2380          WHITESPACE@3778..3779 " "2381          EXPR_APPLY@3779..38352382            EXPR_INDEX@3779..37872383              EXPR_VAR@3779..37822384                NAME@3779..37822385                  IDENT@3779..3782 "std"2386              DOT@3782..3783 "."2387              NAME@3783..37872388                IDENT@3783..3787 "join"2389            ARGS_DESC@3787..38352390              L_PAREN@3787..3788 "("2391              ARG@3788..37902392                EXPR_STRING@3788..37902393                  STRING_SINGLE@3788..3790 "''"2394              COMMA@3790..3791 ","2395              WHITESPACE@3791..3792 " "2396              ARG@3792..38342397                EXPR_ARRAY_COMP@3792..38342398                  L_BRACK@3792..3793 "["2399                  EXPR_APPLY@3793..38022400                    EXPR_VAR@3793..37982401                      NAME@3793..37982402                        IDENT@3793..3798 "trans"2403                    ARGS_DESC@3798..38022404                      L_PAREN@3798..3799 "("2405                      ARG@3799..38012406                        EXPR_VAR@3799..38012407                          NAME@3799..38012408                            IDENT@3799..3801 "ch"2409                      R_PAREN@3801..3802 ")"2410                  WHITESPACE@3802..3803 " "2411                  FOR_SPEC@3803..38332412                    FOR_KW@3803..3806 "for"2413                    WHITESPACE@3806..3807 " "2414                    NAME@3807..38092415                      IDENT@3807..3809 "ch"2416                    WHITESPACE@3809..3810 " "2417                    IN_KW@3810..3812 "in"2418                    WHITESPACE@3812..3813 " "2419                    EXPR_APPLY@3813..38332420                      EXPR_INDEX@3813..38282421                        EXPR_VAR@3813..38162422                          NAME@3813..38162423                            IDENT@3813..3816 "std"2424                        DOT@3816..3817 "."2425                        NAME@3817..38282426                          IDENT@3817..3828 "stringChars"2427                      ARGS_DESC@3828..38332428                        L_PAREN@3828..3829 "("2429                        ARG@3829..38322430                          EXPR_VAR@3829..38322431                            NAME@3829..38322432                              IDENT@3829..3832 "str"2433                        R_PAREN@3832..3833 ")"2434                  R_BRACK@3833..3834 "]"2435              R_PAREN@3834..3835 ")"2436      COMMA@3835..3836 ","2437      WHITESPACE@3836..3840 "\n\n  "2438      MEMBER_FIELD_METHOD@3840..40542439        FIELD_NAME_FIXED@3840..38592440          NAME@3840..38592441            IDENT@3840..3859 "escapeStringDollars"2442        PARAMS_DESC@3859..38652443          L_PAREN@3859..3860 "("2444          PARAM@3860..38642445            DESTRUCT_FULL@3860..38642446              NAME@3860..38642447                IDENT@3860..3864 "str_"2448          R_PAREN@3864..3865 ")"2449        COLONCOLON@3865..3867 "::"2450        WHITESPACE@3867..3872 "\n    "2451        STMT_LOCAL@3872..39032452          LOCAL_KW@3872..3877 "local"2453          WHITESPACE@3877..3878 " "2454          BIND_DESTRUCT@3878..39022455            DESTRUCT_FULL@3878..38812456              NAME@3878..38812457                IDENT@3878..3881 "str"2458            WHITESPACE@3881..3882 " "2459            ASSIGN@3882..3883 "="2460            WHITESPACE@3883..3884 " "2461            EXPR_APPLY@3884..39022462              EXPR_INDEX@3884..38962463                EXPR_VAR@3884..38872464                  NAME@3884..38872465                    IDENT@3884..3887 "std"2466                DOT@3887..3888 "."2467                NAME@3888..38962468                  IDENT@3888..3896 "toString"2469              ARGS_DESC@3896..39022470                L_PAREN@3896..3897 "("2471                ARG@3897..39012472                  EXPR_VAR@3897..39012473                    NAME@3897..39012474                      IDENT@3897..3901 "str_"2475                R_PAREN@3901..3902 ")"2476          SEMI@3902..3903 ";"2477        WHITESPACE@3903..3908 "\n    "2478        STMT_LOCAL@3908..39852479          LOCAL_KW@3908..3913 "local"2480          WHITESPACE@3913..3914 " "2481          BIND_FUNCTION@3914..39842482            NAME@3914..39192483              IDENT@3914..3919 "trans"2484            PARAMS_DESC@3919..39232485              L_PAREN@3919..3920 "("2486              PARAM@3920..39222487                DESTRUCT_FULL@3920..39222488                  NAME@3920..39222489                    IDENT@3920..3922 "ch"2490              R_PAREN@3922..3923 ")"2491            WHITESPACE@3923..3924 " "2492            ASSIGN@3924..3925 "="2493            WHITESPACE@3925..3932 "\n      "2494            EXPR_IF_THEN_ELSE@3932..39842495              IF_KW@3932..3934 "if"2496              WHITESPACE@3934..3935 " "2497              EXPR_BINARY@3935..39442498                LHS_EXPR@3935..39372499                  EXPR_VAR@3935..39372500                    NAME@3935..39372501                      IDENT@3935..3937 "ch"2502                WHITESPACE@3937..3938 " "2503                EQ@3938..3940 "=="2504                WHITESPACE@3940..3941 " "2505                EXPR_STRING@3941..39442506                  STRING_SINGLE@3941..3944 "'$'"2507              WHITESPACE@3944..3945 " "2508              THEN_KW@3945..3949 "then"2509              WHITESPACE@3949..3958 "\n        "2510              TRUE_EXPR@3958..39622511                EXPR_STRING@3958..39622512                  STRING_SINGLE@3958..3962 "'$$'"2513              WHITESPACE@3962..3969 "\n      "2514              ELSE_KW@3969..3973 "else"2515              WHITESPACE@3973..3982 "\n        "2516              FALSE_EXPR@3982..39842517                EXPR_VAR@3982..39842518                  NAME@3982..39842519                    IDENT@3982..3984 "ch"2520          SEMI@3984..3985 ";"2521        WHITESPACE@3985..3990 "\n    "2522        EXPR_APPLY@3990..40542523          EXPR_INDEX@3990..39992524            EXPR_VAR@3990..39932525              NAME@3990..39932526                IDENT@3990..3993 "std"2527            DOT@3993..3994 "."2528            NAME@3994..39992529              IDENT@3994..3999 "foldl"2530          ARGS_DESC@3999..40542531            L_PAREN@3999..4000 "("2532            ARG@4000..40272533              EXPR_FUNCTION@4000..40272534                FUNCTION_KW@4000..4008 "function"2535                PARAMS_DESC@4008..40142536                  L_PAREN@4008..4009 "("2537                  PARAM@4009..40102538                    DESTRUCT_FULL@4009..40102539                      NAME@4009..40102540                        IDENT@4009..4010 "a"2541                  COMMA@4010..4011 ","2542                  WHITESPACE@4011..4012 " "2543                  PARAM@4012..40132544                    DESTRUCT_FULL@4012..40132545                      NAME@4012..40132546                        IDENT@4012..4013 "b"2547                  R_PAREN@4013..4014 ")"2548                WHITESPACE@4014..4015 " "2549                EXPR_BINARY@4015..40272550                  LHS_EXPR@4015..40162551                    EXPR_VAR@4015..40162552                      NAME@4015..40162553                        IDENT@4015..4016 "a"2554                  WHITESPACE@4016..4017 " "2555                  PLUS@4017..4018 "+"2556                  WHITESPACE@4018..4019 " "2557                  EXPR_APPLY@4019..40272558                    EXPR_VAR@4019..40242559                      NAME@4019..40242560                        IDENT@4019..4024 "trans"2561                    ARGS_DESC@4024..40272562                      L_PAREN@4024..4025 "("2563                      ARG@4025..40262564                        EXPR_VAR@4025..40262565                          NAME@4025..40262566                            IDENT@4025..4026 "b"2567                      R_PAREN@4026..4027 ")"2568            COMMA@4027..4028 ","2569            WHITESPACE@4028..4029 " "2570            ARG@4029..40492571              EXPR_APPLY@4029..40492572                EXPR_INDEX@4029..40442573                  EXPR_VAR@4029..40322574                    NAME@4029..40322575                      IDENT@4029..4032 "std"2576                  DOT@4032..4033 "."2577                  NAME@4033..40442578                    IDENT@4033..4044 "stringChars"2579                ARGS_DESC@4044..40492580                  L_PAREN@4044..4045 "("2581                  ARG@4045..40482582                    EXPR_VAR@4045..40482583                      NAME@4045..40482584                        IDENT@4045..4048 "str"2585                  R_PAREN@4048..4049 ")"2586            COMMA@4049..4050 ","2587            WHITESPACE@4050..4051 " "2588            ARG@4051..40532589              EXPR_STRING@4051..40532590                STRING_SINGLE@4051..4053 "''"2591            R_PAREN@4053..4054 ")"2592      COMMA@4054..4055 ","2593      WHITESPACE@4055..4059 "\n\n  "2594      MEMBER_BIND_STMT@4059..41742595        OBJ_LOCAL@4059..41742596          LOCAL_KW@4059..4064 "local"2597          WHITESPACE@4064..4065 " "2598          BIND_DESTRUCT@4065..41742599            DESTRUCT_FULL@4065..40762600              NAME@4065..40762601                IDENT@4065..4076 "xml_escapes"2602            WHITESPACE@4076..4077 " "2603            ASSIGN@4077..4078 "="2604            WHITESPACE@4078..4079 " "2605            EXPR_OBJECT@4079..41742606              OBJ_BODY_MEMBER_LIST@4079..41742607                L_BRACE@4079..4080 "{"2608                WHITESPACE@4080..4085 "\n    "2609                MEMBER_FIELD_NORMAL@4085..40962610                  FIELD_NAME_FIXED@4085..40882611                    STRING_SINGLE@4085..4088 "'<'"2612                  COLON@4088..4089 ":"2613                  WHITESPACE@4089..4090 " "2614                  EXPR_STRING@4090..40962615                    STRING_SINGLE@4090..4096 "'&lt;'"2616                COMMA@4096..4097 ","2617                WHITESPACE@4097..4102 "\n    "2618                MEMBER_FIELD_NORMAL@4102..41132619                  FIELD_NAME_FIXED@4102..41052620                    STRING_SINGLE@4102..4105 "'>'"2621                  COLON@4105..4106 ":"2622                  WHITESPACE@4106..4107 " "2623                  EXPR_STRING@4107..41132624                    STRING_SINGLE@4107..4113 "'&gt;'"2625                COMMA@4113..4114 ","2626                WHITESPACE@4114..4119 "\n    "2627                MEMBER_FIELD_NORMAL@4119..41312628                  FIELD_NAME_FIXED@4119..41222629                    STRING_SINGLE@4119..4122 "'&'"2630                  COLON@4122..4123 ":"2631                  WHITESPACE@4123..4124 " "2632                  EXPR_STRING@4124..41312633                    STRING_SINGLE@4124..4131 "'&amp;'"2634                COMMA@4131..4132 ","2635                WHITESPACE@4132..4137 "\n    "2636                MEMBER_FIELD_NORMAL@4137..41502637                  FIELD_NAME_FIXED@4137..41402638                    STRING_SINGLE@4137..4140 "'\"'"2639                  COLON@4140..4141 ":"2640                  WHITESPACE@4141..4142 " "2641                  EXPR_STRING@4142..41502642                    STRING_SINGLE@4142..4150 "'&quot;'"2643                COMMA@4150..4151 ","2644                WHITESPACE@4151..4156 "\n    "2645                MEMBER_FIELD_NORMAL@4156..41692646                  FIELD_NAME_FIXED@4156..41592647                    STRING_DOUBLE@4156..4159 "\"'\""2648                  COLON@4159..4160 ":"2649                  WHITESPACE@4160..4161 " "2650                  EXPR_STRING@4161..41692651                    STRING_SINGLE@4161..4169 "'&apos;'"2652                COMMA@4169..4170 ","2653                WHITESPACE@4170..4173 "\n  "2654                R_BRACE@4173..4174 "}"2655      COMMA@4174..4175 ","2656      WHITESPACE@4175..4179 "\n\n  "2657      MEMBER_FIELD_METHOD@4179..43182658        FIELD_NAME_FIXED@4179..41942659          NAME@4179..41942660            IDENT@4179..4194 "escapeStringXML"2661        PARAMS_DESC@4194..42002662          L_PAREN@4194..4195 "("2663          PARAM@4195..41992664            DESTRUCT_FULL@4195..41992665              NAME@4195..41992666                IDENT@4195..4199 "str_"2667          R_PAREN@4199..4200 ")"2668        COLONCOLON@4200..4202 "::"2669        WHITESPACE@4202..4207 "\n    "2670        STMT_LOCAL@4207..42382671          LOCAL_KW@4207..4212 "local"2672          WHITESPACE@4212..4213 " "2673          BIND_DESTRUCT@4213..42372674            DESTRUCT_FULL@4213..42162675              NAME@4213..42162676                IDENT@4213..4216 "str"2677            WHITESPACE@4216..4217 " "2678            ASSIGN@4217..4218 "="2679            WHITESPACE@4218..4219 " "2680            EXPR_APPLY@4219..42372681              EXPR_INDEX@4219..42312682                EXPR_VAR@4219..42222683                  NAME@4219..42222684                    IDENT@4219..4222 "std"2685                DOT@4222..4223 "."2686                NAME@4223..42312687                  IDENT@4223..4231 "toString"2688              ARGS_DESC@4231..42372689                L_PAREN@4231..4232 "("2690                ARG@4232..42362691                  EXPR_VAR@4232..42362692                    NAME@4232..42362693                      IDENT@4232..4236 "str_"2694                R_PAREN@4236..4237 ")"2695          SEMI@4237..4238 ";"2696        WHITESPACE@4238..4243 "\n    "2697        EXPR_APPLY@4243..43182698          EXPR_INDEX@4243..42512699            EXPR_VAR@4243..42462700              NAME@4243..42462701                IDENT@4243..4246 "std"2702            DOT@4246..4247 "."2703            NAME@4247..42512704              IDENT@4247..4251 "join"2705          ARGS_DESC@4251..43182706            L_PAREN@4251..4252 "("2707            ARG@4252..42542708              EXPR_STRING@4252..42542709                STRING_SINGLE@4252..4254 "''"2710            COMMA@4254..4255 ","2711            WHITESPACE@4255..4256 " "2712            ARG@4256..43172713              EXPR_ARRAY_COMP@4256..43172714                L_BRACK@4256..4257 "["2715                EXPR_APPLY@4257..42852716                  EXPR_INDEX@4257..42642717                    EXPR_VAR@4257..42602718                      NAME@4257..42602719                        IDENT@4257..4260 "std"2720                    DOT@4260..4261 "."2721                    NAME@4261..42642722                      IDENT@4261..4264 "get"2723                  ARGS_DESC@4264..42852724                    L_PAREN@4264..4265 "("2725                    ARG@4265..42762726                      EXPR_VAR@4265..42762727                        NAME@4265..42762728                          IDENT@4265..4276 "xml_escapes"2729                    COMMA@4276..4277 ","2730                    WHITESPACE@4277..4278 " "2731                    ARG@4278..42802732                      EXPR_VAR@4278..42802733                        NAME@4278..42802734                          IDENT@4278..4280 "ch"2735                    COMMA@4280..4281 ","2736                    WHITESPACE@4281..4282 " "2737                    ARG@4282..42842738                      EXPR_VAR@4282..42842739                        NAME@4282..42842740                          IDENT@4282..4284 "ch"2741                    R_PAREN@4284..4285 ")"2742                WHITESPACE@4285..4286 " "2743                FOR_SPEC@4286..43162744                  FOR_KW@4286..4289 "for"2745                  WHITESPACE@4289..4290 " "2746                  NAME@4290..42922747                    IDENT@4290..4292 "ch"2748                  WHITESPACE@4292..4293 " "2749                  IN_KW@4293..4295 "in"2750                  WHITESPACE@4295..4296 " "2751                  EXPR_APPLY@4296..43162752                    EXPR_INDEX@4296..43112753                      EXPR_VAR@4296..42992754                        NAME@4296..42992755                          IDENT@4296..4299 "std"2756                      DOT@4299..4300 "."2757                      NAME@4300..43112758                        IDENT@4300..4311 "stringChars"2759                    ARGS_DESC@4311..43162760                      L_PAREN@4311..4312 "("2761                      ARG@4312..43152762                        EXPR_VAR@4312..43152763                          NAME@4312..43152764                            IDENT@4312..4315 "str"2765                      R_PAREN@4315..4316 ")"2766                R_BRACK@4316..4317 "]"2767            R_PAREN@4317..4318 ")"2768      COMMA@4318..4319 ","2769      WHITESPACE@4319..4323 "\n\n  "2770      MEMBER_FIELD_METHOD@4323..43892771        FIELD_NAME_FIXED@4323..43352772          NAME@4323..43352773            IDENT@4323..4335 "manifestJson"2774        PARAMS_DESC@4335..43422775          L_PAREN@4335..4336 "("2776          PARAM@4336..43412777            DESTRUCT_FULL@4336..43412778              NAME@4336..43412779                IDENT@4336..4341 "value"2780          R_PAREN@4341..4342 ")"2781        COLONCOLON@4342..4344 "::"2782        WHITESPACE@4344..4345 " "2783        EXPR_APPLY@4345..43892784          EXPR_INDEX@4345..43632785            EXPR_VAR@4345..43482786              NAME@4345..43482787                IDENT@4345..4348 "std"2788            DOT@4348..4349 "."2789            NAME@4349..43632790              IDENT@4349..4363 "manifestJsonEx"2791          ARGS_DESC@4363..43892792            L_PAREN@4363..4364 "("2793            ARG@4364..43692794              EXPR_VAR@4364..43692795                NAME@4364..43692796                  IDENT@4364..4369 "value"2797            COMMA@4369..4370 ","2798            WHITESPACE@4370..4371 " "2799            ARG@4371..43772800              EXPR_STRING@4371..43772801                STRING_SINGLE@4371..4377 "'    '"2802            R_PAREN@4377..4378 ")"2803            WHITESPACE@4378..4379 " "2804            TAILSTRICT_KW@4379..4389 "tailstrict"2805      COMMA@4389..4390 ","2806      WHITESPACE@4390..4394 "\n\n  "2807      MEMBER_FIELD_METHOD@4394..44622808        FIELD_NAME_FIXED@4394..44142809          NAME@4394..44142810            IDENT@4394..4414 "manifestJsonMinified"2811        PARAMS_DESC@4414..44212812          L_PAREN@4414..4415 "("2813          PARAM@4415..44202814            DESTRUCT_FULL@4415..44202815              NAME@4415..44202816                IDENT@4415..4420 "value"2817          R_PAREN@4420..4421 ")"2818        COLONCOLON@4421..4423 "::"2819        WHITESPACE@4423..4424 " "2820        EXPR_APPLY@4424..44622821          EXPR_INDEX@4424..44422822            EXPR_VAR@4424..44272823              NAME@4424..44272824                IDENT@4424..4427 "std"2825            DOT@4427..4428 "."2826            NAME@4428..44422827              IDENT@4428..4442 "manifestJsonEx"2828          ARGS_DESC@4442..44622829            L_PAREN@4442..4443 "("2830            ARG@4443..44482831              EXPR_VAR@4443..44482832                NAME@4443..44482833                  IDENT@4443..4448 "value"2834            COMMA@4448..4449 ","2835            WHITESPACE@4449..4450 " "2836            ARG@4450..44522837              EXPR_STRING@4450..44522838                STRING_SINGLE@4450..4452 "''"2839            COMMA@4452..4453 ","2840            WHITESPACE@4453..4454 " "2841            ARG@4454..44562842              EXPR_STRING@4454..44562843                STRING_SINGLE@4454..4456 "''"2844            COMMA@4456..4457 ","2845            WHITESPACE@4457..4458 " "2846            ARG@4458..44612847              EXPR_STRING@4458..44612848                STRING_SINGLE@4458..4461 "':'"2849            R_PAREN@4461..4462 ")"2850      COMMA@4462..4463 ","2851      WHITESPACE@4463..4467 "\n\n  "2852      MEMBER_FIELD_METHOD@4467..48522853        FIELD_NAME_FIXED@4467..44852854          NAME@4467..44852855            IDENT@4467..4485 "manifestYamlStream"2856        PARAMS_DESC@4485..45602857          L_PAREN@4485..4486 "("2858          PARAM@4486..44912859            DESTRUCT_FULL@4486..44912860              NAME@4486..44912861                IDENT@4486..4491 "value"2862          COMMA@4491..4492 ","2863          WHITESPACE@4492..4493 " "2864          PARAM@4493..45212865            DESTRUCT_FULL@4493..45152866              NAME@4493..45152867                IDENT@4493..4515 "indent_array_in_object"2868            ASSIGN@4515..4516 "="2869            EXPR_LITERAL@4516..45212870              FALSE_KW@4516..4521 "false"2871          COMMA@4521..4522 ","2872          WHITESPACE@4522..4523 " "2873          PARAM@4523..45422874            DESTRUCT_FULL@4523..45372875              NAME@4523..45372876                IDENT@4523..4537 "c_document_end"2877            ASSIGN@4537..4538 "="2878            EXPR_LITERAL@4538..45422879              TRUE_KW@4538..4542 "true"2880          COMMA@4542..4543 ","2881          WHITESPACE@4543..4544 " "2882          PARAM@4544..45592883            DESTRUCT_FULL@4544..45542884              NAME@4544..45542885                IDENT@4544..4554 "quote_keys"2886            ASSIGN@4554..4555 "="2887            EXPR_LITERAL@4555..45592888              TRUE_KW@4555..4559 "true"2889          R_PAREN@4559..4560 ")"2890        COLONCOLON@4560..4562 "::"2891        WHITESPACE@4562..4567 "\n    "2892        EXPR_IF_THEN_ELSE@4567..48522893          IF_KW@4567..4569 "if"2894          WHITESPACE@4569..4570 " "2895          EXPR_UNARY@4570..45892896            NOT@4570..4571 "!"2897            EXPR_APPLY@4571..45892898              EXPR_INDEX@4571..45822899                EXPR_VAR@4571..45742900                  NAME@4571..45742901                    IDENT@4571..4574 "std"2902                DOT@4574..4575 "."2903                NAME@4575..45822904                  IDENT@4575..4582 "isArray"2905              ARGS_DESC@4582..45892906                L_PAREN@4582..4583 "("2907                ARG@4583..45882908                  EXPR_VAR@4583..45882909                    NAME@4583..45882910                      IDENT@4583..4588 "value"2911                R_PAREN@4588..4589 ")"2912          WHITESPACE@4589..4590 " "2913          THEN_KW@4590..4594 "then"2914          WHITESPACE@4594..4601 "\n      "2915          TRUE_EXPR@4601..46692916            EXPR_ERROR@4601..46692917              ERROR_KW@4601..4606 "error"2918              WHITESPACE@4606..4607 " "2919              EXPR_BINARY@4607..46692920                LHS_EXPR@4607..46512921                  EXPR_STRING@4607..46512922                    STRING_SINGLE@4607..4651 "'manifestYamlStream o ..."2923                WHITESPACE@4651..4652 " "2924                PLUS@4652..4653 "+"2925                WHITESPACE@4653..4654 " "2926                EXPR_APPLY@4654..46692927                  EXPR_INDEX@4654..46622928                    EXPR_VAR@4654..46572929                      NAME@4654..46572930                        IDENT@4654..4657 "std"2931                    DOT@4657..4658 "."2932                    NAME@4658..46622933                      IDENT@4658..4662 "type"2934                  ARGS_DESC@4662..46692935                    L_PAREN@4662..4663 "("2936                    ARG@4663..46682937                      EXPR_VAR@4663..46682938                        NAME@4663..46682939                          IDENT@4663..4668 "value"2940                    R_PAREN@4668..4669 ")"2941          WHITESPACE@4669..4674 "\n    "2942          ELSE_KW@4674..4678 "else"2943          WHITESPACE@4678..4685 "\n      "2944          FALSE_EXPR@4685..48522945            EXPR_BINARY@4685..48522946              LHS_EXPR@4685..48072947                EXPR_BINARY@4685..48072948                  LHS_EXPR@4685..46922949                    EXPR_STRING@4685..46922950                      STRING_SINGLE@4685..4692 "'---\\n'"2951                  WHITESPACE@4692..4693 " "2952                  PLUS@4693..4694 "+"2953                  WHITESPACE@4694..4695 " "2954                  EXPR_APPLY@4695..48072955                    EXPR_INDEX@4695..47032956                      EXPR_VAR@4695..46982957                        NAME@4695..46982958                          IDENT@4695..4698 "std"2959                      DOT@4698..4699 "."2960                      NAME@4699..47032961                        IDENT@4699..4703 "join"2962                    ARGS_DESC@4703..48072963                      L_PAREN@4703..4704 "("2964                      WHITESPACE@4704..4713 "\n        "2965                      ARG@4713..47222966                        EXPR_STRING@4713..47222967                          STRING_SINGLE@4713..4722 "'\\n---\\n'"2968                      COMMA@4722..4723 ","2969                      WHITESPACE@4723..4724 " "2970                      ARG@4724..47992971                        EXPR_ARRAY_COMP@4724..47992972                          L_BRACK@4724..4725 "["2973                          EXPR_APPLY@4725..47832974                            EXPR_INDEX@4725..47442975                              EXPR_VAR@4725..47282976                                NAME@4725..47282977                                  IDENT@4725..4728 "std"2978                              DOT@4728..4729 "."2979                              NAME@4729..47442980                                IDENT@4729..4744 "manifestYamlDoc"2981                            ARGS_DESC@4744..47832982                              L_PAREN@4744..4745 "("2983                              ARG@4745..47462984                                EXPR_VAR@4745..47462985                                  NAME@4745..47462986                                    IDENT@4745..4746 "e"2987                              COMMA@4746..4747 ","2988                              WHITESPACE@4747..4748 " "2989                              ARG@4748..47702990                                EXPR_VAR@4748..47702991                                  NAME@4748..47702992                                    IDENT@4748..4770 "indent_array_in_object"2993                              COMMA@4770..4771 ","2994                              WHITESPACE@4771..4772 " "2995                              ARG@4772..47822996                                EXPR_VAR@4772..47822997                                  NAME@4772..47822998                                    IDENT@4772..4782 "quote_keys"2999                              R_PAREN@4782..4783 ")"3000                          WHITESPACE@4783..4784 " "3001                          FOR_SPEC@4784..47983002                            FOR_KW@4784..4787 "for"3003                            WHITESPACE@4787..4788 " "3004                            NAME@4788..47893005                              IDENT@4788..4789 "e"3006                            WHITESPACE@4789..4790 " "3007                            IN_KW@4790..4792 "in"3008                            WHITESPACE@4792..4793 " "3009                            EXPR_VAR@4793..47983010                              NAME@4793..47983011                                IDENT@4793..4798 "value"3012                          R_BRACK@4798..4799 "]"3013                      WHITESPACE@4799..4806 "\n      "3014                      R_PAREN@4806..4807 ")"3015              WHITESPACE@4807..4808 " "3016              PLUS@4808..4809 "+"3017              WHITESPACE@4809..4810 " "3018              EXPR_IF_THEN_ELSE@4810..48523019                IF_KW@4810..4812 "if"3020                WHITESPACE@4812..4813 " "3021                EXPR_VAR@4813..48273022                  NAME@4813..48273023                    IDENT@4813..4827 "c_document_end"3024                WHITESPACE@4827..4828 " "3025                THEN_KW@4828..4832 "then"3026                WHITESPACE@4832..4833 " "3027                TRUE_EXPR@4833..48423028                  EXPR_STRING@4833..48423029                    STRING_SINGLE@4833..4842 "'\\n...\\n'"3030                WHITESPACE@4842..4843 " "3031                ELSE_KW@4843..4847 "else"3032                WHITESPACE@4847..4848 " "3033                FALSE_EXPR@4848..48523034                  EXPR_STRING@4848..48523035                    STRING_SINGLE@4848..4852 "'\\n'"3036      COMMA@4852..4853 ","3037      WHITESPACE@4853..4857 "\n\n  "3038      MEMBER_FIELD_METHOD@4857..55133039        FIELD_NAME_FIXED@4857..48713040          NAME@4857..48713041            IDENT@4857..4871 "manifestPython"3042        PARAMS_DESC@4871..48743043          L_PAREN@4871..4872 "("3044          PARAM@4872..48733045            DESTRUCT_FULL@4872..48733046              NAME@4872..48733047                IDENT@4872..4873 "v"3048          R_PAREN@4873..4874 ")"3049        COLONCOLON@4874..4876 "::"3050        WHITESPACE@4876..4881 "\n    "3051        EXPR_IF_THEN_ELSE@4881..55133052          IF_KW@4881..4883 "if"3053          WHITESPACE@4883..4884 " "3054          EXPR_APPLY@4884..48993055            EXPR_INDEX@4884..48963056              EXPR_VAR@4884..48873057                NAME@4884..48873058                  IDENT@4884..4887 "std"3059              DOT@4887..4888 "."3060              NAME@4888..48963061                IDENT@4888..4896 "isObject"3062            ARGS_DESC@4896..48993063              L_PAREN@4896..4897 "("3064              ARG@4897..48983065                EXPR_VAR@4897..48983066                  NAME@4897..48983067                    IDENT@4897..4898 "v"3068              R_PAREN@4898..4899 ")"3069          WHITESPACE@4899..4900 " "3070          THEN_KW@4900..4904 "then"3071          WHITESPACE@4904..4911 "\n      "3072          STMT_LOCAL@4911..50463073            LOCAL_KW@4911..4916 "local"3074            WHITESPACE@4916..4917 " "3075            BIND_DESTRUCT@4917..50453076              DESTRUCT_FULL@4917..49233077                NAME@4917..49233078                  IDENT@4917..4923 "fields"3079              WHITESPACE@4923..4924 " "3080              ASSIGN@4924..4925 "="3081              WHITESPACE@4925..4926 " "3082              EXPR_ARRAY_COMP@4926..50453083                L_BRACK@4926..4927 "["3084                WHITESPACE@4927..4936 "\n        "3085                EXPR_BINARY@4936..50003086                  LHS_EXPR@4936..49443087                    EXPR_STRING@4936..49443088                      STRING_SINGLE@4936..4944 "'%s: %s'"3089                  WHITESPACE@4944..4945 " "3090                  MODULO@4945..4946 "%"3091                  WHITESPACE@4946..4947 " "3092                  EXPR_ARRAY@4947..50003093                    L_BRACK@4947..4948 "["3094                    EXPR_APPLY@4948..49733095                      EXPR_INDEX@4948..49703096                        EXPR_VAR@4948..49513097                          NAME@4948..49513098                            IDENT@4948..4951 "std"3099                        DOT@4951..4952 "."3100                        NAME@4952..49703101                          IDENT@4952..4970 "escapeStringPython"3102                      ARGS_DESC@4970..49733103                        L_PAREN@4970..4971 "("3104                        ARG@4971..49723105                          EXPR_VAR@4971..49723106                            NAME@4971..49723107                              IDENT@4971..4972 "k"3108                        R_PAREN@4972..4973 ")"3109                    COMMA@4973..4974 ","3110                    WHITESPACE@4974..4975 " "3111                    EXPR_APPLY@4975..49993112                      EXPR_INDEX@4975..49933113                        EXPR_VAR@4975..49783114                          NAME@4975..49783115                            IDENT@4975..4978 "std"3116                        DOT@4978..4979 "."3117                        NAME@4979..49933118                          IDENT@4979..4993 "manifestPython"3119                      ARGS_DESC@4993..49993120                        L_PAREN@4993..4994 "("3121                        ARG@4994..49983122                          EXPR_INDEX_EXPR@4994..49983123                            LHS_EXPR@4994..49953124                              EXPR_VAR@4994..49953125                                NAME@4994..49953126                                  IDENT@4994..4995 "v"3127                            L_BRACK@4995..4996 "["3128                            EXPR_VAR@4996..49973129                              NAME@4996..49973130                                IDENT@4996..4997 "k"3131                            R_BRACK@4997..4998 "]"3132                        R_PAREN@4998..4999 ")"3133                    R_BRACK@4999..5000 "]"3134                WHITESPACE@5000..5009 "\n        "3135                FOR_SPEC@5009..50373136                  FOR_KW@5009..5012 "for"3137                  WHITESPACE@5012..5013 " "3138                  NAME@5013..50143139                    IDENT@5013..5014 "k"3140                  WHITESPACE@5014..5015 " "3141                  IN_KW@5015..5017 "in"3142                  WHITESPACE@5017..5018 " "3143                  EXPR_APPLY@5018..50373144                    EXPR_INDEX@5018..50343145                      EXPR_VAR@5018..50213146                        NAME@5018..50213147                          IDENT@5018..5021 "std"3148                      DOT@5021..5022 "."3149                      NAME@5022..50343150                        IDENT@5022..5034 "objectFields"3151                    ARGS_DESC@5034..50373152                      L_PAREN@5034..5035 "("3153                      ARG@5035..50363154                        EXPR_VAR@5035..50363155                          NAME@5035..50363156                            IDENT@5035..5036 "v"3157                      R_PAREN@5036..5037 ")"3158                WHITESPACE@5037..5044 "\n      "3159                R_BRACK@5044..5045 "]"3160            SEMI@5045..5046 ";"3161          WHITESPACE@5046..5053 "\n      "3162          TRUE_EXPR@5053..50863163            EXPR_BINARY@5053..50863164              LHS_EXPR@5053..50593165                EXPR_STRING@5053..50593166                  STRING_SINGLE@5053..5059 "'{%s}'"3167              WHITESPACE@5059..5060 " "3168              MODULO@5060..5061 "%"3169              WHITESPACE@5061..5062 " "3170              EXPR_ARRAY@5062..50863171                L_BRACK@5062..5063 "["3172                EXPR_APPLY@5063..50853173                  EXPR_INDEX@5063..50713174                    EXPR_VAR@5063..50663175                      NAME@5063..50663176                        IDENT@5063..5066 "std"3177                    DOT@5066..5067 "."3178                    NAME@5067..50713179                      IDENT@5067..5071 "join"3180                  ARGS_DESC@5071..50853181                    L_PAREN@5071..5072 "("3182                    ARG@5072..50763183                      EXPR_STRING@5072..50763184                        STRING_SINGLE@5072..5076 "', '"3185                    COMMA@5076..5077 ","3186                    WHITESPACE@5077..5078 " "3187                    ARG@5078..50843188                      EXPR_VAR@5078..50843189                        NAME@5078..50843190                          IDENT@5078..5084 "fields"3191                    R_PAREN@5084..5085 ")"3192                R_BRACK@5085..5086 "]"3193          WHITESPACE@5086..5091 "\n    "3194          ELSE_KW@5091..5095 "else"3195          WHITESPACE@5095..5096 " "3196          FALSE_EXPR@5096..55133197            EXPR_IF_THEN_ELSE@5096..55133198              IF_KW@5096..5098 "if"3199              WHITESPACE@5098..5099 " "3200              EXPR_APPLY@5099..51133201                EXPR_INDEX@5099..51103202                  EXPR_VAR@5099..51023203                    NAME@5099..51023204                      IDENT@5099..5102 "std"3205                  DOT@5102..5103 "."3206                  NAME@5103..51103207                    IDENT@5103..5110 "isArray"3208                ARGS_DESC@5110..51133209                  L_PAREN@5110..5111 "("3210                  ARG@5111..51123211                    EXPR_VAR@5111..51123212                      NAME@5111..51123213                        IDENT@5111..5112 "v"3214                  R_PAREN@5112..5113 ")"3215              WHITESPACE@5113..5114 " "3216              THEN_KW@5114..5118 "then"3217              WHITESPACE@5118..5125 "\n      "3218              TRUE_EXPR@5125..51883219                EXPR_BINARY@5125..51883220                  LHS_EXPR@5125..51313221                    EXPR_STRING@5125..51313222                      STRING_SINGLE@5125..5131 "'[%s]'"3223                  WHITESPACE@5131..5132 " "3224                  MODULO@5132..5133 "%"3225                  WHITESPACE@5133..5134 " "3226                  EXPR_ARRAY@5134..51883227                    L_BRACK@5134..5135 "["3228                    EXPR_APPLY@5135..51873229                      EXPR_INDEX@5135..51433230                        EXPR_VAR@5135..51383231                          NAME@5135..51383232                            IDENT@5135..5138 "std"3233                        DOT@5138..5139 "."3234                        NAME@5139..51433235                          IDENT@5139..5143 "join"3236                      ARGS_DESC@5143..51873237                        L_PAREN@5143..5144 "("3238                        ARG@5144..51483239                          EXPR_STRING@5144..51483240                            STRING_SINGLE@5144..5148 "', '"3241                        COMMA@5148..5149 ","3242                        WHITESPACE@5149..5150 " "3243                        ARG@5150..51863244                          EXPR_ARRAY_COMP@5150..51863245                            L_BRACK@5150..5151 "["3246                            EXPR_APPLY@5151..51733247                              EXPR_INDEX@5151..51693248                                EXPR_VAR@5151..51543249                                  NAME@5151..51543250                                    IDENT@5151..5154 "std"3251                                DOT@5154..5155 "."3252                                NAME@5155..51693253                                  IDENT@5155..5169 "manifestPython"3254                              ARGS_DESC@5169..51733255                                L_PAREN@5169..5170 "("3256                                ARG@5170..51723257                                  EXPR_VAR@5170..51723258                                    NAME@5170..51723259                                      IDENT@5170..5172 "v2"3260                                R_PAREN@5172..5173 ")"3261                            WHITESPACE@5173..5174 " "3262                            FOR_SPEC@5174..51853263                              FOR_KW@5174..5177 "for"3264                              WHITESPACE@5177..5178 " "3265                              NAME@5178..51803266                                IDENT@5178..5180 "v2"3267                              WHITESPACE@5180..5181 " "3268                              IN_KW@5181..5183 "in"3269                              WHITESPACE@5183..5184 " "3270                              EXPR_VAR@5184..51853271                                NAME@5184..51853272                                  IDENT@5184..5185 "v"3273                            R_BRACK@5185..5186 "]"3274                        R_PAREN@5186..5187 ")"3275                    R_BRACK@5187..5188 "]"3276              WHITESPACE@5188..5193 "\n    "3277              ELSE_KW@5193..5197 "else"3278              WHITESPACE@5197..5198 " "3279              FALSE_EXPR@5198..55133280                EXPR_IF_THEN_ELSE@5198..55133281                  IF_KW@5198..5200 "if"3282                  WHITESPACE@5200..5201 " "3283                  EXPR_APPLY@5201..52163284                    EXPR_INDEX@5201..52133285                      EXPR_VAR@5201..52043286                        NAME@5201..52043287                          IDENT@5201..5204 "std"3288                      DOT@5204..5205 "."3289                      NAME@5205..52133290                        IDENT@5205..5213 "isString"3291                    ARGS_DESC@5213..52163292                      L_PAREN@5213..5214 "("3293                      ARG@5214..52153294                        EXPR_VAR@5214..52153295                          NAME@5214..52153296                            IDENT@5214..5215 "v"3297                      R_PAREN@5215..5216 ")"3298                  WHITESPACE@5216..5217 " "3299                  THEN_KW@5217..5221 "then"3300                  WHITESPACE@5221..5228 "\n      "3301                  TRUE_EXPR@5228..52623302                    EXPR_BINARY@5228..52623303                      LHS_EXPR@5228..52323304                        EXPR_STRING@5228..52323305                          STRING_SINGLE@5228..5232 "'%s'"3306                      WHITESPACE@5232..5233 " "3307                      MODULO@5233..5234 "%"3308                      WHITESPACE@5234..5235 " "3309                      EXPR_ARRAY@5235..52623310                        L_BRACK@5235..5236 "["3311                        EXPR_APPLY@5236..52613312                          EXPR_INDEX@5236..52583313                            EXPR_VAR@5236..52393314                              NAME@5236..52393315                                IDENT@5236..5239 "std"3316                            DOT@5239..5240 "."3317                            NAME@5240..52583318                              IDENT@5240..5258 "escapeStringPython"3319                          ARGS_DESC@5258..52613320                            L_PAREN@5258..5259 "("3321                            ARG@5259..52603322                              EXPR_VAR@5259..52603323                                NAME@5259..52603324                                  IDENT@5259..5260 "v"3325                            R_PAREN@5260..5261 ")"3326                        R_BRACK@5261..5262 "]"3327                  WHITESPACE@5262..5267 "\n    "3328                  ELSE_KW@5267..5271 "else"3329                  WHITESPACE@5271..5272 " "3330                  FALSE_EXPR@5272..55133331                    EXPR_IF_THEN_ELSE@5272..55133332                      IF_KW@5272..5274 "if"3333                      WHITESPACE@5274..5275 " "3334                      EXPR_APPLY@5275..52923335                        EXPR_INDEX@5275..52893336                          EXPR_VAR@5275..52783337                            NAME@5275..52783338                              IDENT@5275..5278 "std"3339                          DOT@5278..5279 "."3340                          NAME@5279..52893341                            IDENT@5279..5289 "isFunction"3342                        ARGS_DESC@5289..52923343                          L_PAREN@5289..5290 "("3344                          ARG@5290..52913345                            EXPR_VAR@5290..52913346                              NAME@5290..52913347                                IDENT@5290..5291 "v"3348                          R_PAREN@5291..5292 ")"3349                      WHITESPACE@5292..5293 " "3350                      THEN_KW@5293..5297 "then"3351                      WHITESPACE@5297..5304 "\n      "3352                      TRUE_EXPR@5304..53363353                        EXPR_ERROR@5304..53363354                          ERROR_KW@5304..5309 "error"3355                          WHITESPACE@5309..5310 " "3356                          EXPR_STRING@5310..53363357                            STRING_SINGLE@5310..5336 "'cannot manifest func ..."3358                      WHITESPACE@5336..5341 "\n    "3359                      ELSE_KW@5341..5345 "else"3360                      WHITESPACE@5345..5346 " "3361                      FALSE_EXPR@5346..55133362                        EXPR_IF_THEN_ELSE@5346..55133363                          IF_KW@5346..5348 "if"3364                          WHITESPACE@5348..5349 " "3365                          EXPR_APPLY@5349..53643366                            EXPR_INDEX@5349..53613367                              EXPR_VAR@5349..53523368                                NAME@5349..53523369                                  IDENT@5349..5352 "std"3370                              DOT@5352..5353 "."3371                              NAME@5353..53613372                                IDENT@5353..5361 "isNumber"3373                            ARGS_DESC@5361..53643374                              L_PAREN@5361..5362 "("3375                              ARG@5362..53633376                                EXPR_VAR@5362..53633377                                  NAME@5362..53633378                                    IDENT@5362..5363 "v"3379                              R_PAREN@5363..5364 ")"3380                          WHITESPACE@5364..5365 " "3381                          THEN_KW@5365..5369 "then"3382                          WHITESPACE@5369..5376 "\n      "3383                          TRUE_EXPR@5376..53913384                            EXPR_APPLY@5376..53913385                              EXPR_INDEX@5376..53883386                                EXPR_VAR@5376..53793387                                  NAME@5376..53793388                                    IDENT@5376..5379 "std"3389                                DOT@5379..5380 "."3390                                NAME@5380..53883391                                  IDENT@5380..5388 "toString"3392                              ARGS_DESC@5388..53913393                                L_PAREN@5388..5389 "("3394                                ARG@5389..53903395                                  EXPR_VAR@5389..53903396                                    NAME@5389..53903397                                      IDENT@5389..5390 "v"3398                                R_PAREN@5390..5391 ")"3399                          WHITESPACE@5391..5396 "\n    "3400                          ELSE_KW@5396..5400 "else"3401                          WHITESPACE@5400..5401 " "3402                          FALSE_EXPR@5401..55133403                            EXPR_IF_THEN_ELSE@5401..55133404                              IF_KW@5401..5403 "if"3405                              WHITESPACE@5403..5404 " "3406                              EXPR_BINARY@5404..54133407                                LHS_EXPR@5404..54053408                                  EXPR_VAR@5404..54053409                                    NAME@5404..54053410                                      IDENT@5404..5405 "v"3411                                WHITESPACE@5405..5406 " "3412                                EQ@5406..5408 "=="3413                                WHITESPACE@5408..5409 " "3414                                EXPR_LITERAL@5409..54133415                                  TRUE_KW@5409..5413 "true"3416                              WHITESPACE@5413..5414 " "3417                              THEN_KW@5414..5418 "then"3418                              WHITESPACE@5418..5425 "\n      "3419                              TRUE_EXPR@5425..54313420                                EXPR_STRING@5425..54313421                                  STRING_SINGLE@5425..5431 "'True'"3422                              WHITESPACE@5431..5436 "\n    "3423                              ELSE_KW@5436..5440 "else"3424                              WHITESPACE@5440..5441 " "3425                              FALSE_EXPR@5441..55133426                                EXPR_IF_THEN_ELSE@5441..55133427                                  IF_KW@5441..5443 "if"3428                                  WHITESPACE@5443..5444 " "3429                                  EXPR_BINARY@5444..54543430                                    LHS_EXPR@5444..54453431                                      EXPR_VAR@5444..54453432                                        NAME@5444..54453433                                          IDENT@5444..5445 "v"3434                                    WHITESPACE@5445..5446 " "3435                                    EQ@5446..5448 "=="3436                                    WHITESPACE@5448..5449 " "3437                                    EXPR_LITERAL@5449..54543438                                      FALSE_KW@5449..5454 "false"3439                                  WHITESPACE@5454..5455 " "3440                                  THEN_KW@5455..5459 "then"3441                                  WHITESPACE@5459..5466 "\n      "3442                                  TRUE_EXPR@5466..54733443                                    EXPR_STRING@5466..54733444                                      STRING_SINGLE@5466..5473 "'False'"3445                                  WHITESPACE@5473..5478 "\n    "3446                                  ELSE_KW@5478..5482 "else"3447                                  WHITESPACE@5482..5483 " "3448                                  FALSE_EXPR@5483..55133449                                    EXPR_IF_THEN_ELSE@5483..55133450                                      IF_KW@5483..5485 "if"3451                                      WHITESPACE@5485..5486 " "3452                                      EXPR_BINARY@5486..54953453                                        LHS_EXPR@5486..54873454                                          EXPR_VAR@5486..54873455                                            NAME@5486..54873456                                              IDENT@5486..5487 "v"3457                                        WHITESPACE@5487..5488 " "3458                                        EQ@5488..5490 "=="3459                                        WHITESPACE@5490..5491 " "3460                                        EXPR_LITERAL@5491..54953461                                          NULL_KW@5491..5495 "null"3462                                      WHITESPACE@5495..5496 " "3463                                      THEN_KW@5496..5500 "then"3464                                      WHITESPACE@5500..5507 "\n      "3465                                      TRUE_EXPR@5507..55133466                                        EXPR_STRING@5507..55133467                                          STRING_SINGLE@5507..5513 "'None'"3468      COMMA@5513..5514 ","3469      WHITESPACE@5514..5518 "\n\n  "3470      MEMBER_FIELD_METHOD@5518..56733471        FIELD_NAME_FIXED@5518..55363472          NAME@5518..55363473            IDENT@5518..5536 "manifestPythonVars"3474        PARAMS_DESC@5536..55423475          L_PAREN@5536..5537 "("3476          PARAM@5537..55413477            DESTRUCT_FULL@5537..55413478              NAME@5537..55413479                IDENT@5537..5541 "conf"3480          R_PAREN@5541..5542 ")"3481        COLONCOLON@5542..5544 "::"3482        WHITESPACE@5544..5549 "\n    "3483        STMT_LOCAL@5549..56413484          LOCAL_KW@5549..5554 "local"3485          WHITESPACE@5554..5555 " "3486          BIND_DESTRUCT@5555..56403487            DESTRUCT_FULL@5555..55593488              NAME@5555..55593489                IDENT@5555..5559 "vars"3490            WHITESPACE@5559..5560 " "3491            ASSIGN@5560..5561 "="3492            WHITESPACE@5561..5562 " "3493            EXPR_ARRAY_COMP@5562..56403494              L_BRACK@5562..5563 "["3495              EXPR_BINARY@5563..56073496                LHS_EXPR@5563..55723497                  EXPR_STRING@5563..55723498                    STRING_SINGLE@5563..5572 "'%s = %s'"3499                WHITESPACE@5572..5573 " "3500                MODULO@5573..5574 "%"3501                WHITESPACE@5574..5575 " "3502                EXPR_ARRAY@5575..56073503                  L_BRACK@5575..5576 "["3504                  EXPR_VAR@5576..55773505                    NAME@5576..55773506                      IDENT@5576..5577 "k"3507                  COMMA@5577..5578 ","3508                  WHITESPACE@5578..5579 " "3509                  EXPR_APPLY@5579..56063510                    EXPR_INDEX@5579..55973511                      EXPR_VAR@5579..55823512                        NAME@5579..55823513                          IDENT@5579..5582 "std"3514                      DOT@5582..5583 "."3515                      NAME@5583..55973516                        IDENT@5583..5597 "manifestPython"3517                    ARGS_DESC@5597..56063518                      L_PAREN@5597..5598 "("3519                      ARG@5598..56053520                        EXPR_INDEX_EXPR@5598..56053521                          LHS_EXPR@5598..56023522                            EXPR_VAR@5598..56023523                              NAME@5598..56023524                                IDENT@5598..5602 "conf"3525                          L_BRACK@5602..5603 "["3526                          EXPR_VAR@5603..56043527                            NAME@5603..56043528                              IDENT@5603..5604 "k"3529                          R_BRACK@5604..5605 "]"3530                      R_PAREN@5605..5606 ")"3531                  R_BRACK@5606..5607 "]"3532              WHITESPACE@5607..5608 " "3533              FOR_SPEC@5608..56393534                FOR_KW@5608..5611 "for"3535                WHITESPACE@5611..5612 " "3536                NAME@5612..56133537                  IDENT@5612..5613 "k"3538                WHITESPACE@5613..5614 " "3539                IN_KW@5614..5616 "in"3540                WHITESPACE@5616..5617 " "3541                EXPR_APPLY@5617..56393542                  EXPR_INDEX@5617..56333543                    EXPR_VAR@5617..56203544                      NAME@5617..56203545                        IDENT@5617..5620 "std"3546                    DOT@5620..5621 "."3547                    NAME@5621..56333548                      IDENT@5621..5633 "objectFields"3549                  ARGS_DESC@5633..56393550                    L_PAREN@5633..5634 "("3551                    ARG@5634..56383552                      EXPR_VAR@5634..56383553                        NAME@5634..56383554                          IDENT@5634..5638 "conf"3555                    R_PAREN@5638..5639 ")"3556              R_BRACK@5639..5640 "]"3557          SEMI@5640..5641 ";"3558        WHITESPACE@5641..5646 "\n    "3559        EXPR_APPLY@5646..56733560          EXPR_INDEX@5646..56543561            EXPR_VAR@5646..56493562              NAME@5646..56493563                IDENT@5646..5649 "std"3564            DOT@5649..5650 "."3565            NAME@5650..56543566              IDENT@5650..5654 "join"3567          ARGS_DESC@5654..56733568            L_PAREN@5654..5655 "("3569            ARG@5655..56593570              EXPR_STRING@5655..56593571                STRING_SINGLE@5655..5659 "'\\n'"3572            COMMA@5659..5660 ","3573            WHITESPACE@5660..5661 " "3574            ARG@5661..56723575              EXPR_BINARY@5661..56723576                LHS_EXPR@5661..56653577                  EXPR_VAR@5661..56653578                    NAME@5661..56653579                      IDENT@5661..5665 "vars"3580                WHITESPACE@5665..5666 " "3581                PLUS@5666..5667 "+"3582                WHITESPACE@5667..5668 " "3583                EXPR_ARRAY@5668..56723584                  L_BRACK@5668..5669 "["3585                  EXPR_STRING@5669..56713586                    STRING_SINGLE@5669..5671 "''"3587                  R_BRACK@5671..5672 "]"3588            R_PAREN@5672..5673 ")"3589      COMMA@5673..5674 ","3590      WHITESPACE@5674..5678 "\n\n  "3591      MEMBER_FIELD_METHOD@5678..63453592        FIELD_NAME_FIXED@5678..56953593          NAME@5678..56953594            IDENT@5678..5695 "manifestXmlJsonml"3595        PARAMS_DESC@5695..57023596          L_PAREN@5695..5696 "("3597          PARAM@5696..57013598            DESTRUCT_FULL@5696..57013599              NAME@5696..57013600                IDENT@5696..5701 "value"3601          R_PAREN@5701..5702 ")"3602        COLONCOLON@5702..5704 "::"3603        WHITESPACE@5704..5709 "\n    "3604        EXPR_IF_THEN_ELSE@5709..63453605          IF_KW@5709..5711 "if"3606          WHITESPACE@5711..5712 " "3607          EXPR_UNARY@5712..57313608            NOT@5712..5713 "!"3609            EXPR_APPLY@5713..57313610              EXPR_INDEX@5713..57243611                EXPR_VAR@5713..57163612                  NAME@5713..57163613                    IDENT@5713..5716 "std"3614                DOT@5716..5717 "."3615                NAME@5717..57243616                  IDENT@5717..5724 "isArray"3617              ARGS_DESC@5724..57313618                L_PAREN@5724..5725 "("3619                ARG@5725..57303620                  EXPR_VAR@5725..57303621                    NAME@5725..57303622                      IDENT@5725..5730 "value"3623                R_PAREN@5730..5731 ")"3624          WHITESPACE@5731..5732 " "3625          THEN_KW@5732..5736 "then"3626          WHITESPACE@5736..5743 "\n      "3627          TRUE_EXPR@5743..58113628            EXPR_ERROR@5743..58113629              ERROR_KW@5743..5748 "error"3630              WHITESPACE@5748..5749 " "3631              EXPR_BINARY@5749..58113632                LHS_EXPR@5749..57933633                  EXPR_STRING@5749..57933634                    STRING_SINGLE@5749..5793 "'Expected a JSONML va ..."3635                WHITESPACE@5793..5794 " "3636                MODULO@5794..5795 "%"3637                WHITESPACE@5795..5796 " "3638                EXPR_APPLY@5796..58113639                  EXPR_INDEX@5796..58043640                    EXPR_VAR@5796..57993641                      NAME@5796..57993642                        IDENT@5796..5799 "std"3643                    DOT@5799..5800 "."3644                    NAME@5800..58043645                      IDENT@5800..5804 "type"3646                  ARGS_DESC@5804..58113647                    L_PAREN@5804..5805 "("3648                    ARG@5805..58103649                      EXPR_VAR@5805..58103650                        NAME@5805..58103651                          IDENT@5805..5810 "value"3652                    R_PAREN@5810..5811 ")"3653          WHITESPACE@5811..5816 "\n    "3654          ELSE_KW@5816..5820 "else"3655          WHITESPACE@5820..5827 "\n      "3656          STMT_LOCAL@5827..63273657            LOCAL_KW@5827..5832 "local"3658            WHITESPACE@5832..5833 " "3659            BIND_FUNCTION@5833..63263660              NAME@5833..58363661                IDENT@5833..5836 "aux"3662              PARAMS_DESC@5836..58393663                L_PAREN@5836..5837 "("3664                PARAM@5837..58383665                  DESTRUCT_FULL@5837..58383666                    NAME@5837..58383667                      IDENT@5837..5838 "v"3668                R_PAREN@5838..5839 ")"3669              WHITESPACE@5839..5840 " "3670              ASSIGN@5840..5841 "="3671              WHITESPACE@5841..5850 "\n        "3672              EXPR_IF_THEN_ELSE@5850..63263673                IF_KW@5850..5852 "if"3674                WHITESPACE@5852..5853 " "3675                EXPR_APPLY@5853..58683676                  EXPR_INDEX@5853..58653677                    EXPR_VAR@5853..58563678                      NAME@5853..58563679                        IDENT@5853..5856 "std"3680                    DOT@5856..5857 "."3681                    NAME@5857..58653682                      IDENT@5857..5865 "isString"3683                  ARGS_DESC@5865..58683684                    L_PAREN@5865..5866 "("3685                    ARG@5866..58673686                      EXPR_VAR@5866..58673687                        NAME@5866..58673688                          IDENT@5866..5867 "v"3689                    R_PAREN@5867..5868 ")"3690                WHITESPACE@5868..5869 " "3691                THEN_KW@5869..5873 "then"3692                WHITESPACE@5873..5884 "\n          "3693                TRUE_EXPR@5884..58853694                  EXPR_VAR@5884..58853695                    NAME@5884..58853696                      IDENT@5884..5885 "v"3697                WHITESPACE@5885..5894 "\n        "3698                ELSE_KW@5894..5898 "else"3699                WHITESPACE@5898..5909 "\n          "3700                STMT_LOCAL@5909..59263701                  LOCAL_KW@5909..5914 "local"3702                  WHITESPACE@5914..5915 " "3703                  BIND_DESTRUCT@5915..59253704                    DESTRUCT_FULL@5915..59183705                      NAME@5915..59183706                        IDENT@5915..5918 "tag"3707                    WHITESPACE@5918..5919 " "3708                    ASSIGN@5919..5920 "="3709                    WHITESPACE@5920..5921 " "3710                    EXPR_INDEX_EXPR@5921..59253711                      LHS_EXPR@5921..59223712                        EXPR_VAR@5921..59223713                          NAME@5921..59223714                            IDENT@5921..5922 "v"3715                      L_BRACK@5922..5923 "["3716                      EXPR_NUMBER@5923..59243717                        FLOAT@5923..5924 "0"3718                      R_BRACK@5924..5925 "]"3719                  SEMI@5925..5926 ";"3720                WHITESPACE@5926..5937 "\n          "3721                STMT_LOCAL@5937..59953722                  LOCAL_KW@5937..5942 "local"3723                  WHITESPACE@5942..5943 " "3724                  BIND_DESTRUCT@5943..59943725                    DESTRUCT_FULL@5943..59523726                      NAME@5943..59523727                        IDENT@5943..5952 "has_attrs"3728                    WHITESPACE@5952..5953 " "3729                    ASSIGN@5953..5954 "="3730                    WHITESPACE@5954..5955 " "3731                    EXPR_BINARY@5955..59943732                      LHS_EXPR@5955..59723733                        EXPR_BINARY@5955..59723734                          LHS_EXPR@5955..59683735                            EXPR_APPLY@5955..59683736                              EXPR_INDEX@5955..59653737                                EXPR_VAR@5955..59583738                                  NAME@5955..59583739                                    IDENT@5955..5958 "std"3740                                DOT@5958..5959 "."3741                                NAME@5959..59653742                                  IDENT@5959..5965 "length"3743                              ARGS_DESC@5965..59683744                                L_PAREN@5965..5966 "("3745                                ARG@5966..59673746                                  EXPR_VAR@5966..59673747                                    NAME@5966..59673748                                      IDENT@5966..5967 "v"3749                                R_PAREN@5967..5968 ")"3750                          WHITESPACE@5968..5969 " "3751                          GT@5969..5970 ">"3752                          WHITESPACE@5970..5971 " "3753                          EXPR_NUMBER@5971..59723754                            FLOAT@5971..5972 "1"3755                      WHITESPACE@5972..5973 " "3756                      AND@5973..5975 "&&"3757                      WHITESPACE@5975..5976 " "3758                      EXPR_APPLY@5976..59943759                        EXPR_INDEX@5976..59883760                          EXPR_VAR@5976..59793761                            NAME@5976..59793762                              IDENT@5976..5979 "std"3763                          DOT@5979..5980 "."3764                          NAME@5980..59883765                            IDENT@5980..5988 "isObject"3766                        ARGS_DESC@5988..59943767                          L_PAREN@5988..5989 "("3768                          ARG@5989..59933769                            EXPR_INDEX_EXPR@5989..59933770                              LHS_EXPR@5989..59903771                                EXPR_VAR@5989..59903772                                  NAME@5989..59903773                                    IDENT@5989..5990 "v"3774                              L_BRACK@5990..5991 "["3775                              EXPR_NUMBER@5991..59923776                                FLOAT@5991..5992 "1"3777                              R_BRACK@5992..5993 "]"3778                          R_PAREN@5993..5994 ")"3779                  SEMI@5994..5995 ";"3780                WHITESPACE@5995..6006 "\n          "3781                STMT_LOCAL@6006..60513782                  LOCAL_KW@6006..6011 "local"3783                  WHITESPACE@6011..6012 " "3784                  BIND_DESTRUCT@6012..60503785                    DESTRUCT_FULL@6012..60173786                      NAME@6012..60173787                        IDENT@6012..6017 "attrs"3788                    WHITESPACE@6017..6018 " "3789                    ASSIGN@6018..6019 "="3790                    WHITESPACE@6019..6020 " "3791                    EXPR_IF_THEN_ELSE@6020..60503792                      IF_KW@6020..6022 "if"3793                      WHITESPACE@6022..6023 " "3794                      EXPR_VAR@6023..60323795                        NAME@6023..60323796                          IDENT@6023..6032 "has_attrs"3797                      WHITESPACE@6032..6033 " "3798                      THEN_KW@6033..6037 "then"3799                      WHITESPACE@6037..6038 " "3800                      TRUE_EXPR@6038..60423801                        EXPR_INDEX_EXPR@6038..60423802                          LHS_EXPR@6038..60393803                            EXPR_VAR@6038..60393804                              NAME@6038..60393805                                IDENT@6038..6039 "v"3806                          L_BRACK@6039..6040 "["3807                          EXPR_NUMBER@6040..60413808                            FLOAT@6040..6041 "1"3809                          R_BRACK@6041..6042 "]"3810                      WHITESPACE@6042..6043 " "3811                      ELSE_KW@6043..6047 "else"3812                      WHITESPACE@6047..6048 " "3813                      FALSE_EXPR@6048..60503814                        EXPR_OBJECT@6048..60503815                          OBJ_BODY_MEMBER_LIST@6048..60503816                            L_BRACE@6048..6049 "{"3817                            R_BRACE@6049..6050 "}"3818                  SEMI@6050..6051 ";"3819                WHITESPACE@6051..6062 "\n          "3820                STMT_LOCAL@6062..61143821                  LOCAL_KW@6062..6067 "local"3822                  WHITESPACE@6067..6068 " "3823                  BIND_DESTRUCT@6068..61133824                    DESTRUCT_FULL@6068..60763825                      NAME@6068..60763826                        IDENT@6068..6076 "children"3827                    WHITESPACE@6076..6077 " "3828                    ASSIGN@6077..6078 "="3829                    WHITESPACE@6078..6079 " "3830                    EXPR_IF_THEN_ELSE@6079..61133831                      IF_KW@6079..6081 "if"3832                      WHITESPACE@6081..6082 " "3833                      EXPR_VAR@6082..60913834                        NAME@6082..60913835                          IDENT@6082..6091 "has_attrs"3836                      WHITESPACE@6091..6092 " "3837                      THEN_KW@6092..6096 "then"3838                      WHITESPACE@6096..6097 " "3839                      TRUE_EXPR@6097..61023840                        EXPR_SLICE@6097..61023841                          EXPR_VAR@6097..60983842                            NAME@6097..60983843                              IDENT@6097..6098 "v"3844                          SLICE_DESC@6098..61023845                            L_BRACK@6098..6099 "["3846                            EXPR_NUMBER@6099..61003847                              FLOAT@6099..6100 "2"3848                            COLON@6100..6101 ":"3849                            R_BRACK@6101..6102 "]"3850                      WHITESPACE@6102..6103 " "3851                      ELSE_KW@6103..6107 "else"3852                      WHITESPACE@6107..6108 " "3853                      FALSE_EXPR@6108..61133854                        EXPR_SLICE@6108..61133855                          EXPR_VAR@6108..61093856                            NAME@6108..61093857                              IDENT@6108..6109 "v"3858                          SLICE_DESC@6109..61133859                            L_BRACK@6109..6110 "["3860                            EXPR_NUMBER@6110..61113861                              FLOAT@6110..6111 "1"3862                            COLON@6111..6112 ":"3863                            R_BRACK@6112..6113 "]"3864                  SEMI@6113..6114 ";"3865                WHITESPACE@6114..6125 "\n          "3866                STMT_LOCAL@6125..62313867                  LOCAL_KW@6125..6130 "local"3868                  WHITESPACE@6130..6131 " "3869                  BIND_DESTRUCT@6131..62303870                    DESTRUCT_FULL@6131..61403871                      NAME@6131..61403872                        IDENT@6131..6140 "attrs_str"3873                    WHITESPACE@6140..6141 " "3874                    ASSIGN@6141..6142 "="3875                    WHITESPACE@6142..6155 "\n            "3876                    EXPR_APPLY@6155..62303877                      EXPR_INDEX@6155..61633878                        EXPR_VAR@6155..61583879                          NAME@6155..61583880                            IDENT@6155..6158 "std"3881                        DOT@6158..6159 "."3882                        NAME@6159..61633883                          IDENT@6159..6163 "join"3884                      ARGS_DESC@6163..62303885                        L_PAREN@6163..6164 "("3886                        ARG@6164..61663887                          EXPR_STRING@6164..61663888                            STRING_SINGLE@6164..6166 "''"3889                        COMMA@6166..6167 ","3890                        WHITESPACE@6167..6168 " "3891                        ARG@6168..62293892                          EXPR_ARRAY_COMP@6168..62293893                            L_BRACK@6168..6169 "["3894                            EXPR_BINARY@6169..61953895                              LHS_EXPR@6169..61793896                                EXPR_STRING@6169..61793897                                  STRING_SINGLE@6169..6179 "' %s=\"%s\"'"3898                              WHITESPACE@6179..6180 " "3899                              MODULO@6180..6181 "%"3900                              WHITESPACE@6181..6182 " "3901                              EXPR_ARRAY@6182..61953902                                L_BRACK@6182..6183 "["3903                                EXPR_VAR@6183..61843904                                  NAME@6183..61843905                                    IDENT@6183..6184 "k"3906                                COMMA@6184..6185 ","3907                                WHITESPACE@6185..6186 " "3908                                EXPR_INDEX_EXPR@6186..61943909                                  LHS_EXPR@6186..61913910                                    EXPR_VAR@6186..61913911                                      NAME@6186..61913912                                        IDENT@6186..6191 "attrs"3913                                  L_BRACK@6191..6192 "["3914                                  EXPR_VAR@6192..61933915                                    NAME@6192..61933916                                      IDENT@6192..6193 "k"3917                                  R_BRACK@6193..6194 "]"3918                                R_BRACK@6194..6195 "]"3919                            WHITESPACE@6195..6196 " "3920                            FOR_SPEC@6196..62283921                              FOR_KW@6196..6199 "for"3922                              WHITESPACE@6199..6200 " "3923                              NAME@6200..62013924                                IDENT@6200..6201 "k"3925                              WHITESPACE@6201..6202 " "3926                              IN_KW@6202..6204 "in"3927                              WHITESPACE@6204..6205 " "3928                              EXPR_APPLY@6205..62283929                                EXPR_INDEX@6205..62213930                                  EXPR_VAR@6205..62083931                                    NAME@6205..62083932                                      IDENT@6205..6208 "std"3933                                  DOT@6208..6209 "."3934                                  NAME@6209..62213935                                    IDENT@6209..6221 "objectFields"3936                                ARGS_DESC@6221..62283937                                  L_PAREN@6221..6222 "("3938                                  ARG@6222..62273939                                    EXPR_VAR@6222..62273940                                      NAME@6222..62273941                                        IDENT@6222..6227 "attrs"3942                                  R_PAREN@6227..6228 ")"3943                            R_BRACK@6228..6229 "]"3944                        R_PAREN@6229..6230 ")"3945                  SEMI@6230..6231 ";"3946                WHITESPACE@6231..6242 "\n          "3947                FALSE_EXPR@6242..63263948                  EXPR_APPLY@6242..63263949                    EXPR_INDEX@6242..62543950                      EXPR_VAR@6242..62453951                        NAME@6242..62453952                          IDENT@6242..6245 "std"3953                      DOT@6245..6246 "."3954                      NAME@6246..62543955                        IDENT@6246..6254 "deepJoin"3956                    ARGS_DESC@6254..63263957                      L_PAREN@6254..6255 "("3958                      ARG@6255..63253959                        EXPR_ARRAY@6255..63253960                          L_BRACK@6255..6256 "["3961                          EXPR_STRING@6256..62593962                            STRING_SINGLE@6256..6259 "'<'"3963                          COMMA@6259..6260 ","3964                          WHITESPACE@6260..6261 " "3965                          EXPR_VAR@6261..62643966                            NAME@6261..62643967                              IDENT@6261..6264 "tag"3968                          COMMA@6264..6265 ","3969                          WHITESPACE@6265..6266 " "3970                          EXPR_VAR@6266..62753971                            NAME@6266..62753972                              IDENT@6266..6275 "attrs_str"3973                          COMMA@6275..6276 ","3974                          WHITESPACE@6276..6277 " "3975                          EXPR_STRING@6277..62803976                            STRING_SINGLE@6277..6280 "'>'"3977                          COMMA@6280..6281 ","3978                          WHITESPACE@6281..6282 " "3979                          EXPR_ARRAY_COMP@6282..63083980                            L_BRACK@6282..6283 "["3981                            EXPR_APPLY@6283..62893982                              EXPR_VAR@6283..62863983                                NAME@6283..62863984                                  IDENT@6283..6286 "aux"3985                              ARGS_DESC@6286..62893986                                L_PAREN@6286..6287 "("3987                                ARG@6287..62883988                                  EXPR_VAR@6287..62883989                                    NAME@6287..62883990                                      IDENT@6287..6288 "x"3991                                R_PAREN@6288..6289 ")"3992                            WHITESPACE@6289..6290 " "3993                            FOR_SPEC@6290..63073994                              FOR_KW@6290..6293 "for"3995                              WHITESPACE@6293..6294 " "3996                              NAME@6294..62953997                                IDENT@6294..6295 "x"3998                              WHITESPACE@6295..6296 " "3999                              IN_KW@6296..6298 "in"4000                              WHITESPACE@6298..6299 " "4001                              EXPR_VAR@6299..63074002                                NAME@6299..63074003                                  IDENT@6299..6307 "children"4004                            R_BRACK@6307..6308 "]"4005                          COMMA@6308..6309 ","4006                          WHITESPACE@6309..6310 " "4007                          EXPR_STRING@6310..63144008                            STRING_SINGLE@6310..6314 "'</'"4009                          COMMA@6314..6315 ","4010                          WHITESPACE@6315..6316 " "4011                          EXPR_VAR@6316..63194012                            NAME@6316..63194013                              IDENT@6316..6319 "tag"4014                          COMMA@6319..6320 ","4015                          WHITESPACE@6320..6321 " "4016                          EXPR_STRING@6321..63244017                            STRING_SINGLE@6321..6324 "'>'"4018                          R_BRACK@6324..6325 "]"4019                      R_PAREN@6325..6326 ")"4020            SEMI@6326..6327 ";"4021          WHITESPACE@6327..6335 "\n\n      "4022          FALSE_EXPR@6335..63454023            EXPR_APPLY@6335..63454024              EXPR_VAR@6335..63384025                NAME@6335..63384026                  IDENT@6335..6338 "aux"4027              ARGS_DESC@6338..63454028                L_PAREN@6338..6339 "("4029                ARG@6339..63444030                  EXPR_VAR@6339..63444031                    NAME@6339..63444032                      IDENT@6339..6344 "value"4033                R_PAREN@6344..6345 ")"4034      COMMA@6345..6346 ","4035      WHITESPACE@6346..6350 "\n\n  "4036      MEMBER_FIELD_METHOD@6350..68994037        FIELD_NAME_FIXED@6350..63584038          NAME@6350..63584039            IDENT@6350..6358 "setUnion"4040        PARAMS_DESC@6358..63734041          L_PAREN@6358..6359 "("4042          PARAM@6359..63604043            DESTRUCT_FULL@6359..63604044              NAME@6359..63604045                IDENT@6359..6360 "a"4046          COMMA@6360..6361 ","4047          WHITESPACE@6361..6362 " "4048          PARAM@6362..63634049            DESTRUCT_FULL@6362..63634050              NAME@6362..63634051                IDENT@6362..6363 "b"4052          COMMA@6363..6364 ","4053          WHITESPACE@6364..6365 " "4054          PARAM@6365..63724055            DESTRUCT_FULL@6365..63694056              NAME@6365..63694057                IDENT@6365..6369 "keyF"4058            ASSIGN@6369..6370 "="4059            EXPR_VAR@6370..63724060              NAME@6370..63724061                IDENT@6370..6372 "id"4062          R_PAREN@6372..6373 ")"4063        COLONCOLON@6373..6375 "::"4064        WHITESPACE@6375..6380 "\n    "4065        SINGLE_LINE_SLASH_COMMENT@6380..6422 "// NOTE: order matter ..."4066        WHITESPACE@6422..6426 "    "4067        STMT_LOCAL@6426..68754068          LOCAL_KW@6426..6431 "local"4069          WHITESPACE@6431..6432 " "4070          BIND_FUNCTION@6432..68744071            NAME@6432..64354072              IDENT@6432..6435 "aux"4073            PARAMS_DESC@6435..64524074              L_PAREN@6435..6436 "("4075              PARAM@6436..64374076                DESTRUCT_FULL@6436..64374077                  NAME@6436..64374078                    IDENT@6436..6437 "a"4079              COMMA@6437..6438 ","4080              WHITESPACE@6438..6439 " "4081              PARAM@6439..64404082                DESTRUCT_FULL@6439..64404083                  NAME@6439..64404084                    IDENT@6439..6440 "b"4085              COMMA@6440..6441 ","4086              WHITESPACE@6441..6442 " "4087              PARAM@6442..64434088                DESTRUCT_FULL@6442..64434089                  NAME@6442..64434090                    IDENT@6442..6443 "i"4091              COMMA@6443..6444 ","4092              WHITESPACE@6444..6445 " "4093              PARAM@6445..64464094                DESTRUCT_FULL@6445..64464095                  NAME@6445..64464096                    IDENT@6445..6446 "j"4097              COMMA@6446..6447 ","4098              WHITESPACE@6447..6448 " "4099              PARAM@6448..64514100                DESTRUCT_FULL@6448..64514101                  NAME@6448..64514102                    IDENT@6448..6451 "acc"4103              R_PAREN@6451..6452 ")"4104            WHITESPACE@6452..6453 " "4105            ASSIGN@6453..6454 "="4106            WHITESPACE@6454..6461 "\n      "4107            EXPR_IF_THEN_ELSE@6461..68744108              IF_KW@6461..6463 "if"4109              WHITESPACE@6463..6464 " "4110              EXPR_BINARY@6464..64824111                LHS_EXPR@6464..64654112                  EXPR_VAR@6464..64654113                    NAME@6464..64654114                      IDENT@6464..6465 "i"4115                WHITESPACE@6465..6466 " "4116                GE@6466..6468 ">="4117                WHITESPACE@6468..6469 " "4118                EXPR_APPLY@6469..64824119                  EXPR_INDEX@6469..64794120                    EXPR_VAR@6469..64724121                      NAME@6469..64724122                        IDENT@6469..6472 "std"4123                    DOT@6472..6473 "."4124                    NAME@6473..64794125                      IDENT@6473..6479 "length"4126                  ARGS_DESC@6479..64824127                    L_PAREN@6479..6480 "("4128                    ARG@6480..64814129                      EXPR_VAR@6480..64814130                        NAME@6480..64814131                          IDENT@6480..6481 "a"4132                    R_PAREN@6481..6482 ")"4133              WHITESPACE@6482..6483 " "4134              THEN_KW@6483..6487 "then"4135              WHITESPACE@6487..6496 "\n        "4136              TRUE_EXPR@6496..65074137                EXPR_BINARY@6496..65074138                  LHS_EXPR@6496..64994139                    EXPR_VAR@6496..64994140                      NAME@6496..64994141                        IDENT@6496..6499 "acc"4142                  WHITESPACE@6499..6500 " "4143                  PLUS@6500..6501 "+"4144                  WHITESPACE@6501..6502 " "4145                  EXPR_SLICE@6502..65074146                    EXPR_VAR@6502..65034147                      NAME@6502..65034148                        IDENT@6502..6503 "b"4149                    SLICE_DESC@6503..65074150                      L_BRACK@6503..6504 "["4151                      EXPR_VAR@6504..65054152                        NAME@6504..65054153                          IDENT@6504..6505 "j"4154                      COLON@6505..6506 ":"4155                      R_BRACK@6506..6507 "]"4156              WHITESPACE@6507..6514 "\n      "4157              ELSE_KW@6514..6518 "else"4158              WHITESPACE@6518..6519 " "4159              FALSE_EXPR@6519..68744160                EXPR_IF_THEN_ELSE@6519..68744161                  IF_KW@6519..6521 "if"4162                  WHITESPACE@6521..6522 " "4163                  EXPR_BINARY@6522..65404164                    LHS_EXPR@6522..65234165                      EXPR_VAR@6522..65234166                        NAME@6522..65234167                          IDENT@6522..6523 "j"4168                    WHITESPACE@6523..6524 " "4169                    GE@6524..6526 ">="4170                    WHITESPACE@6526..6527 " "4171                    EXPR_APPLY@6527..65404172                      EXPR_INDEX@6527..65374173                        EXPR_VAR@6527..65304174                          NAME@6527..65304175                            IDENT@6527..6530 "std"4176                        DOT@6530..6531 "."4177                        NAME@6531..65374178                          IDENT@6531..6537 "length"4179                      ARGS_DESC@6537..65404180                        L_PAREN@6537..6538 "("4181                        ARG@6538..65394182                          EXPR_VAR@6538..65394183                            NAME@6538..65394184                              IDENT@6538..6539 "b"4185                        R_PAREN@6539..6540 ")"4186                  WHITESPACE@6540..6541 " "4187                  THEN_KW@6541..6545 "then"4188                  WHITESPACE@6545..6554 "\n        "4189                  TRUE_EXPR@6554..65654190                    EXPR_BINARY@6554..65654191                      LHS_EXPR@6554..65574192                        EXPR_VAR@6554..65574193                          NAME@6554..65574194                            IDENT@6554..6557 "acc"4195                      WHITESPACE@6557..6558 " "4196                      PLUS@6558..6559 "+"4197                      WHITESPACE@6559..6560 " "4198                      EXPR_SLICE@6560..65654199                        EXPR_VAR@6560..65614200                          NAME@6560..65614201                            IDENT@6560..6561 "a"4202                        SLICE_DESC@6561..65654203                          L_BRACK@6561..6562 "["4204                          EXPR_VAR@6562..65634205                            NAME@6562..65634206                              IDENT@6562..6563 "i"4207                          COLON@6563..6564 ":"4208                          R_BRACK@6564..6565 "]"4209                  WHITESPACE@6565..6572 "\n      "4210                  ELSE_KW@6572..6576 "else"4211                  WHITESPACE@6576..6585 "\n        "4212                  STMT_LOCAL@6585..66074213                    LOCAL_KW@6585..6590 "local"4214                    WHITESPACE@6590..6591 " "4215                    BIND_DESTRUCT@6591..66064216                      DESTRUCT_FULL@6591..65934217                        NAME@6591..65934218                          IDENT@6591..6593 "ak"4219                      WHITESPACE@6593..6594 " "4220                      ASSIGN@6594..6595 "="4221                      WHITESPACE@6595..6596 " "4222                      EXPR_APPLY@6596..66064223                        EXPR_VAR@6596..66004224                          NAME@6596..66004225                            IDENT@6596..6600 "keyF"4226                        ARGS_DESC@6600..66064227                          L_PAREN@6600..6601 "("4228                          ARG@6601..66054229                            EXPR_INDEX_EXPR@6601..66054230                              LHS_EXPR@6601..66024231                                EXPR_VAR@6601..66024232                                  NAME@6601..66024233                                    IDENT@6601..6602 "a"4234                              L_BRACK@6602..6603 "["4235                              EXPR_VAR@6603..66044236                                NAME@6603..66044237                                  IDENT@6603..6604 "i"4238                              R_BRACK@6604..6605 "]"4239                          R_PAREN@6605..6606 ")"4240                    SEMI@6606..6607 ";"4241                  WHITESPACE@6607..6616 "\n        "4242                  STMT_LOCAL@6616..66384243                    LOCAL_KW@6616..6621 "local"4244                    WHITESPACE@6621..6622 " "4245                    BIND_DESTRUCT@6622..66374246                      DESTRUCT_FULL@6622..66244247                        NAME@6622..66244248                          IDENT@6622..6624 "bk"4249                      WHITESPACE@6624..6625 " "4250                      ASSIGN@6625..6626 "="4251                      WHITESPACE@6626..6627 " "4252                      EXPR_APPLY@6627..66374253                        EXPR_VAR@6627..66314254                          NAME@6627..66314255                            IDENT@6627..6631 "keyF"4256                        ARGS_DESC@6631..66374257                          L_PAREN@6631..6632 "("4258                          ARG@6632..66364259                            EXPR_INDEX_EXPR@6632..66364260                              LHS_EXPR@6632..66334261                                EXPR_VAR@6632..66334262                                  NAME@6632..66334263                                    IDENT@6632..6633 "b"4264                              L_BRACK@6633..6634 "["4265                              EXPR_VAR@6634..66354266                                NAME@6634..66354267                                  IDENT@6634..6635 "j"4268                              R_BRACK@6635..6636 "]"4269                          R_PAREN@6636..6637 ")"4270                    SEMI@6637..6638 ";"4271                  WHITESPACE@6638..6647 "\n        "4272                  FALSE_EXPR@6647..68744273                    EXPR_IF_THEN_ELSE@6647..68744274                      IF_KW@6647..6649 "if"4275                      WHITESPACE@6649..6650 " "4276                      EXPR_BINARY@6650..66584277                        LHS_EXPR@6650..66524278                          EXPR_VAR@6650..66524279                            NAME@6650..66524280                              IDENT@6650..6652 "ak"4281                        WHITESPACE@6652..6653 " "4282                        EQ@6653..6655 "=="4283                        WHITESPACE@6655..6656 " "4284                        EXPR_VAR@6656..66584285                          NAME@6656..66584286                            IDENT@6656..6658 "bk"4287                      WHITESPACE@6658..6659 " "4288                      THEN_KW@6659..6663 "then"4289                      WHITESPACE@6663..6674 "\n          "4290                      TRUE_EXPR@6674..67224291                        EXPR_APPLY@6674..67224292                          EXPR_VAR@6674..66774293                            NAME@6674..66774294                              IDENT@6674..6677 "aux"4295                          ARGS_DESC@6677..67224296                            L_PAREN@6677..6678 "("4297                            ARG@6678..66794298                              EXPR_VAR@6678..66794299                                NAME@6678..66794300                                  IDENT@6678..6679 "a"4301                            COMMA@6679..6680 ","4302                            WHITESPACE@6680..6681 " "4303                            ARG@6681..66824304                              EXPR_VAR@6681..66824305                                NAME@6681..66824306                                  IDENT@6681..6682 "b"4307                            COMMA@6682..6683 ","4308                            WHITESPACE@6683..6684 " "4309                            ARG@6684..66894310                              EXPR_BINARY@6684..66894311                                LHS_EXPR@6684..66854312                                  EXPR_VAR@6684..66854313                                    NAME@6684..66854314                                      IDENT@6684..6685 "i"4315                                WHITESPACE@6685..6686 " "4316                                PLUS@6686..6687 "+"4317                                WHITESPACE@6687..6688 " "4318                                EXPR_NUMBER@6688..66894319                                  FLOAT@6688..6689 "1"4320                            COMMA@6689..6690 ","4321                            WHITESPACE@6690..6691 " "4322                            ARG@6691..66964323                              EXPR_BINARY@6691..66964324                                LHS_EXPR@6691..66924325                                  EXPR_VAR@6691..66924326                                    NAME@6691..66924327                                      IDENT@6691..6692 "j"4328                                WHITESPACE@6692..6693 " "4329                                PLUS@6693..6694 "+"4330                                WHITESPACE@6694..6695 " "4331                                EXPR_NUMBER@6695..66964332                                  FLOAT@6695..6696 "1"4333                            COMMA@6696..6697 ","4334                            WHITESPACE@6697..6698 " "4335                            ARG@6698..67104336                              EXPR_BINARY@6698..67104337                                LHS_EXPR@6698..67014338                                  EXPR_VAR@6698..67014339                                    NAME@6698..67014340                                      IDENT@6698..6701 "acc"4341                                WHITESPACE@6701..6702 " "4342                                PLUS@6702..6703 "+"4343                                WHITESPACE@6703..6704 " "4344                                EXPR_ARRAY@6704..67104345                                  L_BRACK@6704..6705 "["4346                                  EXPR_INDEX_EXPR@6705..67094347                                    LHS_EXPR@6705..67064348                                      EXPR_VAR@6705..67064349                                        NAME@6705..67064350                                          IDENT@6705..6706 "a"4351                                    L_BRACK@6706..6707 "["4352                                    EXPR_VAR@6707..67084353                                      NAME@6707..67084354                                        IDENT@6707..6708 "i"4355                                    R_BRACK@6708..6709 "]"4356                                  R_BRACK@6709..6710 "]"4357                            R_PAREN@6710..6711 ")"4358                            WHITESPACE@6711..6712 " "4359                            TAILSTRICT_KW@6712..6722 "tailstrict"4360                      WHITESPACE@6722..6731 "\n        "4361                      ELSE_KW@6731..6735 "else"4362                      WHITESPACE@6735..6736 " "4363                      FALSE_EXPR@6736..68744364                        EXPR_IF_THEN_ELSE@6736..68744365                          IF_KW@6736..6738 "if"4366                          WHITESPACE@6738..6739 " "4367                          EXPR_BINARY@6739..67464368                            LHS_EXPR@6739..67414369                              EXPR_VAR@6739..67414370                                NAME@6739..67414371                                  IDENT@6739..6741 "ak"4372                            WHITESPACE@6741..6742 " "4373                            LT@6742..6743 "<"4374                            WHITESPACE@6743..6744 " "4375                            EXPR_VAR@6744..67464376                              NAME@6744..67464377                                IDENT@6744..6746 "bk"4378                          WHITESPACE@6746..6747 " "4379                          THEN_KW@6747..6751 "then"4380                          WHITESPACE@6751..6762 "\n          "4381                          TRUE_EXPR@6762..68064382                            EXPR_APPLY@6762..68064383                              EXPR_VAR@6762..67654384                                NAME@6762..67654385                                  IDENT@6762..6765 "aux"4386                              ARGS_DESC@6765..68064387                                L_PAREN@6765..6766 "("4388                                ARG@6766..67674389                                  EXPR_VAR@6766..67674390                                    NAME@6766..67674391                                      IDENT@6766..6767 "a"4392                                COMMA@6767..6768 ","4393                                WHITESPACE@6768..6769 " "4394                                ARG@6769..67704395                                  EXPR_VAR@6769..67704396                                    NAME@6769..67704397                                      IDENT@6769..6770 "b"4398                                COMMA@6770..6771 ","4399                                WHITESPACE@6771..6772 " "4400                                ARG@6772..67774401                                  EXPR_BINARY@6772..67774402                                    LHS_EXPR@6772..67734403                                      EXPR_VAR@6772..67734404                                        NAME@6772..67734405                                          IDENT@6772..6773 "i"4406                                    WHITESPACE@6773..6774 " "4407                                    PLUS@6774..6775 "+"4408                                    WHITESPACE@6775..6776 " "4409                                    EXPR_NUMBER@6776..67774410                                      FLOAT@6776..6777 "1"4411                                COMMA@6777..6778 ","4412                                WHITESPACE@6778..6779 " "4413                                ARG@6779..67804414                                  EXPR_VAR@6779..67804415                                    NAME@6779..67804416                                      IDENT@6779..6780 "j"4417                                COMMA@6780..6781 ","4418                                WHITESPACE@6781..6782 " "4419                                ARG@6782..67944420                                  EXPR_BINARY@6782..67944421                                    LHS_EXPR@6782..67854422                                      EXPR_VAR@6782..67854423                                        NAME@6782..67854424                                          IDENT@6782..6785 "acc"4425                                    WHITESPACE@6785..6786 " "4426                                    PLUS@6786..6787 "+"4427                                    WHITESPACE@6787..6788 " "4428                                    EXPR_ARRAY@6788..67944429                                      L_BRACK@6788..6789 "["4430                                      EXPR_INDEX_EXPR@6789..67934431                                        LHS_EXPR@6789..67904432                                          EXPR_VAR@6789..67904433                                            NAME@6789..67904434                                              IDENT@6789..6790 "a"4435                                        L_BRACK@6790..6791 "["4436                                        EXPR_VAR@6791..67924437                                          NAME@6791..67924438                                            IDENT@6791..6792 "i"4439                                        R_BRACK@6792..6793 "]"4440                                      R_BRACK@6793..6794 "]"4441                                R_PAREN@6794..6795 ")"4442                                WHITESPACE@6795..6796 " "4443                                TAILSTRICT_KW@6796..6806 "tailstrict"4444                          WHITESPACE@6806..6815 "\n        "4445                          ELSE_KW@6815..6819 "else"4446                          WHITESPACE@6819..6830 "\n          "4447                          FALSE_EXPR@6830..68744448                            EXPR_APPLY@6830..68744449                              EXPR_VAR@6830..68334450                                NAME@6830..68334451                                  IDENT@6830..6833 "aux"4452                              ARGS_DESC@6833..68744453                                L_PAREN@6833..6834 "("4454                                ARG@6834..68354455                                  EXPR_VAR@6834..68354456                                    NAME@6834..68354457                                      IDENT@6834..6835 "a"4458                                COMMA@6835..6836 ","4459                                WHITESPACE@6836..6837 " "4460                                ARG@6837..68384461                                  EXPR_VAR@6837..68384462                                    NAME@6837..68384463                                      IDENT@6837..6838 "b"4464                                COMMA@6838..6839 ","4465                                WHITESPACE@6839..6840 " "4466                                ARG@6840..68414467                                  EXPR_VAR@6840..68414468                                    NAME@6840..68414469                                      IDENT@6840..6841 "i"4470                                COMMA@6841..6842 ","4471                                WHITESPACE@6842..6843 " "4472                                ARG@6843..68484473                                  EXPR_BINARY@6843..68484474                                    LHS_EXPR@6843..68444475                                      EXPR_VAR@6843..68444476                                        NAME@6843..68444477                                          IDENT@6843..6844 "j"4478                                    WHITESPACE@6844..6845 " "4479                                    PLUS@6845..6846 "+"4480                                    WHITESPACE@6846..6847 " "4481                                    EXPR_NUMBER@6847..68484482                                      FLOAT@6847..6848 "1"4483                                COMMA@6848..6849 ","4484                                WHITESPACE@6849..6850 " "4485                                ARG@6850..68624486                                  EXPR_BINARY@6850..68624487                                    LHS_EXPR@6850..68534488                                      EXPR_VAR@6850..68534489                                        NAME@6850..68534490                                          IDENT@6850..6853 "acc"4491                                    WHITESPACE@6853..6854 " "4492                                    PLUS@6854..6855 "+"4493                                    WHITESPACE@6855..6856 " "4494                                    EXPR_ARRAY@6856..68624495                                      L_BRACK@6856..6857 "["4496                                      EXPR_INDEX_EXPR@6857..68614497                                        LHS_EXPR@6857..68584498                                          EXPR_VAR@6857..68584499                                            NAME@6857..68584500                                              IDENT@6857..6858 "b"4501                                        L_BRACK@6858..6859 "["4502                                        EXPR_VAR@6859..68604503                                          NAME@6859..68604504                                            IDENT@6859..6860 "j"4505                                        R_BRACK@6860..6861 "]"4506                                      R_BRACK@6861..6862 "]"4507                                R_PAREN@6862..6863 ")"4508                                WHITESPACE@6863..6864 " "4509                                TAILSTRICT_KW@6864..6874 "tailstrict"4510          SEMI@6874..6875 ";"4511        WHITESPACE@6875..6880 "\n    "4512        EXPR_APPLY@6880..68994513          EXPR_VAR@6880..68834514            NAME@6880..68834515              IDENT@6880..6883 "aux"4516          ARGS_DESC@6883..68994517            L_PAREN@6883..6884 "("4518            ARG@6884..68854519              EXPR_VAR@6884..68854520                NAME@6884..68854521                  IDENT@6884..6885 "a"4522            COMMA@6885..6886 ","4523            WHITESPACE@6886..6887 " "4524            ARG@6887..68884525              EXPR_VAR@6887..68884526                NAME@6887..68884527                  IDENT@6887..6888 "b"4528            COMMA@6888..6889 ","4529            WHITESPACE@6889..6890 " "4530            ARG@6890..68914531              EXPR_NUMBER@6890..68914532                FLOAT@6890..6891 "0"4533            COMMA@6891..6892 ","4534            WHITESPACE@6892..6893 " "4535            ARG@6893..68944536              EXPR_NUMBER@6893..68944537                FLOAT@6893..6894 "0"4538            COMMA@6894..6895 ","4539            WHITESPACE@6895..6896 " "4540            ARG@6896..68984541              EXPR_ARRAY@6896..68984542                L_BRACK@6896..6897 "["4543                R_BRACK@6897..6898 "]"4544            R_PAREN@6898..6899 ")"4545      COMMA@6899..6900 ","4546      WHITESPACE@6900..6904 "\n\n  "4547      MEMBER_FIELD_METHOD@6904..73614548        FIELD_NAME_FIXED@6904..69114549          NAME@6904..69114550            IDENT@6904..6911 "setDiff"4551        PARAMS_DESC@6911..69264552          L_PAREN@6911..6912 "("4553          PARAM@6912..69134554            DESTRUCT_FULL@6912..69134555              NAME@6912..69134556                IDENT@6912..6913 "a"4557          COMMA@6913..6914 ","4558          WHITESPACE@6914..6915 " "4559          PARAM@6915..69164560            DESTRUCT_FULL@6915..69164561              NAME@6915..69164562                IDENT@6915..6916 "b"4563          COMMA@6916..6917 ","4564          WHITESPACE@6917..6918 " "4565          PARAM@6918..69254566            DESTRUCT_FULL@6918..69224567              NAME@6918..69224568                IDENT@6918..6922 "keyF"4569            ASSIGN@6922..6923 "="4570            EXPR_VAR@6923..69254571              NAME@6923..69254572                IDENT@6923..6925 "id"4573          R_PAREN@6925..6926 ")"4574        COLONCOLON@6926..6928 "::"4575        WHITESPACE@6928..6933 "\n    "4576        STMT_LOCAL@6933..73264577          LOCAL_KW@6933..6938 "local"4578          WHITESPACE@6938..6939 " "4579          BIND_FUNCTION@6939..73254580            NAME@6939..69424581              IDENT@6939..6942 "aux"4582            PARAMS_DESC@6942..69594583              L_PAREN@6942..6943 "("4584              PARAM@6943..69444585                DESTRUCT_FULL@6943..69444586                  NAME@6943..69444587                    IDENT@6943..6944 "a"4588              COMMA@6944..6945 ","4589              WHITESPACE@6945..6946 " "4590              PARAM@6946..69474591                DESTRUCT_FULL@6946..69474592                  NAME@6946..69474593                    IDENT@6946..6947 "b"4594              COMMA@6947..6948 ","4595              WHITESPACE@6948..6949 " "4596              PARAM@6949..69504597                DESTRUCT_FULL@6949..69504598                  NAME@6949..69504599                    IDENT@6949..6950 "i"4600              COMMA@6950..6951 ","4601              WHITESPACE@6951..6952 " "4602              PARAM@6952..69534603                DESTRUCT_FULL@6952..69534604                  NAME@6952..69534605                    IDENT@6952..6953 "j"4606              COMMA@6953..6954 ","4607              WHITESPACE@6954..6955 " "4608              PARAM@6955..69584609                DESTRUCT_FULL@6955..69584610                  NAME@6955..69584611                    IDENT@6955..6958 "acc"4612              R_PAREN@6958..6959 ")"4613            WHITESPACE@6959..6960 " "4614            ASSIGN@6960..6961 "="4615            WHITESPACE@6961..6968 "\n      "4616            EXPR_IF_THEN_ELSE@6968..73254617              IF_KW@6968..6970 "if"4618              WHITESPACE@6970..6971 " "4619              EXPR_BINARY@6971..69894620                LHS_EXPR@6971..69724621                  EXPR_VAR@6971..69724622                    NAME@6971..69724623                      IDENT@6971..6972 "i"4624                WHITESPACE@6972..6973 " "4625                GE@6973..6975 ">="4626                WHITESPACE@6975..6976 " "4627                EXPR_APPLY@6976..69894628                  EXPR_INDEX@6976..69864629                    EXPR_VAR@6976..69794630                      NAME@6976..69794631                        IDENT@6976..6979 "std"4632                    DOT@6979..6980 "."4633                    NAME@6980..69864634                      IDENT@6980..6986 "length"4635                  ARGS_DESC@6986..69894636                    L_PAREN@6986..6987 "("4637                    ARG@6987..69884638                      EXPR_VAR@6987..69884639                        NAME@6987..69884640                          IDENT@6987..6988 "a"4641                    R_PAREN@6988..6989 ")"4642              WHITESPACE@6989..6990 " "4643              THEN_KW@6990..6994 "then"4644              WHITESPACE@6994..7003 "\n        "4645              TRUE_EXPR@7003..70064646                EXPR_VAR@7003..70064647                  NAME@7003..70064648                    IDENT@7003..7006 "acc"4649              WHITESPACE@7006..7013 "\n      "4650              ELSE_KW@7013..7017 "else"4651              WHITESPACE@7017..7018 " "4652              FALSE_EXPR@7018..73254653                EXPR_IF_THEN_ELSE@7018..73254654                  IF_KW@7018..7020 "if"4655                  WHITESPACE@7020..7021 " "4656                  EXPR_BINARY@7021..70394657                    LHS_EXPR@7021..70224658                      EXPR_VAR@7021..70224659                        NAME@7021..70224660                          IDENT@7021..7022 "j"4661                    WHITESPACE@7022..7023 " "4662                    GE@7023..7025 ">="4663                    WHITESPACE@7025..7026 " "4664                    EXPR_APPLY@7026..70394665                      EXPR_INDEX@7026..70364666                        EXPR_VAR@7026..70294667                          NAME@7026..70294668                            IDENT@7026..7029 "std"4669                        DOT@7029..7030 "."4670                        NAME@7030..70364671                          IDENT@7030..7036 "length"4672                      ARGS_DESC@7036..70394673                        L_PAREN@7036..7037 "("4674                        ARG@7037..70384675                          EXPR_VAR@7037..70384676                            NAME@7037..70384677                              IDENT@7037..7038 "b"4678                        R_PAREN@7038..7039 ")"4679                  WHITESPACE@7039..7040 " "4680                  THEN_KW@7040..7044 "then"4681                  WHITESPACE@7044..7053 "\n        "4682                  TRUE_EXPR@7053..70644683                    EXPR_BINARY@7053..70644684                      LHS_EXPR@7053..70564685                        EXPR_VAR@7053..70564686                          NAME@7053..70564687                            IDENT@7053..7056 "acc"4688                      WHITESPACE@7056..7057 " "4689                      PLUS@7057..7058 "+"4690                      WHITESPACE@7058..7059 " "4691                      EXPR_SLICE@7059..70644692                        EXPR_VAR@7059..70604693                          NAME@7059..70604694                            IDENT@7059..7060 "a"4695                        SLICE_DESC@7060..70644696                          L_BRACK@7060..7061 "["4697                          EXPR_VAR@7061..70624698                            NAME@7061..70624699                              IDENT@7061..7062 "i"4700                          COLON@7062..7063 ":"4701                          R_BRACK@7063..7064 "]"4702                  WHITESPACE@7064..7071 "\n      "4703                  ELSE_KW@7071..7075 "else"4704                  WHITESPACE@7075..7084 "\n        "4705                  FALSE_EXPR@7084..73254706                    EXPR_IF_THEN_ELSE@7084..73254707                      IF_KW@7084..7086 "if"4708                      WHITESPACE@7086..7087 " "4709                      EXPR_BINARY@7087..71114710                        LHS_EXPR@7087..70974711                          EXPR_APPLY@7087..70974712                            EXPR_VAR@7087..70914713                              NAME@7087..70914714                                IDENT@7087..7091 "keyF"4715                            ARGS_DESC@7091..70974716                              L_PAREN@7091..7092 "("4717                              ARG@7092..70964718                                EXPR_INDEX_EXPR@7092..70964719                                  LHS_EXPR@7092..70934720                                    EXPR_VAR@7092..70934721                                      NAME@7092..70934722                                        IDENT@7092..7093 "a"4723                                  L_BRACK@7093..7094 "["4724                                  EXPR_VAR@7094..70954725                                    NAME@7094..70954726                                      IDENT@7094..7095 "i"4727                                  R_BRACK@7095..7096 "]"4728                              R_PAREN@7096..7097 ")"4729                        WHITESPACE@7097..7098 " "4730                        EQ@7098..7100 "=="4731                        WHITESPACE@7100..7101 " "4732                        EXPR_APPLY@7101..71114733                          EXPR_VAR@7101..71054734                            NAME@7101..71054735                              IDENT@7101..7105 "keyF"4736                          ARGS_DESC@7105..71114737                            L_PAREN@7105..7106 "("4738                            ARG@7106..71104739                              EXPR_INDEX_EXPR@7106..71104740                                LHS_EXPR@7106..71074741                                  EXPR_VAR@7106..71074742                                    NAME@7106..71074743                                      IDENT@7106..7107 "b"4744                                L_BRACK@7107..7108 "["4745                                EXPR_VAR@7108..71094746                                  NAME@7108..71094747                                    IDENT@7108..7109 "j"4748                                R_BRACK@7109..7110 "]"4749                            R_PAREN@7110..7111 ")"4750                      WHITESPACE@7111..7112 " "4751                      THEN_KW@7112..7116 "then"4752                      WHITESPACE@7116..7127 "\n          "4753                      TRUE_EXPR@7127..71664754                        EXPR_APPLY@7127..71664755                          EXPR_VAR@7127..71304756                            NAME@7127..71304757                              IDENT@7127..7130 "aux"4758                          ARGS_DESC@7130..71664759                            L_PAREN@7130..7131 "("4760                            ARG@7131..71324761                              EXPR_VAR@7131..71324762                                NAME@7131..71324763                                  IDENT@7131..7132 "a"4764                            COMMA@7132..7133 ","4765                            WHITESPACE@7133..7134 " "4766                            ARG@7134..71354767                              EXPR_VAR@7134..71354768                                NAME@7134..71354769                                  IDENT@7134..7135 "b"4770                            COMMA@7135..7136 ","4771                            WHITESPACE@7136..7137 " "4772                            ARG@7137..71424773                              EXPR_BINARY@7137..71424774                                LHS_EXPR@7137..71384775                                  EXPR_VAR@7137..71384776                                    NAME@7137..71384777                                      IDENT@7137..7138 "i"4778                                WHITESPACE@7138..7139 " "4779                                PLUS@7139..7140 "+"4780                                WHITESPACE@7140..7141 " "4781                                EXPR_NUMBER@7141..71424782                                  FLOAT@7141..7142 "1"4783                            COMMA@7142..7143 ","4784                            WHITESPACE@7143..7144 " "4785                            ARG@7144..71494786                              EXPR_BINARY@7144..71494787                                LHS_EXPR@7144..71454788                                  EXPR_VAR@7144..71454789                                    NAME@7144..71454790                                      IDENT@7144..7145 "j"4791                                WHITESPACE@7145..7146 " "4792                                PLUS@7146..7147 "+"4793                                WHITESPACE@7147..7148 " "4794                                EXPR_NUMBER@7148..71494795                                  FLOAT@7148..7149 "1"4796                            COMMA@7149..7150 ","4797                            WHITESPACE@7150..7151 " "4798                            ARG@7151..71544799                              EXPR_VAR@7151..71544800                                NAME@7151..71544801                                  IDENT@7151..7154 "acc"4802                            R_PAREN@7154..7155 ")"4803                            WHITESPACE@7155..7156 " "4804                            TAILSTRICT_KW@7156..7166 "tailstrict"4805                      WHITESPACE@7166..7175 "\n        "4806                      ELSE_KW@7175..7179 "else"4807                      WHITESPACE@7179..7180 " "4808                      FALSE_EXPR@7180..73254809                        EXPR_IF_THEN_ELSE@7180..73254810                          IF_KW@7180..7182 "if"4811                          WHITESPACE@7182..7183 " "4812                          EXPR_BINARY@7183..72064813                            LHS_EXPR@7183..71934814                              EXPR_APPLY@7183..71934815                                EXPR_VAR@7183..71874816                                  NAME@7183..71874817                                    IDENT@7183..7187 "keyF"4818                                ARGS_DESC@7187..71934819                                  L_PAREN@7187..7188 "("4820                                  ARG@7188..71924821                                    EXPR_INDEX_EXPR@7188..71924822                                      LHS_EXPR@7188..71894823                                        EXPR_VAR@7188..71894824                                          NAME@7188..71894825                                            IDENT@7188..7189 "a"4826                                      L_BRACK@7189..7190 "["4827                                      EXPR_VAR@7190..71914828                                        NAME@7190..71914829                                          IDENT@7190..7191 "i"4830                                      R_BRACK@7191..7192 "]"4831                                  R_PAREN@7192..7193 ")"4832                            WHITESPACE@7193..7194 " "4833                            LT@7194..7195 "<"4834                            WHITESPACE@7195..7196 " "4835                            EXPR_APPLY@7196..72064836                              EXPR_VAR@7196..72004837                                NAME@7196..72004838                                  IDENT@7196..7200 "keyF"4839                              ARGS_DESC@7200..72064840                                L_PAREN@7200..7201 "("4841                                ARG@7201..72054842                                  EXPR_INDEX_EXPR@7201..72054843                                    LHS_EXPR@7201..72024844                                      EXPR_VAR@7201..72024845                                        NAME@7201..72024846                                          IDENT@7201..7202 "b"4847                                    L_BRACK@7202..7203 "["4848                                    EXPR_VAR@7203..72044849                                      NAME@7203..72044850                                        IDENT@7203..7204 "j"4851                                    R_BRACK@7204..7205 "]"4852                                R_PAREN@7205..7206 ")"4853                          WHITESPACE@7206..7207 " "4854                          THEN_KW@7207..7211 "then"4855                          WHITESPACE@7211..7222 "\n          "4856                          TRUE_EXPR@7222..72664857                            EXPR_APPLY@7222..72664858                              EXPR_VAR@7222..72254859                                NAME@7222..72254860                                  IDENT@7222..7225 "aux"4861                              ARGS_DESC@7225..72664862                                L_PAREN@7225..7226 "("4863                                ARG@7226..72274864                                  EXPR_VAR@7226..72274865                                    NAME@7226..72274866                                      IDENT@7226..7227 "a"4867                                COMMA@7227..7228 ","4868                                WHITESPACE@7228..7229 " "4869                                ARG@7229..72304870                                  EXPR_VAR@7229..72304871                                    NAME@7229..72304872                                      IDENT@7229..7230 "b"4873                                COMMA@7230..7231 ","4874                                WHITESPACE@7231..7232 " "4875                                ARG@7232..72374876                                  EXPR_BINARY@7232..72374877                                    LHS_EXPR@7232..72334878                                      EXPR_VAR@7232..72334879                                        NAME@7232..72334880                                          IDENT@7232..7233 "i"4881                                    WHITESPACE@7233..7234 " "4882                                    PLUS@7234..7235 "+"4883                                    WHITESPACE@7235..7236 " "4884                                    EXPR_NUMBER@7236..72374885                                      FLOAT@7236..7237 "1"4886                                COMMA@7237..7238 ","4887                                WHITESPACE@7238..7239 " "4888                                ARG@7239..72404889                                  EXPR_VAR@7239..72404890                                    NAME@7239..72404891                                      IDENT@7239..7240 "j"4892                                COMMA@7240..7241 ","4893                                WHITESPACE@7241..7242 " "4894                                ARG@7242..72544895                                  EXPR_BINARY@7242..72544896                                    LHS_EXPR@7242..72454897                                      EXPR_VAR@7242..72454898                                        NAME@7242..72454899                                          IDENT@7242..7245 "acc"4900                                    WHITESPACE@7245..7246 " "4901                                    PLUS@7246..7247 "+"4902                                    WHITESPACE@7247..7248 " "4903                                    EXPR_ARRAY@7248..72544904                                      L_BRACK@7248..7249 "["4905                                      EXPR_INDEX_EXPR@7249..72534906                                        LHS_EXPR@7249..72504907                                          EXPR_VAR@7249..72504908                                            NAME@7249..72504909                                              IDENT@7249..7250 "a"4910                                        L_BRACK@7250..7251 "["4911                                        EXPR_VAR@7251..72524912                                          NAME@7251..72524913                                            IDENT@7251..7252 "i"4914                                        R_BRACK@7252..7253 "]"4915                                      R_BRACK@7253..7254 "]"4916                                R_PAREN@7254..7255 ")"4917                                WHITESPACE@7255..7256 " "4918                                TAILSTRICT_KW@7256..7266 "tailstrict"4919                          WHITESPACE@7266..7275 "\n        "4920                          ELSE_KW@7275..7279 "else"4921                          WHITESPACE@7279..7290 "\n          "4922                          FALSE_EXPR@7290..73254923                            EXPR_APPLY@7290..73254924                              EXPR_VAR@7290..72934925                                NAME@7290..72934926                                  IDENT@7290..7293 "aux"4927                              ARGS_DESC@7293..73254928                                L_PAREN@7293..7294 "("4929                                ARG@7294..72954930                                  EXPR_VAR@7294..72954931                                    NAME@7294..72954932                                      IDENT@7294..7295 "a"4933                                COMMA@7295..7296 ","4934                                WHITESPACE@7296..7297 " "4935                                ARG@7297..72984936                                  EXPR_VAR@7297..72984937                                    NAME@7297..72984938                                      IDENT@7297..7298 "b"4939                                COMMA@7298..7299 ","4940                                WHITESPACE@7299..7300 " "4941                                ARG@7300..73014942                                  EXPR_VAR@7300..73014943                                    NAME@7300..73014944                                      IDENT@7300..7301 "i"4945                                COMMA@7301..7302 ","4946                                WHITESPACE@7302..7303 " "4947                                ARG@7303..73084948                                  EXPR_BINARY@7303..73084949                                    LHS_EXPR@7303..73044950                                      EXPR_VAR@7303..73044951                                        NAME@7303..73044952                                          IDENT@7303..7304 "j"4953                                    WHITESPACE@7304..7305 " "4954                                    PLUS@7305..7306 "+"4955                                    WHITESPACE@7306..7307 " "4956                                    EXPR_NUMBER@7307..73084957                                      FLOAT@7307..7308 "1"4958                                COMMA@7308..7309 ","4959                                WHITESPACE@7309..7310 " "4960                                ARG@7310..73134961                                  EXPR_VAR@7310..73134962                                    NAME@7310..73134963                                      IDENT@7310..7313 "acc"4964                                R_PAREN@7313..7314 ")"4965                                WHITESPACE@7314..7315 " "4966                                TAILSTRICT_KW@7315..7325 "tailstrict"4967          SEMI@7325..7326 ";"4968        WHITESPACE@7326..7331 "\n    "4969        EXPR_APPLY@7331..73614970          EXPR_VAR@7331..73344971            NAME@7331..73344972              IDENT@7331..7334 "aux"4973          ARGS_DESC@7334..73614974            L_PAREN@7334..7335 "("4975            ARG@7335..73364976              EXPR_VAR@7335..73364977                NAME@7335..73364978                  IDENT@7335..7336 "a"4979            COMMA@7336..7337 ","4980            WHITESPACE@7337..7338 " "4981            ARG@7338..73394982              EXPR_VAR@7338..73394983                NAME@7338..73394984                  IDENT@7338..7339 "b"4985            COMMA@7339..7340 ","4986            WHITESPACE@7340..7341 " "4987            ARG@7341..73424988              EXPR_NUMBER@7341..73424989                FLOAT@7341..7342 "0"4990            COMMA@7342..7343 ","4991            WHITESPACE@7343..7344 " "4992            ARG@7344..73454993              EXPR_NUMBER@7344..73454994                FLOAT@7344..7345 "0"4995            COMMA@7345..7346 ","4996            WHITESPACE@7346..7347 " "4997            ARG@7347..73494998              EXPR_ARRAY@7347..73494999                L_BRACK@7347..7348 "["5000                R_BRACK@7348..7349 "]"5001            R_PAREN@7349..7350 ")"5002            WHITESPACE@7350..7351 " "5003            TAILSTRICT_KW@7351..7361 "tailstrict"5004      COMMA@7361..7362 ","5005      WHITESPACE@7362..7366 "\n\n  "5006      MEMBER_FIELD_METHOD@7366..81545007        FIELD_NAME_FIXED@7366..73765008          NAME@7366..73765009            IDENT@7366..7376 "mergePatch"5010        PARAMS_DESC@7376..73915011          L_PAREN@7376..7377 "("5012          PARAM@7377..73835013            DESTRUCT_FULL@7377..73835014              NAME@7377..73835015                IDENT@7377..7383 "target"5016          COMMA@7383..7384 ","5017          WHITESPACE@7384..7385 " "5018          PARAM@7385..73905019            DESTRUCT_FULL@7385..73905020              NAME@7385..73905021                IDENT@7385..7390 "patch"5022          R_PAREN@7390..7391 ")"5023        COLONCOLON@7391..7393 "::"5024        WHITESPACE@7393..7398 "\n    "5025        EXPR_IF_THEN_ELSE@7398..81545026          IF_KW@7398..7400 "if"5027          WHITESPACE@7400..7401 " "5028          EXPR_APPLY@7401..74205029            EXPR_INDEX@7401..74135030              EXPR_VAR@7401..74045031                NAME@7401..74045032                  IDENT@7401..7404 "std"5033              DOT@7404..7405 "."5034              NAME@7405..74135035                IDENT@7405..7413 "isObject"5036            ARGS_DESC@7413..74205037              L_PAREN@7413..7414 "("5038              ARG@7414..74195039                EXPR_VAR@7414..74195040                  NAME@7414..74195041                    IDENT@7414..7419 "patch"5042              R_PAREN@7419..7420 ")"5043          WHITESPACE@7420..7421 " "5044          THEN_KW@7421..7425 "then"5045          WHITESPACE@7425..7432 "\n      "5046          STMT_LOCAL@7432..75065047            LOCAL_KW@7432..7437 "local"5048            WHITESPACE@7437..7438 " "5049            BIND_DESTRUCT@7438..75055050              DESTRUCT_FULL@7438..74515051                NAME@7438..74515052                  IDENT@7438..7451 "target_object"5053              WHITESPACE@7451..7452 " "5054              ASSIGN@7452..7453 "="5055              WHITESPACE@7453..7462 "\n        "5056              EXPR_IF_THEN_ELSE@7462..75055057                IF_KW@7462..7464 "if"5058                WHITESPACE@7464..7465 " "5059                EXPR_APPLY@7465..74855060                  EXPR_INDEX@7465..74775061                    EXPR_VAR@7465..74685062                      NAME@7465..74685063                        IDENT@7465..7468 "std"5064                    DOT@7468..7469 "."5065                    NAME@7469..74775066                      IDENT@7469..7477 "isObject"5067                  ARGS_DESC@7477..74855068                    L_PAREN@7477..7478 "("5069                    ARG@7478..74845070                      EXPR_VAR@7478..74845071                        NAME@7478..74845072                          IDENT@7478..7484 "target"5073                    R_PAREN@7484..7485 ")"5074                WHITESPACE@7485..7486 " "5075                THEN_KW@7486..7490 "then"5076                WHITESPACE@7490..7491 " "5077                TRUE_EXPR@7491..74975078                  EXPR_VAR@7491..74975079                    NAME@7491..74975080                      IDENT@7491..7497 "target"5081                WHITESPACE@7497..7498 " "5082                ELSE_KW@7498..7502 "else"5083                WHITESPACE@7502..7503 " "5084                FALSE_EXPR@7503..75055085                  EXPR_OBJECT@7503..75055086                    OBJ_BODY_MEMBER_LIST@7503..75055087                      L_BRACE@7503..7504 "{"5088                      R_BRACE@7504..7505 "}"5089            SEMI@7505..7506 ";"5090          WHITESPACE@7506..7514 "\n\n      "5091          STMT_LOCAL@7514..76205092            LOCAL_KW@7514..7519 "local"5093            WHITESPACE@7519..7520 " "5094            BIND_DESTRUCT@7520..76195095              DESTRUCT_FULL@7520..75335096                NAME@7520..75335097                  IDENT@7520..7533 "target_fields"5098              WHITESPACE@7533..7534 " "5099              ASSIGN@7534..7535 "="5100              WHITESPACE@7535..7544 "\n        "5101              EXPR_IF_THEN_ELSE@7544..76195102                IF_KW@7544..7546 "if"5103                WHITESPACE@7546..7547 " "5104                EXPR_APPLY@7547..75745105                  EXPR_INDEX@7547..75595106                    EXPR_VAR@7547..75505107                      NAME@7547..75505108                        IDENT@7547..7550 "std"5109                    DOT@7550..7551 "."5110                    NAME@7551..75595111                      IDENT@7551..7559 "isObject"5112                  ARGS_DESC@7559..75745113                    L_PAREN@7559..7560 "("5114                    ARG@7560..75735115                      EXPR_VAR@7560..75735116                        NAME@7560..75735117                          IDENT@7560..7573 "target_object"5118                    R_PAREN@7573..7574 ")"5119                WHITESPACE@7574..7575 " "5120                THEN_KW@7575..7579 "then"5121                WHITESPACE@7579..7580 " "5122                TRUE_EXPR@7580..76115123                  EXPR_APPLY@7580..76115124                    EXPR_INDEX@7580..75965125                      EXPR_VAR@7580..75835126                        NAME@7580..75835127                          IDENT@7580..7583 "std"5128                      DOT@7583..7584 "."5129                      NAME@7584..75965130                        IDENT@7584..7596 "objectFields"5131                    ARGS_DESC@7596..76115132                      L_PAREN@7596..7597 "("5133                      ARG@7597..76105134                        EXPR_VAR@7597..76105135                          NAME@7597..76105136                            IDENT@7597..7610 "target_object"5137                      R_PAREN@7610..7611 ")"5138                WHITESPACE@7611..7612 " "5139                ELSE_KW@7612..7616 "else"5140                WHITESPACE@7616..7617 " "5141                FALSE_EXPR@7617..76195142                  EXPR_ARRAY@7617..76195143                    L_BRACK@7617..7618 "["5144                    R_BRACK@7618..7619 "]"5145            SEMI@7619..7620 ";"5146          WHITESPACE@7620..7628 "\n\n      "5147          STMT_LOCAL@7628..77055148            LOCAL_KW@7628..7633 "local"5149            WHITESPACE@7633..7634 " "5150            BIND_DESTRUCT@7634..77045151              DESTRUCT_FULL@7634..76455152                NAME@7634..76455153                  IDENT@7634..7645 "null_fields"5154              WHITESPACE@7645..7646 " "5155              ASSIGN@7646..7647 "="5156              WHITESPACE@7647..7648 " "5157              EXPR_ARRAY_COMP@7648..77045158                L_BRACK@7648..7649 "["5159                EXPR_VAR@7649..76505160                  NAME@7649..76505161                    IDENT@7649..7650 "k"5162                WHITESPACE@7650..7651 " "5163                FOR_SPEC@7651..76835164                  FOR_KW@7651..7654 "for"5165                  WHITESPACE@7654..7655 " "5166                  NAME@7655..76565167                    IDENT@7655..7656 "k"5168                  WHITESPACE@7656..7657 " "5169                  IN_KW@7657..7659 "in"5170                  WHITESPACE@7659..7660 " "5171                  EXPR_APPLY@7660..76835172                    EXPR_INDEX@7660..76765173                      EXPR_VAR@7660..76635174                        NAME@7660..76635175                          IDENT@7660..7663 "std"5176                      DOT@7663..7664 "."5177                      NAME@7664..76765178                        IDENT@7664..7676 "objectFields"5179                    ARGS_DESC@7676..76835180                      L_PAREN@7676..7677 "("5181                      ARG@7677..76825182                        EXPR_VAR@7677..76825183                          NAME@7677..76825184                            IDENT@7677..7682 "patch"5185                      R_PAREN@7682..7683 ")"5186                WHITESPACE@7683..7684 " "5187                IF_SPEC@7684..77035188                  IF_KW@7684..7686 "if"5189                  WHITESPACE@7686..7687 " "5190                  EXPR_BINARY@7687..77035191                    LHS_EXPR@7687..76955192                      EXPR_INDEX_EXPR@7687..76955193                        LHS_EXPR@7687..76925194                          EXPR_VAR@7687..76925195                            NAME@7687..76925196                              IDENT@7687..7692 "patch"5197                        L_BRACK@7692..7693 "["5198                        EXPR_VAR@7693..76945199                          NAME@7693..76945200                            IDENT@7693..7694 "k"5201                        R_BRACK@7694..7695 "]"5202                    WHITESPACE@7695..7696 " "5203                    EQ@7696..7698 "=="5204                    WHITESPACE@7698..7699 " "5205                    EXPR_LITERAL@7699..77035206                      NULL_KW@7699..7703 "null"5207                R_BRACK@7703..7704 "]"5208            SEMI@7704..7705 ";"5209          WHITESPACE@7705..7712 "\n      "5210          STMT_LOCAL@7712..77855211            LOCAL_KW@7712..7717 "local"5212            WHITESPACE@7717..7718 " "5213            BIND_DESTRUCT@7718..77845214              DESTRUCT_FULL@7718..77295215                NAME@7718..77295216                  IDENT@7718..7729 "both_fields"5217              WHITESPACE@7729..7730 " "5218              ASSIGN@7730..7731 "="5219              WHITESPACE@7731..7732 " "5220              EXPR_APPLY@7732..77845221                EXPR_INDEX@7732..77445222                  EXPR_VAR@7732..77355223                    NAME@7732..77355224                      IDENT@7732..7735 "std"5225                  DOT@7735..7736 "."5226                  NAME@7736..77445227                    IDENT@7736..7744 "setUnion"5228                ARGS_DESC@7744..77845229                  L_PAREN@7744..7745 "("5230                  ARG@7745..77585231                    EXPR_VAR@7745..77585232                      NAME@7745..77585233                        IDENT@7745..7758 "target_fields"5234                  COMMA@7758..7759 ","5235                  WHITESPACE@7759..7760 " "5236                  ARG@7760..77835237                    EXPR_APPLY@7760..77835238                      EXPR_INDEX@7760..77765239                        EXPR_VAR@7760..77635240                          NAME@7760..77635241                            IDENT@7760..7763 "std"5242                        DOT@7763..7764 "."5243                        NAME@7764..77765244                          IDENT@7764..7776 "objectFields"5245                      ARGS_DESC@7776..77835246                        L_PAREN@7776..7777 "("5247                        ARG@7777..77825248                          EXPR_VAR@7777..77825249                            NAME@7777..77825250                              IDENT@7777..7782 "patch"5251                        R_PAREN@7782..7783 ")"5252                  R_PAREN@7783..7784 ")"5253            SEMI@7784..7785 ";"5254          WHITESPACE@7785..7793 "\n\n      "5255          TRUE_EXPR@7793..81335256            EXPR_OBJECT@7793..81335257              OBJ_BODY_COMP@7793..81335258                L_BRACE@7793..7794 "{"5259                WHITESPACE@7794..7803 "\n        "5260                MEMBER_FIELD_NORMAL@7803..80705261                  FIELD_NAME_DYNAMIC@7803..78065262                    L_BRACK@7803..7804 "["5263                    EXPR_VAR@7804..78055264                      NAME@7804..78055265                        IDENT@7804..7805 "k"5266                    R_BRACK@7805..7806 "]"5267                  COLON@7806..7807 ":"5268                  WHITESPACE@7807..7818 "\n          "5269                  EXPR_IF_THEN_ELSE@7818..80705270                    IF_KW@7818..7820 "if"5271                    WHITESPACE@7820..7821 " "5272                    EXPR_UNARY@7821..78455273                      NOT@7821..7822 "!"5274                      EXPR_APPLY@7822..78455275                        EXPR_INDEX@7822..78355276                          EXPR_VAR@7822..78255277                            NAME@7822..78255278                              IDENT@7822..7825 "std"5279                          DOT@7825..7826 "."5280                          NAME@7826..78355281                            IDENT@7826..7835 "objectHas"5282                        ARGS_DESC@7835..78455283                          L_PAREN@7835..7836 "("5284                          ARG@7836..78415285                            EXPR_VAR@7836..78415286                              NAME@7836..78415287                                IDENT@7836..7841 "patch"5288                          COMMA@7841..7842 ","5289                          WHITESPACE@7842..7843 " "5290                          ARG@7843..78445291                            EXPR_VAR@7843..78445292                              NAME@7843..78445293                                IDENT@7843..7844 "k"5294                          R_PAREN@7844..7845 ")"5295                    WHITESPACE@7845..7846 " "5296                    THEN_KW@7846..7850 "then"5297                    WHITESPACE@7850..7863 "\n            "5298                    TRUE_EXPR@7863..78795299                      EXPR_INDEX_EXPR@7863..78795300                        LHS_EXPR@7863..78765301                          EXPR_VAR@7863..78765302                            NAME@7863..78765303                              IDENT@7863..7876 "target_object"5304                        L_BRACK@7876..7877 "["5305                        EXPR_VAR@7877..78785306                          NAME@7877..78785307                            IDENT@7877..7878 "k"5308                        R_BRACK@7878..7879 "]"5309                    WHITESPACE@7879..7890 "\n          "5310                    ELSE_KW@7890..7894 "else"5311                    WHITESPACE@7894..7895 " "5312                    FALSE_EXPR@7895..80705313                      EXPR_IF_THEN_ELSE@7895..80705314                        IF_KW@7895..7897 "if"5315                        WHITESPACE@7897..7898 " "5316                        EXPR_UNARY@7898..79305317                          NOT@7898..7899 "!"5318                          EXPR_APPLY@7899..79305319                            EXPR_INDEX@7899..79125320                              EXPR_VAR@7899..79025321                                NAME@7899..79025322                                  IDENT@7899..7902 "std"5323                              DOT@7902..7903 "."5324                              NAME@7903..79125325                                IDENT@7903..7912 "objectHas"5326                            ARGS_DESC@7912..79305327                              L_PAREN@7912..7913 "("5328                              ARG@7913..79265329                                EXPR_VAR@7913..79265330                                  NAME@7913..79265331                                    IDENT@7913..7926 "target_object"5332                              COMMA@7926..7927 ","5333                              WHITESPACE@7927..7928 " "5334                              ARG@7928..79295335                                EXPR_VAR@7928..79295336                                  NAME@7928..79295337                                    IDENT@7928..7929 "k"5338                              R_PAREN@7929..7930 ")"5339                        WHITESPACE@7930..7931 " "5340                        THEN_KW@7931..7935 "then"5341                        WHITESPACE@7935..7948 "\n            "5342                        TRUE_EXPR@7948..79895343                          EXPR_APPLY@7948..79895344                            EXPR_INDEX@7948..79625345                              EXPR_VAR@7948..79515346                                NAME@7948..79515347                                  IDENT@7948..7951 "std"5348                              DOT@7951..7952 "."5349                              NAME@7952..79625350                                IDENT@7952..7962 "mergePatch"5351                            ARGS_DESC@7962..79895352                              L_PAREN@7962..7963 "("5353                              ARG@7963..79675354                                EXPR_LITERAL@7963..79675355                                  NULL_KW@7963..7967 "null"5356                              COMMA@7967..7968 ","5357                              WHITESPACE@7968..7969 " "5358                              ARG@7969..79775359                                EXPR_INDEX_EXPR@7969..79775360                                  LHS_EXPR@7969..79745361                                    EXPR_VAR@7969..79745362                                      NAME@7969..79745363                                        IDENT@7969..7974 "patch"5364                                  L_BRACK@7974..7975 "["5365                                  EXPR_VAR@7975..79765366                                    NAME@7975..79765367                                      IDENT@7975..7976 "k"5368                                  R_BRACK@7976..7977 "]"5369                              R_PAREN@7977..7978 ")"5370                              WHITESPACE@7978..7979 " "5371                              TAILSTRICT_KW@7979..7989 "tailstrict"5372                        WHITESPACE@7989..8000 "\n          "5373                        ELSE_KW@8000..8004 "else"5374                        WHITESPACE@8004..8017 "\n            "5375                        FALSE_EXPR@8017..80705376                          EXPR_APPLY@8017..80705377                            EXPR_INDEX@8017..80315378                              EXPR_VAR@8017..80205379                                NAME@8017..80205380                                  IDENT@8017..8020 "std"5381                              DOT@8020..8021 "."5382                              NAME@8021..80315383                                IDENT@8021..8031 "mergePatch"5384                            ARGS_DESC@8031..80705385                              L_PAREN@8031..8032 "("5386                              ARG@8032..80485387                                EXPR_INDEX_EXPR@8032..80485388                                  LHS_EXPR@8032..80455389                                    EXPR_VAR@8032..80455390                                      NAME@8032..80455391                                        IDENT@8032..8045 "target_object"5392                                  L_BRACK@8045..8046 "["5393                                  EXPR_VAR@8046..80475394                                    NAME@8046..80475395                                      IDENT@8046..8047 "k"5396                                  R_BRACK@8047..8048 "]"5397                              COMMA@8048..8049 ","5398                              WHITESPACE@8049..8050 " "5399                              ARG@8050..80585400                                EXPR_INDEX_EXPR@8050..80585401                                  LHS_EXPR@8050..80555402                                    EXPR_VAR@8050..80555403                                      NAME@8050..80555404                                        IDENT@8050..8055 "patch"5405                                  L_BRACK@8055..8056 "["5406                                  EXPR_VAR@8056..80575407                                    NAME@8056..80575408                                      IDENT@8056..8057 "k"5409                                  R_BRACK@8057..8058 "]"5410                              R_PAREN@8058..8059 ")"5411                              WHITESPACE@8059..8060 " "5412                              TAILSTRICT_KW@8060..8070 "tailstrict"5413                WHITESPACE@8070..8079 "\n        "5414                FOR_SPEC@8079..81255415                  FOR_KW@8079..8082 "for"5416                  WHITESPACE@8082..8083 " "5417                  NAME@8083..80845418                    IDENT@8083..8084 "k"5419                  WHITESPACE@8084..8085 " "5420                  IN_KW@8085..8087 "in"5421                  WHITESPACE@8087..8088 " "5422                  EXPR_APPLY@8088..81255423                    EXPR_INDEX@8088..80995424                      EXPR_VAR@8088..80915425                        NAME@8088..80915426                          IDENT@8088..8091 "std"5427                      DOT@8091..8092 "."5428                      NAME@8092..80995429                        IDENT@8092..8099 "setDiff"5430                    ARGS_DESC@8099..81255431                      L_PAREN@8099..8100 "("5432                      ARG@8100..81115433                        EXPR_VAR@8100..81115434                          NAME@8100..81115435                            IDENT@8100..8111 "both_fields"5436                      COMMA@8111..8112 ","5437                      WHITESPACE@8112..8113 " "5438                      ARG@8113..81245439                        EXPR_VAR@8113..81245440                          NAME@8113..81245441                            IDENT@8113..8124 "null_fields"5442                      R_PAREN@8124..8125 ")"5443                WHITESPACE@8125..8132 "\n      "5444                R_BRACE@8132..8133 "}"5445          WHITESPACE@8133..8138 "\n    "5446          ELSE_KW@8138..8142 "else"5447          WHITESPACE@8142..8149 "\n      "5448          FALSE_EXPR@8149..81545449            EXPR_VAR@8149..81545450              NAME@8149..81545451                IDENT@8149..8154 "patch"5452      COMMA@8154..8155 ","5453      WHITESPACE@8155..8159 "\n\n  "5454      MEMBER_FIELD_METHOD@8159..82655455        FIELD_NAME_FIXED@8159..81625456          NAME@8159..81625457            IDENT@8159..8162 "get"5458        PARAMS_DESC@8162..81995459          L_PAREN@8162..8163 "("5460          PARAM@8163..81645461            DESTRUCT_FULL@8163..81645462              NAME@8163..81645463                IDENT@8163..8164 "o"5464          COMMA@8164..8165 ","5465          WHITESPACE@8165..8166 " "5466          PARAM@8166..81675467            DESTRUCT_FULL@8166..81675468              NAME@8166..81675469                IDENT@8166..8167 "f"5470          COMMA@8167..8168 ","5471          WHITESPACE@8168..8169 " "5472          PARAM@8169..81815473            DESTRUCT_FULL@8169..81765474              NAME@8169..81765475                IDENT@8169..8176 "default"5476            ASSIGN@8176..8177 "="5477            EXPR_LITERAL@8177..81815478              NULL_KW@8177..8181 "null"5479          COMMA@8181..8182 ","5480          WHITESPACE@8182..8183 " "5481          PARAM@8183..81985482            DESTRUCT_FULL@8183..81935483              NAME@8183..81935484                IDENT@8183..8193 "inc_hidden"5485            ASSIGN@8193..8194 "="5486            EXPR_LITERAL@8194..81985487              TRUE_KW@8194..8198 "true"5488          R_PAREN@8198..8199 ")"5489        COLONCOLON@8199..8201 "::"5490        WHITESPACE@8201..8206 "\n    "5491        EXPR_IF_THEN_ELSE@8206..82655492          IF_KW@8206..8208 "if"5493          WHITESPACE@8208..8209 " "5494          EXPR_APPLY@8209..82425495            EXPR_INDEX@8209..82245496              EXPR_VAR@8209..82125497                NAME@8209..82125498                  IDENT@8209..8212 "std"5499              DOT@8212..8213 "."5500              NAME@8213..82245501                IDENT@8213..8224 "objectHasEx"5502            ARGS_DESC@8224..82425503              L_PAREN@8224..8225 "("5504              ARG@8225..82265505                EXPR_VAR@8225..82265506                  NAME@8225..82265507                    IDENT@8225..8226 "o"5508              COMMA@8226..8227 ","5509              WHITESPACE@8227..8228 " "5510              ARG@8228..82295511                EXPR_VAR@8228..82295512                  NAME@8228..82295513                    IDENT@8228..8229 "f"5514              COMMA@8229..8230 ","5515              WHITESPACE@8230..8231 " "5516              ARG@8231..82415517                EXPR_VAR@8231..82415518                  NAME@8231..82415519                    IDENT@8231..8241 "inc_hidden"5520              R_PAREN@8241..8242 ")"5521          WHITESPACE@8242..8243 " "5522          THEN_KW@8243..8247 "then"5523          WHITESPACE@8247..8248 " "5524          TRUE_EXPR@8248..82525525            EXPR_INDEX_EXPR@8248..82525526              LHS_EXPR@8248..82495527                EXPR_VAR@8248..82495528                  NAME@8248..82495529                    IDENT@8248..8249 "o"5530              L_BRACK@8249..8250 "["5531              EXPR_VAR@8250..82515532                NAME@8250..82515533                  IDENT@8250..8251 "f"5534              R_BRACK@8251..8252 "]"5535          WHITESPACE@8252..8253 " "5536          ELSE_KW@8253..8257 "else"5537          WHITESPACE@8257..8258 " "5538          FALSE_EXPR@8258..82655539            EXPR_VAR@8258..82655540              NAME@8258..82655541                IDENT@8258..8265 "default"5542      COMMA@8265..8266 ","5543      WHITESPACE@8266..8270 "\n\n  "5544      MEMBER_FIELD_METHOD@8270..83205545        FIELD_NAME_FIXED@8270..82825546          NAME@8270..82825547            IDENT@8270..8282 "objectFields"5548        PARAMS_DESC@8282..82855549          L_PAREN@8282..8283 "("5550          PARAM@8283..82845551            DESTRUCT_FULL@8283..82845552              NAME@8283..82845553                IDENT@8283..8284 "o"5554          R_PAREN@8284..8285 ")"5555        COLONCOLON@8285..8287 "::"5556        WHITESPACE@8287..8292 "\n    "5557        EXPR_APPLY@8292..83205558          EXPR_INDEX@8292..83105559            EXPR_VAR@8292..82955560              NAME@8292..82955561                IDENT@8292..8295 "std"5562            DOT@8295..8296 "."5563            NAME@8296..83105564              IDENT@8296..8310 "objectFieldsEx"5565          ARGS_DESC@8310..83205566            L_PAREN@8310..8311 "("5567            ARG@8311..83125568              EXPR_VAR@8311..83125569                NAME@8311..83125570                  IDENT@8311..8312 "o"5571            COMMA@8312..8313 ","5572            WHITESPACE@8313..8314 " "5573            ARG@8314..83195574              EXPR_LITERAL@8314..83195575                FALSE_KW@8314..8319 "false"5576            R_PAREN@8319..8320 ")"5577      COMMA@8320..8321 ","5578      WHITESPACE@8321..8325 "\n\n  "5579      MEMBER_FIELD_METHOD@8325..83775580        FIELD_NAME_FIXED@8325..83405581          NAME@8325..83405582            IDENT@8325..8340 "objectFieldsAll"5583        PARAMS_DESC@8340..83435584          L_PAREN@8340..8341 "("5585          PARAM@8341..83425586            DESTRUCT_FULL@8341..83425587              NAME@8341..83425588                IDENT@8341..8342 "o"5589          R_PAREN@8342..8343 ")"5590        COLONCOLON@8343..8345 "::"5591        WHITESPACE@8345..8350 "\n    "5592        EXPR_APPLY@8350..83775593          EXPR_INDEX@8350..83685594            EXPR_VAR@8350..83535595              NAME@8350..83535596                IDENT@8350..8353 "std"5597            DOT@8353..8354 "."5598            NAME@8354..83685599              IDENT@8354..8368 "objectFieldsEx"5600          ARGS_DESC@8368..83775601            L_PAREN@8368..8369 "("5602            ARG@8369..83705603              EXPR_VAR@8369..83705604                NAME@8369..83705605                  IDENT@8369..8370 "o"5606            COMMA@8370..8371 ","5607            WHITESPACE@8371..8372 " "5608            ARG@8372..83765609              EXPR_LITERAL@8372..83765610                TRUE_KW@8372..8376 "true"5611            R_PAREN@8376..8377 ")"5612      COMMA@8377..8378 ","5613      WHITESPACE@8378..8382 "\n\n  "5614      MEMBER_FIELD_METHOD@8382..84325615        FIELD_NAME_FIXED@8382..83915616          NAME@8382..83915617            IDENT@8382..8391 "objectHas"5618        PARAMS_DESC@8391..83975619          L_PAREN@8391..8392 "("5620          PARAM@8392..83935621            DESTRUCT_FULL@8392..83935622              NAME@8392..83935623                IDENT@8392..8393 "o"5624          COMMA@8393..8394 ","5625          WHITESPACE@8394..8395 " "5626          PARAM@8395..83965627            DESTRUCT_FULL@8395..83965628              NAME@8395..83965629                IDENT@8395..8396 "f"5630          R_PAREN@8396..8397 ")"5631        COLONCOLON@8397..8399 "::"5632        WHITESPACE@8399..8404 "\n    "5633        EXPR_APPLY@8404..84325634          EXPR_INDEX@8404..84195635            EXPR_VAR@8404..84075636              NAME@8404..84075637                IDENT@8404..8407 "std"5638            DOT@8407..8408 "."5639            NAME@8408..84195640              IDENT@8408..8419 "objectHasEx"5641          ARGS_DESC@8419..84325642            L_PAREN@8419..8420 "("5643            ARG@8420..84215644              EXPR_VAR@8420..84215645                NAME@8420..84215646                  IDENT@8420..8421 "o"5647            COMMA@8421..8422 ","5648            WHITESPACE@8422..8423 " "5649            ARG@8423..84245650              EXPR_VAR@8423..84245651                NAME@8423..84245652                  IDENT@8423..8424 "f"5653            COMMA@8424..8425 ","5654            WHITESPACE@8425..8426 " "5655            ARG@8426..84315656              EXPR_LITERAL@8426..84315657                FALSE_KW@8426..8431 "false"5658            R_PAREN@8431..8432 ")"5659      COMMA@8432..8433 ","5660      WHITESPACE@8433..8437 "\n\n  "5661      MEMBER_FIELD_METHOD@8437..84895662        FIELD_NAME_FIXED@8437..84495663          NAME@8437..84495664            IDENT@8437..8449 "objectHasAll"5665        PARAMS_DESC@8449..84555666          L_PAREN@8449..8450 "("5667          PARAM@8450..84515668            DESTRUCT_FULL@8450..84515669              NAME@8450..84515670                IDENT@8450..8451 "o"5671          COMMA@8451..8452 ","5672          WHITESPACE@8452..8453 " "5673          PARAM@8453..84545674            DESTRUCT_FULL@8453..84545675              NAME@8453..84545676                IDENT@8453..8454 "f"5677          R_PAREN@8454..8455 ")"5678        COLONCOLON@8455..8457 "::"5679        WHITESPACE@8457..8462 "\n    "5680        EXPR_APPLY@8462..84895681          EXPR_INDEX@8462..84775682            EXPR_VAR@8462..84655683              NAME@8462..84655684                IDENT@8462..8465 "std"5685            DOT@8465..8466 "."5686            NAME@8466..84775687              IDENT@8466..8477 "objectHasEx"5688          ARGS_DESC@8477..84895689            L_PAREN@8477..8478 "("5690            ARG@8478..84795691              EXPR_VAR@8478..84795692                NAME@8478..84795693                  IDENT@8478..8479 "o"5694            COMMA@8479..8480 ","5695            WHITESPACE@8480..8481 " "5696            ARG@8481..84825697              EXPR_VAR@8481..84825698                NAME@8481..84825699                  IDENT@8481..8482 "f"5700            COMMA@8482..8483 ","5701            WHITESPACE@8483..8484 " "5702            ARG@8484..84885703              EXPR_LITERAL@8484..84885704                TRUE_KW@8484..8488 "true"5705            R_PAREN@8488..8489 ")"5706      COMMA@8489..8490 ","5707      WHITESPACE@8490..8494 "\n\n  "5708      MEMBER_FIELD_METHOD@8494..85515709        FIELD_NAME_FIXED@8494..85065710          NAME@8494..85065711            IDENT@8494..8506 "objectValues"5712        PARAMS_DESC@8506..85095713          L_PAREN@8506..8507 "("5714          PARAM@8507..85085715            DESTRUCT_FULL@8507..85085716              NAME@8507..85085717                IDENT@8507..8508 "o"5718          R_PAREN@8508..8509 ")"5719        COLONCOLON@8509..8511 "::"5720        WHITESPACE@8511..8516 "\n    "5721        EXPR_ARRAY_COMP@8516..85515722          L_BRACK@8516..8517 "["5723          EXPR_INDEX_EXPR@8517..85215724            LHS_EXPR@8517..85185725              EXPR_VAR@8517..85185726                NAME@8517..85185727                  IDENT@8517..8518 "o"5728            L_BRACK@8518..8519 "["5729            EXPR_VAR@8519..85205730              NAME@8519..85205731                IDENT@8519..8520 "k"5732            R_BRACK@8520..8521 "]"5733          WHITESPACE@8521..8522 " "5734          FOR_SPEC@8522..85505735            FOR_KW@8522..8525 "for"5736            WHITESPACE@8525..8526 " "5737            NAME@8526..85275738              IDENT@8526..8527 "k"5739            WHITESPACE@8527..8528 " "5740            IN_KW@8528..8530 "in"5741            WHITESPACE@8530..8531 " "5742            EXPR_APPLY@8531..85505743              EXPR_INDEX@8531..85475744                EXPR_VAR@8531..85345745                  NAME@8531..85345746                    IDENT@8531..8534 "std"5747                DOT@8534..8535 "."5748                NAME@8535..85475749                  IDENT@8535..8547 "objectFields"5750              ARGS_DESC@8547..85505751                L_PAREN@8547..8548 "("5752                ARG@8548..85495753                  EXPR_VAR@8548..85495754                    NAME@8548..85495755                      IDENT@8548..8549 "o"5756                R_PAREN@8549..8550 ")"5757          R_BRACK@8550..8551 "]"5758      COMMA@8551..8552 ","5759      WHITESPACE@8552..8556 "\n\n  "5760      MEMBER_FIELD_METHOD@8556..86195761        FIELD_NAME_FIXED@8556..85715762          NAME@8556..85715763            IDENT@8556..8571 "objectValuesAll"5764        PARAMS_DESC@8571..85745765          L_PAREN@8571..8572 "("5766          PARAM@8572..85735767            DESTRUCT_FULL@8572..85735768              NAME@8572..85735769                IDENT@8572..8573 "o"5770          R_PAREN@8573..8574 ")"5771        COLONCOLON@8574..8576 "::"5772        WHITESPACE@8576..8581 "\n    "5773        EXPR_ARRAY_COMP@8581..86195774          L_BRACK@8581..8582 "["5775          EXPR_INDEX_EXPR@8582..85865776            LHS_EXPR@8582..85835777              EXPR_VAR@8582..85835778                NAME@8582..85835779                  IDENT@8582..8583 "o"5780            L_BRACK@8583..8584 "["5781            EXPR_VAR@8584..85855782              NAME@8584..85855783                IDENT@8584..8585 "k"5784            R_BRACK@8585..8586 "]"5785          WHITESPACE@8586..8587 " "5786          FOR_SPEC@8587..86185787            FOR_KW@8587..8590 "for"5788            WHITESPACE@8590..8591 " "5789            NAME@8591..85925790              IDENT@8591..8592 "k"5791            WHITESPACE@8592..8593 " "5792            IN_KW@8593..8595 "in"5793            WHITESPACE@8595..8596 " "5794            EXPR_APPLY@8596..86185795              EXPR_INDEX@8596..86155796                EXPR_VAR@8596..85995797                  NAME@8596..85995798                    IDENT@8596..8599 "std"5799                DOT@8599..8600 "."5800                NAME@8600..86155801                  IDENT@8600..8615 "objectFieldsAll"5802              ARGS_DESC@8615..86185803                L_PAREN@8615..8616 "("5804                ARG@8616..86175805                  EXPR_VAR@8616..86175806                    NAME@8616..86175807                      IDENT@8616..8617 "o"5808                R_PAREN@8617..8618 ")"5809          R_BRACK@8618..8619 "]"5810      COMMA@8619..8620 ","5811      WHITESPACE@8620..8624 "\n\n  "5812      MEMBER_FIELD_METHOD@8624..87585813        FIELD_NAME_FIXED@8624..86355814          NAME@8624..86355815            IDENT@8624..8635 "resolvePath"5816        PARAMS_DESC@8635..86415817          L_PAREN@8635..8636 "("5818          PARAM@8636..86375819            DESTRUCT_FULL@8636..86375820              NAME@8636..86375821                IDENT@8636..8637 "f"5822          COMMA@8637..8638 ","5823          WHITESPACE@8638..8639 " "5824          PARAM@8639..86405825            DESTRUCT_FULL@8639..86405826              NAME@8639..86405827                IDENT@8639..8640 "r"5828          R_PAREN@8640..8641 ")"5829        COLONCOLON@8641..8643 "::"5830        WHITESPACE@8643..8648 "\n    "5831        STMT_LOCAL@8648..86785832          LOCAL_KW@8648..8653 "local"5833          WHITESPACE@8653..8654 " "5834          BIND_DESTRUCT@8654..86775835            DESTRUCT_FULL@8654..86575836              NAME@8654..86575837                IDENT@8654..8657 "arr"5838            WHITESPACE@8657..8658 " "5839            ASSIGN@8658..8659 "="5840            WHITESPACE@8659..8660 " "5841            EXPR_APPLY@8660..86775842              EXPR_INDEX@8660..86695843                EXPR_VAR@8660..86635844                  NAME@8660..86635845                    IDENT@8660..8663 "std"5846                DOT@8663..8664 "."5847                NAME@8664..86695848                  IDENT@8664..8669 "split"5849              ARGS_DESC@8669..86775850                L_PAREN@8669..8670 "("5851                ARG@8670..86715852                  EXPR_VAR@8670..86715853                    NAME@8670..86715854                      IDENT@8670..8671 "f"5855                COMMA@8671..8672 ","5856                WHITESPACE@8672..8673 " "5857                ARG@8673..86765858                  EXPR_STRING@8673..86765859                    STRING_SINGLE@8673..8676 "'/'"5860                R_PAREN@8676..8677 ")"5861          SEMI@8677..8678 ";"5862        WHITESPACE@8678..8683 "\n    "5863        EXPR_APPLY@8683..87585864          EXPR_INDEX@8683..86915865            EXPR_VAR@8683..86865866              NAME@8683..86865867                IDENT@8683..8686 "std"5868            DOT@8686..8687 "."5869            NAME@8687..86915870              IDENT@8687..8691 "join"5871          ARGS_DESC@8691..87585872            L_PAREN@8691..8692 "("5873            ARG@8692..86955874              EXPR_STRING@8692..86955875                STRING_SINGLE@8692..8695 "'/'"5876            COMMA@8695..8696 ","5877            WHITESPACE@8696..8697 " "5878            ARG@8697..87575879              EXPR_BINARY@8697..87575880                LHS_EXPR@8697..87515881                  EXPR_APPLY@8697..87515882                    EXPR_INDEX@8697..87105883                      EXPR_VAR@8697..87005884                        NAME@8697..87005885                          IDENT@8697..8700 "std"5886                      DOT@8700..8701 "."5887                      NAME@8701..87105888                        IDENT@8701..8710 "makeArray"5889                    ARGS_DESC@8710..87515890                      L_PAREN@8710..8711 "("5891                      ARG@8711..87305892                        EXPR_BINARY@8711..87305893                          LHS_EXPR@8711..87265894                            EXPR_APPLY@8711..87265895                              EXPR_INDEX@8711..87215896                                EXPR_VAR@8711..87145897                                  NAME@8711..87145898                                    IDENT@8711..8714 "std"5899                                DOT@8714..8715 "."5900                                NAME@8715..87215901                                  IDENT@8715..8721 "length"5902                              ARGS_DESC@8721..87265903                                L_PAREN@8721..8722 "("5904                                ARG@8722..87255905                                  EXPR_VAR@8722..87255906                                    NAME@8722..87255907                                      IDENT@8722..8725 "arr"5908                                R_PAREN@8725..8726 ")"5909                          WHITESPACE@8726..8727 " "5910                          MINUS@8727..8728 "-"5911                          WHITESPACE@8728..8729 " "5912                          EXPR_NUMBER@8729..87305913                            FLOAT@8729..8730 "1"5914                      COMMA@8730..8731 ","5915                      WHITESPACE@8731..8732 " "5916                      ARG@8732..87505917                        EXPR_FUNCTION@8732..87505918                          FUNCTION_KW@8732..8740 "function"5919                          PARAMS_DESC@8740..87435920                            L_PAREN@8740..8741 "("5921                            PARAM@8741..87425922                              DESTRUCT_FULL@8741..87425923                                NAME@8741..87425924                                  IDENT@8741..8742 "i"5925                            R_PAREN@8742..8743 ")"5926                          WHITESPACE@8743..8744 " "5927                          EXPR_INDEX_EXPR@8744..87505928                            LHS_EXPR@8744..87475929                              EXPR_VAR@8744..87475930                                NAME@8744..87475931                                  IDENT@8744..8747 "arr"5932                            L_BRACK@8747..8748 "["5933                            EXPR_VAR@8748..87495934                              NAME@8748..87495935                                IDENT@8748..8749 "i"5936                            R_BRACK@8749..8750 "]"5937                      R_PAREN@8750..8751 ")"5938                WHITESPACE@8751..8752 " "5939                PLUS@8752..8753 "+"5940                WHITESPACE@8753..8754 " "5941                EXPR_ARRAY@8754..87575942                  L_BRACK@8754..8755 "["5943                  EXPR_VAR@8755..87565944                    NAME@8755..87565945                      IDENT@8755..8756 "r"5946                  R_BRACK@8756..8757 "]"5947            R_PAREN@8757..8758 ")"5948      COMMA@8758..8759 ","5949      WHITESPACE@8759..8763 "\n\n  "5950      MEMBER_FIELD_METHOD@8763..92165951        FIELD_NAME_FIXED@8763..87685952          NAME@8763..87685953            IDENT@8763..8768 "prune"5954        PARAMS_DESC@8768..87715955          L_PAREN@8768..8769 "("5956          PARAM@8769..87705957            DESTRUCT_FULL@8769..87705958              NAME@8769..87705959                IDENT@8769..8770 "a"5960          R_PAREN@8770..8771 ")"5961        COLONCOLON@8771..8773 "::"5962        WHITESPACE@8773..8778 "\n    "5963        STMT_LOCAL@8778..89825964          LOCAL_KW@8778..8783 "local"5965          WHITESPACE@8783..8784 " "5966          BIND_FUNCTION@8784..89815967            NAME@8784..87935968              IDENT@8784..8793 "isContent"5969            PARAMS_DESC@8793..87965970              L_PAREN@8793..8794 "("5971              PARAM@8794..87955972                DESTRUCT_FULL@8794..87955973                  NAME@8794..87955974                    IDENT@8794..8795 "b"5975              R_PAREN@8795..8796 ")"5976            WHITESPACE@8796..8797 " "5977            ASSIGN@8797..8798 "="5978            WHITESPACE@8798..8805 "\n      "5979            EXPR_IF_THEN_ELSE@8805..89815980              IF_KW@8805..8807 "if"5981              WHITESPACE@8807..8808 " "5982              EXPR_BINARY@8808..88175983                LHS_EXPR@8808..88095984                  EXPR_VAR@8808..88095985                    NAME@8808..88095986                      IDENT@8808..8809 "b"5987                WHITESPACE@8809..8810 " "5988                EQ@8810..8812 "=="5989                WHITESPACE@8812..8813 " "5990                EXPR_LITERAL@8813..88175991                  NULL_KW@8813..8817 "null"5992              WHITESPACE@8817..8818 " "5993              THEN_KW@8818..8822 "then"5994              WHITESPACE@8822..8831 "\n        "5995              TRUE_EXPR@8831..88365996                EXPR_LITERAL@8831..88365997                  FALSE_KW@8831..8836 "false"5998              WHITESPACE@8836..8843 "\n      "5999              ELSE_KW@8843..8847 "else"6000              WHITESPACE@8847..8848 " "6001              FALSE_EXPR@8848..89816002                EXPR_IF_THEN_ELSE@8848..89816003                  IF_KW@8848..8850 "if"6004                  WHITESPACE@8850..8851 " "6005                  EXPR_APPLY@8851..88656006                    EXPR_INDEX@8851..88626007                      EXPR_VAR@8851..88546008                        NAME@8851..88546009                          IDENT@8851..8854 "std"6010                      DOT@8854..8855 "."6011                      NAME@8855..88626012                        IDENT@8855..8862 "isArray"6013                    ARGS_DESC@8862..88656014                      L_PAREN@8862..8863 "("6015                      ARG@8863..88646016                        EXPR_VAR@8863..88646017                          NAME@8863..88646018                            IDENT@8863..8864 "b"6019                      R_PAREN@8864..8865 ")"6020                  WHITESPACE@8865..8866 " "6021                  THEN_KW@8866..8870 "then"6022                  WHITESPACE@8870..8879 "\n        "6023                  TRUE_EXPR@8879..88966024                    EXPR_BINARY@8879..88966025                      LHS_EXPR@8879..88926026                        EXPR_APPLY@8879..88926027                          EXPR_INDEX@8879..88896028                            EXPR_VAR@8879..88826029                              NAME@8879..88826030                                IDENT@8879..8882 "std"6031                            DOT@8882..8883 "."6032                            NAME@8883..88896033                              IDENT@8883..8889 "length"6034                          ARGS_DESC@8889..88926035                            L_PAREN@8889..8890 "("6036                            ARG@8890..88916037                              EXPR_VAR@8890..88916038                                NAME@8890..88916039                                  IDENT@8890..8891 "b"6040                            R_PAREN@8891..8892 ")"6041                      WHITESPACE@8892..8893 " "6042                      GT@8893..8894 ">"6043                      WHITESPACE@8894..8895 " "6044                      EXPR_NUMBER@8895..88966045                        FLOAT@8895..8896 "0"6046                  WHITESPACE@8896..8903 "\n      "6047                  ELSE_KW@8903..8907 "else"6048                  WHITESPACE@8907..8908 " "6049                  FALSE_EXPR@8908..89816050                    EXPR_IF_THEN_ELSE@8908..89816051                      IF_KW@8908..8910 "if"6052                      WHITESPACE@8910..8911 " "6053                      EXPR_APPLY@8911..89266054                        EXPR_INDEX@8911..89236055                          EXPR_VAR@8911..89146056                            NAME@8911..89146057                              IDENT@8911..8914 "std"6058                          DOT@8914..8915 "."6059                          NAME@8915..89236060                            IDENT@8915..8923 "isObject"6061                        ARGS_DESC@8923..89266062                          L_PAREN@8923..8924 "("6063                          ARG@8924..89256064                            EXPR_VAR@8924..89256065                              NAME@8924..89256066                                IDENT@8924..8925 "b"6067                          R_PAREN@8925..8926 ")"6068                      WHITESPACE@8926..8927 " "6069                      THEN_KW@8927..8931 "then"6070                      WHITESPACE@8931..8940 "\n        "6071                      TRUE_EXPR@8940..89576072                        EXPR_BINARY@8940..89576073                          LHS_EXPR@8940..89536074                            EXPR_APPLY@8940..89536075                              EXPR_INDEX@8940..89506076                                EXPR_VAR@8940..89436077                                  NAME@8940..89436078                                    IDENT@8940..8943 "std"6079                                DOT@8943..8944 "."6080                                NAME@8944..89506081                                  IDENT@8944..8950 "length"6082                              ARGS_DESC@8950..89536083                                L_PAREN@8950..8951 "("6084                                ARG@8951..89526085                                  EXPR_VAR@8951..89526086                                    NAME@8951..89526087                                      IDENT@8951..8952 "b"6088                                R_PAREN@8952..8953 ")"6089                          WHITESPACE@8953..8954 " "6090                          GT@8954..8955 ">"6091                          WHITESPACE@8955..8956 " "6092                          EXPR_NUMBER@8956..89576093                            FLOAT@8956..8957 "0"6094                      WHITESPACE@8957..8964 "\n      "6095                      ELSE_KW@8964..8968 "else"6096                      WHITESPACE@8968..8977 "\n        "6097                      FALSE_EXPR@8977..89816098                        EXPR_LITERAL@8977..89816099                          TRUE_KW@8977..8981 "true"6100          SEMI@8981..8982 ";"6101        WHITESPACE@8982..8987 "\n    "6102        EXPR_IF_THEN_ELSE@8987..92166103          IF_KW@8987..8989 "if"6104          WHITESPACE@8989..8990 " "6105          EXPR_APPLY@8990..90046106            EXPR_INDEX@8990..90016107              EXPR_VAR@8990..89936108                NAME@8990..89936109                  IDENT@8990..8993 "std"6110              DOT@8993..8994 "."6111              NAME@8994..90016112                IDENT@8994..9001 "isArray"6113            ARGS_DESC@9001..90046114              L_PAREN@9001..9002 "("6115              ARG@9002..90036116                EXPR_VAR@9002..90036117                  NAME@9002..90036118                    IDENT@9002..9003 "a"6119              R_PAREN@9003..9004 ")"6120          WHITESPACE@9004..9005 " "6121          THEN_KW@9005..9009 "then"6122          WHITESPACE@9009..9016 "\n      "6123          TRUE_EXPR@9016..90666124            EXPR_ARRAY_COMP@9016..90666125              L_BRACK@9016..9017 "["6126              EXPR_APPLY@9017..90296127                EXPR_INDEX@9017..90266128                  EXPR_VAR@9017..90206129                    NAME@9017..90206130                      IDENT@9017..9020 "std"6131                  DOT@9020..9021 "."6132                  NAME@9021..90266133                    IDENT@9021..9026 "prune"6134                ARGS_DESC@9026..90296135                  L_PAREN@9026..9027 "("6136                  ARG@9027..90286137                    EXPR_VAR@9027..90286138                      NAME@9027..90286139                        IDENT@9027..9028 "x"6140                  R_PAREN@9028..9029 ")"6141              WHITESPACE@9029..9030 " "6142              FOR_SPEC@9030..90406143                FOR_KW@9030..9033 "for"6144                WHITESPACE@9033..9034 " "6145                NAME@9034..90356146                  IDENT@9034..9035 "x"6147                WHITESPACE@9035..9036 " "6148                IN_KW@9036..9038 "in"6149                WHITESPACE@9038..9039 " "6150                EXPR_VAR@9039..90406151                  NAME@9039..90406152                    IDENT@9039..9040 "a"6153              WHITESPACE@9040..9041 " "6154              IF_SPEC@9041..90656155                IF_KW@9041..9043 "if"6156                WHITESPACE@9043..9044 " "6157                EXPR_APPLY@9044..90656158                  EXPR_VAR@9044..90536159                    NAME@9044..90536160                      IDENT@9044..9053 "isContent"6161                  ARGS_DESC@9053..90656162                    L_PAREN@9053..9054 "("6163                    ARG@9054..90646164                      EXPR_APPLY@9054..90646165                        EXPR_INDEX@9054..90616166                          EXPR_LITERAL@9054..90556167                            DOLLAR@9054..9055 "$"6168                          DOT@9055..9056 "."6169                          NAME@9056..90616170                            IDENT@9056..9061 "prune"6171                        ARGS_DESC@9061..90646172                          L_PAREN@9061..9062 "("6173                          ARG@9062..90636174                            EXPR_VAR@9062..90636175                              NAME@9062..90636176                                IDENT@9062..9063 "x"6177                          R_PAREN@9063..9064 ")"6178                    R_PAREN@9064..9065 ")"6179              R_BRACK@9065..9066 "]"6180          WHITESPACE@9066..9071 "\n    "6181          ELSE_KW@9071..9075 "else"6182          WHITESPACE@9075..9076 " "6183          FALSE_EXPR@9076..92166184            EXPR_IF_THEN_ELSE@9076..92166185              IF_KW@9076..9078 "if"6186              WHITESPACE@9078..9079 " "6187              EXPR_APPLY@9079..90946188                EXPR_INDEX@9079..90916189                  EXPR_VAR@9079..90826190                    NAME@9079..90826191                      IDENT@9079..9082 "std"6192                  DOT@9082..9083 "."6193                  NAME@9083..90916194                    IDENT@9083..9091 "isObject"6195                ARGS_DESC@9091..90946196                  L_PAREN@9091..9092 "("6197                  ARG@9092..90936198                    EXPR_VAR@9092..90936199                      NAME@9092..90936200                        IDENT@9092..9093 "a"6201                  R_PAREN@9093..9094 ")"6202              WHITESPACE@9094..9095 " "6203              THEN_KW@9095..9099 "then"6204              WHITESPACE@9099..9100 " "6205              TRUE_EXPR@9100..92036206                EXPR_OBJECT@9100..92036207                  OBJ_BODY_COMP@9100..92036208                    L_BRACE@9100..9101 "{"6209                    WHITESPACE@9101..9108 "\n      "6210                    MEMBER_FIELD_NORMAL@9108..91266211                      FIELD_NAME_DYNAMIC@9108..91116212                        L_BRACK@9108..9109 "["6213                        EXPR_VAR@9109..91106214                          NAME@9109..91106215                            IDENT@9109..9110 "x"6216                        R_BRACK@9110..9111 "]"6217                      COLON@9111..9112 ":"6218                      WHITESPACE@9112..9113 " "6219                      EXPR_APPLY@9113..91266220                        EXPR_INDEX@9113..91206221                          EXPR_LITERAL@9113..91146222                            DOLLAR@9113..9114 "$"6223                          DOT@9114..9115 "."6224                          NAME@9115..91206225                            IDENT@9115..9120 "prune"6226                        ARGS_DESC@9120..91266227                          L_PAREN@9120..9121 "("6228                          ARG@9121..91256229                            EXPR_INDEX_EXPR@9121..91256230                              LHS_EXPR@9121..91226231                                EXPR_VAR@9121..91226232                                  NAME@9121..91226233                                    IDENT@9121..9122 "a"6234                              L_BRACK@9122..9123 "["6235                              EXPR_VAR@9123..91246236                                NAME@9123..91246237                                  IDENT@9123..9124 "x"6238                              R_BRACK@9124..9125 "]"6239                          R_PAREN@9125..9126 ")"6240                    WHITESPACE@9126..9133 "\n      "6241                    FOR_SPEC@9133..91616242                      FOR_KW@9133..9136 "for"6243                      WHITESPACE@9136..9137 " "6244                      NAME@9137..91386245                        IDENT@9137..9138 "x"6246                      WHITESPACE@9138..9139 " "6247                      IN_KW@9139..9141 "in"6248                      WHITESPACE@9141..9142 " "6249                      EXPR_APPLY@9142..91616250                        EXPR_INDEX@9142..91586251                          EXPR_VAR@9142..91456252                            NAME@9142..91456253                              IDENT@9142..9145 "std"6254                          DOT@9145..9146 "."6255                          NAME@9146..91586256                            IDENT@9146..9158 "objectFields"6257                        ARGS_DESC@9158..91616258                          L_PAREN@9158..9159 "("6259                          ARG@9159..91606260                            EXPR_VAR@9159..91606261                              NAME@9159..91606262                                IDENT@9159..9160 "a"6263                          R_PAREN@9160..9161 ")"6264                    WHITESPACE@9161..9168 "\n      "6265                    IF_SPEC@9168..91976266                      IF_KW@9168..9170 "if"6267                      WHITESPACE@9170..9171 " "6268                      EXPR_APPLY@9171..91976269                        EXPR_VAR@9171..91806270                          NAME@9171..91806271                            IDENT@9171..9180 "isContent"6272                        ARGS_DESC@9180..91976273                          L_PAREN@9180..9181 "("6274                          ARG@9181..91966275                            EXPR_APPLY@9181..91966276                              EXPR_INDEX@9181..91906277                                EXPR_VAR@9181..91846278                                  NAME@9181..91846279                                    IDENT@9181..9184 "std"6280                                DOT@9184..9185 "."6281                                NAME@9185..91906282                                  IDENT@9185..9190 "prune"6283                              ARGS_DESC@9190..91966284                                L_PAREN@9190..9191 "("6285                                ARG@9191..91956286                                  EXPR_INDEX_EXPR@9191..91956287                                    LHS_EXPR@9191..91926288                                      EXPR_VAR@9191..91926289                                        NAME@9191..91926290                                          IDENT@9191..9192 "a"6291                                    L_BRACK@9192..9193 "["6292                                    EXPR_VAR@9193..91946293                                      NAME@9193..91946294                                        IDENT@9193..9194 "x"6295                                    R_BRACK@9194..9195 "]"6296                                R_PAREN@9195..9196 ")"6297                          R_PAREN@9196..9197 ")"6298                    WHITESPACE@9197..9202 "\n    "6299                    R_BRACE@9202..9203 "}"6300              WHITESPACE@9203..9204 " "6301              ELSE_KW@9204..9208 "else"6302              WHITESPACE@9208..9215 "\n      "6303              FALSE_EXPR@9215..92166304                EXPR_VAR@9215..92166305                  NAME@9215..92166306                    IDENT@9215..9216 "a"6307      COMMA@9216..9217 ","6308      WHITESPACE@9217..9221 "\n\n  "6309      MEMBER_FIELD_METHOD@9221..94366310        FIELD_NAME_FIXED@9221..92256311          NAME@9221..92256312            IDENT@9221..9225 "find"6313        PARAMS_DESC@9225..92376314          L_PAREN@9225..9226 "("6315          PARAM@9226..92316316            DESTRUCT_FULL@9226..92316317              NAME@9226..92316318                IDENT@9226..9231 "value"6319          COMMA@9231..9232 ","6320          WHITESPACE@9232..9233 " "6321          PARAM@9233..92366322            DESTRUCT_FULL@9233..92366323              NAME@9233..92366324                IDENT@9233..9236 "arr"6325          R_PAREN@9236..9237 ")"6326        COLONCOLON@9237..9239 "::"6327        WHITESPACE@9239..9244 "\n    "6328        EXPR_IF_THEN_ELSE@9244..94366329          IF_KW@9244..9246 "if"6330          WHITESPACE@9246..9247 " "6331          EXPR_UNARY@9247..92646332            NOT@9247..9248 "!"6333            EXPR_APPLY@9248..92646334              EXPR_INDEX@9248..92596335                EXPR_VAR@9248..92516336                  NAME@9248..92516337                    IDENT@9248..9251 "std"6338                DOT@9251..9252 "."6339                NAME@9252..92596340                  IDENT@9252..9259 "isArray"6341              ARGS_DESC@9259..92646342                L_PAREN@9259..9260 "("6343                ARG@9260..92636344                  EXPR_VAR@9260..92636345                    NAME@9260..92636346                      IDENT@9260..9263 "arr"6347                R_PAREN@9263..9264 ")"6348          WHITESPACE@9264..9265 " "6349          THEN_KW@9265..9269 "then"6350          WHITESPACE@9269..9276 "\n      "6351          TRUE_EXPR@9276..93466352            EXPR_ERROR@9276..93466353              ERROR_KW@9276..9281 "error"6354              WHITESPACE@9281..9282 " "6355              EXPR_BINARY@9282..93466356                LHS_EXPR@9282..93306357                  EXPR_STRING@9282..93306358                    STRING_SINGLE@9282..9330 "'find second paramete ..."6359                WHITESPACE@9330..9331 " "6360                PLUS@9331..9332 "+"6361                WHITESPACE@9332..9333 " "6362                EXPR_APPLY@9333..93466363                  EXPR_INDEX@9333..93416364                    EXPR_VAR@9333..93366365                      NAME@9333..93366366                        IDENT@9333..9336 "std"6367                    DOT@9336..9337 "."6368                    NAME@9337..93416369                      IDENT@9337..9341 "type"6370                  ARGS_DESC@9341..93466371                    L_PAREN@9341..9342 "("6372                    ARG@9342..93456373                      EXPR_VAR@9342..93456374                        NAME@9342..93456375                          IDENT@9342..9345 "arr"6376                    R_PAREN@9345..9346 ")"6377          WHITESPACE@9346..9351 "\n    "6378          ELSE_KW@9351..9355 "else"6379          WHITESPACE@9355..9362 "\n      "6380          FALSE_EXPR@9362..94366381            EXPR_APPLY@9362..94366382              EXPR_INDEX@9362..93726383                EXPR_VAR@9362..93656384                  NAME@9362..93656385                    IDENT@9362..9365 "std"6386                DOT@9365..9366 "."6387                NAME@9366..93726388                  IDENT@9366..9372 "filter"6389              ARGS_DESC@9372..94366390                L_PAREN@9372..9373 "("6391                ARG@9373..94006392                  EXPR_FUNCTION@9373..94006393                    FUNCTION_KW@9373..9381 "function"6394                    PARAMS_DESC@9381..93846395                      L_PAREN@9381..9382 "("6396                      PARAM@9382..93836397                        DESTRUCT_FULL@9382..93836398                          NAME@9382..93836399                            IDENT@9382..9383 "i"6400                      R_PAREN@9383..9384 ")"6401                    WHITESPACE@9384..9385 " "6402                    EXPR_BINARY@9385..94006403                      LHS_EXPR@9385..93916404                        EXPR_INDEX_EXPR@9385..93916405                          LHS_EXPR@9385..93886406                            EXPR_VAR@9385..93886407                              NAME@9385..93886408                                IDENT@9385..9388 "arr"6409                          L_BRACK@9388..9389 "["6410                          EXPR_VAR@9389..93906411                            NAME@9389..93906412                              IDENT@9389..9390 "i"6413                          R_BRACK@9390..9391 "]"6414                      WHITESPACE@9391..9392 " "6415                      EQ@9392..9394 "=="6416                      WHITESPACE@9394..9395 " "6417                      EXPR_VAR@9395..94006418                        NAME@9395..94006419                          IDENT@9395..9400 "value"6420                COMMA@9400..9401 ","6421                WHITESPACE@9401..9402 " "6422                ARG@9402..94356423                  EXPR_APPLY@9402..94356424                    EXPR_INDEX@9402..94116425                      EXPR_VAR@9402..94056426                        NAME@9402..94056427                          IDENT@9402..9405 "std"6428                      DOT@9405..9406 "."6429                      NAME@9406..94116430                        IDENT@9406..9411 "range"6431                    ARGS_DESC@9411..94356432                      L_PAREN@9411..9412 "("6433                      ARG@9412..94136434                        EXPR_NUMBER@9412..94136435                          FLOAT@9412..9413 "0"6436                      COMMA@9413..9414 ","6437                      WHITESPACE@9414..9415 " "6438                      ARG@9415..94346439                        EXPR_BINARY@9415..94346440                          LHS_EXPR@9415..94306441                            EXPR_APPLY@9415..94306442                              EXPR_INDEX@9415..94256443                                EXPR_VAR@9415..94186444                                  NAME@9415..94186445                                    IDENT@9415..9418 "std"6446                                DOT@9418..9419 "."6447                                NAME@9419..94256448                                  IDENT@9419..9425 "length"6449                              ARGS_DESC@9425..94306450                                L_PAREN@9425..9426 "("6451                                ARG@9426..94296452                                  EXPR_VAR@9426..94296453                                    NAME@9426..94296454                                      IDENT@9426..9429 "arr"6455                                R_PAREN@9429..9430 ")"6456                          WHITESPACE@9430..9431 " "6457                          MINUS@9431..9432 "-"6458                          WHITESPACE@9432..9433 " "6459                          EXPR_NUMBER@9433..94346460                            FLOAT@9433..9434 "1"6461                      R_PAREN@9434..9435 ")"6462                R_PAREN@9435..9436 ")"6463      COMMA@9436..9437 ","6464      WHITESPACE@9437..9441 "\n\n  "6465      SINGLE_LINE_SLASH_COMMENT@9441..9451 "// Compat\n"6466      WHITESPACE@9451..9453 "  "6467      MEMBER_FIELD_METHOD@9453..95636468        FIELD_NAME_FIXED@9453..94686469          NAME@9453..94686470            IDENT@9453..9468 "__compare_array"6471        PARAMS_DESC@9468..94806472          L_PAREN@9468..9469 "("6473          PARAM@9469..94736474            DESTRUCT_FULL@9469..94736475              NAME@9469..94736476                IDENT@9469..9473 "arr1"6477          COMMA@9473..9474 ","6478          WHITESPACE@9474..9475 " "6479          PARAM@9475..94796480            DESTRUCT_FULL@9475..94796481              NAME@9475..94796482                IDENT@9475..9479 "arr2"6483          R_PAREN@9479..9480 ")"6484        COLONCOLON@9480..9482 "::"6485        WHITESPACE@9482..9487 "\n    "6486        EXPR_ASSERT@9487..95636487          ASSERTION@9487..95326488            ASSERT_KW@9487..9493 "assert"6489            WHITESPACE@9493..9494 " "6490            LHS_EXPR@9494..95326491              EXPR_BINARY@9494..95326492                LHS_EXPR@9494..95116493                  EXPR_APPLY@9494..95116494                    EXPR_INDEX@9494..95056495                      EXPR_VAR@9494..94976496                        NAME@9494..94976497                          IDENT@9494..9497 "std"6498                      DOT@9497..9498 "."6499                      NAME@9498..95056500                        IDENT@9498..9505 "isArray"6501                    ARGS_DESC@9505..95116502                      L_PAREN@9505..9506 "("6503                      ARG@9506..95106504                        EXPR_VAR@9506..95106505                          NAME@9506..95106506                            IDENT@9506..9510 "arr1"6507                      R_PAREN@9510..9511 ")"6508                WHITESPACE@9511..9512 " "6509                AND@9512..9514 "&&"6510                WHITESPACE@9514..9515 " "6511                EXPR_APPLY@9515..95326512                  EXPR_INDEX@9515..95266513                    EXPR_VAR@9515..95186514                      NAME@9515..95186515                        IDENT@9515..9518 "std"6516                    DOT@9518..9519 "."6517                    NAME@9519..95266518                      IDENT@9519..9526 "isArray"6519                  ARGS_DESC@9526..95326520                    L_PAREN@9526..9527 "("6521                    ARG@9527..95316522                      EXPR_VAR@9527..95316523                        NAME@9527..95316524                          IDENT@9527..9531 "arr2"6525                    R_PAREN@9531..9532 ")"6526          SEMI@9532..9533 ";"6527          WHITESPACE@9533..9538 "\n    "6528          EXPR_APPLY@9538..95636529            EXPR_INDEX@9538..95516530              EXPR_VAR@9538..95416531                NAME@9538..95416532                  IDENT@9538..9541 "std"6533              DOT@9541..9542 "."6534              NAME@9542..95516535                IDENT@9542..9551 "__compare"6536            ARGS_DESC@9551..95636537              L_PAREN@9551..9552 "("6538              ARG@9552..95566539                EXPR_VAR@9552..95566540                  NAME@9552..95566541                    IDENT@9552..9556 "arr1"6542              COMMA@9556..9557 ","6543              WHITESPACE@9557..9558 " "6544              ARG@9558..95626545                EXPR_VAR@9558..95626546                  NAME@9558..95626547                    IDENT@9558..9562 "arr2"6548              R_PAREN@9562..9563 ")"6549      COMMA@9563..9564 ","6550      WHITESPACE@9564..9567 "\n  "6551      MEMBER_FIELD_METHOD@9567..96316552        FIELD_NAME_FIXED@9567..95796553          NAME@9567..95796554            IDENT@9567..9579 "__array_less"6555        PARAMS_DESC@9579..95916556          L_PAREN@9579..9580 "("6557          PARAM@9580..95846558            DESTRUCT_FULL@9580..95846559              NAME@9580..95846560                IDENT@9580..9584 "arr1"6561          COMMA@9584..9585 ","6562          WHITESPACE@9585..9586 " "6563          PARAM@9586..95906564            DESTRUCT_FULL@9586..95906565              NAME@9586..95906566                IDENT@9586..9590 "arr2"6567          R_PAREN@9590..9591 ")"6568        COLONCOLON@9591..9593 "::"6569        WHITESPACE@9593..9594 " "6570        EXPR_BINARY@9594..96316571          LHS_EXPR@9594..96256572            EXPR_APPLY@9594..96256573              EXPR_INDEX@9594..96136574                EXPR_VAR@9594..95976575                  NAME@9594..95976576                    IDENT@9594..9597 "std"6577                DOT@9597..9598 "."6578                NAME@9598..96136579                  IDENT@9598..9613 "__compare_array"6580              ARGS_DESC@9613..96256581                L_PAREN@9613..9614 "("6582                ARG@9614..96186583                  EXPR_VAR@9614..96186584                    NAME@9614..96186585                      IDENT@9614..9618 "arr1"6586                COMMA@9618..9619 ","6587                WHITESPACE@9619..9620 " "6588                ARG@9620..96246589                  EXPR_VAR@9620..96246590                    NAME@9620..96246591                      IDENT@9620..9624 "arr2"6592                R_PAREN@9624..9625 ")"6593          WHITESPACE@9625..9626 " "6594          EQ@9626..9628 "=="6595          WHITESPACE@9628..9629 " "6596          EXPR_UNARY@9629..96316597            MINUS@9629..9630 "-"6598            EXPR_NUMBER@9630..96316599              FLOAT@9630..9631 "1"6600      COMMA@9631..9632 ","6601      WHITESPACE@9632..9635 "\n  "6602      MEMBER_FIELD_METHOD@9635..97016603        FIELD_NAME_FIXED@9635..96506604          NAME@9635..96506605            IDENT@9635..9650 "__array_greater"6606        PARAMS_DESC@9650..96626607          L_PAREN@9650..9651 "("6608          PARAM@9651..96556609            DESTRUCT_FULL@9651..96556610              NAME@9651..96556611                IDENT@9651..9655 "arr1"6612          COMMA@9655..9656 ","6613          WHITESPACE@9656..9657 " "6614          PARAM@9657..96616615            DESTRUCT_FULL@9657..96616616              NAME@9657..96616617                IDENT@9657..9661 "arr2"6618          R_PAREN@9661..9662 ")"6619        COLONCOLON@9662..9664 "::"6620        WHITESPACE@9664..9665 " "6621        EXPR_BINARY@9665..97016622          LHS_EXPR@9665..96966623            EXPR_APPLY@9665..96966624              EXPR_INDEX@9665..96846625                EXPR_VAR@9665..96686626                  NAME@9665..96686627                    IDENT@9665..9668 "std"6628                DOT@9668..9669 "."6629                NAME@9669..96846630                  IDENT@9669..9684 "__compare_array"6631              ARGS_DESC@9684..96966632                L_PAREN@9684..9685 "("6633                ARG@9685..96896634                  EXPR_VAR@9685..96896635                    NAME@9685..96896636                      IDENT@9685..9689 "arr1"6637                COMMA@9689..9690 ","6638                WHITESPACE@9690..9691 " "6639                ARG@9691..96956640                  EXPR_VAR@9691..96956641                    NAME@9691..96956642                      IDENT@9691..9695 "arr2"6643                R_PAREN@9695..9696 ")"6644          WHITESPACE@9696..9697 " "6645          EQ@9697..9699 "=="6646          WHITESPACE@9699..9700 " "6647          EXPR_NUMBER@9700..97016648            FLOAT@9700..9701 "1"6649      COMMA@9701..9702 ","6650      WHITESPACE@9702..9705 "\n  "6651      MEMBER_FIELD_METHOD@9705..97776652        FIELD_NAME_FIXED@9705..97266653          NAME@9705..97266654            IDENT@9705..9726 "__array_less_or_equal"6655        PARAMS_DESC@9726..97386656          L_PAREN@9726..9727 "("6657          PARAM@9727..97316658            DESTRUCT_FULL@9727..97316659              NAME@9727..97316660                IDENT@9727..9731 "arr1"6661          COMMA@9731..9732 ","6662          WHITESPACE@9732..9733 " "6663          PARAM@9733..97376664            DESTRUCT_FULL@9733..97376665              NAME@9733..97376666                IDENT@9733..9737 "arr2"6667          R_PAREN@9737..9738 ")"6668        COLONCOLON@9738..9740 "::"6669        WHITESPACE@9740..9741 " "6670        EXPR_BINARY@9741..97776671          LHS_EXPR@9741..97726672            EXPR_APPLY@9741..97726673              EXPR_INDEX@9741..97606674                EXPR_VAR@9741..97446675                  NAME@9741..97446676                    IDENT@9741..9744 "std"6677                DOT@9744..9745 "."6678                NAME@9745..97606679                  IDENT@9745..9760 "__compare_array"6680              ARGS_DESC@9760..97726681                L_PAREN@9760..9761 "("6682                ARG@9761..97656683                  EXPR_VAR@9761..97656684                    NAME@9761..97656685                      IDENT@9761..9765 "arr1"6686                COMMA@9765..9766 ","6687                WHITESPACE@9766..9767 " "6688                ARG@9767..97716689                  EXPR_VAR@9767..97716690                    NAME@9767..97716691                      IDENT@9767..9771 "arr2"6692                R_PAREN@9771..9772 ")"6693          WHITESPACE@9772..9773 " "6694          LE@9773..9775 "<="6695          WHITESPACE@9775..9776 " "6696          EXPR_NUMBER@9776..97776697            FLOAT@9776..9777 "0"6698      COMMA@9777..9778 ","6699      WHITESPACE@9778..9781 "\n  "6700      MEMBER_FIELD_METHOD@9781..98566701        FIELD_NAME_FIXED@9781..98056702          NAME@9781..98056703            IDENT@9781..9805 "__array_greater_or_equal"6704        PARAMS_DESC@9805..98176705          L_PAREN@9805..9806 "("6706          PARAM@9806..98106707            DESTRUCT_FULL@9806..98106708              NAME@9806..98106709                IDENT@9806..9810 "arr1"6710          COMMA@9810..9811 ","6711          WHITESPACE@9811..9812 " "6712          PARAM@9812..98166713            DESTRUCT_FULL@9812..98166714              NAME@9812..98166715                IDENT@9812..9816 "arr2"6716          R_PAREN@9816..9817 ")"6717        COLONCOLON@9817..9819 "::"6718        WHITESPACE@9819..9820 " "6719        EXPR_BINARY@9820..98566720          LHS_EXPR@9820..98516721            EXPR_APPLY@9820..98516722              EXPR_INDEX@9820..98396723                EXPR_VAR@9820..98236724                  NAME@9820..98236725                    IDENT@9820..9823 "std"6726                DOT@9823..9824 "."6727                NAME@9824..98396728                  IDENT@9824..9839 "__compare_array"6729              ARGS_DESC@9839..98516730                L_PAREN@9839..9840 "("6731                ARG@9840..98446732                  EXPR_VAR@9840..98446733                    NAME@9840..98446734                      IDENT@9840..9844 "arr1"6735                COMMA@9844..9845 ","6736                WHITESPACE@9845..9846 " "6737                ARG@9846..98506738                  EXPR_VAR@9846..98506739                    NAME@9846..98506740                      IDENT@9846..9850 "arr2"6741                R_PAREN@9850..9851 ")"6742          WHITESPACE@9851..9852 " "6743          GE@9852..9854 ">="6744          WHITESPACE@9854..9855 " "6745          EXPR_NUMBER@9855..98566746            FLOAT@9855..9856 "0"6747      COMMA@9856..9857 ","6748      WHITESPACE@9857..9858 "\n"6749      R_BRACE@9858..9859 "}"6750  WHITESPACE@9859..9860 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snap
@@ -3,6 +3,6 @@
 expression: "|||\n"
 ---
 SOURCE_FILE@0..4
-  EXPR_STRING@0..4
-    ERROR_STRING_BLOCK_MISSING_INDENT@0..4 "|||\n"
-
+  EXPR@0..4
+    EXPR_STRING@0..4
+      ERROR_STRING_BLOCK_MISSING_INDENT@0..4 "|||\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snap
@@ -3,6 +3,6 @@
 expression: "|||\nhello\n"
 ---
 SOURCE_FILE@0..10
-  EXPR_STRING@0..10
-    ERROR_STRING_BLOCK_MISSING_INDENT@0..10 "|||\nhello\n"
-
+  EXPR@0..10
+    EXPR_STRING@0..10
+      ERROR_STRING_BLOCK_MISSING_INDENT@0..10 "|||\nhello\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snap
@@ -3,6 +3,6 @@
 expression: "|||hello\n"
 ---
 SOURCE_FILE@0..9
-  EXPR_STRING@0..9
-    ERROR_STRING_BLOCK_MISSING_NEW_LINE@0..9 "|||hello\n"
-
+  EXPR@0..9
+    EXPR_STRING@0..9
+      ERROR_STRING_BLOCK_MISSING_NEW_LINE@0..9 "|||hello\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snap
@@ -3,6 +3,6 @@
 expression: "|||\n\thello\n"
 ---
 SOURCE_FILE@0..11
-  EXPR_STRING@0..11
-    ERROR_STRING_BLOCK_UNEXPECTED_END@0..11 "|||\n\thello\n"
-
+  EXPR@0..11
+    EXPR_STRING@0..11
+      ERROR_STRING_BLOCK_UNEXPECTED_END@0..11 "|||\n\thello\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
@@ -3,22 +3,24 @@
 expression: "local * = 1;\na\n"
 ---
 SOURCE_FILE@0..15
-  STMT_LOCAL@0..12
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..11
-      ERROR_UNEXPECTED_TOKEN@6..7
-        MUL@6..7 "*"
-      WHITESPACE@7..8 " "
-      ASSIGN@8..9 "="
-      WHITESPACE@9..10 " "
-      EXPR_NUMBER@10..11
-        FLOAT@10..11 "1"
-    SEMI@11..12 ";"
-  WHITESPACE@12..13 "\n"
-  EXPR_VAR@13..14
-    NAME@13..14
-      IDENT@13..14 "a"
+  EXPR@0..14
+    STMT_LOCAL@0..12
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..11
+        ERROR_UNEXPECTED_TOKEN@6..7
+          MUL@6..7 "*"
+        WHITESPACE@7..8 " "
+        ASSIGN@8..9 "="
+        WHITESPACE@9..10 " "
+        EXPR@10..11
+          EXPR_NUMBER@10..11
+            FLOAT@10..11 "1"
+      SEMI@11..12 ";"
+    WHITESPACE@12..13 "\n"
+    EXPR_VAR@13..14
+      NAME@13..14
+        IDENT@13..14 "a"
   WHITESPACE@14..15 "\n"
 ===
 LocatedSyntaxError { error: Unexpected { expected: Named("destruction specifier"), found: MUL }, range: 6..7 }
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
@@ -3,33 +3,36 @@
 expression: "{\n\ta: 1;\n\tb: 2;\n}\n"
 ---
 SOURCE_FILE@0..18
-  EXPR_OBJECT@0..17
-    OBJ_BODY_MEMBER_LIST@0..17
-      L_BRACE@0..1 "{"
-      WHITESPACE@1..3 "\n\t"
-      MEMBER_FIELD_NORMAL@3..7
-        FIELD_NAME_FIXED@3..4
-          NAME@3..4
-            IDENT@3..4 "a"
-        COLON@4..5 ":"
-        WHITESPACE@5..6 " "
-        EXPR_NUMBER@6..7
-          FLOAT@6..7 "1"
-      ERROR_UNEXPECTED_TOKEN@7..8
-        SEMI@7..8 ";"
-      WHITESPACE@8..10 "\n\t"
-      MEMBER_FIELD_NORMAL@10..14
-        FIELD_NAME_FIXED@10..11
-          NAME@10..11
-            IDENT@10..11 "b"
-        COLON@11..12 ":"
-        WHITESPACE@12..13 " "
-        EXPR_NUMBER@13..14
-          FLOAT@13..14 "2"
-      ERROR_UNEXPECTED_TOKEN@14..15
-        SEMI@14..15 ";"
-      WHITESPACE@15..16 "\n"
-      R_BRACE@16..17 "}"
+  EXPR@0..17
+    EXPR_OBJECT@0..17
+      OBJ_BODY_MEMBER_LIST@0..17
+        L_BRACE@0..1 "{"
+        WHITESPACE@1..3 "\n\t"
+        MEMBER_FIELD_NORMAL@3..7
+          FIELD_NAME_FIXED@3..4
+            NAME@3..4
+              IDENT@3..4 "a"
+          COLON@4..5 ":"
+          WHITESPACE@5..6 " "
+          EXPR@6..7
+            EXPR_NUMBER@6..7
+              FLOAT@6..7 "1"
+        ERROR_UNEXPECTED_TOKEN@7..8
+          SEMI@7..8 ";"
+        WHITESPACE@8..10 "\n\t"
+        MEMBER_FIELD_NORMAL@10..14
+          FIELD_NAME_FIXED@10..11
+            NAME@10..11
+              IDENT@10..11 "b"
+          COLON@11..12 ":"
+          WHITESPACE@12..13 " "
+          EXPR@13..14
+            EXPR_NUMBER@13..14
+              FLOAT@13..14 "2"
+        ERROR_UNEXPECTED_TOKEN@14..15
+          SEMI@14..15 ";"
+        WHITESPACE@15..16 "\n"
+        R_BRACE@16..17 "}"
   WHITESPACE@17..18 "\n"
 ===
 LocatedSyntaxError { error: Unexpected { expected: Named("comma"), found: SEMI }, range: 7..8 }
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/tests.rs
+++ b/crates/jrsonnet-rowan-parser/src/tests.rs
@@ -72,7 +72,7 @@
 			styles: ThemeStyles::none(),
 		});
 
-		write!(out, "===").unwrap();
+		writeln!(out, "===").unwrap();
 		handler
 			.render_report(&mut out, &diag)
 			.expect("fmt error?..");
modifiedxtask/src/sourcegen/ast.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/ast.rs
+++ b/xtask/src/sourcegen/ast.rs
@@ -149,7 +149,7 @@
 					let mut types = HashMap::new();
 					for field in fields.iter().filter(|f| f.token_name().is_none()) {
 						if let Some(old) = types.insert(field.ty(), field.method_name(kinds)) {
-							panic!("{name}.{} has same type as {name}.{}, resolve conflict by wrapping one field: {}", old, field.method_name(kinds), field.ty());
+							// panic!("{name}.{} has same type as {name}.{}, resolve conflict by wrapping one field: {}", old, field.method_name(kinds), field.ty());
 						}
 						// TODO: check for assignable field types, i.e you can have
 						// ```
modifiedxtask/src/sourcegen/kinds.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/kinds.rs
+++ b/xtask/src/sourcegen/kinds.rs
@@ -212,6 +212,7 @@
 	let mut kinds = KindsSrc::new();
 	define_kinds![kinds =
 		"||" => "OR";
+		"??" => "NULL_COAELSE";
 		"&&" => "AND";
 		"|" => "BIT_OR";
 		"^" => "BIT_XOR";