difftreelog
refactor parser and grammar compatibility
in: master
46 files changed
cmds/jrsonnet-fmt/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/cmds/jrsonnet-fmt/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "jrsonnet-fmt"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+dprint-core = "0.58.2"
+jrsonnet-rowan-parser = { path = "../../crates/jrsonnet-rowan-parser" }
cmds/jrsonnet-fmt/src/main.rsdiffbeforeafterboth--- /dev/null
+++ b/cmds/jrsonnet-fmt/src/main.rs
@@ -0,0 +1,513 @@
+use std::any::type_name;
+
+use dprint_core::formatting::{PrintItems, PrintOptions, Signal};
+use jrsonnet_rowan_parser::{
+ nodes::{
+ ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,
+ DestructRest, Expr, Field, FieldName, ForSpec, IfSpec, ImportKind, LhsExpr, Literal,
+ Member, Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, String,
+ UnaryOperator,
+ },
+ AstToken, SyntaxToken,
+};
+
+pub trait Printable {
+ fn print(&self) -> PrintItems;
+}
+
+macro_rules! pi {
+ (@i; $($t:tt)*) => {{
+ #[allow(unused_mut)]
+ let mut o = PrintItems::new();
+ pi!(@s; o: $($t)*);
+ o
+ }};
+ (@s; $o:ident: str($e:expr $(,)?) $($t:tt)*) => {{
+ $o.push_str($e);
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $o:ident: nl $($t:tt)*) => {{
+ $o.push_signal(Signal::NewLine);
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $o:ident: >i $($t:tt)*) => {{
+ $o.push_signal(Signal::StartIndent);
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $o:ident: <i $($t:tt)*) => {{
+ $o.push_signal(Signal::FinishIndent);
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $o:ident: {$expr:expr} $($t:tt)*) => {{
+ $o.extend($expr.print());
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $o:ident: if ($e:expr)($($then:tt)*) $($t:tt)*) => {{
+ if $e {
+ pi!(@s; $o: $($then)*);
+ }
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $o:ident: ifelse ($e:expr)($($then:tt)*)($($else:tt)*) $($t:tt)*) => {{
+ if $e {
+ pi!(@s; $o: $($then)*);
+ } else {
+ pi!(@s; $o: $($else)*);
+ }
+ pi!(@s; $o: $($t)*);
+ }};
+ (@s; $i:ident:) => {}
+}
+macro_rules! p {
+ (new: $($t:tt)*) => {
+ pi!(@i; $($t)*)
+ };
+ ($o:ident: $($t:tt)*) => {
+ pi!(@s; $o: $($t)*)
+ };
+}
+
+impl<P> Printable for Option<P>
+where
+ P: Printable,
+{
+ fn print(&self) -> PrintItems {
+ if let Some(v) = self {
+ v.print()
+ } else {
+ p!(new: str(
+ &format!(
+ "/*missing {}*/",
+ type_name::<P>().replace("jrsonnet_rowan_parser::generated::nodes::", "")
+ ),
+ ))
+ }
+ }
+}
+
+impl Printable for SyntaxToken {
+ fn print(&self) -> PrintItems {
+ p!(new: str(&self.to_string()))
+ }
+}
+
+impl Printable for String {
+ fn print(&self) -> PrintItems {
+ p!(new: str(&format!("{}", self)))
+ }
+}
+impl Printable for Number {
+ fn print(&self) -> PrintItems {
+ p!(new: str(&format!("{}", self)))
+ }
+}
+
+impl Printable for Name {
+ fn print(&self) -> PrintItems {
+ p!(new: {self.ident_lit()})
+ }
+}
+
+impl Printable for DestructRest {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new: str("..."));
+ if let Some(name) = self.into() {
+ p!(pi: {name});
+ }
+ pi
+ }
+}
+
+impl Printable for Destruct {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new:);
+ match self {
+ Destruct::DestructFull(f) => {
+ p!(pi: {f.name()})
+ }
+ Destruct::DestructSkip(_) => p!(pi: str("?")),
+ Destruct::DestructArray(a) => {
+ p!(pi: str("[") >i nl);
+ for el in a.destruct_array_parts() {
+ match el {
+ DestructArrayPart::DestructArrayElement(e) => {
+ p!(pi: {e.destruct()} str(",") nl)
+ }
+ DestructArrayPart::DestructRest(d) => {
+ p!(pi: {d} str(",") nl)
+ }
+ }
+ }
+ p!(pi: <i str("]"));
+ }
+ Destruct::DestructObject(o) => {
+ p!(pi: str("{") >i nl);
+ for item in o.destruct_object_fields() {
+ p!(pi: {item.field()});
+ if let Some(des) = item.destruct() {
+ p!(pi: str(": ") {des})
+ }
+ if let Some(def) = item.expr() {
+ p!(pi: str(" = ") {def});
+ }
+ p!(pi: str(",") nl);
+ }
+ if let Some(rest) = o.destruct_rest() {
+ p!(pi: {rest} nl)
+ }
+ p!(pi: <i str("}"));
+ }
+ }
+ pi
+ }
+}
+
+impl Printable for FieldName {
+ fn print(&self) -> PrintItems {
+ match self {
+ FieldName::FieldNameFixed(f) => {
+ if let Some(id) = f.id() {
+ p!(new: {id})
+ } else if let Some(str) = f.string() {
+ p!(new: {str})
+ } else {
+ p!(new: str("/*missing FieldName*/"))
+ }
+ }
+ FieldName::FieldNameDynamic(d) => {
+ p!(new: str("[") {d.expr()} str("]"))
+ }
+ }
+ }
+}
+impl Printable for Field {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new:);
+ match self {
+ Field::FieldNormal(n) => {
+ p!(pi: {n.field_name()});
+ if n.plus_token().is_some() {
+ p!(pi: str("+"));
+ }
+ p!(pi: str(": ") {n.expr()});
+ }
+ Field::FieldMethod(m) => {
+ p!(pi: {m.field_name()} {m.params_desc()} str(": ") {m.expr()});
+ }
+ }
+ pi
+ }
+}
+
+impl Printable for ObjLocal {
+ fn print(&self) -> PrintItems {
+ p!(new: str("local ") {self.bind()})
+ }
+}
+
+impl Printable for Assertion {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new: str("assert ") {self.condition()});
+ if self.colon_token().is_some() || self.message().is_some() {
+ p!(pi: str(": ") {self.message()})
+ }
+ pi
+ }
+}
+
+impl Printable for ParamsDesc {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new: str("(") >i nl);
+ for param in self.params() {
+ p!(pi: {param.destruct()});
+ if param.assign_token().is_some() || param.expr().is_some() {
+ p!(pi: str(" = ") {param.expr()})
+ }
+ p!(pi: str(",") nl)
+ }
+ p!(pi: <i str(")"));
+ pi
+ }
+}
+impl Printable for ArgsDesc {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new: str("(") >i nl);
+ for arg in self.args() {
+ if arg.name().is_some() || arg.assign_token().is_some() {
+ p!(pi: {arg.name()} str(" = "));
+ }
+ p!(pi: {arg.expr()} str(",") nl)
+ }
+ p!(pi: <i str(")"));
+ pi
+ }
+}
+impl Printable for SliceDesc {
+ fn print(&self) -> PrintItems {
+ let mut pi = p!(new: str("["));
+ if self.from().is_some() {
+ p!(pi: {self.from()});
+ }
+ p!(pi: str(":"));
+ if self.end().is_some() {
+ p!(pi: {self.end().map(|e|e.expr())})
+ }
+ // Keep only one : in case if we don't need step
+ if self.step().is_some() {
+ p!(pi: str(":") {self.step().map(|e|e.expr())});
+ }
+ p!(pi: str("]"));
+ pi
+ }
+}
+
+impl Printable for ObjBody {
+ fn print(&self) -> PrintItems {
+ match self {
+ ObjBody::ObjBodyComp(_) => todo!(),
+ ObjBody::ObjBodyMemberList(l) => {
+ let mut pi = p!(new:);
+ for mem in l.members() {
+ match mem {
+ Member::MemberBindStmt(b) => {
+ p!(pi: {b.obj_local()})
+ }
+ Member::MemberAssertStmt(ass) => {
+ p!(pi: {ass.assertion()})
+ }
+ Member::MemberField(f) => {
+ p!(pi: {f.field()})
+ }
+ }
+ p!(pi: str(",") nl)
+ }
+ pi
+ }
+ }
+ }
+}
+impl Printable for UnaryOperator {
+ fn print(&self) -> PrintItems {
+ p!(new: str(self.text()))
+ }
+}
+impl Printable for BinaryOperator {
+ fn print(&self) -> PrintItems {
+ p!(new: str(self.text()))
+ }
+}
+impl Printable for Bind {
+ fn print(&self) -> PrintItems {
+ match self {
+ Bind::BindDestruct(d) => {
+ p!(new: {d.into()} str(" = ") {d.value()})
+ }
+ Bind::BindFunction(f) => {
+ p!(new: str("function") {f.params()} str(" = ") {f.value()})
+ }
+ }
+ }
+}
+impl Printable for Literal {
+ fn print(&self) -> PrintItems {
+ p!(new: str(&self.syntax().to_string()))
+ }
+}
+impl Printable for ImportKind {
+ fn print(&self) -> PrintItems {
+ p!(new: str(&self.syntax().to_string()))
+ }
+}
+impl Printable for LhsExpr {
+ fn print(&self) -> PrintItems {
+ p!(new: {self.expr()})
+ }
+}
+impl Printable for ForSpec {
+ fn print(&self) -> PrintItems {
+ p!(new: str("for ") {self.bind()} str(" in ") {self.expr()})
+ }
+}
+impl Printable for IfSpec {
+ fn print(&self) -> PrintItems {
+ p!(new: str("if ") {self.expr()})
+ }
+}
+impl Printable for CompSpec {
+ fn print(&self) -> PrintItems {
+ match self {
+ CompSpec::ForSpec(f) => f.print(),
+ CompSpec::IfSpec(i) => i.print(),
+ }
+ }
+}
+impl Printable for Expr {
+ fn print(&self) -> PrintItems {
+ match self {
+ Expr::ExprBinary(b) => {
+ p!(new: {b.lhs()} str(" ") {b.binary_operator()} str(" ") {b.rhs()})
+ }
+ Expr::ExprUnary(u) => p!(new: {u.unary_operator()} {u.rhs()}),
+ Expr::ExprSlice(s) => {
+ p!(new: {s.expr()} {s.slice_desc()})
+ }
+ Expr::ExprIndex(i) => {
+ p!(new: {i.expr()} str(".") {i.index()})
+ }
+ Expr::ExprIndexExpr(i) => p!(new: {i.base()} str("[") {i.index()} str("]")),
+ Expr::ExprApply(a) => {
+ let mut pi = p!(new: {a.expr()} {a.args_desc()});
+ if a.tailstrict_kw_token().is_some() {
+ p!(pi: str(" tailstrict"));
+ }
+ pi
+ }
+ Expr::ExprObjExtend(ex) => {
+ p!(new: {ex.lhs_expr()} str(" ") {ex.expr()})
+ }
+ Expr::ExprParened(p) => {
+ p!(new: str("(") {p.expr()} str(")"))
+ }
+ Expr::ExprIntrinsicThisFile(_) => p!(new: str("$intrinsicThisFile")),
+ Expr::ExprIntrinsicId(_) => p!(new: str("$intrinsicId")),
+ Expr::ExprIntrinsic(i) => p!(new: str("$intrinsic(") {i.name()} str(")")),
+ Expr::ExprString(s) => p!(new: {s.string()}),
+ Expr::ExprNumber(n) => p!(new: {n.number()}),
+ Expr::ExprArray(a) => {
+ let mut pi = p!(new: str("[") >i nl);
+ for el in a.exprs() {
+ p!(pi: {el} str(",") nl);
+ }
+ p!(pi: <i str("]"));
+ pi
+ }
+ Expr::ExprObject(o) => {
+ p!(new: str("{") >i nl {o.obj_body()} <i str("}"))
+ }
+ Expr::ExprArrayComp(arr) => {
+ let mut pi = p!(new: str("[") {arr.expr()});
+ for spec in arr.comp_specs() {
+ p!(pi: str(" ") {spec});
+ }
+ p!(pi: str("]"));
+ pi
+ }
+ Expr::ExprImport(v) => {
+ p!(new: {v.import_kind()} str(" ") {v.string()})
+ }
+ Expr::ExprVar(n) => p!(new: {n.name()}),
+ Expr::ExprLocal(l) => {
+ let mut pi = p!(new: str("local") >i nl);
+ for bind in l.binds() {
+ p!(pi: {bind} str(",") nl);
+ }
+ p!(pi: <i str(";") nl {l.expr()});
+ pi
+ }
+ Expr::ExprIfThenElse(ite) => {
+ let mut pi =
+ p!(new: str("if ") {ite.cond()} str(" then ") {ite.then().map(|t| t.expr())});
+ if ite.else_kw_token().is_some() || ite.else_().is_some() {
+ p!(pi: str(" else ") {ite.else_().map(|t| t.expr())})
+ }
+ pi
+ }
+ Expr::ExprFunction(f) => p!(new: str("function") {f.params_desc()} str(" ") {f.expr()}),
+ Expr::ExprAssert(a) => p!(new: {a.assertion()} str("; ") {a.expr()}),
+ Expr::ExprError(e) => p!(new: str("error ") {e.expr()}),
+ Expr::ExprLiteral(l) => {
+ p!(new: {l.literal()})
+ }
+ }
+ }
+}
+
+impl Printable for SourceFile {
+ fn print(&self) -> PrintItems {
+ assert!(self.expr().is_some());
+ self.expr().print()
+ }
+}
+
+fn main() {
+ let (parsed, _errors) = jrsonnet_rowan_parser::parse(
+ r#"
+
+
+ # Edit me!
+ local b = import "b.libsonnet"; # comment
+ local a = import "a.libsonnet";
+
+ local f(x,y)=x+y;
+
+ local {a: [b, ..., c], d, ...e} = null;
+
+ local ass = assert false : false; false;
+
+ local fn = function(a, b, c = 3) 4;
+
+ local comp = [a for b in c if d == e];
+ local ocomp = {[k]: 1 for k in v};
+
+ local ? = skip;
+
+ local intr = $intrinsic(test);
+ local intrId = $intrinsicId;
+ local intrThisFile = $intrinsicThisFile;
+
+ local ie = a[expr];
+
+ local unary = !a;
+
+ local Template = {z: "foo"};
+
+ {
+ local
+
+ h = 3,
+ assert self.a == 1
+
+ : "error",
+ "f": ((((((3)))))) ,
+ "g g":
+ f(4,2),
+ arr: [[
+ 1, 2,
+ ],
+ 3,
+ {
+ b: {
+ c: {
+ k: [16]
+ }
+ }
+ }
+ ],
+ m: a[1::],
+ m: b[::],
+ k: if a == b then
+
+
+ 2
+
+ else Template {}
+ } + Template
+
+
+"#,
+ );
+
+ // dbg!(errors);
+ dbg!(&parsed);
+
+ let o = dprint_core::formatting::format(
+ || parsed.print(),
+ PrintOptions {
+ indent_width: 2,
+ max_width: 100,
+ use_tabs: false,
+ new_line_text: "\n",
+ },
+ );
+ println!("{}", o);
+}
crates/jrsonnet-rowan-parser/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/Cargo.toml
+++ b/crates/jrsonnet-rowan-parser/Cargo.toml
@@ -19,3 +19,4 @@
indoc = "1.0.3"
insta = "1.10.0"
anyhow = "1.0.57"
+jrsonnet-stdlib = { path = "../jrsonnet-stdlib" }
crates/jrsonnet-rowan-parser/jsonnet.ungramdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/jsonnet.ungram
+++ b/crates/jrsonnet-rowan-parser/jsonnet.ungram
@@ -1,7 +1,12 @@
+// This file describes structure of jsonnet source code
+// It is also used to generate files in src/generated
+
+// Token names ending with `!` are considered meta, and handled specifically
+
SourceFile = Expr
ExprBinary =
- lhs:Expr
+ lhs:LhsExpr
BinaryOperator
rhs:Expr
ExprUnary =
@@ -9,29 +14,23 @@
rhs:Expr
ExprSlice =
Expr
- '['
SliceDesc
- ']'
ExprIndex =
Expr
'.'
index:Name
ExprIndexExpr =
- base:Expr
+ base:LhsExpr
'['
index:Expr
']'
ExprApply =
Expr
- '('
ArgsDesc
- ')'
'tailstrict'?
ExprObjExtend =
+ LhsExpr
Expr
- '{'
- ObjBody
- '}'
ExprParened =
'('
Expr
@@ -64,13 +63,16 @@
'['
Expr
','?
- ForSpec
CompSpec*
']'
+
ExprImport =
- 'importstr' String
-| 'importbin' String
-| 'import' String
+ ImportKind String
+
+ImportKind =
+ 'importstr'
+| 'importbin'
+| 'import'
ExprVar =
name:Name
@@ -78,12 +80,15 @@
'local'
(Bind (',' Bind)* ','?)
';'
+ Expr
+
ExprIfThenElse =
'if'
cond:Expr
'then'
- then:Expr
- ('else' else_:Expr)?
+ then:TrueExpr
+ ('else' else_:FalseExpr)?
+
ExprFunction =
'function'
'('
@@ -112,6 +117,7 @@
| ExprIntrinsic
| ExprString
| ExprNumber
+| ExprLiteral
| ExprArray
| ExprObject
| ExprArrayComp
@@ -130,42 +136,48 @@
| '<<' | '>>'
| '+' | '-'
| '*' | '/' | '%'
+| 'ERROR_NO_OPERATOR!'
UnaryOperator =
'-' | '!' | '~'
+SliceDescEnd=Expr
+SliceDescStep=Expr
SliceDesc =
+ '['
from:Expr?
':'
(
- end:Expr?
+ end:SliceDescEnd?
(
':'
- step:Expr?
+ step:SliceDescStep?
)?
)?
+ ']'
Name =
- 'ident'
+ 'LIT_IDENT!'
ArgsDesc =
+ '('
(Arg (',' Arg)* ','?)?
+ ')'
Arg =
(name:Name '=')? Expr
ObjBodyComp =
pre:ObjLocalPostComma*
'['
- key:Expr
+ key:LhsExpr
']'
'+'?
':'
value:Expr
post:ObjLocalPreComma*
- ForSpec
CompSpec*
ObjBodyMemberList =
- (Member (',' Member) ','?)?
+ (Member (',' Member)* ','?)?
ObjBody =
ObjBodyComp
| ObjBodyMemberList
@@ -196,9 +208,7 @@
Expr
FieldMethod =
FieldName
- '('
ParamsDesc
- ')'
Visibility
Expr
Field =
@@ -230,14 +240,15 @@
| 'super'
String =
- 'string_double'
-| 'string_single'
-| 'string_double_verbatim'
-| 'string_single_verbatim'
-| 'string_block'
+ 'LIT_STRING_DOUBLE!'
+| 'LIT_STRING_SINGLE!'
+| 'LIT_STRING_DOUBLE_VERBATIM!'
+| 'LIT_STRING_SINGLE_VERBATIM!'
+| 'LIT_STRING_BLOCK!'
Number =
- 'number'
+ 'LIT_FLOAT!'
+| 'META_FORCE_ENUM!'
ForSpec =
'for'
@@ -257,9 +268,7 @@
value:Expr
BindFunction =
name:Name
- '('
params:ParamsDesc
- ')'
'='
value:Expr
Bind =
@@ -267,7 +276,9 @@
| BindFunction
ParamsDesc =
+ '('
(Param (',' Param)* ','?)?
+ ')'
Param =
Destruct
(
@@ -277,30 +288,23 @@
Assertion =
'assert'
- condition:Expr
+ condition:LhsExpr
(
':'
- Expr
+ message:Expr
)?
DestructFull =
- into:Name
+ Name
DestructSkip =
'?'
DestructArray =
'['
- start:(
- Destruct
- (',' Destruct)*
+ (
+ DestructArrayPart
+ (',' DestructArrayPart)*
','?
)?
- DestructRest?
- ','?
- end:(
- Destruct
- (',' Destruct)*
- ','?
- )
']'
DestructObject =
'{'
@@ -314,10 +318,16 @@
'}'
Destruct =
DestructFull
- DestructSkip
- DestructArray
- DestructObject
+| DestructSkip
+| DestructArray
+| DestructObject
+DestructArrayElement =
+ Destruct
+DestructArrayPart =
+ DestructArrayElement
+| DestructRest
+
DestructRest =
'...'
into:Name?
@@ -332,3 +342,8 @@
'='
Expr
)?
+
+// Aliases used to resolve node type conflicts
+TrueExpr=Expr
+FalseExpr=Expr
+LhsExpr=Expr
crates/jrsonnet-rowan-parser/src/ast.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/ast.rs
+++ b/crates/jrsonnet-rowan-parser/src/ast.rs
@@ -1 +1,95 @@
-pub trait AstToken {}
+use std::marker::PhantomData;
+
+use crate::{SyntaxKind, SyntaxNode, SyntaxNodeChildren, SyntaxToken};
+
+/// The main trait to go from untyped `SyntaxNode` to a typed ast. The
+/// conversion itself has zero runtime cost: ast and syntax nodes have exactly
+/// the same representation: a pointer to the tree root and a pointer to the
+/// node itself.
+pub trait AstNode {
+ fn can_cast(kind: SyntaxKind) -> bool
+ where
+ Self: Sized;
+
+ fn cast(syntax: SyntaxNode) -> Option<Self>
+ where
+ Self: Sized;
+
+ fn syntax(&self) -> &SyntaxNode;
+ fn clone_for_update(&self) -> Self
+ where
+ Self: Sized,
+ {
+ Self::cast(self.syntax().clone_for_update()).unwrap()
+ }
+ fn clone_subtree(&self) -> Self
+ where
+ Self: Sized,
+ {
+ Self::cast(self.syntax().clone_subtree()).unwrap()
+ }
+}
+
+/// Like `AstNode`, but wraps tokens rather than interior nodes.
+pub trait AstToken {
+ fn can_cast(token: SyntaxKind) -> bool
+ where
+ Self: Sized;
+
+ fn cast(syntax: SyntaxToken) -> Option<Self>
+ where
+ Self: Sized;
+
+ fn syntax(&self) -> &SyntaxToken;
+
+ fn text(&self) -> &str {
+ self.syntax().text()
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct AstChildren<N> {
+ inner: SyntaxNodeChildren,
+ ph: PhantomData<N>,
+}
+
+impl<N> AstChildren<N> {
+ fn new(parent: &SyntaxNode) -> Self {
+ AstChildren {
+ inner: parent.children(),
+ ph: PhantomData,
+ }
+ }
+}
+
+impl<N: AstNode> Iterator for AstChildren<N> {
+ type Item = N;
+ fn next(&mut self) -> Option<N> {
+ self.inner.find_map(N::cast)
+ }
+}
+
+pub mod support {
+ use super::{AstChildren, AstNode, AstToken, SyntaxKind, SyntaxNode, SyntaxToken};
+
+ pub fn child<N: AstNode>(parent: &SyntaxNode) -> Option<N> {
+ parent.children().find_map(N::cast)
+ }
+ pub fn token_child<N: AstToken>(parent: &SyntaxNode) -> Option<N> {
+ parent.children_with_tokens().find_map(|n| match n {
+ rowan::NodeOrToken::Node(_) => None,
+ rowan::NodeOrToken::Token(t) => N::cast(t),
+ })
+ }
+
+ pub fn children<N: AstNode>(parent: &SyntaxNode) -> AstChildren<N> {
+ AstChildren::new(parent)
+ }
+
+ pub fn token(parent: &SyntaxNode, kind: SyntaxKind) -> Option<SyntaxToken> {
+ parent
+ .children_with_tokens()
+ .filter_map(|it| it.into_token())
+ .find(|it| it.kind() == kind)
+ }
+}
crates/jrsonnet-rowan-parser/src/binary.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/binary.rs
+++ b/crates/jrsonnet-rowan-parser/src/binary.rs
@@ -20,6 +20,7 @@
Or,
In,
ObjectApply,
+ #[allow(dead_code)]
Invalid,
}
crates/jrsonnet-rowan-parser/src/classify.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/classify.rs
@@ -0,0 +1,51 @@
+use crate::SyntaxKind;
+
+impl SyntaxKind {
+ pub fn is_trivia(self) -> bool {
+ matches!(
+ self,
+ Self::WHITESPACE
+ | Self::MULTI_LINE_COMMENT
+ | Self::ERROR_COMMENT_TOO_SHORT
+ | Self::ERROR_COMMENT_UNTERMINATED
+ | Self::SINGLE_LINE_HASH_COMMENT
+ | Self::SINGLE_LINE_SLASH_COMMENT
+ )
+ }
+ pub fn is_string(self) -> bool {
+ matches!(
+ self,
+ Self::STRING_SINGLE
+ | Self::ERROR_STRING_SINGLE_UNTERMINATED
+ | Self::STRING_DOUBLE
+ | Self::ERROR_STRING_DOUBLE_UNTERMINATED
+ | Self::STRING_SINGLE_VERBATIM
+ | Self::ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED
+ | Self::STRING_DOUBLE_VERBATIM
+ | Self::ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED
+ | Self::STRING_BLOCK
+ | Self::ERROR_STRING_BLOCK_UNEXPECTED_END
+ | Self::ERROR_STRING_BLOCK_MISSING_NEW_LINE
+ | Self::ERROR_STRING_BLOCK_MISSING_TERMINATION
+ | Self::ERROR_STRING_BLOCK_MISSING_INDENT
+ )
+ }
+ pub fn is_number(self) -> bool {
+ matches!(
+ self,
+ Self::FLOAT
+ | Self::ERROR_FLOAT_JUNK_AFTER_POINT
+ | Self::ERROR_FLOAT_JUNK_AFTER_EXPONENT
+ | Self::ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN
+ )
+ }
+ pub fn is_literal(self) -> bool {
+ matches!(
+ self,
+ Self::NULL_KW
+ | Self::TRUE_KW | Self::FALSE_KW
+ | Self::SELF_KW | Self::DOLLAR
+ | Self::SUPER_KW
+ )
+ }
+}
crates/jrsonnet-rowan-parser/src/event.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/event.rs
+++ b/crates/jrsonnet-rowan-parser/src/event.rs
@@ -1,6 +1,6 @@
use std::mem;
-use rowan::{GreenNode, GreenNodeBuilder, Language};
+use rowan::{GreenNodeBuilder, Language};
use crate::{
lex::Lexeme,
@@ -10,14 +10,27 @@
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Event {
+ /// Used for unfinished markers
+ Pending,
+ /// After marker is completed, Pending event is replaced with Start
Start {
kind: SyntaxKind,
+ /// If marker is preceded or wrapped - instead of reordering events, we
+ /// insert start event in the end of events Vec instead, and store relative offset to this event here
forward_parent: Option<usize>,
},
- Token,
- Finish,
- Placeholder,
+ /// Eat token
+ Token {
+ kind: SyntaxKind,
+ },
+ /// Position of finished node
+ Finish {
+ /// Same as forward_parent of Start, but for wrapping
+ wrapper: Option<usize>,
+ },
Error(SyntaxError),
+ /// Used for dropped markers and other things
+ Noop,
}
pub(super) struct Sink<'i> {
@@ -40,12 +53,17 @@
}
pub(super) fn finish(mut self) -> Parse {
+ let mut eat_start_whitespace = false;
+ let mut depth = 0;
for idx in 0..self.events.len() {
- match mem::replace(&mut self.events[idx], Event::Placeholder) {
+ match mem::replace(&mut self.events[idx], Event::Noop) {
Event::Start {
kind,
forward_parent,
} => {
+ if depth != 0 {
+ self.skip_whitespace();
+ }
let mut kinds = vec![kind];
let mut idx = idx;
@@ -60,7 +78,7 @@
forward_parent = if let Event::Start {
kind,
forward_parent,
- } = mem::replace(&mut self.events[idx], Event::Placeholder)
+ } = mem::replace(&mut self.events[idx], Event::Noop)
{
kinds.push(kind);
forward_parent
@@ -71,18 +89,46 @@
for kind in kinds.into_iter().rev() {
self.builder.start_node(JsonnetLanguage::kind_to_raw(kind));
+ depth += 1;
+ if depth == 1 {
+ self.skip_whitespace();
+ }
+ }
+
+ eat_start_whitespace = false;
+ }
+ Event::Token { kind } => {
+ if eat_start_whitespace {
+ self.skip_whitespace();
}
+ self.token(kind);
+ eat_start_whitespace = true;
}
- Event::Token => self.token(),
- Event::Finish => {
+ Event::Finish { wrapper } => {
self.builder.finish_node();
+ depth -= 1;
+ let mut idx = idx;
+ let mut wrapper = wrapper;
+ while let Some(w) = wrapper {
+ idx += w;
+ wrapper = if let Event::Finish { wrapper } =
+ mem::replace(&mut self.events[idx], Event::Noop)
+ {
+ self.builder.finish_node();
+ depth -= 1;
+ wrapper
+ } else {
+ unreachable!()
+ }
+ }
+ eat_start_whitespace = true;
}
- Event::Placeholder => {}
+ Event::Pending => panic!("placeholder should not end in events"),
+ Event::Noop => {}
Event::Error(e) => {
self.errors.push(e);
}
}
- self.skip_whitespace();
}
Parse {
@@ -90,10 +136,10 @@
errors: self.errors,
}
}
- fn token(&mut self) {
+ fn token(&mut self, kind: SyntaxKind) {
let lexeme = self.lexemes[self.offset];
self.builder
- .token(JsonnetLanguage::kind_to_raw(lexeme.kind), lexeme.text);
+ .token(JsonnetLanguage::kind_to_raw(kind), lexeme.text);
self.offset += 1;
}
fn skip_whitespace(&mut self) {
@@ -102,7 +148,7 @@
break;
}
- self.token();
+ self.token(lexeme.kind);
}
}
}
crates/jrsonnet-rowan-parser/src/generated/mod.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/generated/mod.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/mod.rs
@@ -1,3 +1,2 @@
-// mod tokens;
-// mod nodes;
+pub mod nodes;
pub mod syntax_kinds;
crates/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
@@ -1,9 +1,9 @@
//! This is a generated file, please do not edit manually. Changes can be
//! made in codegeneration that lives in `xtask` top-level dir.
-#![allow(non_snake_case)]
+#![allow(non_snake_case, clippy::match_like_matches_macro)]
use crate::{
- ast::{self, support, AstChildren, AstNode},
+ ast::{support, AstChildren, AstNode, AstToken},
SyntaxKind::{self, *},
SyntaxNode, SyntaxToken, T,
};
@@ -13,7 +13,9 @@
pub(crate) syntax: SyntaxNode,
}
impl SourceFile {
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -21,35 +23,25 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprBinary {
- pub fn lhs(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn binary_operator(&self) -> Option<BinaryOperator> { support::child(&self.syntax) }
- pub fn rhs(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn lhs(&self) -> Option<LhsExpr> {
+ support::child(&self.syntax)
+ }
+ pub fn binary_operator(&self) -> Option<BinaryOperator> {
+ support::token_child(&self.syntax)
+ }
+ pub fn rhs(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct BinaryOperator {
+pub struct LhsExpr {
pub(crate) syntax: SyntaxNode,
}
-impl BinaryOperator {
- pub fn or_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![||]) }
- pub fn and_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&&]) }
- pub fn bit_or_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![|]) }
- pub fn bit_xor_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![^]) }
- pub fn bit_and_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) }
- pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![==]) }
- pub fn ne_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!=]) }
- pub fn lt_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<]) }
- pub fn gt_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>]) }
- pub fn le_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<=]) }
- pub fn ge_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>=]) }
- pub fn in_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![in]) }
- pub fn lhs_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<<]) }
- pub fn rhs_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>>]) }
- pub fn plus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![+]) }
- pub fn minus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![-]) }
- pub fn mul_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![*]) }
- pub fn div_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![/]) }
- pub fn modulo_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![%]) }
+impl LhsExpr {
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -57,29 +49,25 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprUnary {
- pub fn unary_operator(&self) -> Option<UnaryOperator> { support::child(&self.syntax) }
- pub fn rhs(&self) -> Option<Expr> { support::child(&self.syntax) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct UnaryOperator {
- pub(crate) syntax: SyntaxNode,
+ pub fn unary_operator(&self) -> Option<UnaryOperator> {
+ support::token_child(&self.syntax)
+ }
+ pub fn rhs(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
-impl UnaryOperator {
- pub fn minus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![-]) }
- pub fn not_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!]) }
- pub fn bit_not_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![~]) }
-}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ExprSlice {
pub(crate) syntax: SyntaxNode,
}
impl ExprSlice {
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }
- pub fn slice_desc(&self) -> Option<SliceDesc> { support::child(&self.syntax) }
- pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn slice_desc(&self) -> Option<SliceDesc> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -87,10 +75,24 @@
pub(crate) syntax: SyntaxNode,
}
impl SliceDesc {
- pub fn from(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
- pub fn end(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn step(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['['])
+ }
+ pub fn from(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn colon_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![:])
+ }
+ pub fn end(&self) -> Option<SliceDescEnd> {
+ support::child(&self.syntax)
+ }
+ pub fn step(&self) -> Option<SliceDescStep> {
+ support::child(&self.syntax)
+ }
+ pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![']'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -98,9 +100,15 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprIndex {
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn dot_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![.]) }
- pub fn index(&self) -> Option<Name> { support::child(&self.syntax) }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn dot_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![.])
+ }
+ pub fn index(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -108,7 +116,9 @@
pub(crate) syntax: SyntaxNode,
}
impl Name {
- pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
+ pub fn ident_lit(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, IDENT)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -116,10 +126,18 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprIndexExpr {
- pub fn base(&self) -> Option<Expr> { support::child(&self.syntax) }
- 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![']']) }
+ pub fn base(&self) -> Option<LhsExpr> {
+ support::child(&self.syntax)
+ }
+ 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)]
@@ -127,11 +145,13 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprApply {
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
- pub fn args_desc(&self) -> Option<ArgsDesc> { support::child(&self.syntax) }
- pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
- pub fn tailstrict_token(&self) -> Option<SyntaxToken> {
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn args_desc(&self) -> Option<ArgsDesc> {
+ support::child(&self.syntax)
+ }
+ pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {
support::token(&self.syntax, T![tailstrict])
}
}
@@ -141,7 +161,15 @@
pub(crate) syntax: SyntaxNode,
}
impl ArgsDesc {
- pub fn args(&self) -> AstChildren<Arg> { support::children(&self.syntax) }
+ 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 r_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![')'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -149,10 +177,12 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprObjExtend {
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn l_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
- pub fn obj_body(&self) -> Option<ObjBody> { support::child(&self.syntax) }
- pub fn r_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
+ pub fn lhs_expr(&self) -> Option<LhsExpr> {
+ support::child(&self.syntax)
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -160,9 +190,15 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprParened {
- pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
+ pub fn l_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['('])
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn r_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![')'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -170,20 +206,9 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprLiteral {
- pub fn literal(&self) -> Option<Literal> { support::child(&self.syntax) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Literal {
- pub(crate) syntax: SyntaxNode,
-}
-impl Literal {
- pub fn null_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![null]) }
- pub fn true_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![true]) }
- pub fn false_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![false]) }
- pub fn self_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![self]) }
- pub fn dollar_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['$']) }
- pub fn super_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![super]) }
+ pub fn literal(&self) -> Option<Literal> {
+ support::token_child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -214,9 +239,15 @@
pub fn intrinsic_token(&self) -> Option<SyntaxToken> {
support::token(&self.syntax, T!["$intrinsic"])
}
- pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
- pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }
- pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
+ pub fn l_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['('])
+ }
+ pub fn name(&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)]
@@ -224,28 +255,8 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprString {
- pub fn string(&self) -> Option<String> { support::child(&self.syntax) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct String {
- pub(crate) syntax: SyntaxNode,
-}
-impl String {
- pub fn string_double_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![string_double])
- }
- pub fn string_single_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![string_single])
- }
- pub fn string_double_verbatim_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![string_double_verbatim])
- }
- pub fn string_single_verbatim_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![string_single_verbatim])
- }
- pub fn string_block_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![string_block])
+ pub fn string(&self) -> Option<String> {
+ support::token_child(&self.syntax)
}
}
@@ -254,25 +265,25 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprNumber {
- pub fn number(&self) -> Option<Number> { support::child(&self.syntax) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Number {
- pub(crate) syntax: SyntaxNode,
+ pub fn number(&self) -> Option<Number> {
+ support::token_child(&self.syntax)
+ }
}
-impl Number {
- pub fn number_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![number]) }
-}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ExprArray {
pub(crate) syntax: SyntaxNode,
}
impl ExprArray {
- pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }
- pub fn exprs(&self) -> AstChildren<Expr> { support::children(&self.syntax) }
- pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }
+ pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['['])
+ }
+ pub fn exprs(&self) -> AstChildren<Expr> {
+ support::children(&self.syntax)
+ }
+ pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![']'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -280,9 +291,15 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprObject {
- pub fn l_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
- pub fn obj_body(&self) -> Option<ObjBody> { support::child(&self.syntax) }
- pub fn r_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
+ pub fn l_brace_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['{'])
+ }
+ pub fn obj_body(&self) -> Option<ObjBody> {
+ support::child(&self.syntax)
+ }
+ pub fn r_brace_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['}'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -290,38 +307,34 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprArrayComp {
- pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }
- pub fn for_spec(&self) -> Option<ForSpec> { support::child(&self.syntax) }
- pub fn comp_specs(&self) -> AstChildren<CompSpec> { support::children(&self.syntax) }
- pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ForSpec {
- pub(crate) syntax: SyntaxNode,
+ pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['['])
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn comma_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![,])
+ }
+ pub fn comp_specs(&self) -> AstChildren<CompSpec> {
+ support::children(&self.syntax)
+ }
+ pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![']'])
+ }
}
-impl ForSpec {
- pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
- pub fn bind(&self) -> Option<Name> { support::child(&self.syntax) }
- pub fn in_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![in]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
-}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ExprImport {
pub(crate) syntax: SyntaxNode,
}
impl ExprImport {
- pub fn importstr_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![importstr])
+ pub fn import_kind(&self) -> Option<ImportKind> {
+ support::token_child(&self.syntax)
}
- pub fn string(&self) -> Option<String> { support::child(&self.syntax) }
- pub fn importbin_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![importbin])
+ pub fn string(&self) -> Option<String> {
+ support::token_child(&self.syntax)
}
- pub fn import_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![import]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -329,7 +342,9 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprVar {
- pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }
+ pub fn name(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -337,9 +352,18 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprLocal {
- pub fn local_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![;]) }
+ 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![;])
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -347,12 +371,44 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprIfThenElse {
- pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }
- pub fn cond(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn then_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![then]) }
- pub fn then(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn else_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![else]) }
- pub fn else_(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn if_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![if])
+ }
+ pub fn cond(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn then_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![then])
+ }
+ pub fn then(&self) -> Option<TrueExpr> {
+ support::child(&self.syntax)
+ }
+ pub fn else_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![else])
+ }
+ pub fn else_(&self) -> Option<FalseExpr> {
+ support::child(&self.syntax)
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct TrueExpr {
+ pub(crate) syntax: SyntaxNode,
+}
+impl TrueExpr {
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct FalseExpr {
+ pub(crate) syntax: SyntaxNode,
+}
+impl FalseExpr {
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -360,13 +416,21 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprFunction {
- pub fn function_token(&self) -> Option<SyntaxToken> {
+ pub fn function_kw_token(&self) -> Option<SyntaxToken> {
support::token(&self.syntax, T![function])
}
- pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
- pub fn params_desc(&self) -> Option<ParamsDesc> { support::child(&self.syntax) }
- pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn l_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['('])
+ }
+ pub fn params_desc(&self) -> Option<ParamsDesc> {
+ support::child(&self.syntax)
+ }
+ pub fn r_paren_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)]
@@ -374,7 +438,15 @@
pub(crate) syntax: SyntaxNode,
}
impl ParamsDesc {
- pub fn params(&self) -> AstChildren<Param> { support::children(&self.syntax) }
+ pub fn l_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['('])
+ }
+ pub fn params(&self) -> AstChildren<Param> {
+ support::children(&self.syntax)
+ }
+ pub fn r_paren_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![')'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -382,9 +454,15 @@
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) }
+ 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)]
@@ -392,10 +470,18 @@
pub(crate) syntax: SyntaxNode,
}
impl Assertion {
- pub fn assert_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![assert]) }
- pub fn condition(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ 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)]
@@ -403,18 +489,48 @@
pub(crate) syntax: SyntaxNode,
}
impl ExprError {
- pub fn error_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![error]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn error_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![error])
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct SliceDescEnd {
+ pub(crate) syntax: SyntaxNode,
+}
+impl SliceDescEnd {
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct SliceDescStep {
+ pub(crate) syntax: SyntaxNode,
+}
+impl SliceDescStep {
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Arg {
pub(crate) syntax: SyntaxNode,
}
impl Arg {
- pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }
- pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn name(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
+ pub fn assign_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)]
@@ -422,16 +538,33 @@
pub(crate) syntax: SyntaxNode,
}
impl ObjBodyComp {
- pub fn pre(&self) -> AstChildren<ObjLocalPostComma> { support::children(&self.syntax) }
- pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }
- pub fn key(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }
- pub fn plus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![+]) }
- pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
- pub fn value(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn post(&self) -> AstChildren<ObjLocalPreComma> { support::children(&self.syntax) }
- pub fn for_spec(&self) -> Option<ForSpec> { support::child(&self.syntax) }
- pub fn comp_specs(&self) -> AstChildren<CompSpec> { support::children(&self.syntax) }
+ pub fn pre(&self) -> AstChildren<ObjLocalPostComma> {
+ support::children(&self.syntax)
+ }
+ pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['['])
+ }
+ pub fn key(&self) -> Option<LhsExpr> {
+ support::child(&self.syntax)
+ }
+ pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![']'])
+ }
+ pub fn plus_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![+])
+ }
+ pub fn colon_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![:])
+ }
+ pub fn value(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
+ pub fn post(&self) -> AstChildren<ObjLocalPreComma> {
+ support::children(&self.syntax)
+ }
+ pub fn comp_specs(&self) -> AstChildren<CompSpec> {
+ support::children(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -439,8 +572,12 @@
pub(crate) syntax: SyntaxNode,
}
impl ObjLocalPostComma {
- pub fn obj_local(&self) -> Option<ObjLocal> { support::child(&self.syntax) }
- pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }
+ pub fn obj_local(&self) -> Option<ObjLocal> {
+ support::child(&self.syntax)
+ }
+ pub fn comma_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![,])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -448,8 +585,12 @@
pub(crate) syntax: SyntaxNode,
}
impl ObjLocalPreComma {
- pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }
- pub fn obj_local(&self) -> Option<ObjLocal> { support::child(&self.syntax) }
+ pub fn comma_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![,])
+ }
+ pub fn obj_local(&self) -> Option<ObjLocal> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -457,8 +598,9 @@
pub(crate) syntax: SyntaxNode,
}
impl ObjBodyMemberList {
- pub fn member(&self) -> Option<Member> { support::child(&self.syntax) }
- pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }
+ pub fn members(&self) -> AstChildren<Member> {
+ support::children(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -466,8 +608,12 @@
pub(crate) syntax: SyntaxNode,
}
impl ObjLocal {
- pub fn local_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![local]) }
- pub fn bind(&self) -> Option<Bind> { support::child(&self.syntax) }
+ pub fn local_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![local])
+ }
+ pub fn bind(&self) -> Option<Bind> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -475,7 +621,9 @@
pub(crate) syntax: SyntaxNode,
}
impl MemberBindStmt {
- pub fn obj_local(&self) -> Option<ObjLocal> { support::child(&self.syntax) }
+ pub fn obj_local(&self) -> Option<ObjLocal> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -483,7 +631,9 @@
pub(crate) syntax: SyntaxNode,
}
impl MemberAssertStmt {
- pub fn assertion(&self) -> Option<Assertion> { support::child(&self.syntax) }
+ pub fn assertion(&self) -> Option<Assertion> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -491,7 +641,9 @@
pub(crate) syntax: SyntaxNode,
}
impl MemberField {
- pub fn field(&self) -> Option<Field> { support::child(&self.syntax) }
+ pub fn field(&self) -> Option<Field> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -499,22 +651,18 @@
pub(crate) syntax: SyntaxNode,
}
impl FieldNormal {
- pub fn field_name(&self) -> Option<FieldName> { support::child(&self.syntax) }
- pub fn plus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![+]) }
- pub fn visibility(&self) -> Option<Visibility> { support::child(&self.syntax) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Visibility {
- pub(crate) syntax: SyntaxNode,
-}
-impl Visibility {
- pub fn coloncoloncolon_token(&self) -> Option<SyntaxToken> {
- support::token(&self.syntax, T![:::])
+ pub fn field_name(&self) -> Option<FieldName> {
+ support::child(&self.syntax)
+ }
+ pub fn plus_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![+])
+ }
+ pub fn visibility(&self) -> Option<Visibility> {
+ support::token_child(&self.syntax)
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
}
- pub fn coloncolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![::]) }
- pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -522,12 +670,18 @@
pub(crate) syntax: SyntaxNode,
}
impl FieldMethod {
- pub fn field_name(&self) -> Option<FieldName> { support::child(&self.syntax) }
- pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
- pub fn params_desc(&self) -> Option<ParamsDesc> { support::child(&self.syntax) }
- pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
- pub fn visibility(&self) -> Option<Visibility> { support::child(&self.syntax) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn field_name(&self) -> Option<FieldName> {
+ support::child(&self.syntax)
+ }
+ pub fn params_desc(&self) -> Option<ParamsDesc> {
+ support::child(&self.syntax)
+ }
+ pub fn visibility(&self) -> Option<Visibility> {
+ support::token_child(&self.syntax)
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -535,8 +689,12 @@
pub(crate) syntax: SyntaxNode,
}
impl FieldNameFixed {
- pub fn id(&self) -> Option<Name> { support::child(&self.syntax) }
- pub fn string(&self) -> Option<String> { support::child(&self.syntax) }
+ pub fn id(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
+ pub fn string(&self) -> Option<String> {
+ support::token_child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -544,39 +702,63 @@
pub(crate) syntax: SyntaxNode,
}
impl FieldNameDynamic {
- pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
- pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }
+ pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['['])
+ }
+ pub fn expr(&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 IfSpec {
+pub struct ForSpec {
pub(crate) syntax: SyntaxNode,
}
-impl IfSpec {
- pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+impl ForSpec {
+ pub fn for_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![for])
+ }
+ pub fn bind(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
+ pub fn in_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![in])
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct BindDestruct {
+pub struct IfSpec {
pub(crate) syntax: SyntaxNode,
}
-impl BindDestruct {
- pub fn into(&self) -> Option<Destruct> { support::child(&self.syntax) }
- pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
- pub fn value(&self) -> Option<Expr> { support::child(&self.syntax) }
+impl IfSpec {
+ pub fn if_kw_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![if])
+ }
+ pub fn expr(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Destruct {
+pub struct BindDestruct {
pub(crate) syntax: SyntaxNode,
}
-impl Destruct {
- pub fn destruct_full(&self) -> Option<DestructFull> { support::child(&self.syntax) }
- pub fn destruct_skip(&self) -> Option<DestructSkip> { support::child(&self.syntax) }
- pub fn destruct_array(&self) -> Option<DestructArray> { support::child(&self.syntax) }
- pub fn destruct_object(&self) -> Option<DestructObject> { support::child(&self.syntax) }
+impl BindDestruct {
+ pub fn into(&self) -> Option<Destruct> {
+ support::child(&self.syntax)
+ }
+ pub fn assign_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![=])
+ }
+ pub fn value(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -584,12 +766,18 @@
pub(crate) syntax: SyntaxNode,
}
impl BindFunction {
- pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }
- pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
- pub fn params(&self) -> Option<ParamsDesc> { support::child(&self.syntax) }
- pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
- pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
- pub fn value(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn name(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
+ pub fn params(&self) -> Option<ParamsDesc> {
+ support::child(&self.syntax)
+ }
+ pub fn assign_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![=])
+ }
+ pub fn value(&self) -> Option<Expr> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -597,9 +785,15 @@
pub(crate) syntax: SyntaxNode,
}
impl Param {
- pub fn destruct(&self) -> Option<Destruct> { support::child(&self.syntax) }
- pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn destruct(&self) -> Option<Destruct> {
+ support::child(&self.syntax)
+ }
+ pub fn assign_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)]
@@ -607,7 +801,9 @@
pub(crate) syntax: SyntaxNode,
}
impl DestructFull {
- pub fn into(&self) -> Option<Name> { support::child(&self.syntax) }
+ pub fn name(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -615,7 +811,9 @@
pub(crate) syntax: SyntaxNode,
}
impl DestructSkip {
- pub fn question_mark_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![?]) }
+ pub fn question_mark_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![?])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -623,21 +821,15 @@
pub(crate) syntax: SyntaxNode,
}
impl DestructArray {
- pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }
- pub fn start(&self) -> AstChildren<Destruct> { support::children(&self.syntax) }
- pub fn destruct_rest(&self) -> Option<DestructRest> { support::child(&self.syntax) }
- pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }
- pub fn end(&self) -> AstChildren<Destruct> { support::children(&self.syntax) }
- pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct DestructRest {
- pub(crate) syntax: SyntaxNode,
-}
-impl DestructRest {
- pub fn dotdotdot_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![...]) }
- pub fn into(&self) -> Option<Name> { support::child(&self.syntax) }
+ pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['['])
+ }
+ pub fn destruct_array_parts(&self) -> AstChildren<DestructArrayPart> {
+ support::children(&self.syntax)
+ }
+ pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![']'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -645,13 +837,21 @@
pub(crate) syntax: SyntaxNode,
}
impl DestructObject {
- pub fn l_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
+ pub fn l_brace_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['{'])
+ }
pub fn destruct_object_fields(&self) -> AstChildren<DestructObjectField> {
support::children(&self.syntax)
}
- pub fn destruct_rest(&self) -> Option<DestructRest> { support::child(&self.syntax) }
- pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }
- pub fn r_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
+ pub fn destruct_rest(&self) -> Option<DestructRest> {
+ support::child(&self.syntax)
+ }
+ pub fn comma_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![,])
+ }
+ pub fn r_brace_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T!['}'])
+ }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -659,12 +859,45 @@
pub(crate) syntax: SyntaxNode,
}
impl DestructObjectField {
- pub fn field(&self) -> Option<Name> { support::child(&self.syntax) }
- pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
- pub fn destruct(&self) -> Option<Destruct> { support::child(&self.syntax) }
- pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
- pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+ pub fn field(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
+ pub fn colon_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![:])
+ }
+ pub fn destruct(&self) -> Option<Destruct> {
+ support::child(&self.syntax)
+ }
+ pub fn assign_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 DestructRest {
+ pub(crate) syntax: SyntaxNode,
+}
+impl DestructRest {
+ pub fn dotdotdot_token(&self) -> Option<SyntaxToken> {
+ support::token(&self.syntax, T![...])
+ }
+ pub fn into(&self) -> Option<Name> {
+ support::child(&self.syntax)
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct DestructArrayElement {
+ pub(crate) syntax: SyntaxNode,
}
+impl DestructArrayElement {
+ pub fn destruct(&self) -> Option<Destruct> {
+ support::child(&self.syntax)
+ }
+}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Expr {
@@ -681,6 +914,7 @@
ExprIntrinsic(ExprIntrinsic),
ExprString(ExprString),
ExprNumber(ExprNumber),
+ ExprLiteral(ExprLiteral),
ExprArray(ExprArray),
ExprObject(ExprObject),
ExprArrayComp(ExprArrayComp),
@@ -729,8 +963,136 @@
FieldNameFixed(FieldNameFixed),
FieldNameDynamic(FieldNameDynamic),
}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Destruct {
+ DestructFull(DestructFull),
+ DestructSkip(DestructSkip),
+ DestructArray(DestructArray),
+ DestructObject(DestructObject),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum DestructArrayPart {
+ DestructArrayElement(DestructArrayElement),
+ DestructRest(DestructRest),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct BinaryOperator {
+ syntax: SyntaxToken,
+ kind: BinaryOperatorKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum BinaryOperatorKind {
+ Or,
+ And,
+ BitOr,
+ BitXor,
+ BitAnd,
+ Eq,
+ Ne,
+ Lt,
+ Gt,
+ Le,
+ Ge,
+ InKw,
+ Lhs,
+ Rhs,
+ Plus,
+ Minus,
+ Mul,
+ Div,
+ Modulo,
+ ErrorNoOperator,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct UnaryOperator {
+ syntax: SyntaxToken,
+ kind: UnaryOperatorKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum UnaryOperatorKind {
+ Minus,
+ Not,
+ BitNot,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct Literal {
+ syntax: SyntaxToken,
+ kind: LiteralKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum LiteralKind {
+ NullKw,
+ TrueKw,
+ FalseKw,
+ SelfKw,
+ Dollar,
+ SuperKw,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct String {
+ syntax: SyntaxToken,
+ kind: StringKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum StringKind {
+ StringDouble,
+ StringSingle,
+ StringDoubleVerbatim,
+ StringSingleVerbatim,
+ StringBlock,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct Number {
+ syntax: SyntaxToken,
+ kind: NumberKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum NumberKind {
+ Float,
+ MetaForceEnum,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct ImportKind {
+ syntax: SyntaxToken,
+ kind: ImportKindKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum ImportKindKind {
+ ImportstrKw,
+ ImportbinKw,
+ ImportKw,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct Visibility {
+ syntax: SyntaxToken,
+ kind: VisibilityKind,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum VisibilityKind {
+ Coloncoloncolon,
+ Coloncolon,
+ Colon,
+}
impl AstNode for SourceFile {
- fn can_cast(kind: SyntaxKind) -> bool { kind == SOURCE_FILE }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == SOURCE_FILE
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -738,10 +1100,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprBinary {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_BINARY }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_BINARY
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -749,10 +1115,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for BinaryOperator {
- fn can_cast(kind: SyntaxKind) -> bool { kind == BINARY_OPERATOR }
+impl AstNode for LhsExpr {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == LHS_EXPR
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -760,10 +1130,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprUnary {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_UNARY }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_UNARY
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -771,21 +1145,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
-}
-impl AstNode for UnaryOperator {
- fn can_cast(kind: SyntaxKind) -> bool { kind == UNARY_OPERATOR }
- fn cast(syntax: SyntaxNode) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for ExprSlice {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_SLICE }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_SLICE
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -793,10 +1160,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for SliceDesc {
- fn can_cast(kind: SyntaxKind) -> bool { kind == SLICE_DESC }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == SLICE_DESC
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -804,10 +1175,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprIndex {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INDEX }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_INDEX
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -815,10 +1190,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for Name {
- fn can_cast(kind: SyntaxKind) -> bool { kind == NAME }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == NAME
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -826,10 +1205,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprIndexExpr {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INDEX_EXPR }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_INDEX_EXPR
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -837,10 +1220,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprApply {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_APPLY }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_APPLY
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -848,10 +1235,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ArgsDesc {
- fn can_cast(kind: SyntaxKind) -> bool { kind == ARGS_DESC }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == ARGS_DESC
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -859,10 +1250,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprObjExtend {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_OBJ_EXTEND }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_OBJ_EXTEND
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -870,10 +1265,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprParened {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_PARENED }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_PARENED
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -881,10 +1280,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ExprLiteral {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_LITERAL }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_LITERAL
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -892,10 +1295,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for Literal {
- fn can_cast(kind: SyntaxKind) -> bool { kind == LITERAL }
+impl AstNode for ExprIntrinsicThisFile {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_INTRINSIC_THIS_FILE
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -903,10 +1310,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprIntrinsicThisFile {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INTRINSIC_THIS_FILE }
+impl AstNode for ExprIntrinsicId {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_INTRINSIC_ID
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -914,10 +1325,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprIntrinsicId {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INTRINSIC_ID }
+impl AstNode for ExprIntrinsic {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_INTRINSIC
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -925,10 +1340,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprIntrinsic {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INTRINSIC }
+impl AstNode for ExprString {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_STRING
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -936,10 +1355,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprString {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_STRING }
+impl AstNode for ExprNumber {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_NUMBER
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -947,10 +1370,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for String {
- fn can_cast(kind: SyntaxKind) -> bool { kind == STRING }
+impl AstNode for ExprArray {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_ARRAY
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -958,10 +1385,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprNumber {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_NUMBER }
+impl AstNode for ExprObject {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_OBJECT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -969,10 +1400,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for Number {
- fn can_cast(kind: SyntaxKind) -> bool { kind == NUMBER }
+impl AstNode for ExprArrayComp {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_ARRAY_COMP
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -980,10 +1415,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprArray {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ARRAY }
+impl AstNode for ExprImport {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_IMPORT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -991,10 +1430,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprObject {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_OBJECT }
+impl AstNode for ExprVar {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_VAR
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1002,10 +1445,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprArrayComp {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ARRAY_COMP }
+impl AstNode for ExprLocal {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_LOCAL
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1013,10 +1460,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ForSpec {
- fn can_cast(kind: SyntaxKind) -> bool { kind == FOR_SPEC }
+impl AstNode for ExprIfThenElse {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_IF_THEN_ELSE
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1024,10 +1475,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprImport {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_IMPORT }
+impl AstNode for TrueExpr {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == TRUE_EXPR
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1035,10 +1490,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprVar {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_VAR }
+impl AstNode for FalseExpr {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == FALSE_EXPR
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1046,10 +1505,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprLocal {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_LOCAL }
+impl AstNode for ExprFunction {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_FUNCTION
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1057,10 +1520,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprIfThenElse {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_IF_THEN_ELSE }
+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 })
@@ -1068,10 +1535,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprFunction {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_FUNCTION }
+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()) {
Some(Self { syntax })
@@ -1079,10 +1550,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ParamsDesc {
- fn can_cast(kind: SyntaxKind) -> bool { kind == PARAMS_DESC }
+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 })
@@ -1090,10 +1565,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprAssert {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ASSERT }
+impl AstNode for ExprError {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == EXPR_ERROR
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1101,10 +1580,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for Assertion {
- fn can_cast(kind: SyntaxKind) -> bool { kind == ASSERTION }
+impl AstNode for SliceDescEnd {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == SLICE_DESC_END
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1112,10 +1595,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for ExprError {
- fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ERROR }
+impl AstNode for SliceDescStep {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == SLICE_DESC_STEP
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1123,10 +1610,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for Arg {
- fn can_cast(kind: SyntaxKind) -> bool { kind == ARG }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == ARG
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1134,10 +1625,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ObjBodyComp {
- fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_BODY_COMP }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == OBJ_BODY_COMP
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1145,10 +1640,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ObjLocalPostComma {
- fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_LOCAL_POST_COMMA }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == OBJ_LOCAL_POST_COMMA
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1156,10 +1655,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ObjLocalPreComma {
- fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_LOCAL_PRE_COMMA }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == OBJ_LOCAL_PRE_COMMA
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1167,10 +1670,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ObjBodyMemberList {
- fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_BODY_MEMBER_LIST }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == OBJ_BODY_MEMBER_LIST
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1178,10 +1685,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for ObjLocal {
- fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_LOCAL }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == OBJ_LOCAL
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1189,10 +1700,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for MemberBindStmt {
- fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_BIND_STMT }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == MEMBER_BIND_STMT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1200,10 +1715,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for MemberAssertStmt {
- fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_ASSERT_STMT }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == MEMBER_ASSERT_STMT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1211,10 +1730,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for MemberField {
- fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_FIELD }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == MEMBER_FIELD
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1222,10 +1745,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for FieldNormal {
- fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_NORMAL }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == FIELD_NORMAL
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1233,10 +1760,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for Visibility {
- fn can_cast(kind: SyntaxKind) -> bool { kind == VISIBILITY }
+impl AstNode for FieldMethod {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == FIELD_METHOD
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1244,10 +1775,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for FieldMethod {
- fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_METHOD }
+impl AstNode for FieldNameFixed {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == FIELD_NAME_FIXED
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1255,10 +1790,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for FieldNameFixed {
- fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_NAME_FIXED }
+impl AstNode for FieldNameDynamic {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == FIELD_NAME_DYNAMIC
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1266,10 +1805,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for FieldNameDynamic {
- fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_NAME_DYNAMIC }
+impl AstNode for ForSpec {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == FOR_SPEC
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1277,10 +1820,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for IfSpec {
- fn can_cast(kind: SyntaxKind) -> bool { kind == IF_SPEC }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == IF_SPEC
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1288,10 +1835,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl AstNode for BindDestruct {
- fn can_cast(kind: SyntaxKind) -> bool { kind == BIND_DESTRUCT }
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == BIND_DESTRUCT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1299,10 +1850,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for Destruct {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT }
+impl AstNode for BindFunction {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == BIND_FUNCTION
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1310,10 +1865,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for BindFunction {
- fn can_cast(kind: SyntaxKind) -> bool { kind == BIND_FUNCTION }
+impl AstNode for Param {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == PARAM
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1321,10 +1880,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for Param {
- fn can_cast(kind: SyntaxKind) -> bool { kind == PARAM }
+impl AstNode for DestructFull {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_FULL
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1332,10 +1895,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for DestructFull {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_FULL }
+impl AstNode for DestructSkip {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_SKIP
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1343,10 +1910,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for DestructSkip {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_SKIP }
+impl AstNode for DestructArray {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_ARRAY
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1354,10 +1925,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for DestructArray {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_ARRAY }
+impl AstNode for DestructObject {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_OBJECT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1365,10 +1940,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for DestructRest {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_REST }
+impl AstNode for DestructObjectField {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_OBJECT_FIELD
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1376,10 +1955,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for DestructObject {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_OBJECT }
+impl AstNode for DestructRest {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_REST
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1387,10 +1970,14 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
-impl AstNode for DestructObjectField {
- fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_OBJECT_FIELD }
+impl AstNode for DestructArrayElement {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ kind == DESTRUCT_ARRAY_ELEMENT
+ }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@@ -1398,76 +1985,129 @@
None
}
}
- fn syntax(&self) -> &SyntaxNode { &self.syntax }
+ fn syntax(&self) -> &SyntaxNode {
+ &self.syntax
+ }
}
impl From<ExprBinary> for Expr {
- fn from(node: ExprBinary) -> Expr { Expr::ExprBinary(node) }
+ fn from(node: ExprBinary) -> Expr {
+ Expr::ExprBinary(node)
+ }
}
impl From<ExprUnary> for Expr {
- fn from(node: ExprUnary) -> Expr { Expr::ExprUnary(node) }
+ fn from(node: ExprUnary) -> Expr {
+ Expr::ExprUnary(node)
+ }
}
impl From<ExprSlice> for Expr {
- fn from(node: ExprSlice) -> Expr { Expr::ExprSlice(node) }
+ fn from(node: ExprSlice) -> Expr {
+ Expr::ExprSlice(node)
+ }
}
impl From<ExprIndex> for Expr {
- fn from(node: ExprIndex) -> Expr { Expr::ExprIndex(node) }
+ fn from(node: ExprIndex) -> Expr {
+ Expr::ExprIndex(node)
+ }
}
impl From<ExprIndexExpr> for Expr {
- fn from(node: ExprIndexExpr) -> Expr { Expr::ExprIndexExpr(node) }
+ fn from(node: ExprIndexExpr) -> Expr {
+ Expr::ExprIndexExpr(node)
+ }
}
impl From<ExprApply> for Expr {
- fn from(node: ExprApply) -> Expr { Expr::ExprApply(node) }
+ fn from(node: ExprApply) -> Expr {
+ Expr::ExprApply(node)
+ }
}
impl From<ExprObjExtend> for Expr {
- fn from(node: ExprObjExtend) -> Expr { Expr::ExprObjExtend(node) }
+ fn from(node: ExprObjExtend) -> Expr {
+ Expr::ExprObjExtend(node)
+ }
}
impl From<ExprParened> for Expr {
- fn from(node: ExprParened) -> Expr { Expr::ExprParened(node) }
+ fn from(node: ExprParened) -> Expr {
+ Expr::ExprParened(node)
+ }
}
impl From<ExprIntrinsicThisFile> for Expr {
- fn from(node: ExprIntrinsicThisFile) -> Expr { Expr::ExprIntrinsicThisFile(node) }
+ fn from(node: ExprIntrinsicThisFile) -> Expr {
+ Expr::ExprIntrinsicThisFile(node)
+ }
}
impl From<ExprIntrinsicId> for Expr {
- fn from(node: ExprIntrinsicId) -> Expr { Expr::ExprIntrinsicId(node) }
+ fn from(node: ExprIntrinsicId) -> Expr {
+ Expr::ExprIntrinsicId(node)
+ }
}
impl From<ExprIntrinsic> for Expr {
- fn from(node: ExprIntrinsic) -> Expr { Expr::ExprIntrinsic(node) }
+ fn from(node: ExprIntrinsic) -> Expr {
+ Expr::ExprIntrinsic(node)
+ }
}
impl From<ExprString> for Expr {
- fn from(node: ExprString) -> Expr { Expr::ExprString(node) }
+ fn from(node: ExprString) -> Expr {
+ Expr::ExprString(node)
+ }
}
impl From<ExprNumber> for Expr {
- fn from(node: ExprNumber) -> Expr { Expr::ExprNumber(node) }
+ fn from(node: ExprNumber) -> Expr {
+ Expr::ExprNumber(node)
+ }
}
+impl From<ExprLiteral> for Expr {
+ fn from(node: ExprLiteral) -> Expr {
+ Expr::ExprLiteral(node)
+ }
+}
impl From<ExprArray> for Expr {
- fn from(node: ExprArray) -> Expr { Expr::ExprArray(node) }
+ fn from(node: ExprArray) -> Expr {
+ Expr::ExprArray(node)
+ }
}
impl From<ExprObject> for Expr {
- fn from(node: ExprObject) -> Expr { Expr::ExprObject(node) }
+ fn from(node: ExprObject) -> Expr {
+ Expr::ExprObject(node)
+ }
}
impl From<ExprArrayComp> for Expr {
- fn from(node: ExprArrayComp) -> Expr { Expr::ExprArrayComp(node) }
+ fn from(node: ExprArrayComp) -> Expr {
+ Expr::ExprArrayComp(node)
+ }
}
impl From<ExprImport> for Expr {
- fn from(node: ExprImport) -> Expr { Expr::ExprImport(node) }
+ fn from(node: ExprImport) -> Expr {
+ Expr::ExprImport(node)
+ }
}
impl From<ExprVar> for Expr {
- fn from(node: ExprVar) -> Expr { Expr::ExprVar(node) }
+ fn from(node: ExprVar) -> Expr {
+ Expr::ExprVar(node)
+ }
}
impl From<ExprLocal> for Expr {
- fn from(node: ExprLocal) -> Expr { Expr::ExprLocal(node) }
+ fn from(node: ExprLocal) -> Expr {
+ Expr::ExprLocal(node)
+ }
}
impl From<ExprIfThenElse> for Expr {
- fn from(node: ExprIfThenElse) -> Expr { Expr::ExprIfThenElse(node) }
+ fn from(node: ExprIfThenElse) -> Expr {
+ Expr::ExprIfThenElse(node)
+ }
}
impl From<ExprFunction> for Expr {
- fn from(node: ExprFunction) -> Expr { Expr::ExprFunction(node) }
+ fn from(node: ExprFunction) -> Expr {
+ Expr::ExprFunction(node)
+ }
}
impl From<ExprAssert> for Expr {
- fn from(node: ExprAssert) -> Expr { Expr::ExprAssert(node) }
+ fn from(node: ExprAssert) -> Expr {
+ Expr::ExprAssert(node)
+ }
}
impl From<ExprError> for Expr {
- fn from(node: ExprError) -> Expr { Expr::ExprError(node) }
+ fn from(node: ExprError) -> Expr {
+ Expr::ExprError(node)
+ }
}
impl AstNode for Expr {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1485,6 +2125,7 @@
| EXPR_INTRINSIC
| EXPR_STRING
| EXPR_NUMBER
+ | EXPR_LITERAL
| EXPR_ARRAY
| EXPR_OBJECT
| EXPR_ARRAY_COMP
@@ -1515,6 +2156,7 @@
EXPR_INTRINSIC => Expr::ExprIntrinsic(ExprIntrinsic { syntax }),
EXPR_STRING => Expr::ExprString(ExprString { syntax }),
EXPR_NUMBER => Expr::ExprNumber(ExprNumber { syntax }),
+ EXPR_LITERAL => Expr::ExprLiteral(ExprLiteral { syntax }),
EXPR_ARRAY => Expr::ExprArray(ExprArray { syntax }),
EXPR_OBJECT => Expr::ExprObject(ExprObject { syntax }),
EXPR_ARRAY_COMP => Expr::ExprArrayComp(ExprArrayComp { syntax }),
@@ -1544,6 +2186,7 @@
Expr::ExprIntrinsic(it) => &it.syntax,
Expr::ExprString(it) => &it.syntax,
Expr::ExprNumber(it) => &it.syntax,
+ Expr::ExprLiteral(it) => &it.syntax,
Expr::ExprArray(it) => &it.syntax,
Expr::ExprObject(it) => &it.syntax,
Expr::ExprArrayComp(it) => &it.syntax,
@@ -1558,10 +2201,14 @@
}
}
impl From<ObjBodyComp> for ObjBody {
- fn from(node: ObjBodyComp) -> ObjBody { ObjBody::ObjBodyComp(node) }
+ fn from(node: ObjBodyComp) -> ObjBody {
+ ObjBody::ObjBodyComp(node)
+ }
}
impl From<ObjBodyMemberList> for ObjBody {
- fn from(node: ObjBodyMemberList) -> ObjBody { ObjBody::ObjBodyMemberList(node) }
+ fn from(node: ObjBodyMemberList) -> ObjBody {
+ ObjBody::ObjBodyMemberList(node)
+ }
}
impl AstNode for ObjBody {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1586,10 +2233,14 @@
}
}
impl From<ForSpec> for CompSpec {
- fn from(node: ForSpec) -> CompSpec { CompSpec::ForSpec(node) }
+ fn from(node: ForSpec) -> CompSpec {
+ CompSpec::ForSpec(node)
+ }
}
impl From<IfSpec> for CompSpec {
- fn from(node: IfSpec) -> CompSpec { CompSpec::IfSpec(node) }
+ fn from(node: IfSpec) -> CompSpec {
+ CompSpec::IfSpec(node)
+ }
}
impl AstNode for CompSpec {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1614,10 +2265,14 @@
}
}
impl From<BindDestruct> for Bind {
- fn from(node: BindDestruct) -> Bind { Bind::BindDestruct(node) }
+ fn from(node: BindDestruct) -> Bind {
+ Bind::BindDestruct(node)
+ }
}
impl From<BindFunction> for Bind {
- fn from(node: BindFunction) -> Bind { Bind::BindFunction(node) }
+ fn from(node: BindFunction) -> Bind {
+ Bind::BindFunction(node)
+ }
}
impl AstNode for Bind {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1642,13 +2297,19 @@
}
}
impl From<MemberBindStmt> for Member {
- fn from(node: MemberBindStmt) -> Member { Member::MemberBindStmt(node) }
+ fn from(node: MemberBindStmt) -> Member {
+ Member::MemberBindStmt(node)
+ }
}
impl From<MemberAssertStmt> for Member {
- fn from(node: MemberAssertStmt) -> Member { Member::MemberAssertStmt(node) }
+ fn from(node: MemberAssertStmt) -> Member {
+ Member::MemberAssertStmt(node)
+ }
}
impl From<MemberField> for Member {
- fn from(node: MemberField) -> Member { Member::MemberField(node) }
+ fn from(node: MemberField) -> Member {
+ Member::MemberField(node)
+ }
}
impl AstNode for Member {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1675,10 +2336,14 @@
}
}
impl From<FieldNormal> for Field {
- fn from(node: FieldNormal) -> Field { Field::FieldNormal(node) }
+ fn from(node: FieldNormal) -> Field {
+ Field::FieldNormal(node)
+ }
}
impl From<FieldMethod> for Field {
- fn from(node: FieldMethod) -> Field { Field::FieldMethod(node) }
+ fn from(node: FieldMethod) -> Field {
+ Field::FieldMethod(node)
+ }
}
impl AstNode for Field {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1703,10 +2368,14 @@
}
}
impl From<FieldNameFixed> for FieldName {
- fn from(node: FieldNameFixed) -> FieldName { FieldName::FieldNameFixed(node) }
+ fn from(node: FieldNameFixed) -> FieldName {
+ FieldName::FieldNameFixed(node)
+ }
}
impl From<FieldNameDynamic> for FieldName {
- fn from(node: FieldNameDynamic) -> FieldName { FieldName::FieldNameDynamic(node) }
+ fn from(node: FieldNameDynamic) -> FieldName {
+ FieldName::FieldNameDynamic(node)
+ }
}
impl AstNode for FieldName {
fn can_cast(kind: SyntaxKind) -> bool {
@@ -1730,6 +2399,448 @@
}
}
}
+impl From<DestructFull> for Destruct {
+ fn from(node: DestructFull) -> Destruct {
+ Destruct::DestructFull(node)
+ }
+}
+impl From<DestructSkip> for Destruct {
+ fn from(node: DestructSkip) -> Destruct {
+ Destruct::DestructSkip(node)
+ }
+}
+impl From<DestructArray> for Destruct {
+ fn from(node: DestructArray) -> Destruct {
+ Destruct::DestructArray(node)
+ }
+}
+impl From<DestructObject> for Destruct {
+ fn from(node: DestructObject) -> Destruct {
+ Destruct::DestructObject(node)
+ }
+}
+impl AstNode for Destruct {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ DESTRUCT_FULL | DESTRUCT_SKIP | DESTRUCT_ARRAY | DESTRUCT_OBJECT => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxNode) -> Option<Self> {
+ let res = match syntax.kind() {
+ DESTRUCT_FULL => Destruct::DestructFull(DestructFull { syntax }),
+ DESTRUCT_SKIP => Destruct::DestructSkip(DestructSkip { syntax }),
+ DESTRUCT_ARRAY => Destruct::DestructArray(DestructArray { syntax }),
+ DESTRUCT_OBJECT => Destruct::DestructObject(DestructObject { syntax }),
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxNode {
+ match self {
+ Destruct::DestructFull(it) => &it.syntax,
+ Destruct::DestructSkip(it) => &it.syntax,
+ Destruct::DestructArray(it) => &it.syntax,
+ Destruct::DestructObject(it) => &it.syntax,
+ }
+ }
+}
+impl From<DestructArrayElement> for DestructArrayPart {
+ fn from(node: DestructArrayElement) -> DestructArrayPart {
+ DestructArrayPart::DestructArrayElement(node)
+ }
+}
+impl From<DestructRest> for DestructArrayPart {
+ fn from(node: DestructRest) -> DestructArrayPart {
+ DestructArrayPart::DestructRest(node)
+ }
+}
+impl AstNode for DestructArrayPart {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ DESTRUCT_ARRAY_ELEMENT | DESTRUCT_REST => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxNode) -> Option<Self> {
+ let res = match syntax.kind() {
+ DESTRUCT_ARRAY_ELEMENT => {
+ DestructArrayPart::DestructArrayElement(DestructArrayElement { syntax })
+ }
+ DESTRUCT_REST => DestructArrayPart::DestructRest(DestructRest { syntax }),
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxNode {
+ match self {
+ DestructArrayPart::DestructArrayElement(it) => &it.syntax,
+ DestructArrayPart::DestructRest(it) => &it.syntax,
+ }
+ }
+}
+impl AstToken for BinaryOperator {
+ 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 | ERROR_NO_OPERATOR => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ OR => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Or,
+ },
+ AND => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::And,
+ },
+ BIT_OR => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::BitOr,
+ },
+ BIT_XOR => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::BitXor,
+ },
+ BIT_AND => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::BitAnd,
+ },
+ EQ => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Eq,
+ },
+ NE => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Ne,
+ },
+ LT => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Lt,
+ },
+ GT => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Gt,
+ },
+ LE => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Le,
+ },
+ GE => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Ge,
+ },
+ IN_KW => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::InKw,
+ },
+ LHS => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Lhs,
+ },
+ RHS => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Rhs,
+ },
+ PLUS => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Plus,
+ },
+ MINUS => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Minus,
+ },
+ MUL => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Mul,
+ },
+ DIV => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Div,
+ },
+ MODULO => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::Modulo,
+ },
+ ERROR_NO_OPERATOR => BinaryOperator {
+ syntax,
+ kind: BinaryOperatorKind::ErrorNoOperator,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl BinaryOperator {
+ pub fn kind(&self) -> BinaryOperatorKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for BinaryOperator {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl AstToken for UnaryOperator {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ MINUS | NOT | BIT_NOT => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ MINUS => UnaryOperator {
+ syntax,
+ kind: UnaryOperatorKind::Minus,
+ },
+ NOT => UnaryOperator {
+ syntax,
+ kind: UnaryOperatorKind::Not,
+ },
+ BIT_NOT => UnaryOperator {
+ syntax,
+ kind: UnaryOperatorKind::BitNot,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl UnaryOperator {
+ pub fn kind(&self) -> UnaryOperatorKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for UnaryOperator {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl AstToken for Literal {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | DOLLAR | SUPER_KW => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ NULL_KW => Literal {
+ syntax,
+ kind: LiteralKind::NullKw,
+ },
+ TRUE_KW => Literal {
+ syntax,
+ kind: LiteralKind::TrueKw,
+ },
+ FALSE_KW => Literal {
+ syntax,
+ kind: LiteralKind::FalseKw,
+ },
+ SELF_KW => Literal {
+ syntax,
+ kind: LiteralKind::SelfKw,
+ },
+ DOLLAR => Literal {
+ syntax,
+ kind: LiteralKind::Dollar,
+ },
+ SUPER_KW => Literal {
+ syntax,
+ kind: LiteralKind::SuperKw,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl Literal {
+ pub fn kind(&self) -> LiteralKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for Literal {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl AstToken for String {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ STRING_DOUBLE
+ | STRING_SINGLE
+ | STRING_DOUBLE_VERBATIM
+ | STRING_SINGLE_VERBATIM
+ | STRING_BLOCK => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ STRING_DOUBLE => String {
+ syntax,
+ kind: StringKind::StringDouble,
+ },
+ STRING_SINGLE => String {
+ syntax,
+ kind: StringKind::StringSingle,
+ },
+ STRING_DOUBLE_VERBATIM => String {
+ syntax,
+ kind: StringKind::StringDoubleVerbatim,
+ },
+ STRING_SINGLE_VERBATIM => String {
+ syntax,
+ kind: StringKind::StringSingleVerbatim,
+ },
+ STRING_BLOCK => String {
+ syntax,
+ kind: StringKind::StringBlock,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl String {
+ pub fn kind(&self) -> StringKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for String {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl AstToken for Number {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ FLOAT | META_FORCE_ENUM => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ FLOAT => Number {
+ syntax,
+ kind: NumberKind::Float,
+ },
+ META_FORCE_ENUM => Number {
+ syntax,
+ kind: NumberKind::MetaForceEnum,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl Number {
+ pub fn kind(&self) -> NumberKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for Number {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl AstToken for ImportKind {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ IMPORTSTR_KW => ImportKind {
+ syntax,
+ kind: ImportKindKind::ImportstrKw,
+ },
+ IMPORTBIN_KW => ImportKind {
+ syntax,
+ kind: ImportKindKind::ImportbinKw,
+ },
+ IMPORT_KW => ImportKind {
+ syntax,
+ kind: ImportKindKind::ImportKw,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl ImportKind {
+ pub fn kind(&self) -> ImportKindKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for ImportKind {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl AstToken for Visibility {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ COLONCOLONCOLON | COLONCOLON | COLON => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ COLONCOLONCOLON => Visibility {
+ syntax,
+ kind: VisibilityKind::Coloncoloncolon,
+ },
+ COLONCOLON => Visibility {
+ syntax,
+ kind: VisibilityKind::Coloncolon,
+ },
+ COLON => Visibility {
+ syntax,
+ kind: VisibilityKind::Colon,
+ },
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+}
+impl Visibility {
+ pub fn kind(&self) -> VisibilityKind {
+ self.kind
+ }
+}
+impl std::fmt::Display for Visibility {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
impl std::fmt::Display for Expr {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
@@ -1765,31 +2876,36 @@
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for SourceFile {
+impl std::fmt::Display for Destruct {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprBinary {
+impl std::fmt::Display for DestructArrayPart {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for BinaryOperator {
+impl std::fmt::Display for SourceFile {
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 ExprBinary {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for UnaryOperator {
+impl std::fmt::Display for LhsExpr {
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 ExprSlice {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
@@ -1840,11 +2956,6 @@
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for Literal {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(self.syntax(), f)
- }
-}
impl std::fmt::Display for ExprIntrinsicThisFile {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
@@ -1861,11 +2972,6 @@
}
}
impl std::fmt::Display for ExprString {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(self.syntax(), f)
- }
-}
-impl std::fmt::Display for String {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
@@ -1875,47 +2981,47 @@
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for Number {
+impl std::fmt::Display for ExprArray {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprArray {
+impl std::fmt::Display for ExprObject {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprObject {
+impl std::fmt::Display for ExprArrayComp {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprArrayComp {
+impl std::fmt::Display for ExprImport {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ForSpec {
+impl std::fmt::Display for ExprVar {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprImport {
+impl std::fmt::Display for ExprLocal {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprVar {
+impl std::fmt::Display for ExprIfThenElse {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprLocal {
+impl std::fmt::Display for TrueExpr {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for ExprIfThenElse {
+impl std::fmt::Display for FalseExpr {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
@@ -1945,6 +3051,16 @@
std::fmt::Display::fmt(self.syntax(), f)
}
}
+impl std::fmt::Display for SliceDescEnd {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl std::fmt::Display for SliceDescStep {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
impl std::fmt::Display for Arg {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
@@ -1991,11 +3107,6 @@
}
}
impl std::fmt::Display for FieldNormal {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(self.syntax(), f)
- }
-}
-impl std::fmt::Display for Visibility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
@@ -2015,17 +3126,17 @@
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for IfSpec {
+impl std::fmt::Display for ForSpec {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for BindDestruct {
+impl std::fmt::Display for IfSpec {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for Destruct {
+impl std::fmt::Display for BindDestruct {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
@@ -2055,17 +3166,22 @@
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for DestructRest {
+impl std::fmt::Display for DestructObject {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+}
+impl std::fmt::Display for DestructObjectField {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for DestructObject {
+impl std::fmt::Display for DestructRest {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
-impl std::fmt::Display for DestructObjectField {
+impl std::fmt::Display for DestructArrayElement {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
crates/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
@@ -1,7 +1,13 @@
//! This is a generated file, please do not edit manually. Changes can be
//! made in codegeneration that lives in `xtask` top-level dir.
-#![allow(bad_style, missing_docs, unreachable_pub)]
+#![allow(
+ bad_style,
+ missing_docs,
+ unreachable_pub,
+ clippy::manual_non_exhaustive,
+ clippy::match_like_matches_macro
+)]
use logos::Logos;
#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Logos)]
@@ -89,6 +95,52 @@
INTRINSIC_ID,
#[token("$intrinsic")]
INTRINSIC,
+ #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?")]
+ FLOAT,
+ #[regex("(?:0|[1-9][0-9]*)\\.[^0-9]")]
+ ERROR_FLOAT_JUNK_AFTER_POINT,
+ #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][^+\\-0-9]")]
+ ERROR_FLOAT_JUNK_AFTER_EXPONENT,
+ #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][+-][^0-9]")]
+ ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN,
+ #[regex("\"(?s:[^\"\\\\]|\\\\.)*\"")]
+ STRING_DOUBLE,
+ #[regex("\"(?s:[^\"\\\\]|\\\\.)*")]
+ ERROR_STRING_DOUBLE_UNTERMINATED,
+ #[regex("'(?s:[^'\\\\]|\\\\.)*'")]
+ STRING_SINGLE,
+ #[regex("'(?s:[^'\\\\]|\\\\.)*")]
+ ERROR_STRING_SINGLE_UNTERMINATED,
+ #[regex("@\"(?:[^\"]|\"\")*\"")]
+ STRING_DOUBLE_VERBATIM,
+ #[regex("@\"(?:[^\"]|\"\")*")]
+ ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED,
+ #[regex("@'(?:[^']|'')*'")]
+ STRING_SINGLE_VERBATIM,
+ #[regex("@'(?:[^']|'')*")]
+ ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED,
+ #[regex("@[^\"'\\s]\\S+")]
+ ERROR_STRING_VERBATIM_MISSING_QUOTES,
+ #[regex("\\|\\|\\|", crate::string_block::lex_str_block_test)]
+ STRING_BLOCK,
+ ERROR_STRING_BLOCK_UNEXPECTED_END,
+ ERROR_STRING_BLOCK_MISSING_NEW_LINE,
+ ERROR_STRING_BLOCK_MISSING_TERMINATION,
+ ERROR_STRING_BLOCK_MISSING_INDENT,
+ #[regex("[_a-zA-Z][_a-zA-Z0-9]*")]
+ IDENT,
+ #[regex("[ \\t\\n\\r]+")]
+ WHITESPACE,
+ #[regex("//[^\\r\\n]*(\\r\\n|\\n)?")]
+ SINGLE_LINE_SLASH_COMMENT,
+ #[regex("#[^\\r\\n]*(\\r\\n|\\n)?")]
+ SINGLE_LINE_HASH_COMMENT,
+ #[regex("/\\*([^*]|\\*[^/])*\\*/")]
+ MULTI_LINE_COMMENT,
+ #[regex("/\\*/")]
+ ERROR_COMMENT_TOO_SHORT,
+ #[regex("/\\*([^*]|\\*[^/])+")]
+ ERROR_COMMENT_UNTERMINATED,
#[token("tailstrict")]
TAILSTRICT_KW,
#[token("importstr")]
@@ -111,6 +163,7 @@
ERROR_KW,
#[token("in")]
IN_KW,
+ ERROR_NO_OPERATOR,
#[token("null")]
NULL_KW,
#[token("true")]
@@ -121,39 +174,17 @@
SELF_KW,
#[token("super")]
SUPER_KW,
+ META_FORCE_ENUM,
#[token("for")]
FOR_KW,
#[token("assert")]
ASSERT_KW,
- #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?")]
- NUMBER,
- #[regex("\"(?s:[^\"\\\\]|\\\\.)*\"")]
- STRING_DOUBLE,
- #[regex("'(?s:[^'\\\\]|\\\\.)*'")]
- STRING_SINGLE,
- #[regex("@\"(?:[^\"]|\"\")*\"")]
- STRING_DOUBLE_VERBATIM,
- #[regex("@'(?:[^']|'')*'")]
- STRING_SINGLE_VERBATIM,
- #[regex("\\|\\|\\|")]
- STRING_BLOCK,
- #[regex("[_a-zA-Z][_a-zA-Z0-9]*")]
- IDENT,
- #[regex("[ \\t\\n\\r]+")]
- WHITESPACE,
- #[regex("//[^\\r\\n]*(\\r\\n|\\n)?")]
- SINGLE_LINE_SLASH_COMMENT,
- #[regex("#[^\\r\\n]*(\\r\\n|\\n)?")]
- SINGLE_LINE_HASH_COMMENT,
- #[regex("/\\*([^*]|\\*[^/])*\\*/")]
- MULTI_LINE_COMMENT,
#[error]
ERROR,
SOURCE_FILE,
EXPR_BINARY,
- BINARY_OPERATOR,
+ LHS_EXPR,
EXPR_UNARY,
- UNARY_OPERATOR,
EXPR_SLICE,
SLICE_DESC,
EXPR_INDEX,
@@ -164,26 +195,27 @@
EXPR_OBJ_EXTEND,
EXPR_PARENED,
EXPR_LITERAL,
- LITERAL,
EXPR_INTRINSIC_THIS_FILE,
EXPR_INTRINSIC_ID,
EXPR_INTRINSIC,
EXPR_STRING,
- STRING,
EXPR_NUMBER,
EXPR_ARRAY,
EXPR_OBJECT,
EXPR_ARRAY_COMP,
- FOR_SPEC,
EXPR_IMPORT,
EXPR_VAR,
EXPR_LOCAL,
EXPR_IF_THEN_ELSE,
+ TRUE_EXPR,
+ FALSE_EXPR,
EXPR_FUNCTION,
PARAMS_DESC,
EXPR_ASSERT,
ASSERTION,
EXPR_ERROR,
+ SLICE_DESC_END,
+ SLICE_DESC_STEP,
ARG,
OBJ_BODY_COMP,
OBJ_LOCAL_POST_COMMA,
@@ -194,21 +226,21 @@
MEMBER_ASSERT_STMT,
MEMBER_FIELD,
FIELD_NORMAL,
- VISIBILITY,
FIELD_METHOD,
FIELD_NAME_FIXED,
FIELD_NAME_DYNAMIC,
+ FOR_SPEC,
IF_SPEC,
BIND_DESTRUCT,
- DESTRUCT,
BIND_FUNCTION,
PARAM,
DESTRUCT_FULL,
DESTRUCT_SKIP,
DESTRUCT_ARRAY,
- DESTRUCT_REST,
DESTRUCT_OBJECT,
DESTRUCT_OBJECT_FIELD,
+ DESTRUCT_REST,
+ DESTRUCT_ARRAY_ELEMENT,
EXPR,
OBJ_BODY,
COMP_SPEC,
@@ -216,6 +248,15 @@
MEMBER,
FIELD,
FIELD_NAME,
+ DESTRUCT,
+ DESTRUCT_ARRAY_PART,
+ BINARY_OPERATOR,
+ UNARY_OPERATOR,
+ LITERAL,
+ STRING,
+ NUMBER,
+ IMPORT_KIND,
+ VISIBILITY,
#[doc(hidden)]
__LAST,
}
@@ -223,76 +264,23 @@
impl SyntaxKind {
pub fn is_keyword(self) -> bool {
match self {
- TAILSTRICT_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | LOCAL_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_punct(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 | INTRINSIC_THIS_FILE
- | INTRINSIC_ID | INTRINSIC => true,
+ | INTRINSIC_ID | INTRINSIC | TAILSTRICT_KW | IMPORTSTR_KW | IMPORTBIN_KW
+ | IMPORT_KW | LOCAL_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 from_keyword(ident: &str) -> Option<SyntaxKind> {
- let kw = match ident {
- "tailstrict" => TAILSTRICT_KW,
- "importstr" => IMPORTSTR_KW,
- "importbin" => IMPORTBIN_KW,
- "import" => IMPORT_KW,
- "local" => LOCAL_KW,
- "if" => IF_KW,
- "then" => THEN_KW,
- "else" => ELSE_KW,
- "function" => FUNCTION_KW,
- "error" => ERROR_KW,
- "in" => IN_KW,
- "null" => NULL_KW,
- "true" => TRUE_KW,
- "false" => FALSE_KW,
- "self" => SELF_KW,
- "super" => SUPER_KW,
- "for" => FOR_KW,
- "assert" => ASSERT_KW,
- _ => return None,
- };
- Some(kw)
- }
- pub fn from_char(c: char) -> Option<SyntaxKind> {
- let tok = match c {
- '|' => BIT_OR,
- '^' => BIT_XOR,
- '&' => BIT_AND,
- '<' => LT,
- '>' => GT,
- '+' => PLUS,
- '-' => MINUS,
- '*' => MUL,
- '/' => DIV,
- '%' => MODULO,
- '!' => NOT,
- '~' => BIT_NOT,
- '[' => L_BRACK,
- ']' => R_BRACK,
- '(' => L_PAREN,
- ')' => R_PAREN,
- '{' => L_BRACE,
- '}' => R_BRACE,
- ':' => COLON,
- ';' => SEMI,
- '.' => DOT,
- ',' => COMMA,
- '$' => DOLLAR,
- '=' => ASSIGN,
- '?' => QUESTION_MARK,
- _ => return None,
- };
- Some(tok)
+ pub fn is_enum(self) -> bool {
+ match self {
+ EXPR | OBJ_BODY | COMP_SPEC | BIND | MEMBER | FIELD | FIELD_NAME | DESTRUCT
+ | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR | LITERAL | STRING
+ | NUMBER | IMPORT_KIND | VISIBILITY => true,
+ _ => false,
+ }
}
pub fn from_raw(r: u16) -> Self {
assert!(r < Self::__LAST as u16);
@@ -303,5 +291,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 } ; ["$intrinsicThisFile"] => { $ crate :: SyntaxKind :: INTRINSIC_THIS_FILE } ; ["$intrinsicId"] => { $ crate :: SyntaxKind :: INTRINSIC_ID } ; ["$intrinsic"] => { $ crate :: SyntaxKind :: INTRINSIC } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_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 } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; }
+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 } ; ["$intrinsicThisFile"] => { $ crate :: SyntaxKind :: INTRINSIC_THIS_FILE } ; ["$intrinsicId"] => { $ crate :: SyntaxKind :: INTRINSIC_ID } ; ["$intrinsic"] => { $ crate :: SyntaxKind :: INTRINSIC } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_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;
crates/jrsonnet-rowan-parser/src/generated/tokens.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/generated/tokens.rs
+++ /dev/null
@@ -1,155 +0,0 @@
-//! This is a generated file, please do not edit manually. Changes can be
-//! made in codegeneration that lives in `xtask` top-level dir.
-
-use crate::{
- ast::AstToken,
- SyntaxKind::{self, *},
- SyntaxToken,
-};
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Whitespace {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for Whitespace {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for Whitespace {
- fn can_cast(kind: SyntaxKind) -> bool { kind == WHITESPACE }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Comment {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for Comment {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for Comment {
- fn can_cast(kind: SyntaxKind) -> bool { kind == COMMENT }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct String {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for String {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for String {
- fn can_cast(kind: SyntaxKind) -> bool { kind == STRING }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct StringVerbantim {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for StringVerbantim {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for StringVerbantim {
- fn can_cast(kind: SyntaxKind) -> bool { kind == STRING_VERBANTIM }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct StringBlock {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for StringBlock {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for StringBlock {
- fn can_cast(kind: SyntaxKind) -> bool { kind == STRING_BLOCK }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Number {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for Number {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for Number {
- fn can_cast(kind: SyntaxKind) -> bool { kind == NUMBER }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Ident {
- pub(crate) syntax: SyntaxToken,
-}
-impl std::fmt::Display for Ident {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Display::fmt(&self.syntax, f)
- }
-}
-impl AstToken for Ident {
- fn can_cast(kind: SyntaxKind) -> bool { kind == IDENT }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) {
- Some(Self { syntax })
- } else {
- None
- }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
-}
crates/jrsonnet-rowan-parser/src/lex.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/lex.rs
+++ b/crates/jrsonnet-rowan-parser/src/lex.rs
@@ -6,40 +6,6 @@
use crate::SyntaxKind;
-impl SyntaxKind {
- pub fn is_trivia(self) -> bool {
- matches!(
- self,
- Self::WHITESPACE
- | Self::MULTI_LINE_COMMENT
- | Self::SINGLE_LINE_HASH_COMMENT
- | Self::SINGLE_LINE_SLASH_COMMENT
- )
- }
- pub fn is_string(self) -> bool {
- matches!(
- self,
- Self::STRING_SINGLE
- | Self::STRING_DOUBLE
- | Self::STRING_SINGLE_VERBATIM
- | Self::STRING_DOUBLE_VERBATIM
- | Self::STRING_BLOCK
- )
- }
- pub fn is_number(self) -> bool {
- matches!(self, Self::NUMBER)
- }
- pub fn is_literal(self) -> bool {
- matches!(
- self,
- Self::NULL_KW
- | Self::TRUE_KW | Self::FALSE_KW
- | Self::SELF_KW | Self::DOLLAR
- | Self::SUPER_KW
- )
- }
-}
-
pub struct Lexer<'a> {
inner: logos::Lexer<'a, SyntaxKind>,
}
@@ -74,7 +40,7 @@
}
}
-#[derive(Clone, Copy)]
+#[derive(Clone, Copy, Debug)]
pub struct Lexeme<'i> {
pub kind: SyntaxKind,
pub text: &'i str,
crates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/lib.rs
+++ b/crates/jrsonnet-rowan-parser/src/lib.rs
@@ -2,6 +2,7 @@
mod ast;
mod binary;
+mod classify;
mod event;
mod generated;
mod language;
@@ -13,8 +14,27 @@
mod token_set;
mod unary;
-pub use generated::syntax_kinds::SyntaxKind;
+pub use ast::{AstChildren, AstNode, AstToken};
+use event::Sink;
+use generated::nodes::SourceFile;
+pub use generated::{nodes, syntax_kinds::SyntaxKind};
pub use language::{
JsonnetLanguage, PreorderWithTokens, SyntaxElement, SyntaxElementChildren, SyntaxNode,
SyntaxNodeChildren, SyntaxToken,
};
+use lex::lex;
+use parser::{Parser, SyntaxError};
+pub fn parse(input: &str) -> (SourceFile, Vec<SyntaxError>) {
+ let lexemes = lex(input);
+ let parser = Parser::new(&lexemes);
+ let events = parser.parse();
+ let sink = Sink::new(events, &lexemes);
+
+ let parse = sink.finish();
+ (
+ SourceFile {
+ syntax: parse.syntax(),
+ },
+ parse.errors,
+ )
+}
crates/jrsonnet-rowan-parser/src/marker.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/marker.rs
+++ b/crates/jrsonnet-rowan-parser/src/marker.rs
@@ -7,7 +7,7 @@
pub pos: usize,
}
impl Ranger {
- pub fn finish(mut self, p: &Parser) -> FinishedRanger {
+ pub fn finish(self, p: &Parser) -> FinishedRanger {
FinishedRanger {
start_token: self.pos,
end_token: self.pos.max(p.offset.saturating_sub(1)),
@@ -20,6 +20,7 @@
pub end_token: usize,
}
impl FinishedRanger {
+ #[allow(dead_code)]
pub fn had_error_since(&self, p: &Parser) -> bool {
p.last_error_token >= self.start_token
}
@@ -28,76 +29,94 @@
#[must_use]
pub struct Marker {
pub start_event_idx: usize,
- pub token: usize,
bomb: DropBomb,
}
impl Marker {
- pub fn new(pos: usize, token: usize) -> Self {
+ pub fn new(pos: usize) -> Self {
Self {
start_event_idx: pos,
- token,
bomb: DropBomb::new("marked dropped while not completed"),
}
}
pub fn complete(mut self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker {
self.bomb.defuse();
+ assert!(
+ !kind.is_enum(),
+ "{kind:?} is a enum kind, you should use variant kinds instead"
+ );
+ // TODO: is_parser should return true if enum variant has #[regex]/#[token] over it
+ // debug_assert!(
+ // !kind.is_parser(),
+ // "{kind:?} should be only emitted by parser, not used directly"
+ // );
let event_at_pos = &mut p.events[self.start_event_idx];
- assert_eq!(*event_at_pos, Event::Placeholder);
+ assert_eq!(*event_at_pos, Event::Pending);
*event_at_pos = Event::Start {
kind,
forward_parent: None,
};
- p.events.push(Event::Finish);
+ let finish_event_idx = p.events.len();
+ p.events.push(Event::Finish { wrapper: None });
p.entered -= 1;
p.clear_outdated_hints();
CompletedMarker {
start_event_idx: self.start_event_idx,
- start_token: self.token,
- end_token: self.token.max(p.offset.saturating_sub(1)),
+ finish_event_idx,
}
}
+ pub fn forget(mut self, p: &mut Parser) {
+ self.bomb.defuse();
+ let event_at_pos = &mut p.events[self.start_event_idx];
+ assert_eq!(*event_at_pos, Event::Pending);
+
+ *event_at_pos = Event::Noop;
+ p.entered -= 1;
+ p.clear_outdated_hints();
+ }
}
pub struct CompletedMarker {
start_event_idx: usize,
- pub start_token: usize,
- pub end_token: usize,
+ finish_event_idx: usize,
}
impl CompletedMarker {
pub(super) fn precede(self, p: &mut Parser) -> Marker {
- let mut new_m = p.start();
- new_m.token = self.start_token;
-
- if let Event::Start {
- ref mut forward_parent,
- ..
- } = p.events[self.start_event_idx]
- {
- *forward_parent = Some(new_m.start_event_idx - self.start_event_idx);
- } else {
- unreachable!();
+ let new_m = p.start();
+ match &mut p.events[self.start_event_idx] {
+ Event::Start { forward_parent, .. } => {
+ *forward_parent = Some(new_m.start_event_idx - self.start_event_idx);
+ }
+ _ => unreachable!(),
}
new_m
}
+ /// Create new node around existing marker, not counting anything that comes after it
+ pub fn wrap(self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker {
+ let new_m = p.start();
+ match &mut p.events[self.start_event_idx] {
+ Event::Start { forward_parent, .. } => {
+ *forward_parent = Some(new_m.start_event_idx - self.start_event_idx);
+ }
+ _ => unreachable!(),
+ }
+
+ let completed = new_m.complete(p, kind);
+
+ match &mut p.events[self.finish_event_idx] {
+ Event::Finish { wrapper } => {
+ *wrapper = Some(completed.finish_event_idx - self.finish_event_idx);
+ }
+ _ => unreachable!(),
+ }
+ completed
+ }
}
pub trait AsRange {
fn as_range(&self, p: &Parser) -> TextRange;
fn end_token(&self) -> usize;
-}
-
-impl AsRange for CompletedMarker {
- fn as_range(&self, p: &Parser) -> TextRange {
- TextRange::new(
- p.start_of_token(self.start_token),
- p.end_of_token(self.end_token),
- )
- }
- fn end_token(&self) -> usize {
- self.end_token
- }
}
impl AsRange for FinishedRanger {
crates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -5,9 +5,10 @@
use crate::{
binary::BinaryOperator,
- event::{Event, Sink},
- lex::{lex, Lexeme},
+ event::Event,
+ lex::Lexeme,
marker::{AsRange, CompletedMarker, Marker, Ranger},
+ string_block::{lex_str_block, StringBlockError},
token_set::SyntaxKindSet,
unary::UnaryOperator,
SyntaxKind,
@@ -43,9 +44,10 @@
pub last_error_token: usize,
expected_syntax: Option<ExpectedSyntax>,
expected_syntax_tracking_state: Rc<Cell<ExpectedSyntaxTrackingState>>,
+ steps: Cell<u64>,
}
-const DEFAULT_RECOVERY_SET: SyntaxKindSet = TS![; ')' ']' '}' local];
+const DEFAULT_RECOVERY_SET: SyntaxKindSet = TS![];
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SyntaxError {
@@ -68,9 +70,9 @@
},
}
-impl Into<LabeledSpan> for SyntaxError {
- fn into(self) -> LabeledSpan {
- match self {
+impl From<SyntaxError> for LabeledSpan {
+ fn from(val: SyntaxError) -> Self {
+ match val {
SyntaxError::Unexpected {
expected,
found,
@@ -91,7 +93,7 @@
),
SyntaxError::Custom { error, range } | SyntaxError::Hint { error, range } => {
LabeledSpan::new_with_span(
- Some(format!("{}", error)),
+ Some(error),
SourceSpan::new(
SourceOffset::from(usize::from(range.start())),
SourceOffset::from(usize::from(range.end() - range.start())),
@@ -103,7 +105,7 @@
}
impl<'i> Parser<'i> {
- fn new(lexemes: &'i [Lexeme<'i>]) -> Self {
+ pub fn new(lexemes: &'i [Lexeme<'i>]) -> Self {
Self {
lexemes,
offset: 0,
@@ -115,6 +117,7 @@
expected_syntax_tracking_state: Rc::new(Cell::new(
ExpectedSyntaxTrackingState::Unnamed,
)),
+ steps: Cell::new(0),
}
}
pub fn clear_outdated_hints(&mut self) {
@@ -132,27 +135,21 @@
.set(ExpectedSyntaxTrackingState::Unnamed);
}
pub fn start(&mut self) -> Marker {
+ self.skip_trivia();
let start_event_idx = self.events.len();
- self.events.push(Event::Placeholder);
+ self.events.push(Event::Pending);
self.entered += 1;
- Marker::new(start_event_idx, self.offset)
+ Marker::new(start_event_idx)
}
pub fn start_ranger(&mut self) -> Ranger {
+ self.skip_trivia();
let pos = self.offset;
Ranger { pos }
}
- fn parse(mut self) -> Vec<Event> {
+ pub fn parse(mut self) -> Vec<Event> {
let m = self.start();
expr(&mut self);
- if !self.at_end() {
- let ranger = self.start_ranger();
-
- while self.peek().is_some() {
- self.bump()
- }
- let end = ranger.finish(&self);
- self.custom_error(end, "unexpected input after expression");
- }
+ self.expect(EOF);
m.complete(&mut self, SOURCE_FILE);
self.events
@@ -168,7 +165,9 @@
recovery_set: SyntaxKindSet,
) {
if self.at(kind) {
- self.bump();
+ if kind != EOF {
+ self.bump();
+ }
} else {
self.error_with_recovery_set(recovery_set);
}
@@ -180,9 +179,6 @@
} else {
self.error_with_no_skip();
}
- }
- pub(crate) fn last_token_range(&self) -> Option<TextRange> {
- self.lexemes.last().map(|Lexeme { range, .. }| *range)
}
fn current_token(&self) -> Lexeme<'i> {
self.lexemes[self.offset]
@@ -236,15 +232,19 @@
&mut self,
recovery_set: SyntaxKindSet,
) -> Option<CompletedMarker> {
- let expected_syntax = self.expected_syntax.take().unwrap();
+ let expected_syntax = self
+ .expected_syntax
+ .take()
+ .unwrap_or(ExpectedSyntax::Named("unknown"));
self.expected_syntax_tracking_state
.set(ExpectedSyntaxTrackingState::Unnamed);
- if self.at_end() || self.at_set(recovery_set) {
+ self.skip_trivia();
+ if self.at_end() || self.at_ts(recovery_set) {
let range = self
.previous_token()
.map(|t| t.range)
- .unwrap_or(TextRange::at(TextSize::from(0), TextSize::from(0)));
+ .unwrap_or_else(|| TextRange::at(TextSize::from(0), TextSize::from(0)));
self.events.push(Event::Error(SyntaxError::Missing {
expected: expected_syntax,
@@ -256,7 +256,7 @@
let current_token = self.current_token();
self.events.push(Event::Error(SyntaxError::Unexpected {
- expected: expected_syntax.clone(),
+ expected: expected_syntax,
found: current_token.kind,
range: current_token.range,
}));
@@ -270,30 +270,85 @@
fn bump(&mut self) {
self.skip_trivia();
+ self.bump_remap(self.current());
+ }
+ fn bump_remap(&mut self, kind: SyntaxKind) {
+ self.skip_trivia();
assert_ne!(self.offset, self.lexemes.len(), "already at end");
- self.events.push(Event::Token);
+ self.events.push(Event::Token { kind });
self.offset += 1;
self.clear_expected_syntaxes();
}
- fn peek(&mut self) -> Option<SyntaxKind> {
- self.skip_trivia();
- self.peek_raw()
+ fn step(&self) {
+ use std::fmt::Write;
+ let steps = self.steps.get();
+ if steps >= 15000000 {
+ let mut out = "seems like parsing is stuck".to_owned();
+ {
+ let last = 20;
+ write!(out, "\n\nLast {} events:", last).unwrap();
+ for (i, event) in self
+ .events
+ .iter()
+ .skip(self.events.len().saturating_sub(last))
+ .enumerate()
+ {
+ write!(out, "\n{i}. {event:?}").unwrap();
+ }
+ }
+ {
+ let next = 20;
+ write!(out, "\n\nNext {next} tokens:").unwrap();
+ for (i, tok) in self.lexemes.iter().skip(self.offset).take(next).enumerate() {
+ write!(out, "\n{i}. {tok:?}").unwrap();
+ }
+ }
+ panic!("{out}")
+ }
+ self.steps.set(steps + 1);
+ }
+ fn nth(&self, i: usize) -> SyntaxKind {
+ self.step();
+ let mut offset = self.offset;
+ for _ in 0..i {
+ while self
+ .lexemes
+ .get(offset)
+ .map(|l| l.kind.is_trivia())
+ .unwrap_or(false)
+ {
+ offset += 1;
+ }
+ offset += 1;
+ }
+ while self
+ .lexemes
+ .get(offset)
+ .map(|l| l.kind.is_trivia())
+ .unwrap_or(false)
+ {
+ offset += 1;
+ }
+ self.lexemes.get(offset).map(|l| l.kind).unwrap_or(EOF)
}
- pub fn peek_token(&mut self) -> Option<&Lexeme<'i>> {
- self.skip_trivia();
- self.peek_token_raw()
+ fn current(&self) -> SyntaxKind {
+ self.nth(0)
}
fn skip_trivia(&mut self) {
- while self.peek_raw().map(|c| c.is_trivia()).unwrap_or(false) {
+ while self.peek_raw().is_trivia() {
self.offset += 1;
}
- }
- fn peek_raw(&mut self) -> Option<SyntaxKind> {
- self.lexemes.get(self.offset).map(|l| l.kind)
}
- fn peek_token_raw(&mut self) -> Option<&Lexeme<'i>> {
+ fn current_lexeme(&mut self) -> Option<&Lexeme> {
+ self.skip_trivia();
self.lexemes.get(self.offset)
}
+ fn peek_raw(&mut self) -> SyntaxKind {
+ self.lexemes
+ .get(self.offset)
+ .map(|l| l.kind)
+ .unwrap_or(SyntaxKind::EOF)
+ }
#[must_use]
pub(crate) fn expected_syntax_name(&mut self, name: &'static str) -> ExpectedSyntaxGuard {
self.expected_syntax_tracking_state
@@ -303,16 +358,19 @@
ExpectedSyntaxGuard::new(Rc::clone(&self.expected_syntax_tracking_state))
}
pub fn at(&mut self, kind: SyntaxKind) -> bool {
+ self.nth_at(0, kind)
+ }
+ pub fn nth_at(&mut self, n: usize, kind: SyntaxKind) -> bool {
if let ExpectedSyntaxTrackingState::Unnamed = self.expected_syntax_tracking_state.get() {
self.expected_syntax = Some(ExpectedSyntax::Unnamed(kind));
}
- self.peek() == Some(kind)
+ self.nth(n) == kind
}
- pub fn at_set(&mut self, set: SyntaxKindSet) -> bool {
- self.peek().map_or(false, |k| set.contains(k))
+ pub fn at_ts(&mut self, set: SyntaxKindSet) -> bool {
+ set.contains(self.current())
}
pub fn at_end(&mut self) -> bool {
- self.peek().is_none()
+ self.at(EOF)
}
}
pub(crate) struct ExpectedSyntaxGuard {
@@ -352,8 +410,8 @@
}}
}
-fn expr(p: &mut Parser) {
- expr_binding_power(p, 0);
+fn expr(p: &mut Parser) -> Option<CompletedMarker> {
+ expr_binding_power(p, 0)
}
fn expr_binding_power(p: &mut Parser, minimum_binding_power: u8) -> Option<CompletedMarker> {
let mut lhs = lhs(p)?;
@@ -392,7 +450,7 @@
p.bump();
}
- let m = lhs.precede(p);
+ let m = lhs.wrap(p, LHS_EXPR).precede(p);
let parsed_rhs = expr_binding_power(p, right_binding_power).is_some();
lhs = m.complete(
p,
@@ -414,11 +472,11 @@
if p.at(T![for]) {
let m = p.start();
p.bump();
- p.expect(IDENT);
+ name(p);
p.expect(T![in]);
expr(p);
m.complete(p, FOR_SPEC);
- } else if p.at(T![in]) {
+ } else if p.at(T![if]) {
let m = p.start();
p.bump();
expr(p);
@@ -439,7 +497,7 @@
if p.at(T![,]) {
p.bump();
true
- } else if p.at_set(set) {
+ } else if p.at_ts(set) {
p.expect_with_no_skip(T![,]);
p.bump();
true
@@ -449,18 +507,76 @@
}
fn field_name(p: &mut Parser) {
let _e = p.expected_syntax_name("field name");
+ let m = p.start();
if p.at(T!['[']) {
p.bump();
expr(p);
p.expect(T![']']);
+ m.complete(p, FIELD_NAME_DYNAMIC);
} else if p.at(IDENT) {
+ name(p);
+ m.complete(p, FIELD_NAME_FIXED);
+ } else if p.current().is_string() {
+ string(p);
+ m.complete(p, FIELD_NAME_FIXED);
+ } else {
+ p.error_with_recovery_set(TS![;]);
+ }
+}
+fn visibility(p: &mut Parser) {
+ if p.at_ts(TS![: :: :::]) {
p.bump()
} else {
- p.error_with_recovery_set(TS![;]);
+ p.error_with_recovery_set(TS![]);
}
}
+fn field(p: &mut Parser) {
+ let m = p.start();
+ field_name(p);
+ let plus = if p.at(T![+]) {
+ let r = p.start_ranger();
+ p.bump();
+ Some(r.finish(p))
+ } else {
+ None
+ };
+ let params = if p.at(T!['(']) {
+ if let Some(plus) = plus {
+ p.custom_error(plus, "can't extend with method");
+ }
+ params_desc(p);
+ if p.at(T![+]) {
+ let r = p.start_ranger();
+ p.bump();
+ p.custom_error(r.finish(p), "can't extend with method");
+ }
+ true
+ } else {
+ false
+ };
+ visibility(p);
+ expr(p);
+
+ if params {
+ m.complete(p, FIELD_METHOD)
+ } else {
+ m.complete(p, FIELD_NORMAL)
+ };
+}
+fn assertion(p: &mut Parser) {
+ assert!(p.at(T![assert]));
+ let m = p.start();
+ p.bump();
+ expr(p).map(|c| c.wrap(p, LHS_EXPR));
+ if p.at(T![:]) {
+ p.bump();
+ expr(p);
+ }
+ m.complete(p, ASSERTION);
+}
fn object(p: &mut Parser) -> CompletedMarker {
assert!(p.at(T!['{']));
+ let m_t = p.start();
let m = p.start();
p.bump();
@@ -470,13 +586,19 @@
break;
}
let m = p.start();
- field_name(p);
- p.expect(T![,]);
- expr(p);
- while p.at(T![for]) || p.at(T![if]) {
- compspec(p)
- }
- m.complete(p, MEMBER);
+ if p.at(T![local]) {
+ obj_local(p);
+ m.complete(p, MEMBER_BIND_STMT)
+ } else if p.at(T![assert]) {
+ assertion(p);
+ m.complete(p, MEMBER_ASSERT_STMT)
+ } else {
+ field(p);
+ while p.at(T![for]) || p.at(T![if]) {
+ compspec(p)
+ }
+ m.complete(p, MEMBER_FIELD)
+ };
if comma_with_alternatives(p, SyntaxKindSet::new(&[T![=]])) {
continue;
}
@@ -484,10 +606,19 @@
break;
}
- m.complete(p, OBJ_BODY)
+ m.complete(p, OBJ_BODY_MEMBER_LIST);
+ m_t.complete(p, EXPR_OBJECT)
+}
+fn param(p: &mut Parser) {
+ let m = p.start();
+ destruct(p);
+ if p.at(T![=]) {
+ p.bump();
+ expr(p);
+ }
+ m.complete(p, PARAM);
}
-
-fn params(p: &mut Parser) -> CompletedMarker {
+fn params_desc(p: &mut Parser) -> CompletedMarker {
assert!(p.at(T!['(']));
let m = p.start();
p.bump();
@@ -496,14 +627,8 @@
if p.at(T![')']) {
p.bump();
break;
- }
- let m = p.start();
- p.expect(IDENT);
- if p.at(T![=]) {
- p.bump();
- expr(p);
}
- m.complete(p, PARAM);
+ param(p);
if comma(p) {
continue;
}
@@ -513,48 +638,39 @@
m.complete(p, PARAMS_DESC)
}
-fn args(p: &mut Parser) {
+fn args_desc(p: &mut Parser) {
+ let m = p.start();
assert!(p.at(T!['(']));
p.bump();
- let mut error_positional_start = None::<Marker>;
- let mut started_named = Cell::new(false);
- let mut on_positional = |p: &mut Parser, m: Marker| {
- let c = m.complete(p, ARG);
- if started_named.get() && error_positional_start.is_none() {
- error_positional_start = Some(c.precede(p));
- }
- };
+ let started_named = Cell::new(false);
+
loop {
if p.at(T![')']) {
break;
}
let m = p.start();
- if p.at(IDENT) {
+ if p.at(IDENT) && p.nth_at(1, T![=]) {
+ name(p);
p.bump();
- if p.at(T![=]) {
- p.bump();
- expr(p);
- m.complete(p, ARG);
- started_named.set(true);
- } else {
- on_positional(p, m);
- }
+ expr(p);
+ m.complete(p, ARG);
+ started_named.set(true);
} else {
expr(p);
- on_positional(p, m);
+ m.complete(p, ARG);
}
if comma(p) {
continue;
}
break;
}
- if let Some(error_positional_start) = error_positional_start {
- let c = error_positional_start.complete(p, ERROR);
- p.custom_error(c, "positional arguments can't be placed after named")
+ p.expect(T![')']);
+ if p.at(T![tailstrict]) {
+ p.bump()
}
- p.expect(T![')']);
+ m.complete(p, ARGS_DESC);
}
fn array(p: &mut Parser) -> CompletedMarker {
@@ -605,7 +721,45 @@
m.complete(p, EXPR_ARRAY)
}
}
-
+/// Returns true if it was slice, false if just index
+#[must_use]
+fn slice_desc_or_index(p: &mut Parser) -> bool {
+ let m = p.start();
+ p.bump();
+ // TODO: do not treat :, ::, ::: as full tokens?
+ // Start
+ if !p.at(T![:]) && !p.at(T![::]) {
+ expr(p);
+ }
+ if p.at(T![:]) {
+ p.bump();
+ // End
+ if !p.at(T![']']) {
+ expr(p).map(|c| c.wrap(p, SLICE_DESC_END));
+ }
+ if p.at(T![:]) {
+ p.bump();
+ // Step
+ if !p.at(T![']']) {
+ expr(p).map(|c| c.wrap(p, SLICE_DESC_STEP));
+ }
+ }
+ } else if p.at(T![::]) {
+ p.bump();
+ // End
+ if !p.at(T![']']) {
+ expr(p).map(|c| c.wrap(p, SLICE_DESC_END));
+ }
+ } else {
+ // It was not a slice
+ p.expect(T![']']);
+ m.forget(p);
+ return false;
+ }
+ p.expect(T![']']);
+ m.complete(p, SLICE_DESC);
+ true
+}
fn lhs(p: &mut Parser) -> Option<CompletedMarker> {
let mut lhs = lhs_basic(p)?;
@@ -613,34 +767,20 @@
if p.at(T![.]) {
let m = lhs.precede(p);
p.bump();
- p.expect(IDENT);
+ name(p);
lhs = m.complete(p, EXPR_INDEX);
} else if p.at(T!['[']) {
- let m = lhs.precede(p);
- p.bump();
- // Start
- if !p.at(T![:]) {
- expr(p);
- }
- if p.at(T![:]) {
- p.bump();
- // End
- if !p.at(T![']']) && !p.at(T![:]) {
- expr(p);
- }
- if p.at(T![:]) {
- p.bump();
- // Step
- if !p.at(T![']']) {
- expr(p);
- }
- }
+ if slice_desc_or_index(p) {
+ lhs = lhs.precede(p).complete(p, EXPR_SLICE);
+ } else {
+ lhs = lhs
+ .wrap(p, LHS_EXPR)
+ .precede(p)
+ .complete(p, EXPR_INDEX_EXPR);
}
- p.expect(T![']']);
- lhs = m.complete(p, EXPR_SLICE);
} else if p.at(T!['(']) {
let m = lhs.precede(p);
- args(p);
+ args_desc(p);
lhs = m.complete(p, EXPR_APPLY);
} else {
break;
@@ -649,25 +789,199 @@
Some(lhs)
}
-
+fn name(p: &mut Parser) {
+ let m = p.start();
+ p.expect(IDENT);
+ m.complete(p, NAME);
+}
+fn destruct_rest(p: &mut Parser) {
+ assert!(p.at(T![...]));
+ p.bump();
+ let m = p.start();
+ if p.at(IDENT) {
+ p.bump()
+ }
+ m.complete(p, DESTRUCT_REST);
+}
+fn destruct_object_field(p: &mut Parser) {
+ let m = p.start();
+ name(p);
+ if p.at(T![:]) {
+ p.bump();
+ destruct(p);
+ };
+ if p.at(T![=]) {
+ p.bump();
+ expr(p);
+ }
+ m.complete(p, DESTRUCT_OBJECT_FIELD);
+}
+fn obj_local(p: &mut Parser) {
+ assert!(p.at(T![local]));
+ let m = p.start();
+ p.bump();
+ bind(p);
+ m.complete(p, OBJ_LOCAL);
+}
+fn destruct(p: &mut Parser) -> CompletedMarker {
+ let m = p.start();
+ if p.at(T![?]) {
+ p.bump();
+ m.complete(p, DESTRUCT_SKIP)
+ } else if p.at(T!['[']) {
+ p.bump();
+ let mut had_rest = false;
+ loop {
+ if p.at(T![']']) {
+ p.bump();
+ break;
+ } else if p.at(T![...]) {
+ let m_err = p.start_ranger();
+ destruct_rest(p);
+ if had_rest {
+ p.custom_error(m_err.finish(p), "only one rest can be present in array");
+ }
+ had_rest = true;
+ } else {
+ destruct(p);
+ }
+ if p.at(T![,]) {
+ p.bump();
+ continue;
+ }
+ p.expect(T![']']);
+ break;
+ }
+ m.complete(p, DESTRUCT_ARRAY)
+ } else if p.at(T!['{']) {
+ p.bump();
+ let mut had_rest = false;
+ loop {
+ if p.at(T!['}']) {
+ p.bump();
+ break;
+ } else if p.at(T![...]) {
+ let m_err = p.start_ranger();
+ destruct_rest(p);
+ if had_rest {
+ p.custom_error(m_err.finish(p), "only one rest can be present in object");
+ }
+ had_rest = true;
+ } else {
+ if had_rest {
+ p.error_with_recovery_set(TS![]);
+ }
+ destruct_object_field(p);
+ }
+ if p.at(T![,]) {
+ p.bump();
+ continue;
+ }
+ p.expect(T!['}']);
+ break;
+ }
+ m.complete(p, DESTRUCT_OBJECT)
+ } else if p.at(IDENT) {
+ name(p);
+ m.complete(p, DESTRUCT_FULL)
+ } else {
+ m.complete(p, ERROR)
+ }
+}
+fn bind(p: &mut Parser) {
+ let m = p.start();
+ if p.at(IDENT) && p.nth_at(1, T!['(']) {
+ name(p);
+ params_desc(p);
+ p.expect(T![=]);
+ expr(p);
+ m.complete(p, BIND_FUNCTION)
+ } else {
+ destruct(p);
+ p.expect(T![=]);
+ expr(p);
+ m.complete(p, BIND_DESTRUCT)
+ };
+}
+fn string(p: &mut Parser) {
+ assert!(p.current().is_string());
+ if p.at(STRING_BLOCK) {
+ // We use custom lexer, which skips enough bytes, but not returns error
+ // Instead we should call lexer again to verify if there is something wrong with string block
+ let mut lexer = logos::Lexer::<SyntaxKind>::new(dbg!(
+ &p.current_lexeme().expect("parser is at string block").text
+ ));
+ // In kinds, string blocks is parsed at least as `|||`
+ lexer.bump(3);
+ let res = lex_str_block(&mut lexer);
+ debug_assert!(lexer.next().is_none(), "str_block is lexed");
+ match res {
+ Ok(_) => {
+ p.bump();
+ }
+ Err(e) => p.bump_remap(match e {
+ StringBlockError::UnexpectedEnd => ERROR_STRING_BLOCK_UNEXPECTED_END,
+ StringBlockError::MissingNewLine => ERROR_STRING_BLOCK_MISSING_NEW_LINE,
+ StringBlockError::MissingTermination => ERROR_STRING_BLOCK_MISSING_TERMINATION,
+ StringBlockError::MissingIndent => ERROR_STRING_BLOCK_MISSING_INDENT,
+ }),
+ }
+ } else {
+ p.bump();
+ }
+}
+fn number(p: &mut Parser) {
+ assert!(p.current().is_number());
+ p.bump();
+}
+fn literal(p: &mut Parser) {
+ assert!(p.current().is_literal());
+ p.bump();
+}
fn lhs_basic(p: &mut Parser) -> Option<CompletedMarker> {
let _e = p.expected_syntax_name("value");
- Some(if p.peek().map(|l| l.is_literal()).unwrap_or(false) {
+ Some(if p.current().is_literal() {
let m = p.start();
- p.bump();
+ literal(p);
m.complete(p, EXPR_LITERAL)
- } else if p.peek().map(|l| l.is_string()).unwrap_or(false) {
+ } else if p.current().is_string() {
let m = p.start();
- p.bump();
+ string(p);
m.complete(p, EXPR_STRING)
- } else if p.peek().map(|l| l.is_number()).unwrap_or(false) {
+ } else if p.current().is_number() {
let m = p.start();
- p.bump();
+ number(p);
m.complete(p, EXPR_NUMBER)
} else if p.at(IDENT) {
let m = p.start();
- p.bump();
+ name(p);
m.complete(p, EXPR_VAR)
+ } else if p.at(INTRINSIC_THIS_FILE) {
+ let m = p.start();
+ p.bump();
+ m.complete(p, EXPR_INTRINSIC_THIS_FILE)
+ } else if p.at(INTRINSIC_ID) {
+ let m = p.start();
+ p.bump();
+ m.complete(p, EXPR_INTRINSIC_ID)
+ } else if p.at(INTRINSIC) {
+ let m = p.start();
+ p.bump();
+ p.expect(T!['(']);
+ name(p);
+ p.expect(T![')']);
+ m.complete(p, EXPR_INTRINSIC)
+ } else if p.at(T![if]) {
+ let m = p.start();
+ p.bump();
+ expr(p);
+ p.expect(T![then]);
+ expr(p).map(|c| c.wrap(p, TRUE_EXPR));
+ if p.at(T![else]) {
+ p.bump();
+ expr(p).map(|c| c.wrap(p, FALSE_EXPR));
+ }
+ m.complete(p, EXPR_IF_THEN_ELSE)
} else if p.at(T!['[']) {
array(p)
} else if p.at(T!['{']) {
@@ -675,35 +989,26 @@
} else if p.at(T![local]) {
let m = p.start();
p.bump();
- let mut sus_local = None;
loop {
- p.expect_with_recovery_set(IDENT, TS![= ; local]);
- if p.at(T!['(']) {
- params(p);
+ if p.at(T![;]) {
+ p.bump();
+ break;
}
-
- let sus_local_candidate = p.start_ranger();
- p.expect_with_recovery_set(T![=], TS![; local]);
+ bind(p);
- sus_local = p.at(T![local]).then(|| sus_local_candidate.finish(p));
- expr(p);
-
- if !comma(p) {
- break;
+ if p.at(T![,]) {
+ p.bump();
+ continue;
}
- }
- p.expect(T![;]);
- if let Some(sus_local) = sus_local {
- if sus_local.had_error_since(p) {
- p.custom_error(sus_local, "unusal local placement, missing ';' ?")
- }
+ p.expect(T![;]);
+ break;
}
expr(p);
- m.complete(p, T![local])
+ m.complete(p, EXPR_LOCAL)
} else if p.at(T![function]) {
let m = p.start();
p.bump();
- args(p);
+ params_desc(p);
expr(p);
m.complete(p, EXPR_FUNCTION)
} else if p.at(T![error]) {
@@ -713,20 +1018,17 @@
m.complete(p, EXPR_ERROR)
} else if p.at(T![assert]) {
let m = p.start();
- p.bump();
+ assertion(p);
+ p.expect(T![;]);
expr(p);
- if p.at(T![:]) {
- p.bump();
- 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();
- expr(p);
+ string(p);
m.complete(p, EXPR_IMPORT)
} else if p.at(T![-]) || p.at(T![!]) || p.at(T![~]) {
- let op = match p.peek().unwrap() {
+ let op = match p.current() {
T![-] => UnaryOperator::Minus,
T![!] => UnaryOperator::Not,
T![~] => UnaryOperator::BitNegate,
@@ -746,7 +1048,7 @@
p.bump();
m.complete(p, EXPR_PARENED)
} else {
- p.error_with_no_skip();
+ p.error_with_recovery_set(TS![]);
return None;
})
}
@@ -755,14 +1057,4 @@
pub fn syntax(&self) -> SyntaxNode {
SyntaxNode::new_root(self.green_node.clone())
}
-}
-
-pub fn parse(input: &str) -> Parse {
- let lexemes = lex(input);
- let parser = Parser::new(&lexemes);
- let events = parser.parse();
- dbg!(&events);
- let sink = Sink::new(events, &lexemes);
-
- sink.finish()
}
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp.snapdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp.snap
@@ -1,43 +1,34 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "[a for a in [1, 2, 3]]\n"
-
---
-Root@0..23
- Array@0..23
- SymbolLeftBracket@0..1 "["
- ArrayElem@1..21
- BodyDef@1..3
- Ident@1..3
- Ident@1..2 "a"
- Whitespace@2..3 " "
- CompspecFor@3..21
- KeywordFor@3..6 "for"
- Whitespace@6..7 " "
- Ident@7..8 "a"
- Whitespace@8..9 " "
- OpIn@9..11 "in"
- Whitespace@11..12 " "
- Array@12..21
- SymbolLeftBracket@12..13 "["
- ArrayElem@13..14
- BodyDef@13..14
- Literal@13..14
- Number@13..14 "1"
- SymbolComma@14..15 ","
- Whitespace@15..16 " "
- ArrayElem@16..17
- BodyDef@16..17
- Literal@16..17
- Number@16..17 "2"
- SymbolComma@17..18 ","
- Whitespace@18..19 " "
- ArrayElem@19..20
- BodyDef@19..20
- Literal@19..20
- Number@19..20 "3"
- SymbolRightBracket@20..21 "]"
- SymbolRightBracket@21..22 "]"
- Whitespace@22..23 "\n"
+SOURCE_FILE@0..22
+ 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 "]"
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp_incompatible_with_multiple_elems.snapdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp_incompatible_with_multiple_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp_incompatible_with_multiple_elems.snap
@@ -1,58 +1,48 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "[a for a in [1, 2, 3], b]\n"
-
---
-Root@0..26
- Array@0..26
- SymbolLeftBracket@0..1 "["
- ArrayElem@1..21
- BodyDef@1..3
- Ident@1..3
- Ident@1..2 "a"
- Whitespace@2..3 " "
- CompspecFor@3..21
- KeywordFor@3..6 "for"
- Whitespace@6..7 " "
- Ident@7..8 "a"
- Whitespace@8..9 " "
- OpIn@9..11 "in"
- Whitespace@11..12 " "
- Array@12..21
- SymbolLeftBracket@12..13 "["
- ArrayElem@13..14
- BodyDef@13..14
- Literal@13..14
- Number@13..14 "1"
- SymbolComma@14..15 ","
- Whitespace@15..16 " "
- ArrayElem@16..17
- BodyDef@16..17
- Literal@16..17
- Number@16..17 "2"
- SymbolComma@17..18 ","
- Whitespace@18..19 " "
- ArrayElem@19..20
- BodyDef@19..20
- Literal@19..20
- Number@19..20 "3"
- SymbolRightBracket@20..21 "]"
- SymbolComma@21..22 ","
- Whitespace@22..23 " "
- ArrayElem@23..24
- BodyDef@23..24
- Ident@23..24
- Ident@23..24 "b"
- SymbolRightBracket@24..25 "]"
- Whitespace@25..26 "\n"
+SOURCE_FILE@0..25
+ EXPR_ARRAY@0..25
+ 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 "]"
+ COMMA@21..22 ","
+ WHITESPACE@22..23 " "
+ EXPR_VAR@23..24
+ NAME@23..24
+ IDENT@23..24 "b"
+ R_BRACK@24..25 "]"
===
Custom { error: "compspec may only be used if there is only one array element", range: 3..21 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ [a for a in [1, 2, 3], b]
- · [38;2;246;87;248m ─────────┬────────[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mcompspec may only be used if there is only one array element[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | [a for a in [1, 2, 3], b]
+ : ^^^^^^^^^|^^^^^^^^
+ : `-- compspec may only be used if there is only one array element
+ `----
crates/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
@@ -1,18 +1,14 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: " "
-
---
-Root@0..1
- Whitespace@0..1 " "
+SOURCE_FILE@0..1
+ WHITESPACE@0..1 " "
===
Missing { expected: Named("value"), offset: 1 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │
- · [38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 |
+ `----
crates/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
@@ -1,34 +1,38 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "function(a, b = 1) a + b\n"
-
---
-Root@0..25
- FunctionDef@0..25
- KeywordFunction@0..8 "function"
- LParen@8..9 "("
- DefPositionalArg@9..10
- Ident@9..10 "a"
- SymbolComma@10..11 ","
- Whitespace@11..12 " "
- DefNamedArg@12..17
- Ident@12..13 "b"
- Whitespace@13..14 " "
- SymbolAssign@14..15 "="
- Whitespace@15..16 " "
- Literal@16..17
- Number@16..17 "1"
- RParen@17..18 ")"
- Whitespace@18..19 " "
- BodyDef@19..25
- BinOp@19..25
- Ident@19..21
- Ident@19..20 "a"
- Whitespace@20..21 " "
- OpPlus@21..22 "+"
- Whitespace@22..23 " "
- Ident@23..25
- Ident@23..24 "b"
- Whitespace@24..25 "\n"
+SOURCE_FILE@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_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"
crates/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
@@ -1,29 +1,30 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "function(a, b)\n"
-
---
-Root@0..15
- FunctionDef@0..15
- KeywordFunction@0..8 "function"
- LParen@8..9 "("
- DefPositionalArg@9..10
- Ident@9..10 "a"
- SymbolComma@10..11 ","
- Whitespace@11..12 " "
- DefPositionalArg@12..13
- Ident@12..13 "b"
- RParen@13..14 ")"
- Whitespace@14..15 "\n"
- BodyDef@15..15
+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"
+ R_PAREN@13..14 ")"
===
Missing { expected: Named("value"), offset: 14 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ function(a, b)
- · [38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | function(a, b)
+ : ^
+ : `-- missing value
+ `----
crates/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
@@ -1,41 +1,39 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "function(a, b = ) a + b\n"
-
---
-Root@0..24
- FunctionDef@0..24
- KeywordFunction@0..8 "function"
- LParen@8..9 "("
- DefPositionalArg@9..10
- Ident@9..10 "a"
- SymbolComma@10..11 ","
- Whitespace@11..12 " "
- DefNamedArg@12..16
- Ident@12..13 "b"
- Whitespace@13..14 " "
- SymbolAssign@14..15 "="
- Whitespace@15..16 " "
- RParen@16..17 ")"
- Whitespace@17..18 " "
- BodyDef@18..24
- BinOp@18..24
- Ident@18..20
- Ident@18..19 "a"
- Whitespace@19..20 " "
- OpPlus@20..21 "+"
- Whitespace@21..22 " "
- Ident@22..24
- Ident@22..23 "b"
- Whitespace@23..24 "\n"
+SOURCE_FILE@0..24
+ EXPR_FUNCTION@0..24
+ FUNCTION_KW@0..8 "function"
+ PARAMS_DESC@8..18
+ L_PAREN@8..9 "("
+ PARAM@9..10
+ IDENT@9..10 "a"
+ COMMA@10..11 ","
+ WHITESPACE@11..12 " "
+ PARAM@12..16
+ IDENT@12..13 "b"
+ WHITESPACE@13..14 " "
+ ASSIGN@14..15 "="
+ WHITESPACE@15..16 " "
+ R_PAREN@16..17 ")"
+ WHITESPACE@17..18 " "
+ EXPR_BINARY@18..24
+ EXPR_VAR@18..20
+ IDENT@18..19 "a"
+ WHITESPACE@19..20 " "
+ PLUS@20..21 "+"
+ WHITESPACE@21..22 " "
+ EXPR_VAR@22..24
+ IDENT@22..23 "b"
+ WHITESPACE@23..24 "\n"
===
Missing { expected: Named("value"), offset: 15 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ function(a, b = ) a + b
- · [38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | function(a, b = ) a + b
+ : ^
+ : `-- missing value
+ `----
crates/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
@@ -1,30 +1,31 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "function(a, b\n"
-
---
-Root@0..14
- FunctionDef@0..14
- KeywordFunction@0..8 "function"
- LParen@8..9 "("
- DefPositionalArg@9..10
- Ident@9..10 "a"
- SymbolComma@10..11 ","
- Whitespace@11..12 " "
- DefPositionalArg@12..14
- Ident@12..13 "b"
- Whitespace@13..14 "\n"
- BodyDef@14..14
+SOURCE_FILE@0..13
+ EXPR_FUNCTION@0..13
+ FUNCTION_KW@0..8 "function"
+ PARAMS_DESC@8..13
+ 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"
===
-Missing { expected: Unnamed(RParen), offset: 13 }
+Missing { expected: Unnamed(R_PAREN), offset: 13 }
Missing { expected: Named("value"), offset: 13 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ function(a, b
- · [38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212mmissing value[0m[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing RParen[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | function(a, b
+ : ^
+ : |`-- missing value
+ : `-- missing R_PAREN
+ `----
crates/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
@@ -1,47 +1,39 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "local a =\nlocal b = 3;\n1\n"
-
---
-Root@0..25
- Local@0..25
- KeywordLocal@0..5 "local"
- Whitespace@5..6 " "
- Ident@6..7 "a"
- Whitespace@7..8 " "
- SymbolAssign@8..9 "="
- Whitespace@9..10 "\n"
- Local@10..25
- KeywordLocal@10..15 "local"
- Whitespace@15..16 " "
- Ident@16..17 "b"
- Whitespace@17..18 " "
- SymbolAssign@18..19 "="
- Whitespace@19..20 " "
- Literal@20..21
- Number@20..21 "3"
- SymbolSemi@21..22 ";"
- Whitespace@22..23 "\n"
- BodyDef@23..25
- Literal@23..25
- Number@23..24 "1"
- Whitespace@24..25 "\n"
- BodyDef@25..25
+SOURCE_FILE@0..25
+ LOCAL_KW@0..25
+ LOCAL_KW@0..5 "local"
+ WHITESPACE@5..6 " "
+ IDENT@6..7 "a"
+ WHITESPACE@7..8 " "
+ ASSIGN@8..9 "="
+ WHITESPACE@9..10 "\n"
+ LOCAL_KW@10..25
+ LOCAL_KW@10..15 "local"
+ WHITESPACE@15..16 " "
+ IDENT@16..17 "b"
+ WHITESPACE@17..18 " "
+ ASSIGN@18..19 "="
+ WHITESPACE@19..20 " "
+ EXPR_NUMBER@20..21
+ NUMBER@20..21 "3"
+ SEMI@21..22 ";"
+ WHITESPACE@22..23 "\n"
+ EXPR_NUMBER@23..25
+ NUMBER@23..24 "1"
+ WHITESPACE@24..25 "\n"
===
-Missing { expected: Unnamed(SymbolSemi), offset: 24 }
-Custom { error: "unusal local placement, missing ';' ?", range: 8..9 }
+Missing { expected: Unnamed(SEMI), offset: 24 }
Missing { expected: Named("value"), offset: 24 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭─[1:1]
- [2m1[0m │ local a =
- · [38;2;246;87;248m ┬[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248munusal local placement, missing ';' ?[0m[0m
- [2m2[0m │ local b = 3;
- [2m3[0m │ 1
- · [38;2;30;201;212m ▲[0m
- · [38;2;30;201;212m│[0m[38;2;145;246;111m╰── [38;2;145;246;111mmissing value[0m[0m
- · [38;2;30;201;212m╰── [38;2;30;201;212mmissing SymbolSemi[0m[0m
- ╰────
+ x syntax error
+ ,-[2:1]
+ 2 | local b = 3;
+ 3 | 1
+ : ^
+ : |`-- missing value
+ : `-- missing SEMI
+ `----
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap.newdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap.new
+++ /dev/null
@@ -1,43 +0,0 @@
----
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
-expression: "local a =\nlocal b = 3;\n1\n"
-
----
-Root@0..25
- Local@0..25
- KeywordLocal@0..5 "local"
- Whitespace@5..6 " "
- Ident@6..7 "a"
- Whitespace@7..8 " "
- SymbolAssign@8..9 "="
- Whitespace@9..10 "\n"
- Local@10..25
- KeywordLocal@10..15 "local"
- Whitespace@15..16 " "
- Ident@16..17 "b"
- Whitespace@17..18 " "
- SymbolAssign@18..19 "="
- Whitespace@19..20 " "
- Literal@20..21
- Number@20..21 "3"
- SymbolSemi@21..22 ";"
- Whitespace@22..23 "\n"
- BodyDef@23..25
- Literal@23..25
- Number@23..24 "1"
- Whitespace@24..25 "\n"
- BodyDef@25..25
-===
-Missing { expected: Unnamed(SymbolSemi), offset: 24 }
-Missing { expected: Named("value"), offset: 24 }
-===
- [38;2;255;30;30m×[0m syntax error
- ╭─[2:1]
- [2m2[0m │ local b = 3;
- [2m3[0m │ 1
- · [38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212mmissing value[0m[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing SymbolSemi[0m[0m
- ╰────
-
crates/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
@@ -1,29 +1,26 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "local a =\n"
-
---
-Root@0..10
- Local@0..10
- KeywordLocal@0..5 "local"
- Whitespace@5..6 " "
- Ident@6..7 "a"
- Whitespace@7..8 " "
- SymbolAssign@8..9 "="
- Whitespace@9..10 "\n"
- BodyDef@10..10
+SOURCE_FILE@0..10
+ LOCAL_KW@0..10
+ LOCAL_KW@0..5 "local"
+ WHITESPACE@5..6 " "
+ IDENT@6..7 "a"
+ WHITESPACE@7..8 " "
+ ASSIGN@8..9 "="
+ WHITESPACE@9..10 "\n"
===
Missing { expected: Named("value"), offset: 9 }
-Missing { expected: Unnamed(SymbolSemi), offset: 9 }
+Missing { expected: Unnamed(SEMI), offset: 9 }
Missing { expected: Named("value"), offset: 9 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ local a =
- · [38;2;246;87;248m ▲[0m
- · [38;2;145;246;111m╰── [38;2;145;246;111mmissing value[0m[0m
- · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212mmissing SymbolSemi[0m[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | local a =
+ : ^
+ : `-- missing value
+ : |`-- missing SEMI
+ : `-- missing value
+ `----
crates/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
@@ -1,63 +1,61 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "a(1, 2, b=4, 3, 5, k = 12, 6)\n"
-
---
-Root@0..30
- FunctionCall@0..30
- Ident@0..1
- Ident@0..1 "a"
- LParen@1..2 "("
- DefPositionalArg@2..3
- Literal@2..3
- Number@2..3 "1"
- SymbolComma@3..4 ","
- Whitespace@4..5 " "
- DefPositionalArg@5..6
- Literal@5..6
- Number@5..6 "2"
- SymbolComma@6..7 ","
- Whitespace@7..8 " "
- DefNamedArg@8..11
- Ident@8..9 "b"
- SymbolAssign@9..10 "="
- Literal@10..11
- Number@10..11 "4"
- SymbolComma@11..12 ","
- Whitespace@12..13 " "
- ErrorPositionalAfterNamed@13..28
- DefPositionalArg@13..14
- Literal@13..14
- Number@13..14 "3"
- SymbolComma@14..15 ","
- Whitespace@15..16 " "
- DefPositionalArg@16..17
- Literal@16..17
- Number@16..17 "5"
- SymbolComma@17..18 ","
- Whitespace@18..19 " "
- DefNamedArg@19..25
- Ident@19..20 "k"
- Whitespace@20..21 " "
- SymbolAssign@21..22 "="
- Whitespace@22..23 " "
- Literal@23..25
- Number@23..25 "12"
- SymbolComma@25..26 ","
- Whitespace@26..27 " "
- DefPositionalArg@27..28
- Literal@27..28
- Number@27..28 "6"
- RParen@28..29 ")"
- Whitespace@29..30 "\n"
+SOURCE_FILE@0..30
+ EXPR_APPLY@0..30
+ EXPR_VAR@0..1
+ IDENT@0..1 "a"
+ L_PAREN@1..2 "("
+ ARG@2..3
+ EXPR_NUMBER@2..3
+ NUMBER@2..3 "1"
+ COMMA@3..4 ","
+ WHITESPACE@4..5 " "
+ ARG@5..6
+ EXPR_NUMBER@5..6
+ NUMBER@5..6 "2"
+ COMMA@6..7 ","
+ WHITESPACE@7..8 " "
+ ARG@8..11
+ IDENT@8..9 "b"
+ ASSIGN@9..10 "="
+ EXPR_NUMBER@10..11
+ NUMBER@10..11 "4"
+ COMMA@11..12 ","
+ WHITESPACE@12..13 " "
+ ERROR@13..28
+ ARG@13..14
+ EXPR_NUMBER@13..14
+ NUMBER@13..14 "3"
+ COMMA@14..15 ","
+ WHITESPACE@15..16 " "
+ ARG@16..17
+ EXPR_NUMBER@16..17
+ NUMBER@16..17 "5"
+ COMMA@17..18 ","
+ WHITESPACE@18..19 " "
+ ARG@19..25
+ IDENT@19..20 "k"
+ WHITESPACE@20..21 " "
+ ASSIGN@21..22 "="
+ WHITESPACE@22..23 " "
+ EXPR_NUMBER@23..25
+ NUMBER@23..25 "12"
+ COMMA@25..26 ","
+ WHITESPACE@26..27 " "
+ ARG@27..28
+ EXPR_NUMBER@27..28
+ NUMBER@27..28 "6"
+ R_PAREN@28..29 ")"
+ WHITESPACE@29..30 "\n"
===
Custom { error: "positional arguments can't be placed after named", range: 13..28 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ a(1, 2, b=4, 3, 5, k = 12, 6)
- · [38;2;246;87;248m ───────┬───────[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mpositional arguments can't be placed after named[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | a(1, 2, b=4, 3, 5, k = 12, 6)
+ : ^^^^^^^|^^^^^^^
+ : `-- positional arguments can't be placed after named
+ `----
crates/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
@@ -1,23 +1,19 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "+ 2\n"
-
---
-Root@0..4
- OpPlus@0..1 "+"
- Whitespace@1..2 " "
- Number@2..3 "2"
- Whitespace@3..4 "\n"
+SOURCE_FILE@0..2
+ PLUS@0..1 "+"
+ WHITESPACE@1..2 " "
===
Missing { expected: Named("value"), offset: 0 }
-Custom { error: "unexpected input after expression", range: 0..3 }
+Custom { error: "unexpected input after expression", range: 0..1 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ + 2
- · [38;2;246;87;248m▲[0m[38;2;30;201;212m─┬─[0m
- · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212munexpected input after expression[0m[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | + 2
+ : ^
+ : |`-- unexpected input after expression
+ : `-- missing value
+ `----
crates/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
@@ -1,22 +1,20 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "2 2\n"
-
---
-Root@0..4
- Literal@0..2
- Number@0..1 "2"
- Whitespace@1..2 " "
- Number@2..3 "2"
- Whitespace@3..4 "\n"
+SOURCE_FILE@0..3
+ EXPR_NUMBER@0..1
+ FLOAT@0..1 "2"
+ WHITESPACE@1..2 " "
+ ERROR@2..3
+ FLOAT@2..3 "2"
===
-Custom { error: "unexpected input after expression", range: 2..3 }
+Unexpected { expected: Unnamed(EOF), found: FLOAT, range: 2..3 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ 2 2
- · [38;2;246;87;248m ┬[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248munexpected input after expression[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | 2 2
+ : |
+ : `-- expected EOF, found FLOAT
+ `----
crates/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
@@ -1,23 +1,22 @@
---
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
+source: crates/jrsonnet-rowan-parser/src/tests.rs
expression: "a +\n"
-
---
-Root@0..4
- BinOp@0..4
- Ident@0..2
- Ident@0..1 "a"
- Whitespace@1..2 " "
- OpPlus@2..3 "+"
- Whitespace@3..4 "\n"
+SOURCE_FILE@0..3
+ EXPR_BINARY@0..3
+ LHS_EXPR@0..1
+ EXPR_VAR@0..1
+ NAME@0..1
+ IDENT@0..1 "a"
+ WHITESPACE@1..2 " "
+ PLUS@2..3 "+"
===
Missing { expected: Named("value"), offset: 3 }
===
- [38;2;255;30;30m×[0m syntax error
- ╭────
- [2m1[0m │ a +
- · [38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m
- ╰────
+ x syntax error
+ ,----
+ 1 | a +
+ : ^
+ : `-- missing value
+ `----
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snap
@@ -0,0 +1,52 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "std.substr(a, 0, std.length(b)) == b\n"
+---
+SOURCE_FILE@0..36
+ 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"
+ ARGS_DESC@10..31
+ L_PAREN@10..11 "("
+ ARG@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"
+ 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"
+ 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 ")"
+ R_PAREN@30..31 ")"
+ WHITESPACE@31..32 " "
+ EQ@32..34 "=="
+ WHITESPACE@34..35 " "
+ EXPR_VAR@35..36
+ NAME@35..36
+ IDENT@35..36 "b"
+
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snapdiffbeforeafterboth1---2source: crates/jrsonnet-rowan-parser/src/tests.rs3expression: "{\n local std = self,\n local id = std.id,\n\n # Magic legacy field\n thisFile:: $intrinsicThisFile,\n id:: $intrinsicId,\n\n # Those functions aren't normally located in stdlib\n length:: $intrinsic(length),\n type:: $intrinsic(type),\n makeArray:: $intrinsic(makeArray),\n codepoint:: $intrinsic(codepoint),\n objectFieldsEx:: $intrinsic(objectFieldsEx),\n objectHasEx:: $intrinsic(objectHasEx),\n primitiveEquals:: $intrinsic(primitiveEquals),\n modulo:: $intrinsic(modulo),\n floor:: $intrinsic(floor),\n ceil:: $intrinsic(ceil),\n extVar:: $intrinsic(extVar),\n native:: $intrinsic(native),\n filter:: $intrinsic(filter),\n char:: $intrinsic(char),\n encodeUTF8:: $intrinsic(encodeUTF8),\n decodeUTF8:: $intrinsic(decodeUTF8),\n md5:: $intrinsic(md5),\n trace:: $intrinsic(trace),\n parseJson:: $intrinsic(parseJson),\n parseYaml:: $intrinsic(parseYaml),\n\n log:: $intrinsic(log),\n pow:: $intrinsic(pow),\n sqrt:: $intrinsic(sqrt),\n\n sin:: $intrinsic(sin),\n cos:: $intrinsic(cos),\n tan:: $intrinsic(tan),\n asin:: $intrinsic(asin),\n acos:: $intrinsic(acos),\n atan:: $intrinsic(atan),\n\n exp:: $intrinsic(exp),\n mantissa:: $intrinsic(mantissa),\n exponent:: $intrinsic(exponent),\n\n any:: $intrinsic(any),\n all:: $intrinsic(all),\n\n isString(v):: std.type(v) == 'string',\n isNumber(v):: std.type(v) == 'number',\n isBoolean(v):: std.type(v) == 'boolean',\n isObject(v):: std.type(v) == 'object',\n isArray(v):: std.type(v) == 'array',\n isFunction(v):: std.type(v) == 'function',\n\n toString(a)::\n if std.type(a) == 'string' then a else '' + a,\n\n substr:: $intrinsic(substr),\n\n startsWith(a, b)::\n if std.length(a) < std.length(b) then\n false\n else\n std.substr(a, 0, std.length(b)) == b,\n\n endsWith(a, b)::\n if std.length(a) < std.length(b) then\n false\n else\n std.substr(a, std.length(a) - std.length(b), std.length(b)) == b,\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 local parse_nat(str, base) =\n assert base > 0 && base <= 16 : 'integer base %d invalid' % base;\n // These codepoints are in ascending order:\n local zero_code = std.codepoint('0');\n local upper_a_code = std.codepoint('A');\n local lower_a_code = std.codepoint('a');\n local addDigit(aggregate, char) =\n local code = std.codepoint(char);\n local digit = if code >= lower_a_code then\n code - lower_a_code + 10\n else if code >= upper_a_code then\n code - upper_a_code + 10\n else\n code - zero_code;\n assert digit >= 0 && digit < base : '%s is not a base %d integer' % [str, base];\n base * aggregate + digit;\n std.foldl(addDigit, std.stringChars(str), 0),\n\n parseInt(str)::\n assert std.isString(str) : 'Expected string, got ' + std.type(str);\n assert std.length(str) > 0 && str != '-' : 'Not an integer: \"%s\"' % [str];\n if str[0] == '-' then\n -parse_nat(str[1:], 10)\n else\n parse_nat(str, 10),\n\n parseOctal(str)::\n assert std.isString(str) : 'Expected string, got ' + std.type(str);\n assert std.length(str) > 0 : 'Not an octal number: \"\"';\n parse_nat(str, 8),\n\n parseHex(str)::\n assert std.isString(str) : 'Expected string, got ' + std.type(str);\n assert std.length(str) > 0 : 'Not hexadecimal: \"\"';\n parse_nat(str, 16),\n\n split(str, c):: std.splitLimit(str, c, -1),\n\n splitLimit:: $intrinsic(splitLimit),\n\n strReplace:: $intrinsic(strReplace),\n\n asciiUpper:: $intrinsic(asciiUpper),\n\n asciiLower:: $intrinsic(asciiLower),\n\n range:: $intrinsic(range),\n\n repeat(what, count)::\n local joiner =\n if std.isString(what) then ''\n else if std.isArray(what) then []\n else error 'std.repeat first argument must be an array or a string';\n std.join(joiner, std.makeArray(count, function(i) what)),\n\n slice:: $intrinsic(slice),\n\n member:: $intrinsic(member),\n\n count:: $intrinsic(count),\n\n mod:: $intrinsic(mod),\n\n map:: $intrinsic(map),\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 flatMap:: $intrinsic(flatMap),\n\n join:: $intrinsic(join),\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\n format:: $intrinsic(format),\n\n foldr:: $intrinsic(foldr),\n\n foldl:: $intrinsic(foldl),\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 abs(n)::\n if !std.isNumber(n) then\n error 'std.abs expected number, got ' + std.type(n)\n else\n if n > 0 then n else -n,\n\n sign(n)::\n if !std.isNumber(n) then\n error 'std.sign expected number, got ' + std.type(n)\n else\n if n > 0 then\n 1\n else if n < 0 then\n -1\n else 0,\n\n max(a, b)::\n if !std.isNumber(a) then\n error 'std.max first param expected number, got ' + std.type(a)\n else if !std.isNumber(b) then\n error 'std.max second param expected number, got ' + std.type(b)\n else\n if a > b then a else b,\n\n min(a, b)::\n if !std.isNumber(a) then\n error 'std.min first param expected number, got ' + std.type(a)\n else if !std.isNumber(b) then\n error 'std.min second param expected number, got ' + std.type(b)\n else\n if a < b then a else 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 manifestTomlEx(value, indent)::\n local\n escapeStringToml = std.escapeStringJson,\n escapeKeyToml(key) =\n local bare_allowed = std.set(std.stringChars('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'));\n if std.setUnion(std.set(std.stringChars(key)), bare_allowed) == bare_allowed then key else escapeStringToml(key),\n isTableArray(v) = std.isArray(v) && std.length(v) > 0 && std.foldl(function(a, b) a && std.isObject(b), v, true),\n isSection(v) = std.isObject(v) || isTableArray(v),\n renderValue(v, indexedPath, inline, cindent) =\n if v == true then\n 'true'\n else if v == false then\n 'false'\n else if v == null then\n error 'Tried to manifest \"null\" at ' + indexedPath\n else if std.isNumber(v) then\n '' + v\n else if std.isString(v) then\n escapeStringToml(v)\n else if std.isFunction(v) then\n error 'Tried to manifest function at ' + indexedPath\n else if std.isArray(v) then\n if std.length(v) == 0 then\n '[]'\n else\n local range = std.range(0, std.length(v) - 1);\n local new_indent = if inline then '' else cindent + indent;\n local separator = if inline then ' ' else '\\n';\n local lines = ['[' + separator]\n + std.join([',' + separator],\n [\n [new_indent + renderValue(v[i], indexedPath + [i], true, '')]\n for i in range\n ])\n + [separator + (if inline then '' else cindent) + ']'];\n std.join('', lines)\n else if std.isObject(v) then\n local lines = ['{ ']\n + std.join([', '],\n [\n [escapeKeyToml(k) + ' = ' + renderValue(v[k], indexedPath + [k], true, '')]\n for k in std.objectFields(v)\n ])\n + [' }'];\n std.join('', lines),\n renderTableInternal(v, path, indexedPath, cindent) =\n local kvp = std.flattenArrays([\n [cindent + escapeKeyToml(k) + ' = ' + renderValue(v[k], indexedPath + [k], false, cindent)]\n for k in std.objectFields(v)\n if !isSection(v[k])\n ]);\n local sections = [std.join('\\n', kvp)] + [\n (\n if std.isObject(v[k]) then\n renderTable(v[k], path + [k], indexedPath + [k], cindent)\n else\n renderTableArray(v[k], path + [k], indexedPath + [k], cindent)\n )\n for k in std.objectFields(v)\n if isSection(v[k])\n ];\n std.join('\\n\\n', sections),\n renderTable(v, path, indexedPath, cindent) =\n cindent + '[' + std.join('.', std.map(escapeKeyToml, path)) + ']'\n + (if v == {} then '' else '\\n')\n + renderTableInternal(v, path, indexedPath, cindent + indent),\n renderTableArray(v, path, indexedPath, cindent) =\n local range = std.range(0, std.length(v) - 1);\n local sections = [\n (cindent + '[[' + std.join('.', std.map(escapeKeyToml, path)) + ']]'\n + (if v[i] == {} then '' else '\\n')\n + renderTableInternal(v[i], path, indexedPath + [i], cindent + indent))\n for i in range\n ];\n std.join('\\n\\n', sections);\n if std.isObject(value) then\n renderTableInternal(value, [], [], '')\n else\n error 'TOML body must be an object. Got ' + std.type(value),\n\n escapeStringJson:: $intrinsic(escapeStringJson),\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 manifestJson(value):: std.manifestJsonEx(value, ' ') tailstrict,\n\n manifestJsonMinified(value):: std.manifestJsonEx(value, '', '', ':'),\n\n manifestJsonEx:: $intrinsic(manifestJsonEx),\n\n manifestYamlDoc:: $intrinsic(manifestYamlDoc),\n\n manifestYamlStream(value, indent_array_in_object=false, c_document_end=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) for e in value]\n ) + if c_document_end then '\\n...\\n' else '\\n',\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 local base64_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n local base64_inv = { [base64_table[i]]: i for i in std.range(0, 63) },\n\n base64:: $intrinsic(base64),\n\n base64DecodeBytes:: $intrinsic(base64DecodeBytes),\n\n base64Decode:: $intrinsic(base64Decode),\n\n reverse:: $intrinsic(reverse),\n\n sort:: $intrinsic(sort),\n\n uniq(arr, keyF=id)::\n local f(a, b) =\n if std.length(a) == 0 then\n [b]\n else if keyF(a[std.length(a) - 1]) == keyF(b) then\n a\n else\n a + [b];\n std.foldl(f, arr, []),\n\n set(arr, keyF=id)::\n std.uniq(std.sort(arr, keyF), keyF),\n\n setMember(x, arr, keyF=id)::\n // TODO(dcunnin): Binary chop for O(log n) complexity\n std.length(std.setInter([x], arr, keyF)) > 0,\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 setInter(a, b, keyF=id)::\n local aux(a, b, i, j, acc) =\n if i >= std.length(a) || j >= std.length(b) then\n acc\n else\n if keyF(a[i]) == keyF(b[j]) then\n aux(a, b, i + 1, j + 1, acc + [a[i]]) tailstrict\n else if keyF(a[i]) < keyF(b[j]) then\n aux(a, b, i + 1, j, acc) tailstrict\n else\n aux(a, b, i, j + 1, acc) tailstrict;\n aux(a, b, 0, 0, []) tailstrict,\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 equals:: $intrinsic(equals),\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 findSubstr(pat, str)::\n if !std.isString(pat) then\n error 'findSubstr first parameter should be a string, got ' + std.type(pat)\n else if !std.isString(str) then\n error 'findSubstr second parameter should be a string, got ' + std.type(str)\n else\n local pat_len = std.length(pat);\n local str_len = std.length(str);\n if pat_len == 0 || str_len == 0 || pat_len > str_len then\n []\n else\n std.filter(function(i) str[i:i + pat_len] == pat, std.range(0, str_len - pat_len)),\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"4---5SOURCE_FILE@0..189786 EXPR_OBJECT@0..189787 OBJ_BODY_MEMBER_LIST@0..189788 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 SINGLE_LINE_HASH_COMMENT@46..67 "# Magic legacy field\n"46 WHITESPACE@67..69 " "47 MEMBER_FIELD@69..9848 FIELD_NORMAL@69..9849 FIELD_NAME_FIXED@69..7750 NAME@69..7751 IDENT@69..77 "thisFile"52 COLONCOLON@77..79 "::"53 WHITESPACE@79..80 " "54 EXPR_INTRINSIC_THIS_FILE@80..9855 INTRINSIC_THIS_FILE@80..98 "$intrinsicThisFile"56 COMMA@98..99 ","57 WHITESPACE@99..102 "\n "58 MEMBER_FIELD@102..11959 FIELD_NORMAL@102..11960 FIELD_NAME_FIXED@102..10461 NAME@102..10462 IDENT@102..104 "id"63 COLONCOLON@104..106 "::"64 WHITESPACE@106..107 " "65 EXPR_INTRINSIC_ID@107..11966 INTRINSIC_ID@107..119 "$intrinsicId"67 COMMA@119..120 ","68 WHITESPACE@120..124 "\n\n "69 SINGLE_LINE_HASH_COMMENT@124..176 "# Those functions are ..."70 WHITESPACE@176..178 " "71 MEMBER_FIELD@178..20572 FIELD_NORMAL@178..20573 FIELD_NAME_FIXED@178..18474 NAME@178..18475 IDENT@178..184 "length"76 COLONCOLON@184..186 "::"77 WHITESPACE@186..187 " "78 EXPR_INTRINSIC@187..20579 INTRINSIC@187..197 "$intrinsic"80 L_PAREN@197..198 "("81 NAME@198..20482 IDENT@198..204 "length"83 R_PAREN@204..205 ")"84 COMMA@205..206 ","85 WHITESPACE@206..209 "\n "86 MEMBER_FIELD@209..23287 FIELD_NORMAL@209..23288 FIELD_NAME_FIXED@209..21389 NAME@209..21390 IDENT@209..213 "type"91 COLONCOLON@213..215 "::"92 WHITESPACE@215..216 " "93 EXPR_INTRINSIC@216..23294 INTRINSIC@216..226 "$intrinsic"95 L_PAREN@226..227 "("96 NAME@227..23197 IDENT@227..231 "type"98 R_PAREN@231..232 ")"99 COMMA@232..233 ","100 WHITESPACE@233..236 "\n "101 MEMBER_FIELD@236..269102 FIELD_NORMAL@236..269103 FIELD_NAME_FIXED@236..245104 NAME@236..245105 IDENT@236..245 "makeArray"106 COLONCOLON@245..247 "::"107 WHITESPACE@247..248 " "108 EXPR_INTRINSIC@248..269109 INTRINSIC@248..258 "$intrinsic"110 L_PAREN@258..259 "("111 NAME@259..268112 IDENT@259..268 "makeArray"113 R_PAREN@268..269 ")"114 COMMA@269..270 ","115 WHITESPACE@270..273 "\n "116 MEMBER_FIELD@273..306117 FIELD_NORMAL@273..306118 FIELD_NAME_FIXED@273..282119 NAME@273..282120 IDENT@273..282 "codepoint"121 COLONCOLON@282..284 "::"122 WHITESPACE@284..285 " "123 EXPR_INTRINSIC@285..306124 INTRINSIC@285..295 "$intrinsic"125 L_PAREN@295..296 "("126 NAME@296..305127 IDENT@296..305 "codepoint"128 R_PAREN@305..306 ")"129 COMMA@306..307 ","130 WHITESPACE@307..310 "\n "131 MEMBER_FIELD@310..353132 FIELD_NORMAL@310..353133 FIELD_NAME_FIXED@310..324134 NAME@310..324135 IDENT@310..324 "objectFieldsEx"136 COLONCOLON@324..326 "::"137 WHITESPACE@326..327 " "138 EXPR_INTRINSIC@327..353139 INTRINSIC@327..337 "$intrinsic"140 L_PAREN@337..338 "("141 NAME@338..352142 IDENT@338..352 "objectFieldsEx"143 R_PAREN@352..353 ")"144 COMMA@353..354 ","145 WHITESPACE@354..357 "\n "146 MEMBER_FIELD@357..394147 FIELD_NORMAL@357..394148 FIELD_NAME_FIXED@357..368149 NAME@357..368150 IDENT@357..368 "objectHasEx"151 COLONCOLON@368..370 "::"152 WHITESPACE@370..371 " "153 EXPR_INTRINSIC@371..394154 INTRINSIC@371..381 "$intrinsic"155 L_PAREN@381..382 "("156 NAME@382..393157 IDENT@382..393 "objectHasEx"158 R_PAREN@393..394 ")"159 COMMA@394..395 ","160 WHITESPACE@395..398 "\n "161 MEMBER_FIELD@398..443162 FIELD_NORMAL@398..443163 FIELD_NAME_FIXED@398..413164 NAME@398..413165 IDENT@398..413 "primitiveEquals"166 COLONCOLON@413..415 "::"167 WHITESPACE@415..416 " "168 EXPR_INTRINSIC@416..443169 INTRINSIC@416..426 "$intrinsic"170 L_PAREN@426..427 "("171 NAME@427..442172 IDENT@427..442 "primitiveEquals"173 R_PAREN@442..443 ")"174 COMMA@443..444 ","175 WHITESPACE@444..447 "\n "176 MEMBER_FIELD@447..474177 FIELD_NORMAL@447..474178 FIELD_NAME_FIXED@447..453179 NAME@447..453180 IDENT@447..453 "modulo"181 COLONCOLON@453..455 "::"182 WHITESPACE@455..456 " "183 EXPR_INTRINSIC@456..474184 INTRINSIC@456..466 "$intrinsic"185 L_PAREN@466..467 "("186 NAME@467..473187 IDENT@467..473 "modulo"188 R_PAREN@473..474 ")"189 COMMA@474..475 ","190 WHITESPACE@475..478 "\n "191 MEMBER_FIELD@478..503192 FIELD_NORMAL@478..503193 FIELD_NAME_FIXED@478..483194 NAME@478..483195 IDENT@478..483 "floor"196 COLONCOLON@483..485 "::"197 WHITESPACE@485..486 " "198 EXPR_INTRINSIC@486..503199 INTRINSIC@486..496 "$intrinsic"200 L_PAREN@496..497 "("201 NAME@497..502202 IDENT@497..502 "floor"203 R_PAREN@502..503 ")"204 COMMA@503..504 ","205 WHITESPACE@504..507 "\n "206 MEMBER_FIELD@507..530207 FIELD_NORMAL@507..530208 FIELD_NAME_FIXED@507..511209 NAME@507..511210 IDENT@507..511 "ceil"211 COLONCOLON@511..513 "::"212 WHITESPACE@513..514 " "213 EXPR_INTRINSIC@514..530214 INTRINSIC@514..524 "$intrinsic"215 L_PAREN@524..525 "("216 NAME@525..529217 IDENT@525..529 "ceil"218 R_PAREN@529..530 ")"219 COMMA@530..531 ","220 WHITESPACE@531..534 "\n "221 MEMBER_FIELD@534..561222 FIELD_NORMAL@534..561223 FIELD_NAME_FIXED@534..540224 NAME@534..540225 IDENT@534..540 "extVar"226 COLONCOLON@540..542 "::"227 WHITESPACE@542..543 " "228 EXPR_INTRINSIC@543..561229 INTRINSIC@543..553 "$intrinsic"230 L_PAREN@553..554 "("231 NAME@554..560232 IDENT@554..560 "extVar"233 R_PAREN@560..561 ")"234 COMMA@561..562 ","235 WHITESPACE@562..565 "\n "236 MEMBER_FIELD@565..592237 FIELD_NORMAL@565..592238 FIELD_NAME_FIXED@565..571239 NAME@565..571240 IDENT@565..571 "native"241 COLONCOLON@571..573 "::"242 WHITESPACE@573..574 " "243 EXPR_INTRINSIC@574..592244 INTRINSIC@574..584 "$intrinsic"245 L_PAREN@584..585 "("246 NAME@585..591247 IDENT@585..591 "native"248 R_PAREN@591..592 ")"249 COMMA@592..593 ","250 WHITESPACE@593..596 "\n "251 MEMBER_FIELD@596..623252 FIELD_NORMAL@596..623253 FIELD_NAME_FIXED@596..602254 NAME@596..602255 IDENT@596..602 "filter"256 COLONCOLON@602..604 "::"257 WHITESPACE@604..605 " "258 EXPR_INTRINSIC@605..623259 INTRINSIC@605..615 "$intrinsic"260 L_PAREN@615..616 "("261 NAME@616..622262 IDENT@616..622 "filter"263 R_PAREN@622..623 ")"264 COMMA@623..624 ","265 WHITESPACE@624..627 "\n "266 MEMBER_FIELD@627..650267 FIELD_NORMAL@627..650268 FIELD_NAME_FIXED@627..631269 NAME@627..631270 IDENT@627..631 "char"271 COLONCOLON@631..633 "::"272 WHITESPACE@633..634 " "273 EXPR_INTRINSIC@634..650274 INTRINSIC@634..644 "$intrinsic"275 L_PAREN@644..645 "("276 NAME@645..649277 IDENT@645..649 "char"278 R_PAREN@649..650 ")"279 COMMA@650..651 ","280 WHITESPACE@651..654 "\n "281 MEMBER_FIELD@654..689282 FIELD_NORMAL@654..689283 FIELD_NAME_FIXED@654..664284 NAME@654..664285 IDENT@654..664 "encodeUTF8"286 COLONCOLON@664..666 "::"287 WHITESPACE@666..667 " "288 EXPR_INTRINSIC@667..689289 INTRINSIC@667..677 "$intrinsic"290 L_PAREN@677..678 "("291 NAME@678..688292 IDENT@678..688 "encodeUTF8"293 R_PAREN@688..689 ")"294 COMMA@689..690 ","295 WHITESPACE@690..693 "\n "296 MEMBER_FIELD@693..728297 FIELD_NORMAL@693..728298 FIELD_NAME_FIXED@693..703299 NAME@693..703300 IDENT@693..703 "decodeUTF8"301 COLONCOLON@703..705 "::"302 WHITESPACE@705..706 " "303 EXPR_INTRINSIC@706..728304 INTRINSIC@706..716 "$intrinsic"305 L_PAREN@716..717 "("306 NAME@717..727307 IDENT@717..727 "decodeUTF8"308 R_PAREN@727..728 ")"309 COMMA@728..729 ","310 WHITESPACE@729..732 "\n "311 MEMBER_FIELD@732..753312 FIELD_NORMAL@732..753313 FIELD_NAME_FIXED@732..735314 NAME@732..735315 IDENT@732..735 "md5"316 COLONCOLON@735..737 "::"317 WHITESPACE@737..738 " "318 EXPR_INTRINSIC@738..753319 INTRINSIC@738..748 "$intrinsic"320 L_PAREN@748..749 "("321 NAME@749..752322 IDENT@749..752 "md5"323 R_PAREN@752..753 ")"324 COMMA@753..754 ","325 WHITESPACE@754..757 "\n "326 MEMBER_FIELD@757..782327 FIELD_NORMAL@757..782328 FIELD_NAME_FIXED@757..762329 NAME@757..762330 IDENT@757..762 "trace"331 COLONCOLON@762..764 "::"332 WHITESPACE@764..765 " "333 EXPR_INTRINSIC@765..782334 INTRINSIC@765..775 "$intrinsic"335 L_PAREN@775..776 "("336 NAME@776..781337 IDENT@776..781 "trace"338 R_PAREN@781..782 ")"339 COMMA@782..783 ","340 WHITESPACE@783..786 "\n "341 MEMBER_FIELD@786..819342 FIELD_NORMAL@786..819343 FIELD_NAME_FIXED@786..795344 NAME@786..795345 IDENT@786..795 "parseJson"346 COLONCOLON@795..797 "::"347 WHITESPACE@797..798 " "348 EXPR_INTRINSIC@798..819349 INTRINSIC@798..808 "$intrinsic"350 L_PAREN@808..809 "("351 NAME@809..818352 IDENT@809..818 "parseJson"353 R_PAREN@818..819 ")"354 COMMA@819..820 ","355 WHITESPACE@820..823 "\n "356 MEMBER_FIELD@823..856357 FIELD_NORMAL@823..856358 FIELD_NAME_FIXED@823..832359 NAME@823..832360 IDENT@823..832 "parseYaml"361 COLONCOLON@832..834 "::"362 WHITESPACE@834..835 " "363 EXPR_INTRINSIC@835..856364 INTRINSIC@835..845 "$intrinsic"365 L_PAREN@845..846 "("366 NAME@846..855367 IDENT@846..855 "parseYaml"368 R_PAREN@855..856 ")"369 COMMA@856..857 ","370 WHITESPACE@857..861 "\n\n "371 MEMBER_FIELD@861..882372 FIELD_NORMAL@861..882373 FIELD_NAME_FIXED@861..864374 NAME@861..864375 IDENT@861..864 "log"376 COLONCOLON@864..866 "::"377 WHITESPACE@866..867 " "378 EXPR_INTRINSIC@867..882379 INTRINSIC@867..877 "$intrinsic"380 L_PAREN@877..878 "("381 NAME@878..881382 IDENT@878..881 "log"383 R_PAREN@881..882 ")"384 COMMA@882..883 ","385 WHITESPACE@883..886 "\n "386 MEMBER_FIELD@886..907387 FIELD_NORMAL@886..907388 FIELD_NAME_FIXED@886..889389 NAME@886..889390 IDENT@886..889 "pow"391 COLONCOLON@889..891 "::"392 WHITESPACE@891..892 " "393 EXPR_INTRINSIC@892..907394 INTRINSIC@892..902 "$intrinsic"395 L_PAREN@902..903 "("396 NAME@903..906397 IDENT@903..906 "pow"398 R_PAREN@906..907 ")"399 COMMA@907..908 ","400 WHITESPACE@908..911 "\n "401 MEMBER_FIELD@911..934402 FIELD_NORMAL@911..934403 FIELD_NAME_FIXED@911..915404 NAME@911..915405 IDENT@911..915 "sqrt"406 COLONCOLON@915..917 "::"407 WHITESPACE@917..918 " "408 EXPR_INTRINSIC@918..934409 INTRINSIC@918..928 "$intrinsic"410 L_PAREN@928..929 "("411 NAME@929..933412 IDENT@929..933 "sqrt"413 R_PAREN@933..934 ")"414 COMMA@934..935 ","415 WHITESPACE@935..939 "\n\n "416 MEMBER_FIELD@939..960417 FIELD_NORMAL@939..960418 FIELD_NAME_FIXED@939..942419 NAME@939..942420 IDENT@939..942 "sin"421 COLONCOLON@942..944 "::"422 WHITESPACE@944..945 " "423 EXPR_INTRINSIC@945..960424 INTRINSIC@945..955 "$intrinsic"425 L_PAREN@955..956 "("426 NAME@956..959427 IDENT@956..959 "sin"428 R_PAREN@959..960 ")"429 COMMA@960..961 ","430 WHITESPACE@961..964 "\n "431 MEMBER_FIELD@964..985432 FIELD_NORMAL@964..985433 FIELD_NAME_FIXED@964..967434 NAME@964..967435 IDENT@964..967 "cos"436 COLONCOLON@967..969 "::"437 WHITESPACE@969..970 " "438 EXPR_INTRINSIC@970..985439 INTRINSIC@970..980 "$intrinsic"440 L_PAREN@980..981 "("441 NAME@981..984442 IDENT@981..984 "cos"443 R_PAREN@984..985 ")"444 COMMA@985..986 ","445 WHITESPACE@986..989 "\n "446 MEMBER_FIELD@989..1010447 FIELD_NORMAL@989..1010448 FIELD_NAME_FIXED@989..992449 NAME@989..992450 IDENT@989..992 "tan"451 COLONCOLON@992..994 "::"452 WHITESPACE@994..995 " "453 EXPR_INTRINSIC@995..1010454 INTRINSIC@995..1005 "$intrinsic"455 L_PAREN@1005..1006 "("456 NAME@1006..1009457 IDENT@1006..1009 "tan"458 R_PAREN@1009..1010 ")"459 COMMA@1010..1011 ","460 WHITESPACE@1011..1014 "\n "461 MEMBER_FIELD@1014..1037462 FIELD_NORMAL@1014..1037463 FIELD_NAME_FIXED@1014..1018464 NAME@1014..1018465 IDENT@1014..1018 "asin"466 COLONCOLON@1018..1020 "::"467 WHITESPACE@1020..1021 " "468 EXPR_INTRINSIC@1021..1037469 INTRINSIC@1021..1031 "$intrinsic"470 L_PAREN@1031..1032 "("471 NAME@1032..1036472 IDENT@1032..1036 "asin"473 R_PAREN@1036..1037 ")"474 COMMA@1037..1038 ","475 WHITESPACE@1038..1041 "\n "476 MEMBER_FIELD@1041..1064477 FIELD_NORMAL@1041..1064478 FIELD_NAME_FIXED@1041..1045479 NAME@1041..1045480 IDENT@1041..1045 "acos"481 COLONCOLON@1045..1047 "::"482 WHITESPACE@1047..1048 " "483 EXPR_INTRINSIC@1048..1064484 INTRINSIC@1048..1058 "$intrinsic"485 L_PAREN@1058..1059 "("486 NAME@1059..1063487 IDENT@1059..1063 "acos"488 R_PAREN@1063..1064 ")"489 COMMA@1064..1065 ","490 WHITESPACE@1065..1068 "\n "491 MEMBER_FIELD@1068..1091492 FIELD_NORMAL@1068..1091493 FIELD_NAME_FIXED@1068..1072494 NAME@1068..1072495 IDENT@1068..1072 "atan"496 COLONCOLON@1072..1074 "::"497 WHITESPACE@1074..1075 " "498 EXPR_INTRINSIC@1075..1091499 INTRINSIC@1075..1085 "$intrinsic"500 L_PAREN@1085..1086 "("501 NAME@1086..1090502 IDENT@1086..1090 "atan"503 R_PAREN@1090..1091 ")"504 COMMA@1091..1092 ","505 WHITESPACE@1092..1096 "\n\n "506 MEMBER_FIELD@1096..1117507 FIELD_NORMAL@1096..1117508 FIELD_NAME_FIXED@1096..1099509 NAME@1096..1099510 IDENT@1096..1099 "exp"511 COLONCOLON@1099..1101 "::"512 WHITESPACE@1101..1102 " "513 EXPR_INTRINSIC@1102..1117514 INTRINSIC@1102..1112 "$intrinsic"515 L_PAREN@1112..1113 "("516 NAME@1113..1116517 IDENT@1113..1116 "exp"518 R_PAREN@1116..1117 ")"519 COMMA@1117..1118 ","520 WHITESPACE@1118..1121 "\n "521 MEMBER_FIELD@1121..1152522 FIELD_NORMAL@1121..1152523 FIELD_NAME_FIXED@1121..1129524 NAME@1121..1129525 IDENT@1121..1129 "mantissa"526 COLONCOLON@1129..1131 "::"527 WHITESPACE@1131..1132 " "528 EXPR_INTRINSIC@1132..1152529 INTRINSIC@1132..1142 "$intrinsic"530 L_PAREN@1142..1143 "("531 NAME@1143..1151532 IDENT@1143..1151 "mantissa"533 R_PAREN@1151..1152 ")"534 COMMA@1152..1153 ","535 WHITESPACE@1153..1156 "\n "536 MEMBER_FIELD@1156..1187537 FIELD_NORMAL@1156..1187538 FIELD_NAME_FIXED@1156..1164539 NAME@1156..1164540 IDENT@1156..1164 "exponent"541 COLONCOLON@1164..1166 "::"542 WHITESPACE@1166..1167 " "543 EXPR_INTRINSIC@1167..1187544 INTRINSIC@1167..1177 "$intrinsic"545 L_PAREN@1177..1178 "("546 NAME@1178..1186547 IDENT@1178..1186 "exponent"548 R_PAREN@1186..1187 ")"549 COMMA@1187..1188 ","550 WHITESPACE@1188..1192 "\n\n "551 MEMBER_FIELD@1192..1213552 FIELD_NORMAL@1192..1213553 FIELD_NAME_FIXED@1192..1195554 NAME@1192..1195555 IDENT@1192..1195 "any"556 COLONCOLON@1195..1197 "::"557 WHITESPACE@1197..1198 " "558 EXPR_INTRINSIC@1198..1213559 INTRINSIC@1198..1208 "$intrinsic"560 L_PAREN@1208..1209 "("561 NAME@1209..1212562 IDENT@1209..1212 "any"563 R_PAREN@1212..1213 ")"564 COMMA@1213..1214 ","565 WHITESPACE@1214..1217 "\n "566 MEMBER_FIELD@1217..1238567 FIELD_NORMAL@1217..1238568 FIELD_NAME_FIXED@1217..1220569 NAME@1217..1220570 IDENT@1217..1220 "all"571 COLONCOLON@1220..1222 "::"572 WHITESPACE@1222..1223 " "573 EXPR_INTRINSIC@1223..1238574 INTRINSIC@1223..1233 "$intrinsic"575 L_PAREN@1233..1234 "("576 NAME@1234..1237577 IDENT@1234..1237 "all"578 R_PAREN@1237..1238 ")"579 COMMA@1238..1239 ","580 WHITESPACE@1239..1243 "\n\n "581 MEMBER_FIELD@1243..1280582 FIELD_METHOD@1243..1280583 FIELD_NAME_FIXED@1243..1251584 NAME@1243..1251585 IDENT@1243..1251 "isString"586 PARAMS_DESC@1251..1254587 L_PAREN@1251..1252 "("588 PARAM@1252..1253589 DESTRUCT_FULL@1252..1253590 NAME@1252..1253591 IDENT@1252..1253 "v"592 R_PAREN@1253..1254 ")"593 COLONCOLON@1254..1256 "::"594 WHITESPACE@1256..1257 " "595 EXPR_BINARY@1257..1280596 LHS_EXPR@1257..1268597 EXPR_APPLY@1257..1268598 EXPR_INDEX@1257..1265599 EXPR_VAR@1257..1260600 NAME@1257..1260601 IDENT@1257..1260 "std"602 DOT@1260..1261 "."603 NAME@1261..1265604 IDENT@1261..1265 "type"605 ARGS_DESC@1265..1268606 L_PAREN@1265..1266 "("607 ARG@1266..1267608 EXPR_VAR@1266..1267609 NAME@1266..1267610 IDENT@1266..1267 "v"611 R_PAREN@1267..1268 ")"612 WHITESPACE@1268..1269 " "613 EQ@1269..1271 "=="614 WHITESPACE@1271..1272 " "615 EXPR_STRING@1272..1280616 STRING_SINGLE@1272..1280 "'string'"617 COMMA@1280..1281 ","618 WHITESPACE@1281..1284 "\n "619 MEMBER_FIELD@1284..1321620 FIELD_METHOD@1284..1321621 FIELD_NAME_FIXED@1284..1292622 NAME@1284..1292623 IDENT@1284..1292 "isNumber"624 PARAMS_DESC@1292..1295625 L_PAREN@1292..1293 "("626 PARAM@1293..1294627 DESTRUCT_FULL@1293..1294628 NAME@1293..1294629 IDENT@1293..1294 "v"630 R_PAREN@1294..1295 ")"631 COLONCOLON@1295..1297 "::"632 WHITESPACE@1297..1298 " "633 EXPR_BINARY@1298..1321634 LHS_EXPR@1298..1309635 EXPR_APPLY@1298..1309636 EXPR_INDEX@1298..1306637 EXPR_VAR@1298..1301638 NAME@1298..1301639 IDENT@1298..1301 "std"640 DOT@1301..1302 "."641 NAME@1302..1306642 IDENT@1302..1306 "type"643 ARGS_DESC@1306..1309644 L_PAREN@1306..1307 "("645 ARG@1307..1308646 EXPR_VAR@1307..1308647 NAME@1307..1308648 IDENT@1307..1308 "v"649 R_PAREN@1308..1309 ")"650 WHITESPACE@1309..1310 " "651 EQ@1310..1312 "=="652 WHITESPACE@1312..1313 " "653 EXPR_STRING@1313..1321654 STRING_SINGLE@1313..1321 "'number'"655 COMMA@1321..1322 ","656 WHITESPACE@1322..1325 "\n "657 MEMBER_FIELD@1325..1364658 FIELD_METHOD@1325..1364659 FIELD_NAME_FIXED@1325..1334660 NAME@1325..1334661 IDENT@1325..1334 "isBoolean"662 PARAMS_DESC@1334..1337663 L_PAREN@1334..1335 "("664 PARAM@1335..1336665 DESTRUCT_FULL@1335..1336666 NAME@1335..1336667 IDENT@1335..1336 "v"668 R_PAREN@1336..1337 ")"669 COLONCOLON@1337..1339 "::"670 WHITESPACE@1339..1340 " "671 EXPR_BINARY@1340..1364672 LHS_EXPR@1340..1351673 EXPR_APPLY@1340..1351674 EXPR_INDEX@1340..1348675 EXPR_VAR@1340..1343676 NAME@1340..1343677 IDENT@1340..1343 "std"678 DOT@1343..1344 "."679 NAME@1344..1348680 IDENT@1344..1348 "type"681 ARGS_DESC@1348..1351682 L_PAREN@1348..1349 "("683 ARG@1349..1350684 EXPR_VAR@1349..1350685 NAME@1349..1350686 IDENT@1349..1350 "v"687 R_PAREN@1350..1351 ")"688 WHITESPACE@1351..1352 " "689 EQ@1352..1354 "=="690 WHITESPACE@1354..1355 " "691 EXPR_STRING@1355..1364692 STRING_SINGLE@1355..1364 "'boolean'"693 COMMA@1364..1365 ","694 WHITESPACE@1365..1368 "\n "695 MEMBER_FIELD@1368..1405696 FIELD_METHOD@1368..1405697 FIELD_NAME_FIXED@1368..1376698 NAME@1368..1376699 IDENT@1368..1376 "isObject"700 PARAMS_DESC@1376..1379701 L_PAREN@1376..1377 "("702 PARAM@1377..1378703 DESTRUCT_FULL@1377..1378704 NAME@1377..1378705 IDENT@1377..1378 "v"706 R_PAREN@1378..1379 ")"707 COLONCOLON@1379..1381 "::"708 WHITESPACE@1381..1382 " "709 EXPR_BINARY@1382..1405710 LHS_EXPR@1382..1393711 EXPR_APPLY@1382..1393712 EXPR_INDEX@1382..1390713 EXPR_VAR@1382..1385714 NAME@1382..1385715 IDENT@1382..1385 "std"716 DOT@1385..1386 "."717 NAME@1386..1390718 IDENT@1386..1390 "type"719 ARGS_DESC@1390..1393720 L_PAREN@1390..1391 "("721 ARG@1391..1392722 EXPR_VAR@1391..1392723 NAME@1391..1392724 IDENT@1391..1392 "v"725 R_PAREN@1392..1393 ")"726 WHITESPACE@1393..1394 " "727 EQ@1394..1396 "=="728 WHITESPACE@1396..1397 " "729 EXPR_STRING@1397..1405730 STRING_SINGLE@1397..1405 "'object'"731 COMMA@1405..1406 ","732 WHITESPACE@1406..1409 "\n "733 MEMBER_FIELD@1409..1444734 FIELD_METHOD@1409..1444735 FIELD_NAME_FIXED@1409..1416736 NAME@1409..1416737 IDENT@1409..1416 "isArray"738 PARAMS_DESC@1416..1419739 L_PAREN@1416..1417 "("740 PARAM@1417..1418741 DESTRUCT_FULL@1417..1418742 NAME@1417..1418743 IDENT@1417..1418 "v"744 R_PAREN@1418..1419 ")"745 COLONCOLON@1419..1421 "::"746 WHITESPACE@1421..1422 " "747 EXPR_BINARY@1422..1444748 LHS_EXPR@1422..1433749 EXPR_APPLY@1422..1433750 EXPR_INDEX@1422..1430751 EXPR_VAR@1422..1425752 NAME@1422..1425753 IDENT@1422..1425 "std"754 DOT@1425..1426 "."755 NAME@1426..1430756 IDENT@1426..1430 "type"757 ARGS_DESC@1430..1433758 L_PAREN@1430..1431 "("759 ARG@1431..1432760 EXPR_VAR@1431..1432761 NAME@1431..1432762 IDENT@1431..1432 "v"763 R_PAREN@1432..1433 ")"764 WHITESPACE@1433..1434 " "765 EQ@1434..1436 "=="766 WHITESPACE@1436..1437 " "767 EXPR_STRING@1437..1444768 STRING_SINGLE@1437..1444 "'array'"769 COMMA@1444..1445 ","770 WHITESPACE@1445..1448 "\n "771 MEMBER_FIELD@1448..1489772 FIELD_METHOD@1448..1489773 FIELD_NAME_FIXED@1448..1458774 NAME@1448..1458775 IDENT@1448..1458 "isFunction"776 PARAMS_DESC@1458..1461777 L_PAREN@1458..1459 "("778 PARAM@1459..1460779 DESTRUCT_FULL@1459..1460780 NAME@1459..1460781 IDENT@1459..1460 "v"782 R_PAREN@1460..1461 ")"783 COLONCOLON@1461..1463 "::"784 WHITESPACE@1463..1464 " "785 EXPR_BINARY@1464..1489786 LHS_EXPR@1464..1475787 EXPR_APPLY@1464..1475788 EXPR_INDEX@1464..1472789 EXPR_VAR@1464..1467790 NAME@1464..1467791 IDENT@1464..1467 "std"792 DOT@1467..1468 "."793 NAME@1468..1472794 IDENT@1468..1472 "type"795 ARGS_DESC@1472..1475796 L_PAREN@1472..1473 "("797 ARG@1473..1474798 EXPR_VAR@1473..1474799 NAME@1473..1474800 IDENT@1473..1474 "v"801 R_PAREN@1474..1475 ")"802 WHITESPACE@1475..1476 " "803 EQ@1476..1478 "=="804 WHITESPACE@1478..1479 " "805 EXPR_STRING@1479..1489806 STRING_SINGLE@1479..1489 "'function'"807 COMMA@1489..1490 ","808 WHITESPACE@1490..1494 "\n\n "809 MEMBER_FIELD@1494..1557810 FIELD_METHOD@1494..1557811 FIELD_NAME_FIXED@1494..1502812 NAME@1494..1502813 IDENT@1494..1502 "toString"814 PARAMS_DESC@1502..1505815 L_PAREN@1502..1503 "("816 PARAM@1503..1504817 DESTRUCT_FULL@1503..1504818 NAME@1503..1504819 IDENT@1503..1504 "a"820 R_PAREN@1504..1505 ")"821 COLONCOLON@1505..1507 "::"822 WHITESPACE@1507..1512 "\n "823 EXPR_IF_THEN_ELSE@1512..1557824 IF_KW@1512..1514 "if"825 WHITESPACE@1514..1515 " "826 EXPR_BINARY@1515..1538827 LHS_EXPR@1515..1526828 EXPR_APPLY@1515..1526829 EXPR_INDEX@1515..1523830 EXPR_VAR@1515..1518831 NAME@1515..1518832 IDENT@1515..1518 "std"833 DOT@1518..1519 "."834 NAME@1519..1523835 IDENT@1519..1523 "type"836 ARGS_DESC@1523..1526837 L_PAREN@1523..1524 "("838 ARG@1524..1525839 EXPR_VAR@1524..1525840 NAME@1524..1525841 IDENT@1524..1525 "a"842 R_PAREN@1525..1526 ")"843 WHITESPACE@1526..1527 " "844 EQ@1527..1529 "=="845 WHITESPACE@1529..1530 " "846 EXPR_STRING@1530..1538847 STRING_SINGLE@1530..1538 "'string'"848 WHITESPACE@1538..1539 " "849 THEN_KW@1539..1543 "then"850 WHITESPACE@1543..1544 " "851 TRUE_EXPR@1544..1545852 EXPR_VAR@1544..1545853 NAME@1544..1545854 IDENT@1544..1545 "a"855 WHITESPACE@1545..1546 " "856 ELSE_KW@1546..1550 "else"857 WHITESPACE@1550..1551 " "858 FALSE_EXPR@1551..1557859 EXPR_BINARY@1551..1557860 LHS_EXPR@1551..1553861 EXPR_STRING@1551..1553862 STRING_SINGLE@1551..1553 "''"863 WHITESPACE@1553..1554 " "864 PLUS@1554..1555 "+"865 WHITESPACE@1555..1556 " "866 EXPR_VAR@1556..1557867 NAME@1556..1557868 IDENT@1556..1557 "a"869 COMMA@1557..1558 ","870 WHITESPACE@1558..1562 "\n\n "871 MEMBER_FIELD@1562..1589872 FIELD_NORMAL@1562..1589873 FIELD_NAME_FIXED@1562..1568874 NAME@1562..1568875 IDENT@1562..1568 "substr"876 COLONCOLON@1568..1570 "::"877 WHITESPACE@1570..1571 " "878 EXPR_INTRINSIC@1571..1589879 INTRINSIC@1571..1581 "$intrinsic"880 L_PAREN@1581..1582 "("881 NAME@1582..1588882 IDENT@1582..1588 "substr"883 R_PAREN@1588..1589 ")"884 COMMA@1589..1590 ","885 WHITESPACE@1590..1594 "\n\n "886 MEMBER_FIELD@1594..1718887 FIELD_METHOD@1594..1718888 FIELD_NAME_FIXED@1594..1604889 NAME@1594..1604890 IDENT@1594..1604 "startsWith"891 PARAMS_DESC@1604..1610892 L_PAREN@1604..1605 "("893 PARAM@1605..1606894 DESTRUCT_FULL@1605..1606895 NAME@1605..1606896 IDENT@1605..1606 "a"897 COMMA@1606..1607 ","898 WHITESPACE@1607..1608 " "899 PARAM@1608..1609900 DESTRUCT_FULL@1608..1609901 NAME@1608..1609902 IDENT@1608..1609 "b"903 R_PAREN@1609..1610 ")"904 COLONCOLON@1610..1612 "::"905 WHITESPACE@1612..1617 "\n "906 EXPR_IF_THEN_ELSE@1617..1718907 IF_KW@1617..1619 "if"908 WHITESPACE@1619..1620 " "909 EXPR_BINARY@1620..1649910 LHS_EXPR@1620..1633911 EXPR_APPLY@1620..1633912 EXPR_INDEX@1620..1630913 EXPR_VAR@1620..1623914 NAME@1620..1623915 IDENT@1620..1623 "std"916 DOT@1623..1624 "."917 NAME@1624..1630918 IDENT@1624..1630 "length"919 ARGS_DESC@1630..1633920 L_PAREN@1630..1631 "("921 ARG@1631..1632922 EXPR_VAR@1631..1632923 NAME@1631..1632924 IDENT@1631..1632 "a"925 R_PAREN@1632..1633 ")"926 WHITESPACE@1633..1634 " "927 LT@1634..1635 "<"928 WHITESPACE@1635..1636 " "929 EXPR_APPLY@1636..1649930 EXPR_INDEX@1636..1646931 EXPR_VAR@1636..1639932 NAME@1636..1639933 IDENT@1636..1639 "std"934 DOT@1639..1640 "."935 NAME@1640..1646936 IDENT@1640..1646 "length"937 ARGS_DESC@1646..1649938 L_PAREN@1646..1647 "("939 ARG@1647..1648940 EXPR_VAR@1647..1648941 NAME@1647..1648942 IDENT@1647..1648 "b"943 R_PAREN@1648..1649 ")"944 WHITESPACE@1649..1650 " "945 THEN_KW@1650..1654 "then"946 WHITESPACE@1654..1661 "\n "947 TRUE_EXPR@1661..1666948 EXPR_LITERAL@1661..1666949 FALSE_KW@1661..1666 "false"950 WHITESPACE@1666..1671 "\n "951 ELSE_KW@1671..1675 "else"952 WHITESPACE@1675..1682 "\n "953 FALSE_EXPR@1682..1718954 EXPR_BINARY@1682..1718955 LHS_EXPR@1682..1713956 EXPR_APPLY@1682..1713957 EXPR_INDEX@1682..1692958 EXPR_VAR@1682..1685959 NAME@1682..1685960 IDENT@1682..1685 "std"961 DOT@1685..1686 "."962 NAME@1686..1692963 IDENT@1686..1692 "substr"964 ARGS_DESC@1692..1713965 L_PAREN@1692..1693 "("966 ARG@1693..1694967 EXPR_VAR@1693..1694968 NAME@1693..1694969 IDENT@1693..1694 "a"970 COMMA@1694..1695 ","971 WHITESPACE@1695..1696 " "972 ARG@1696..1697973 EXPR_NUMBER@1696..1697974 FLOAT@1696..1697 "0"975 COMMA@1697..1698 ","976 WHITESPACE@1698..1699 " "977 ARG@1699..1712978 EXPR_APPLY@1699..1712979 EXPR_INDEX@1699..1709980 EXPR_VAR@1699..1702981 NAME@1699..1702982 IDENT@1699..1702 "std"983 DOT@1702..1703 "."984 NAME@1703..1709985 IDENT@1703..1709 "length"986 ARGS_DESC@1709..1712987 L_PAREN@1709..1710 "("988 ARG@1710..1711989 EXPR_VAR@1710..1711990 NAME@1710..1711991 IDENT@1710..1711 "b"992 R_PAREN@1711..1712 ")"993 R_PAREN@1712..1713 ")"994 WHITESPACE@1713..1714 " "995 EQ@1714..1716 "=="996 WHITESPACE@1716..1717 " "997 EXPR_VAR@1717..1718998 NAME@1717..1718999 IDENT@1717..1718 "b"1000 COMMA@1718..1719 ","1001 WHITESPACE@1719..1723 "\n\n "1002 MEMBER_FIELD@1723..18731003 FIELD_METHOD@1723..18731004 FIELD_NAME_FIXED@1723..17311005 NAME@1723..17311006 IDENT@1723..1731 "endsWith"1007 PARAMS_DESC@1731..17371008 L_PAREN@1731..1732 "("1009 PARAM@1732..17331010 DESTRUCT_FULL@1732..17331011 NAME@1732..17331012 IDENT@1732..1733 "a"1013 COMMA@1733..1734 ","1014 WHITESPACE@1734..1735 " "1015 PARAM@1735..17361016 DESTRUCT_FULL@1735..17361017 NAME@1735..17361018 IDENT@1735..1736 "b"1019 R_PAREN@1736..1737 ")"1020 COLONCOLON@1737..1739 "::"1021 WHITESPACE@1739..1744 "\n "1022 EXPR_IF_THEN_ELSE@1744..18731023 IF_KW@1744..1746 "if"1024 WHITESPACE@1746..1747 " "1025 EXPR_BINARY@1747..17761026 LHS_EXPR@1747..17601027 EXPR_APPLY@1747..17601028 EXPR_INDEX@1747..17571029 EXPR_VAR@1747..17501030 NAME@1747..17501031 IDENT@1747..1750 "std"1032 DOT@1750..1751 "."1033 NAME@1751..17571034 IDENT@1751..1757 "length"1035 ARGS_DESC@1757..17601036 L_PAREN@1757..1758 "("1037 ARG@1758..17591038 EXPR_VAR@1758..17591039 NAME@1758..17591040 IDENT@1758..1759 "a"1041 R_PAREN@1759..1760 ")"1042 WHITESPACE@1760..1761 " "1043 LT@1761..1762 "<"1044 WHITESPACE@1762..1763 " "1045 EXPR_APPLY@1763..17761046 EXPR_INDEX@1763..17731047 EXPR_VAR@1763..17661048 NAME@1763..17661049 IDENT@1763..1766 "std"1050 DOT@1766..1767 "."1051 NAME@1767..17731052 IDENT@1767..1773 "length"1053 ARGS_DESC@1773..17761054 L_PAREN@1773..1774 "("1055 ARG@1774..17751056 EXPR_VAR@1774..17751057 NAME@1774..17751058 IDENT@1774..1775 "b"1059 R_PAREN@1775..1776 ")"1060 WHITESPACE@1776..1777 " "1061 THEN_KW@1777..1781 "then"1062 WHITESPACE@1781..1788 "\n "1063 TRUE_EXPR@1788..17931064 EXPR_LITERAL@1788..17931065 FALSE_KW@1788..1793 "false"1066 WHITESPACE@1793..1798 "\n "1067 ELSE_KW@1798..1802 "else"1068 WHITESPACE@1802..1809 "\n "1069 FALSE_EXPR@1809..18731070 EXPR_BINARY@1809..18731071 LHS_EXPR@1809..18681072 EXPR_APPLY@1809..18681073 EXPR_INDEX@1809..18191074 EXPR_VAR@1809..18121075 NAME@1809..18121076 IDENT@1809..1812 "std"1077 DOT@1812..1813 "."1078 NAME@1813..18191079 IDENT@1813..1819 "substr"1080 ARGS_DESC@1819..18681081 L_PAREN@1819..1820 "("1082 ARG@1820..18211083 EXPR_VAR@1820..18211084 NAME@1820..18211085 IDENT@1820..1821 "a"1086 COMMA@1821..1822 ","1087 WHITESPACE@1822..1823 " "1088 ARG@1823..18521089 EXPR_BINARY@1823..18521090 LHS_EXPR@1823..18361091 EXPR_APPLY@1823..18361092 EXPR_INDEX@1823..18331093 EXPR_VAR@1823..18261094 NAME@1823..18261095 IDENT@1823..1826 "std"1096 DOT@1826..1827 "."1097 NAME@1827..18331098 IDENT@1827..1833 "length"1099 ARGS_DESC@1833..18361100 L_PAREN@1833..1834 "("1101 ARG@1834..18351102 EXPR_VAR@1834..18351103 NAME@1834..18351104 IDENT@1834..1835 "a"1105 R_PAREN@1835..1836 ")"1106 WHITESPACE@1836..1837 " "1107 MINUS@1837..1838 "-"1108 WHITESPACE@1838..1839 " "1109 EXPR_APPLY@1839..18521110 EXPR_INDEX@1839..18491111 EXPR_VAR@1839..18421112 NAME@1839..18421113 IDENT@1839..1842 "std"1114 DOT@1842..1843 "."1115 NAME@1843..18491116 IDENT@1843..1849 "length"1117 ARGS_DESC@1849..18521118 L_PAREN@1849..1850 "("1119 ARG@1850..18511120 EXPR_VAR@1850..18511121 NAME@1850..18511122 IDENT@1850..1851 "b"1123 R_PAREN@1851..1852 ")"1124 COMMA@1852..1853 ","1125 WHITESPACE@1853..1854 " "1126 ARG@1854..18671127 EXPR_APPLY@1854..18671128 EXPR_INDEX@1854..18641129 EXPR_VAR@1854..18571130 NAME@1854..18571131 IDENT@1854..1857 "std"1132 DOT@1857..1858 "."1133 NAME@1858..18641134 IDENT@1858..1864 "length"1135 ARGS_DESC@1864..18671136 L_PAREN@1864..1865 "("1137 ARG@1865..18661138 EXPR_VAR@1865..18661139 NAME@1865..18661140 IDENT@1865..1866 "b"1141 R_PAREN@1866..1867 ")"1142 R_PAREN@1867..1868 ")"1143 WHITESPACE@1868..1869 " "1144 EQ@1869..1871 "=="1145 WHITESPACE@1871..1872 " "1146 EXPR_VAR@1872..18731147 NAME@1872..18731148 IDENT@1872..1873 "b"1149 COMMA@1873..1874 ","1150 WHITESPACE@1874..1878 "\n\n "1151 MEMBER_FIELD@1878..20211152 FIELD_METHOD@1878..20211153 FIELD_NAME_FIXED@1878..18891154 NAME@1878..18891155 IDENT@1878..1889 "lstripChars"1156 PARAMS_DESC@1889..19011157 L_PAREN@1889..1890 "("1158 PARAM@1890..18931159 DESTRUCT_FULL@1890..18931160 NAME@1890..18931161 IDENT@1890..1893 "str"1162 COMMA@1893..1894 ","1163 WHITESPACE@1894..1895 " "1164 PARAM@1895..19001165 DESTRUCT_FULL@1895..19001166 NAME@1895..19001167 IDENT@1895..1900 "chars"1168 R_PAREN@1900..1901 ")"1169 COLONCOLON@1901..1903 "::"1170 WHITESPACE@1903..1908 "\n "1171 EXPR_IF_THEN_ELSE@1908..20211172 IF_KW@1908..1910 "if"1173 WHITESPACE@1910..1911 " "1174 EXPR_BINARY@1911..19591175 LHS_EXPR@1911..19301176 EXPR_BINARY@1911..19301177 LHS_EXPR@1911..19261178 EXPR_APPLY@1911..19261179 EXPR_INDEX@1911..19211180 EXPR_VAR@1911..19141181 NAME@1911..19141182 IDENT@1911..1914 "std"1183 DOT@1914..1915 "."1184 NAME@1915..19211185 IDENT@1915..1921 "length"1186 ARGS_DESC@1921..19261187 L_PAREN@1921..1922 "("1188 ARG@1922..19251189 EXPR_VAR@1922..19251190 NAME@1922..19251191 IDENT@1922..1925 "str"1192 R_PAREN@1925..1926 ")"1193 WHITESPACE@1926..1927 " "1194 GT@1927..1928 ">"1195 WHITESPACE@1928..1929 " "1196 EXPR_NUMBER@1929..19301197 FLOAT@1929..1930 "0"1198 WHITESPACE@1930..1931 " "1199 AND@1931..1933 "&&"1200 WHITESPACE@1933..1934 " "1201 EXPR_APPLY@1934..19591202 EXPR_INDEX@1934..19441203 EXPR_VAR@1934..19371204 NAME@1934..19371205 IDENT@1934..1937 "std"1206 DOT@1937..1938 "."1207 NAME@1938..19441208 IDENT@1938..1944 "member"1209 ARGS_DESC@1944..19591210 L_PAREN@1944..1945 "("1211 ARG@1945..19501212 EXPR_VAR@1945..19501213 NAME@1945..19501214 IDENT@1945..1950 "chars"1215 COMMA@1950..1951 ","1216 WHITESPACE@1951..1952 " "1217 ARG@1952..19581218 EXPR_INDEX_EXPR@1952..19581219 LHS_EXPR@1952..19551220 EXPR_VAR@1952..19551221 NAME@1952..19551222 IDENT@1952..1955 "str"1223 L_BRACK@1955..1956 "["1224 EXPR_NUMBER@1956..19571225 FLOAT@1956..1957 "0"1226 R_BRACK@1957..1958 "]"1227 R_PAREN@1958..1959 ")"1228 WHITESPACE@1959..1960 " "1229 THEN_KW@1960..1964 "then"1230 WHITESPACE@1964..1971 "\n "1231 TRUE_EXPR@1971..20021232 EXPR_APPLY@1971..20021233 EXPR_INDEX@1971..19861234 EXPR_VAR@1971..19741235 NAME@1971..19741236 IDENT@1971..1974 "std"1237 DOT@1974..1975 "."1238 NAME@1975..19861239 IDENT@1975..1986 "lstripChars"1240 ARGS_DESC@1986..20021241 L_PAREN@1986..1987 "("1242 ARG@1987..19941243 EXPR_SLICE@1987..19941244 EXPR_VAR@1987..19901245 NAME@1987..19901246 IDENT@1987..1990 "str"1247 SLICE_DESC@1990..19941248 L_BRACK@1990..1991 "["1249 EXPR_NUMBER@1991..19921250 FLOAT@1991..1992 "1"1251 COLON@1992..1993 ":"1252 R_BRACK@1993..1994 "]"1253 COMMA@1994..1995 ","1254 WHITESPACE@1995..1996 " "1255 ARG@1996..20011256 EXPR_VAR@1996..20011257 NAME@1996..20011258 IDENT@1996..2001 "chars"1259 R_PAREN@2001..2002 ")"1260 WHITESPACE@2002..2007 "\n "1261 ELSE_KW@2007..2011 "else"1262 WHITESPACE@2011..2018 "\n "1263 FALSE_EXPR@2018..20211264 EXPR_VAR@2018..20211265 NAME@2018..20211266 IDENT@2018..2021 "str"1267 COMMA@2021..2022 ","1268 WHITESPACE@2022..2026 "\n\n "1269 MEMBER_FIELD@2026..22021270 FIELD_METHOD@2026..22021271 FIELD_NAME_FIXED@2026..20371272 NAME@2026..20371273 IDENT@2026..2037 "rstripChars"1274 PARAMS_DESC@2037..20491275 L_PAREN@2037..2038 "("1276 PARAM@2038..20411277 DESTRUCT_FULL@2038..20411278 NAME@2038..20411279 IDENT@2038..2041 "str"1280 COMMA@2041..2042 ","1281 WHITESPACE@2042..2043 " "1282 PARAM@2043..20481283 DESTRUCT_FULL@2043..20481284 NAME@2043..20481285 IDENT@2043..2048 "chars"1286 R_PAREN@2048..2049 ")"1287 COLONCOLON@2049..2051 "::"1288 WHITESPACE@2051..2056 "\n "1289 EXPR_LOCAL@2056..22021290 LOCAL_KW@2056..2061 "local"1291 WHITESPACE@2061..2062 " "1292 BIND_DESTRUCT@2062..20831293 DESTRUCT_FULL@2062..20651294 NAME@2062..20651295 IDENT@2062..2065 "len"1296 WHITESPACE@2065..2066 " "1297 ASSIGN@2066..2067 "="1298 WHITESPACE@2067..2068 " "1299 EXPR_APPLY@2068..20831300 EXPR_INDEX@2068..20781301 EXPR_VAR@2068..20711302 NAME@2068..20711303 IDENT@2068..2071 "std"1304 DOT@2071..2072 "."1305 NAME@2072..20781306 IDENT@2072..2078 "length"1307 ARGS_DESC@2078..20831308 L_PAREN@2078..2079 "("1309 ARG@2079..20821310 EXPR_VAR@2079..20821311 NAME@2079..20821312 IDENT@2079..2082 "str"1313 R_PAREN@2082..2083 ")"1314 SEMI@2083..2084 ";"1315 WHITESPACE@2084..2089 "\n "1316 EXPR_IF_THEN_ELSE@2089..22021317 IF_KW@2089..2091 "if"1318 WHITESPACE@2091..2092 " "1319 EXPR_BINARY@2092..21341320 LHS_EXPR@2092..20991321 EXPR_BINARY@2092..20991322 LHS_EXPR@2092..20951323 EXPR_VAR@2092..20951324 NAME@2092..20951325 IDENT@2092..2095 "len"1326 WHITESPACE@2095..2096 " "1327 GT@2096..2097 ">"1328 WHITESPACE@2097..2098 " "1329 EXPR_NUMBER@2098..20991330 FLOAT@2098..2099 "0"1331 WHITESPACE@2099..2100 " "1332 AND@2100..2102 "&&"1333 WHITESPACE@2102..2103 " "1334 EXPR_APPLY@2103..21341335 EXPR_INDEX@2103..21131336 EXPR_VAR@2103..21061337 NAME@2103..21061338 IDENT@2103..2106 "std"1339 DOT@2106..2107 "."1340 NAME@2107..21131341 IDENT@2107..2113 "member"1342 ARGS_DESC@2113..21341343 L_PAREN@2113..2114 "("1344 ARG@2114..21191345 EXPR_VAR@2114..21191346 NAME@2114..21191347 IDENT@2114..2119 "chars"1348 COMMA@2119..2120 ","1349 WHITESPACE@2120..2121 " "1350 ARG@2121..21331351 EXPR_INDEX_EXPR@2121..21331352 LHS_EXPR@2121..21241353 EXPR_VAR@2121..21241354 NAME@2121..21241355 IDENT@2121..2124 "str"1356 L_BRACK@2124..2125 "["1357 EXPR_BINARY@2125..21321358 LHS_EXPR@2125..21281359 EXPR_VAR@2125..21281360 NAME@2125..21281361 IDENT@2125..2128 "len"1362 WHITESPACE@2128..2129 " "1363 MINUS@2129..2130 "-"1364 WHITESPACE@2130..2131 " "1365 EXPR_NUMBER@2131..21321366 FLOAT@2131..2132 "1"1367 R_BRACK@2132..2133 "]"1368 R_PAREN@2133..2134 ")"1369 WHITESPACE@2134..2135 " "1370 THEN_KW@2135..2139 "then"1371 WHITESPACE@2139..2146 "\n "1372 TRUE_EXPR@2146..21831373 EXPR_APPLY@2146..21831374 EXPR_INDEX@2146..21611375 EXPR_VAR@2146..21491376 NAME@2146..21491377 IDENT@2146..2149 "std"1378 DOT@2149..2150 "."1379 NAME@2150..21611380 IDENT@2150..2161 "rstripChars"1381 ARGS_DESC@2161..21831382 L_PAREN@2161..2162 "("1383 ARG@2162..21751384 EXPR_SLICE@2162..21751385 EXPR_VAR@2162..21651386 NAME@2162..21651387 IDENT@2162..2165 "str"1388 SLICE_DESC@2165..21751389 L_BRACK@2165..2166 "["1390 COLON@2166..2167 ":"1391 SLICE_DESC_END@2167..21741392 EXPR_BINARY@2167..21741393 LHS_EXPR@2167..21701394 EXPR_VAR@2167..21701395 NAME@2167..21701396 IDENT@2167..2170 "len"1397 WHITESPACE@2170..2171 " "1398 MINUS@2171..2172 "-"1399 WHITESPACE@2172..2173 " "1400 EXPR_NUMBER@2173..21741401 FLOAT@2173..2174 "1"1402 R_BRACK@2174..2175 "]"1403 COMMA@2175..2176 ","1404 WHITESPACE@2176..2177 " "1405 ARG@2177..21821406 EXPR_VAR@2177..21821407 NAME@2177..21821408 IDENT@2177..2182 "chars"1409 R_PAREN@2182..2183 ")"1410 WHITESPACE@2183..2188 "\n "1411 ELSE_KW@2188..2192 "else"1412 WHITESPACE@2192..2199 "\n "1413 FALSE_EXPR@2199..22021414 EXPR_VAR@2199..22021415 NAME@2199..22021416 IDENT@2199..2202 "str"1417 COMMA@2202..2203 ","1418 WHITESPACE@2203..2207 "\n\n "1419 MEMBER_FIELD@2207..22871420 FIELD_METHOD@2207..22871421 FIELD_NAME_FIXED@2207..22171422 NAME@2207..22171423 IDENT@2207..2217 "stripChars"1424 PARAMS_DESC@2217..22291425 L_PAREN@2217..2218 "("1426 PARAM@2218..22211427 DESTRUCT_FULL@2218..22211428 NAME@2218..22211429 IDENT@2218..2221 "str"1430 COMMA@2221..2222 ","1431 WHITESPACE@2222..2223 " "1432 PARAM@2223..22281433 DESTRUCT_FULL@2223..22281434 NAME@2223..22281435 IDENT@2223..2228 "chars"1436 R_PAREN@2228..2229 ")"1437 COLONCOLON@2229..2231 "::"1438 WHITESPACE@2231..2236 "\n "1439 EXPR_APPLY@2236..22871440 EXPR_INDEX@2236..22511441 EXPR_VAR@2236..22391442 NAME@2236..22391443 IDENT@2236..2239 "std"1444 DOT@2239..2240 "."1445 NAME@2240..22511446 IDENT@2240..2251 "lstripChars"1447 ARGS_DESC@2251..22871448 L_PAREN@2251..2252 "("1449 ARG@2252..22791450 EXPR_APPLY@2252..22791451 EXPR_INDEX@2252..22671452 EXPR_VAR@2252..22551453 NAME@2252..22551454 IDENT@2252..2255 "std"1455 DOT@2255..2256 "."1456 NAME@2256..22671457 IDENT@2256..2267 "rstripChars"1458 ARGS_DESC@2267..22791459 L_PAREN@2267..2268 "("1460 ARG@2268..22711461 EXPR_VAR@2268..22711462 NAME@2268..22711463 IDENT@2268..2271 "str"1464 COMMA@2271..2272 ","1465 WHITESPACE@2272..2273 " "1466 ARG@2273..22781467 EXPR_VAR@2273..22781468 NAME@2273..22781469 IDENT@2273..2278 "chars"1470 R_PAREN@2278..2279 ")"1471 COMMA@2279..2280 ","1472 WHITESPACE@2280..2281 " "1473 ARG@2281..22861474 EXPR_VAR@2281..22861475 NAME@2281..22861476 IDENT@2281..2286 "chars"1477 R_PAREN@2286..2287 ")"1478 COMMA@2287..2288 ","1479 WHITESPACE@2288..2292 "\n\n "1480 MEMBER_FIELD@2292..23651481 FIELD_METHOD@2292..23651482 FIELD_NAME_FIXED@2292..23031483 NAME@2292..23031484 IDENT@2292..2303 "stringChars"1485 PARAMS_DESC@2303..23081486 L_PAREN@2303..2304 "("1487 PARAM@2304..23071488 DESTRUCT_FULL@2304..23071489 NAME@2304..23071490 IDENT@2304..2307 "str"1491 R_PAREN@2307..2308 ")"1492 COLONCOLON@2308..2310 "::"1493 WHITESPACE@2310..2315 "\n "1494 EXPR_APPLY@2315..23651495 EXPR_INDEX@2315..23281496 EXPR_VAR@2315..23181497 NAME@2315..23181498 IDENT@2315..2318 "std"1499 DOT@2318..2319 "."1500 NAME@2319..23281501 IDENT@2319..2328 "makeArray"1502 ARGS_DESC@2328..23651503 L_PAREN@2328..2329 "("1504 ARG@2329..23441505 EXPR_APPLY@2329..23441506 EXPR_INDEX@2329..23391507 EXPR_VAR@2329..23321508 NAME@2329..23321509 IDENT@2329..2332 "std"1510 DOT@2332..2333 "."1511 NAME@2333..23391512 IDENT@2333..2339 "length"1513 ARGS_DESC@2339..23441514 L_PAREN@2339..2340 "("1515 ARG@2340..23431516 EXPR_VAR@2340..23431517 NAME@2340..23431518 IDENT@2340..2343 "str"1519 R_PAREN@2343..2344 ")"1520 COMMA@2344..2345 ","1521 WHITESPACE@2345..2346 " "1522 ARG@2346..23641523 EXPR_FUNCTION@2346..23641524 FUNCTION_KW@2346..2354 "function"1525 PARAMS_DESC@2354..23571526 L_PAREN@2354..2355 "("1527 PARAM@2355..23561528 DESTRUCT_FULL@2355..23561529 NAME@2355..23561530 IDENT@2355..2356 "i"1531 R_PAREN@2356..2357 ")"1532 WHITESPACE@2357..2358 " "1533 EXPR_INDEX_EXPR@2358..23641534 LHS_EXPR@2358..23611535 EXPR_VAR@2358..23611536 NAME@2358..23611537 IDENT@2358..2361 "str"1538 L_BRACK@2361..2362 "["1539 EXPR_VAR@2362..23631540 NAME@2362..23631541 IDENT@2362..2363 "i"1542 R_BRACK@2363..2364 "]"1543 R_PAREN@2364..2365 ")"1544 COMMA@2365..2366 ","1545 WHITESPACE@2366..2370 "\n\n "1546 MEMBER_BIND_STMT@2370..30861547 OBJ_LOCAL@2370..30861548 LOCAL_KW@2370..2375 "local"1549 WHITESPACE@2375..2376 " "1550 BIND_FUNCTION@2376..30861551 NAME@2376..23851552 IDENT@2376..2385 "parse_nat"1553 PARAMS_DESC@2385..23961554 L_PAREN@2385..2386 "("1555 PARAM@2386..23891556 DESTRUCT_FULL@2386..23891557 NAME@2386..23891558 IDENT@2386..2389 "str"1559 COMMA@2389..2390 ","1560 WHITESPACE@2390..2391 " "1561 PARAM@2391..23951562 DESTRUCT_FULL@2391..23951563 NAME@2391..23951564 IDENT@2391..2395 "base"1565 R_PAREN@2395..2396 ")"1566 WHITESPACE@2396..2397 " "1567 ASSIGN@2397..2398 "="1568 WHITESPACE@2398..2403 "\n "1569 EXPR_ASSERT@2403..30861570 ASSERTION@2403..24671571 ASSERT_KW@2403..2409 "assert"1572 WHITESPACE@2409..2410 " "1573 LHS_EXPR@2410..24321574 EXPR_BINARY@2410..24321575 LHS_EXPR@2410..24181576 EXPR_BINARY@2410..24181577 LHS_EXPR@2410..24141578 EXPR_VAR@2410..24141579 NAME@2410..24141580 IDENT@2410..2414 "base"1581 WHITESPACE@2414..2415 " "1582 GT@2415..2416 ">"1583 WHITESPACE@2416..2417 " "1584 EXPR_NUMBER@2417..24181585 FLOAT@2417..2418 "0"1586 WHITESPACE@2418..2419 " "1587 AND@2419..2421 "&&"1588 WHITESPACE@2421..2422 " "1589 EXPR_BINARY@2422..24321590 LHS_EXPR@2422..24261591 EXPR_VAR@2422..24261592 NAME@2422..24261593 IDENT@2422..2426 "base"1594 WHITESPACE@2426..2427 " "1595 LE@2427..2429 "<="1596 WHITESPACE@2429..2430 " "1597 EXPR_NUMBER@2430..24321598 FLOAT@2430..2432 "16"1599 WHITESPACE@2432..2433 " "1600 COLON@2433..2434 ":"1601 WHITESPACE@2434..2435 " "1602 EXPR_BINARY@2435..24671603 LHS_EXPR@2435..24601604 EXPR_STRING@2435..24601605 STRING_SINGLE@2435..2460 "'integer base %d inva ..."1606 WHITESPACE@2460..2461 " "1607 MODULO@2461..2462 "%"1608 WHITESPACE@2462..2463 " "1609 EXPR_VAR@2463..24671610 NAME@2463..24671611 IDENT@2463..2467 "base"1612 SEMI@2467..2468 ";"1613 WHITESPACE@2468..2473 "\n "1614 SINGLE_LINE_SLASH_COMMENT@2473..2517 "// These codepoints a ..."1615 WHITESPACE@2517..2521 " "1616 EXPR_LOCAL@2521..30861617 LOCAL_KW@2521..2526 "local"1618 WHITESPACE@2526..2527 " "1619 BIND_DESTRUCT@2527..25571620 DESTRUCT_FULL@2527..25361621 NAME@2527..25361622 IDENT@2527..2536 "zero_code"1623 WHITESPACE@2536..2537 " "1624 ASSIGN@2537..2538 "="1625 WHITESPACE@2538..2539 " "1626 EXPR_APPLY@2539..25571627 EXPR_INDEX@2539..25521628 EXPR_VAR@2539..25421629 NAME@2539..25421630 IDENT@2539..2542 "std"1631 DOT@2542..2543 "."1632 NAME@2543..25521633 IDENT@2543..2552 "codepoint"1634 ARGS_DESC@2552..25571635 L_PAREN@2552..2553 "("1636 ARG@2553..25561637 EXPR_STRING@2553..25561638 STRING_SINGLE@2553..2556 "'0'"1639 R_PAREN@2556..2557 ")"1640 SEMI@2557..2558 ";"1641 WHITESPACE@2558..2563 "\n "1642 EXPR_LOCAL@2563..30861643 LOCAL_KW@2563..2568 "local"1644 WHITESPACE@2568..2569 " "1645 BIND_DESTRUCT@2569..26021646 DESTRUCT_FULL@2569..25811647 NAME@2569..25811648 IDENT@2569..2581 "upper_a_code"1649 WHITESPACE@2581..2582 " "1650 ASSIGN@2582..2583 "="1651 WHITESPACE@2583..2584 " "1652 EXPR_APPLY@2584..26021653 EXPR_INDEX@2584..25971654 EXPR_VAR@2584..25871655 NAME@2584..25871656 IDENT@2584..2587 "std"1657 DOT@2587..2588 "."1658 NAME@2588..25971659 IDENT@2588..2597 "codepoint"1660 ARGS_DESC@2597..26021661 L_PAREN@2597..2598 "("1662 ARG@2598..26011663 EXPR_STRING@2598..26011664 STRING_SINGLE@2598..2601 "'A'"1665 R_PAREN@2601..2602 ")"1666 SEMI@2602..2603 ";"1667 WHITESPACE@2603..2608 "\n "1668 EXPR_LOCAL@2608..30861669 LOCAL_KW@2608..2613 "local"1670 WHITESPACE@2613..2614 " "1671 BIND_DESTRUCT@2614..26471672 DESTRUCT_FULL@2614..26261673 NAME@2614..26261674 IDENT@2614..2626 "lower_a_code"1675 WHITESPACE@2626..2627 " "1676 ASSIGN@2627..2628 "="1677 WHITESPACE@2628..2629 " "1678 EXPR_APPLY@2629..26471679 EXPR_INDEX@2629..26421680 EXPR_VAR@2629..26321681 NAME@2629..26321682 IDENT@2629..2632 "std"1683 DOT@2632..2633 "."1684 NAME@2633..26421685 IDENT@2633..2642 "codepoint"1686 ARGS_DESC@2642..26471687 L_PAREN@2642..2643 "("1688 ARG@2643..26461689 EXPR_STRING@2643..26461690 STRING_SINGLE@2643..2646 "'a'"1691 R_PAREN@2646..2647 ")"1692 SEMI@2647..2648 ";"1693 WHITESPACE@2648..2653 "\n "1694 EXPR_LOCAL@2653..30861695 LOCAL_KW@2653..2658 "local"1696 WHITESPACE@2658..2659 " "1697 BIND_FUNCTION@2659..30361698 NAME@2659..26671699 IDENT@2659..2667 "addDigit"1700 PARAMS_DESC@2667..26841701 L_PAREN@2667..2668 "("1702 PARAM@2668..26771703 DESTRUCT_FULL@2668..26771704 NAME@2668..26771705 IDENT@2668..2677 "aggregate"1706 COMMA@2677..2678 ","1707 WHITESPACE@2678..2679 " "1708 PARAM@2679..26831709 DESTRUCT_FULL@2679..26831710 NAME@2679..26831711 IDENT@2679..2683 "char"1712 R_PAREN@2683..2684 ")"1713 WHITESPACE@2684..2685 " "1714 ASSIGN@2685..2686 "="1715 WHITESPACE@2686..2693 "\n "1716 EXPR_LOCAL@2693..30361717 LOCAL_KW@2693..2698 "local"1718 WHITESPACE@2698..2699 " "1719 BIND_DESTRUCT@2699..27251720 DESTRUCT_FULL@2699..27031721 NAME@2699..27031722 IDENT@2699..2703 "code"1723 WHITESPACE@2703..2704 " "1724 ASSIGN@2704..2705 "="1725 WHITESPACE@2705..2706 " "1726 EXPR_APPLY@2706..27251727 EXPR_INDEX@2706..27191728 EXPR_VAR@2706..27091729 NAME@2706..27091730 IDENT@2706..2709 "std"1731 DOT@2709..2710 "."1732 NAME@2710..27191733 IDENT@2710..2719 "codepoint"1734 ARGS_DESC@2719..27251735 L_PAREN@2719..2720 "("1736 ARG@2720..27241737 EXPR_VAR@2720..27241738 NAME@2720..27241739 IDENT@2720..2724 "char"1740 R_PAREN@2724..2725 ")"1741 SEMI@2725..2726 ";"1742 WHITESPACE@2726..2733 "\n "1743 EXPR_LOCAL@2733..30361744 LOCAL_KW@2733..2738 "local"1745 WHITESPACE@2738..2739 " "1746 BIND_DESTRUCT@2739..29171747 DESTRUCT_FULL@2739..27441748 NAME@2739..27441749 IDENT@2739..2744 "digit"1750 WHITESPACE@2744..2745 " "1751 ASSIGN@2745..2746 "="1752 WHITESPACE@2746..2747 " "1753 EXPR_IF_THEN_ELSE@2747..29171754 IF_KW@2747..2749 "if"1755 WHITESPACE@2749..2750 " "1756 EXPR_BINARY@2750..27701757 LHS_EXPR@2750..27541758 EXPR_VAR@2750..27541759 NAME@2750..27541760 IDENT@2750..2754 "code"1761 WHITESPACE@2754..2755 " "1762 GE@2755..2757 ">="1763 WHITESPACE@2757..2758 " "1764 EXPR_VAR@2758..27701765 NAME@2758..27701766 IDENT@2758..2770 "lower_a_code"1767 WHITESPACE@2770..2771 " "1768 THEN_KW@2771..2775 "then"1769 WHITESPACE@2775..2784 "\n "1770 TRUE_EXPR@2784..28081771 EXPR_BINARY@2784..28081772 LHS_EXPR@2784..28031773 EXPR_BINARY@2784..28031774 LHS_EXPR@2784..27881775 EXPR_VAR@2784..27881776 NAME@2784..27881777 IDENT@2784..2788 "code"1778 WHITESPACE@2788..2789 " "1779 MINUS@2789..2790 "-"1780 WHITESPACE@2790..2791 " "1781 EXPR_VAR@2791..28031782 NAME@2791..28031783 IDENT@2791..2803 "lower_a_code"1784 WHITESPACE@2803..2804 " "1785 PLUS@2804..2805 "+"1786 WHITESPACE@2805..2806 " "1787 EXPR_NUMBER@2806..28081788 FLOAT@2806..2808 "10"1789 WHITESPACE@2808..2815 "\n "1790 ELSE_KW@2815..2819 "else"1791 WHITESPACE@2819..2820 " "1792 FALSE_EXPR@2820..29171793 EXPR_IF_THEN_ELSE@2820..29171794 IF_KW@2820..2822 "if"1795 WHITESPACE@2822..2823 " "1796 EXPR_BINARY@2823..28431797 LHS_EXPR@2823..28271798 EXPR_VAR@2823..28271799 NAME@2823..28271800 IDENT@2823..2827 "code"1801 WHITESPACE@2827..2828 " "1802 GE@2828..2830 ">="1803 WHITESPACE@2830..2831 " "1804 EXPR_VAR@2831..28431805 NAME@2831..28431806 IDENT@2831..2843 "upper_a_code"1807 WHITESPACE@2843..2844 " "1808 THEN_KW@2844..2848 "then"1809 WHITESPACE@2848..2857 "\n "1810 TRUE_EXPR@2857..28811811 EXPR_BINARY@2857..28811812 LHS_EXPR@2857..28761813 EXPR_BINARY@2857..28761814 LHS_EXPR@2857..28611815 EXPR_VAR@2857..28611816 NAME@2857..28611817 IDENT@2857..2861 "code"1818 WHITESPACE@2861..2862 " "1819 MINUS@2862..2863 "-"1820 WHITESPACE@2863..2864 " "1821 EXPR_VAR@2864..28761822 NAME@2864..28761823 IDENT@2864..2876 "upper_a_code"1824 WHITESPACE@2876..2877 " "1825 PLUS@2877..2878 "+"1826 WHITESPACE@2878..2879 " "1827 EXPR_NUMBER@2879..28811828 FLOAT@2879..2881 "10"1829 WHITESPACE@2881..2888 "\n "1830 ELSE_KW@2888..2892 "else"1831 WHITESPACE@2892..2901 "\n "1832 FALSE_EXPR@2901..29171833 EXPR_BINARY@2901..29171834 LHS_EXPR@2901..29051835 EXPR_VAR@2901..29051836 NAME@2901..29051837 IDENT@2901..2905 "code"1838 WHITESPACE@2905..2906 " "1839 MINUS@2906..2907 "-"1840 WHITESPACE@2907..2908 " "1841 EXPR_VAR@2908..29171842 NAME@2908..29171843 IDENT@2908..2917 "zero_code"1844 SEMI@2917..2918 ";"1845 WHITESPACE@2918..2925 "\n "1846 EXPR_ASSERT@2925..30361847 ASSERTION@2925..30041848 ASSERT_KW@2925..2931 "assert"1849 WHITESPACE@2931..2932 " "1850 LHS_EXPR@2932..29581851 EXPR_BINARY@2932..29581852 LHS_EXPR@2932..29421853 EXPR_BINARY@2932..29421854 LHS_EXPR@2932..29371855 EXPR_VAR@2932..29371856 NAME@2932..29371857 IDENT@2932..2937 "digit"1858 WHITESPACE@2937..2938 " "1859 GE@2938..2940 ">="1860 WHITESPACE@2940..2941 " "1861 EXPR_NUMBER@2941..29421862 FLOAT@2941..2942 "0"1863 WHITESPACE@2942..2943 " "1864 AND@2943..2945 "&&"1865 WHITESPACE@2945..2946 " "1866 EXPR_BINARY@2946..29581867 LHS_EXPR@2946..29511868 EXPR_VAR@2946..29511869 NAME@2946..29511870 IDENT@2946..2951 "digit"1871 WHITESPACE@2951..2952 " "1872 LT@2952..2953 "<"1873 WHITESPACE@2953..2954 " "1874 EXPR_VAR@2954..29581875 NAME@2954..29581876 IDENT@2954..2958 "base"1877 WHITESPACE@2958..2959 " "1878 COLON@2959..2960 ":"1879 WHITESPACE@2960..2961 " "1880 EXPR_BINARY@2961..30041881 LHS_EXPR@2961..29901882 EXPR_STRING@2961..29901883 STRING_SINGLE@2961..2990 "'%s is not a base %d ..."1884 WHITESPACE@2990..2991 " "1885 MODULO@2991..2992 "%"1886 WHITESPACE@2992..2993 " "1887 EXPR_ARRAY@2993..30041888 L_BRACK@2993..2994 "["1889 EXPR_VAR@2994..29971890 NAME@2994..29971891 IDENT@2994..2997 "str"1892 COMMA@2997..2998 ","1893 WHITESPACE@2998..2999 " "1894 EXPR_VAR@2999..30031895 NAME@2999..30031896 IDENT@2999..3003 "base"1897 R_BRACK@3003..3004 "]"1898 SEMI@3004..3005 ";"1899 WHITESPACE@3005..3012 "\n "1900 EXPR_BINARY@3012..30361901 LHS_EXPR@3012..30281902 EXPR_BINARY@3012..30281903 LHS_EXPR@3012..30161904 EXPR_VAR@3012..30161905 NAME@3012..30161906 IDENT@3012..3016 "base"1907 WHITESPACE@3016..3017 " "1908 MUL@3017..3018 "*"1909 WHITESPACE@3018..3019 " "1910 EXPR_VAR@3019..30281911 NAME@3019..30281912 IDENT@3019..3028 "aggregate"1913 WHITESPACE@3028..3029 " "1914 PLUS@3029..3030 "+"1915 WHITESPACE@3030..3031 " "1916 EXPR_VAR@3031..30361917 NAME@3031..30361918 IDENT@3031..3036 "digit"1919 SEMI@3036..3037 ";"1920 WHITESPACE@3037..3042 "\n "1921 EXPR_APPLY@3042..30861922 EXPR_INDEX@3042..30511923 EXPR_VAR@3042..30451924 NAME@3042..30451925 IDENT@3042..3045 "std"1926 DOT@3045..3046 "."1927 NAME@3046..30511928 IDENT@3046..3051 "foldl"1929 ARGS_DESC@3051..30861930 L_PAREN@3051..3052 "("1931 ARG@3052..30601932 EXPR_VAR@3052..30601933 NAME@3052..30601934 IDENT@3052..3060 "addDigit"1935 COMMA@3060..3061 ","1936 WHITESPACE@3061..3062 " "1937 ARG@3062..30821938 EXPR_APPLY@3062..30821939 EXPR_INDEX@3062..30771940 EXPR_VAR@3062..30651941 NAME@3062..30651942 IDENT@3062..3065 "std"1943 DOT@3065..3066 "."1944 NAME@3066..30771945 IDENT@3066..3077 "stringChars"1946 ARGS_DESC@3077..30821947 L_PAREN@3077..3078 "("1948 ARG@3078..30811949 EXPR_VAR@3078..30811950 NAME@3078..30811951 IDENT@3078..3081 "str"1952 R_PAREN@3081..3082 ")"1953 COMMA@3082..3083 ","1954 WHITESPACE@3083..3084 " "1955 ARG@3084..30851956 EXPR_NUMBER@3084..30851957 FLOAT@3084..3085 "0"1958 R_PAREN@3085..3086 ")"1959 COMMA@3086..3087 ","1960 WHITESPACE@3087..3091 "\n\n "1961 MEMBER_FIELD@3091..33471962 FIELD_METHOD@3091..33471963 FIELD_NAME_FIXED@3091..30991964 NAME@3091..30991965 IDENT@3091..3099 "parseInt"1966 PARAMS_DESC@3099..31041967 L_PAREN@3099..3100 "("1968 PARAM@3100..31031969 DESTRUCT_FULL@3100..31031970 NAME@3100..31031971 IDENT@3100..3103 "str"1972 R_PAREN@3103..3104 ")"1973 COLONCOLON@3104..3106 "::"1974 WHITESPACE@3106..3111 "\n "1975 EXPR_ASSERT@3111..33471976 ASSERTION@3111..31771977 ASSERT_KW@3111..3117 "assert"1978 WHITESPACE@3117..3118 " "1979 LHS_EXPR@3118..31351980 EXPR_APPLY@3118..31351981 EXPR_INDEX@3118..31301982 EXPR_VAR@3118..31211983 NAME@3118..31211984 IDENT@3118..3121 "std"1985 DOT@3121..3122 "."1986 NAME@3122..31301987 IDENT@3122..3130 "isString"1988 ARGS_DESC@3130..31351989 L_PAREN@3130..3131 "("1990 ARG@3131..31341991 EXPR_VAR@3131..31341992 NAME@3131..31341993 IDENT@3131..3134 "str"1994 R_PAREN@3134..3135 ")"1995 WHITESPACE@3135..3136 " "1996 COLON@3136..3137 ":"1997 WHITESPACE@3137..3138 " "1998 EXPR_BINARY@3138..31771999 LHS_EXPR@3138..31612000 EXPR_STRING@3138..31612001 STRING_SINGLE@3138..3161 "'Expected string, got '"2002 WHITESPACE@3161..3162 " "2003 PLUS@3162..3163 "+"2004 WHITESPACE@3163..3164 " "2005 EXPR_APPLY@3164..31772006 EXPR_INDEX@3164..31722007 EXPR_VAR@3164..31672008 NAME@3164..31672009 IDENT@3164..3167 "std"2010 DOT@3167..3168 "."2011 NAME@3168..31722012 IDENT@3168..3172 "type"2013 ARGS_DESC@3172..31772014 L_PAREN@3172..3173 "("2015 ARG@3173..31762016 EXPR_VAR@3173..31762017 NAME@3173..31762018 IDENT@3173..3176 "str"2019 R_PAREN@3176..3177 ")"2020 SEMI@3177..3178 ";"2021 WHITESPACE@3178..3183 "\n "2022 EXPR_ASSERT@3183..33472023 ASSERTION@3183..32562024 ASSERT_KW@3183..3189 "assert"2025 WHITESPACE@3189..3190 " "2026 LHS_EXPR@3190..32232027 EXPR_BINARY@3190..32232028 LHS_EXPR@3190..32092029 EXPR_BINARY@3190..32092030 LHS_EXPR@3190..32052031 EXPR_APPLY@3190..32052032 EXPR_INDEX@3190..32002033 EXPR_VAR@3190..31932034 NAME@3190..31932035 IDENT@3190..3193 "std"2036 DOT@3193..3194 "."2037 NAME@3194..32002038 IDENT@3194..3200 "length"2039 ARGS_DESC@3200..32052040 L_PAREN@3200..3201 "("2041 ARG@3201..32042042 EXPR_VAR@3201..32042043 NAME@3201..32042044 IDENT@3201..3204 "str"2045 R_PAREN@3204..3205 ")"2046 WHITESPACE@3205..3206 " "2047 GT@3206..3207 ">"2048 WHITESPACE@3207..3208 " "2049 EXPR_NUMBER@3208..32092050 FLOAT@3208..3209 "0"2051 WHITESPACE@3209..3210 " "2052 AND@3210..3212 "&&"2053 WHITESPACE@3212..3213 " "2054 EXPR_BINARY@3213..32232055 LHS_EXPR@3213..32162056 EXPR_VAR@3213..32162057 NAME@3213..32162058 IDENT@3213..3216 "str"2059 WHITESPACE@3216..3217 " "2060 NE@3217..3219 "!="2061 WHITESPACE@3219..3220 " "2062 EXPR_STRING@3220..32232063 STRING_SINGLE@3220..3223 "'-'"2064 WHITESPACE@3223..3224 " "2065 COLON@3224..3225 ":"2066 WHITESPACE@3225..3226 " "2067 EXPR_BINARY@3226..32562068 LHS_EXPR@3226..32482069 EXPR_STRING@3226..32482070 STRING_SINGLE@3226..3248 "'Not an integer: \"%s\"'"2071 WHITESPACE@3248..3249 " "2072 MODULO@3249..3250 "%"2073 WHITESPACE@3250..3251 " "2074 EXPR_ARRAY@3251..32562075 L_BRACK@3251..3252 "["2076 EXPR_VAR@3252..32552077 NAME@3252..32552078 IDENT@3252..3255 "str"2079 R_BRACK@3255..3256 "]"2080 SEMI@3256..3257 ";"2081 WHITESPACE@3257..3262 "\n "2082 EXPR_IF_THEN_ELSE@3262..33472083 IF_KW@3262..3264 "if"2084 WHITESPACE@3264..3265 " "2085 EXPR_BINARY@3265..32782086 LHS_EXPR@3265..32712087 EXPR_INDEX_EXPR@3265..32712088 LHS_EXPR@3265..32682089 EXPR_VAR@3265..32682090 NAME@3265..32682091 IDENT@3265..3268 "str"2092 L_BRACK@3268..3269 "["2093 EXPR_NUMBER@3269..32702094 FLOAT@3269..3270 "0"2095 R_BRACK@3270..3271 "]"2096 WHITESPACE@3271..3272 " "2097 EQ@3272..3274 "=="2098 WHITESPACE@3274..3275 " "2099 EXPR_STRING@3275..32782100 STRING_SINGLE@3275..3278 "'-'"2101 WHITESPACE@3278..3279 " "2102 THEN_KW@3279..3283 "then"2103 WHITESPACE@3283..3290 "\n "2104 TRUE_EXPR@3290..33132105 EXPR_UNARY@3290..33132106 MINUS@3290..3291 "-"2107 EXPR_APPLY@3291..33132108 EXPR_VAR@3291..33002109 NAME@3291..33002110 IDENT@3291..3300 "parse_nat"2111 ARGS_DESC@3300..33132112 L_PAREN@3300..3301 "("2113 ARG@3301..33082114 EXPR_SLICE@3301..33082115 EXPR_VAR@3301..33042116 NAME@3301..33042117 IDENT@3301..3304 "str"2118 SLICE_DESC@3304..33082119 L_BRACK@3304..3305 "["2120 EXPR_NUMBER@3305..33062121 FLOAT@3305..3306 "1"2122 COLON@3306..3307 ":"2123 R_BRACK@3307..3308 "]"2124 COMMA@3308..3309 ","2125 WHITESPACE@3309..3310 " "2126 ARG@3310..33122127 EXPR_NUMBER@3310..33122128 FLOAT@3310..3312 "10"2129 R_PAREN@3312..3313 ")"2130 WHITESPACE@3313..3318 "\n "2131 ELSE_KW@3318..3322 "else"2132 WHITESPACE@3322..3329 "\n "2133 FALSE_EXPR@3329..33472134 EXPR_APPLY@3329..33472135 EXPR_VAR@3329..33382136 NAME@3329..33382137 IDENT@3329..3338 "parse_nat"2138 ARGS_DESC@3338..33472139 L_PAREN@3338..3339 "("2140 ARG@3339..33422141 EXPR_VAR@3339..33422142 NAME@3339..33422143 IDENT@3339..3342 "str"2144 COMMA@3342..3343 ","2145 WHITESPACE@3343..3344 " "2146 ARG@3344..33462147 EXPR_NUMBER@3344..33462148 FLOAT@3344..3346 "10"2149 R_PAREN@3346..3347 ")"2150 COMMA@3347..3348 ","2151 WHITESPACE@3348..3352 "\n\n "2152 MEMBER_FIELD@3352..35232153 FIELD_METHOD@3352..35232154 FIELD_NAME_FIXED@3352..33622155 NAME@3352..33622156 IDENT@3352..3362 "parseOctal"2157 PARAMS_DESC@3362..33672158 L_PAREN@3362..3363 "("2159 PARAM@3363..33662160 DESTRUCT_FULL@3363..33662161 NAME@3363..33662162 IDENT@3363..3366 "str"2163 R_PAREN@3366..3367 ")"2164 COLONCOLON@3367..3369 "::"2165 WHITESPACE@3369..3374 "\n "2166 EXPR_ASSERT@3374..35232167 ASSERTION@3374..34402168 ASSERT_KW@3374..3380 "assert"2169 WHITESPACE@3380..3381 " "2170 LHS_EXPR@3381..33982171 EXPR_APPLY@3381..33982172 EXPR_INDEX@3381..33932173 EXPR_VAR@3381..33842174 NAME@3381..33842175 IDENT@3381..3384 "std"2176 DOT@3384..3385 "."2177 NAME@3385..33932178 IDENT@3385..3393 "isString"2179 ARGS_DESC@3393..33982180 L_PAREN@3393..3394 "("2181 ARG@3394..33972182 EXPR_VAR@3394..33972183 NAME@3394..33972184 IDENT@3394..3397 "str"2185 R_PAREN@3397..3398 ")"2186 WHITESPACE@3398..3399 " "2187 COLON@3399..3400 ":"2188 WHITESPACE@3400..3401 " "2189 EXPR_BINARY@3401..34402190 LHS_EXPR@3401..34242191 EXPR_STRING@3401..34242192 STRING_SINGLE@3401..3424 "'Expected string, got '"2193 WHITESPACE@3424..3425 " "2194 PLUS@3425..3426 "+"2195 WHITESPACE@3426..3427 " "2196 EXPR_APPLY@3427..34402197 EXPR_INDEX@3427..34352198 EXPR_VAR@3427..34302199 NAME@3427..34302200 IDENT@3427..3430 "std"2201 DOT@3430..3431 "."2202 NAME@3431..34352203 IDENT@3431..3435 "type"2204 ARGS_DESC@3435..34402205 L_PAREN@3435..3436 "("2206 ARG@3436..34392207 EXPR_VAR@3436..34392208 NAME@3436..34392209 IDENT@3436..3439 "str"2210 R_PAREN@3439..3440 ")"2211 SEMI@3440..3441 ";"2212 WHITESPACE@3441..3446 "\n "2213 EXPR_ASSERT@3446..35232214 ASSERTION@3446..35002215 ASSERT_KW@3446..3452 "assert"2216 WHITESPACE@3452..3453 " "2217 LHS_EXPR@3453..34722218 EXPR_BINARY@3453..34722219 LHS_EXPR@3453..34682220 EXPR_APPLY@3453..34682221 EXPR_INDEX@3453..34632222 EXPR_VAR@3453..34562223 NAME@3453..34562224 IDENT@3453..3456 "std"2225 DOT@3456..3457 "."2226 NAME@3457..34632227 IDENT@3457..3463 "length"2228 ARGS_DESC@3463..34682229 L_PAREN@3463..3464 "("2230 ARG@3464..34672231 EXPR_VAR@3464..34672232 NAME@3464..34672233 IDENT@3464..3467 "str"2234 R_PAREN@3467..3468 ")"2235 WHITESPACE@3468..3469 " "2236 GT@3469..3470 ">"2237 WHITESPACE@3470..3471 " "2238 EXPR_NUMBER@3471..34722239 FLOAT@3471..3472 "0"2240 WHITESPACE@3472..3473 " "2241 COLON@3473..3474 ":"2242 WHITESPACE@3474..3475 " "2243 EXPR_STRING@3475..35002244 STRING_SINGLE@3475..3500 "'Not an octal number: ..."2245 SEMI@3500..3501 ";"2246 WHITESPACE@3501..3506 "\n "2247 EXPR_APPLY@3506..35232248 EXPR_VAR@3506..35152249 NAME@3506..35152250 IDENT@3506..3515 "parse_nat"2251 ARGS_DESC@3515..35232252 L_PAREN@3515..3516 "("2253 ARG@3516..35192254 EXPR_VAR@3516..35192255 NAME@3516..35192256 IDENT@3516..3519 "str"2257 COMMA@3519..3520 ","2258 WHITESPACE@3520..3521 " "2259 ARG@3521..35222260 EXPR_NUMBER@3521..35222261 FLOAT@3521..3522 "8"2262 R_PAREN@3522..3523 ")"2263 COMMA@3523..3524 ","2264 WHITESPACE@3524..3528 "\n\n "2265 MEMBER_FIELD@3528..36942266 FIELD_METHOD@3528..36942267 FIELD_NAME_FIXED@3528..35362268 NAME@3528..35362269 IDENT@3528..3536 "parseHex"2270 PARAMS_DESC@3536..35412271 L_PAREN@3536..3537 "("2272 PARAM@3537..35402273 DESTRUCT_FULL@3537..35402274 NAME@3537..35402275 IDENT@3537..3540 "str"2276 R_PAREN@3540..3541 ")"2277 COLONCOLON@3541..3543 "::"2278 WHITESPACE@3543..3548 "\n "2279 EXPR_ASSERT@3548..36942280 ASSERTION@3548..36142281 ASSERT_KW@3548..3554 "assert"2282 WHITESPACE@3554..3555 " "2283 LHS_EXPR@3555..35722284 EXPR_APPLY@3555..35722285 EXPR_INDEX@3555..35672286 EXPR_VAR@3555..35582287 NAME@3555..35582288 IDENT@3555..3558 "std"2289 DOT@3558..3559 "."2290 NAME@3559..35672291 IDENT@3559..3567 "isString"2292 ARGS_DESC@3567..35722293 L_PAREN@3567..3568 "("2294 ARG@3568..35712295 EXPR_VAR@3568..35712296 NAME@3568..35712297 IDENT@3568..3571 "str"2298 R_PAREN@3571..3572 ")"2299 WHITESPACE@3572..3573 " "2300 COLON@3573..3574 ":"2301 WHITESPACE@3574..3575 " "2302 EXPR_BINARY@3575..36142303 LHS_EXPR@3575..35982304 EXPR_STRING@3575..35982305 STRING_SINGLE@3575..3598 "'Expected string, got '"2306 WHITESPACE@3598..3599 " "2307 PLUS@3599..3600 "+"2308 WHITESPACE@3600..3601 " "2309 EXPR_APPLY@3601..36142310 EXPR_INDEX@3601..36092311 EXPR_VAR@3601..36042312 NAME@3601..36042313 IDENT@3601..3604 "std"2314 DOT@3604..3605 "."2315 NAME@3605..36092316 IDENT@3605..3609 "type"2317 ARGS_DESC@3609..36142318 L_PAREN@3609..3610 "("2319 ARG@3610..36132320 EXPR_VAR@3610..36132321 NAME@3610..36132322 IDENT@3610..3613 "str"2323 R_PAREN@3613..3614 ")"2324 SEMI@3614..3615 ";"2325 WHITESPACE@3615..3620 "\n "2326 EXPR_ASSERT@3620..36942327 ASSERTION@3620..36702328 ASSERT_KW@3620..3626 "assert"2329 WHITESPACE@3626..3627 " "2330 LHS_EXPR@3627..36462331 EXPR_BINARY@3627..36462332 LHS_EXPR@3627..36422333 EXPR_APPLY@3627..36422334 EXPR_INDEX@3627..36372335 EXPR_VAR@3627..36302336 NAME@3627..36302337 IDENT@3627..3630 "std"2338 DOT@3630..3631 "."2339 NAME@3631..36372340 IDENT@3631..3637 "length"2341 ARGS_DESC@3637..36422342 L_PAREN@3637..3638 "("2343 ARG@3638..36412344 EXPR_VAR@3638..36412345 NAME@3638..36412346 IDENT@3638..3641 "str"2347 R_PAREN@3641..3642 ")"2348 WHITESPACE@3642..3643 " "2349 GT@3643..3644 ">"2350 WHITESPACE@3644..3645 " "2351 EXPR_NUMBER@3645..36462352 FLOAT@3645..3646 "0"2353 WHITESPACE@3646..3647 " "2354 COLON@3647..3648 ":"2355 WHITESPACE@3648..3649 " "2356 EXPR_STRING@3649..36702357 STRING_SINGLE@3649..3670 "'Not hexadecimal: \"\"'"2358 SEMI@3670..3671 ";"2359 WHITESPACE@3671..3676 "\n "2360 EXPR_APPLY@3676..36942361 EXPR_VAR@3676..36852362 NAME@3676..36852363 IDENT@3676..3685 "parse_nat"2364 ARGS_DESC@3685..36942365 L_PAREN@3685..3686 "("2366 ARG@3686..36892367 EXPR_VAR@3686..36892368 NAME@3686..36892369 IDENT@3686..3689 "str"2370 COMMA@3689..3690 ","2371 WHITESPACE@3690..3691 " "2372 ARG@3691..36932373 EXPR_NUMBER@3691..36932374 FLOAT@3691..3693 "16"2375 R_PAREN@3693..3694 ")"2376 COMMA@3694..3695 ","2377 WHITESPACE@3695..3699 "\n\n "2378 MEMBER_FIELD@3699..37412379 FIELD_METHOD@3699..37412380 FIELD_NAME_FIXED@3699..37042381 NAME@3699..37042382 IDENT@3699..3704 "split"2383 PARAMS_DESC@3704..37122384 L_PAREN@3704..3705 "("2385 PARAM@3705..37082386 DESTRUCT_FULL@3705..37082387 NAME@3705..37082388 IDENT@3705..3708 "str"2389 COMMA@3708..3709 ","2390 WHITESPACE@3709..3710 " "2391 PARAM@3710..37112392 DESTRUCT_FULL@3710..37112393 NAME@3710..37112394 IDENT@3710..3711 "c"2395 R_PAREN@3711..3712 ")"2396 COLONCOLON@3712..3714 "::"2397 WHITESPACE@3714..3715 " "2398 EXPR_APPLY@3715..37412399 EXPR_INDEX@3715..37292400 EXPR_VAR@3715..37182401 NAME@3715..37182402 IDENT@3715..3718 "std"2403 DOT@3718..3719 "."2404 NAME@3719..37292405 IDENT@3719..3729 "splitLimit"2406 ARGS_DESC@3729..37412407 L_PAREN@3729..3730 "("2408 ARG@3730..37332409 EXPR_VAR@3730..37332410 NAME@3730..37332411 IDENT@3730..3733 "str"2412 COMMA@3733..3734 ","2413 WHITESPACE@3734..3735 " "2414 ARG@3735..37362415 EXPR_VAR@3735..37362416 NAME@3735..37362417 IDENT@3735..3736 "c"2418 COMMA@3736..3737 ","2419 WHITESPACE@3737..3738 " "2420 ARG@3738..37402421 EXPR_UNARY@3738..37402422 MINUS@3738..3739 "-"2423 EXPR_NUMBER@3739..37402424 FLOAT@3739..3740 "1"2425 R_PAREN@3740..3741 ")"2426 COMMA@3741..3742 ","2427 WHITESPACE@3742..3746 "\n\n "2428 MEMBER_FIELD@3746..37812429 FIELD_NORMAL@3746..37812430 FIELD_NAME_FIXED@3746..37562431 NAME@3746..37562432 IDENT@3746..3756 "splitLimit"2433 COLONCOLON@3756..3758 "::"2434 WHITESPACE@3758..3759 " "2435 EXPR_INTRINSIC@3759..37812436 INTRINSIC@3759..3769 "$intrinsic"2437 L_PAREN@3769..3770 "("2438 NAME@3770..37802439 IDENT@3770..3780 "splitLimit"2440 R_PAREN@3780..3781 ")"2441 COMMA@3781..3782 ","2442 WHITESPACE@3782..3786 "\n\n "2443 MEMBER_FIELD@3786..38212444 FIELD_NORMAL@3786..38212445 FIELD_NAME_FIXED@3786..37962446 NAME@3786..37962447 IDENT@3786..3796 "strReplace"2448 COLONCOLON@3796..3798 "::"2449 WHITESPACE@3798..3799 " "2450 EXPR_INTRINSIC@3799..38212451 INTRINSIC@3799..3809 "$intrinsic"2452 L_PAREN@3809..3810 "("2453 NAME@3810..38202454 IDENT@3810..3820 "strReplace"2455 R_PAREN@3820..3821 ")"2456 COMMA@3821..3822 ","2457 WHITESPACE@3822..3826 "\n\n "2458 MEMBER_FIELD@3826..38612459 FIELD_NORMAL@3826..38612460 FIELD_NAME_FIXED@3826..38362461 NAME@3826..38362462 IDENT@3826..3836 "asciiUpper"2463 COLONCOLON@3836..3838 "::"2464 WHITESPACE@3838..3839 " "2465 EXPR_INTRINSIC@3839..38612466 INTRINSIC@3839..3849 "$intrinsic"2467 L_PAREN@3849..3850 "("2468 NAME@3850..38602469 IDENT@3850..3860 "asciiUpper"2470 R_PAREN@3860..3861 ")"2471 COMMA@3861..3862 ","2472 WHITESPACE@3862..3866 "\n\n "2473 MEMBER_FIELD@3866..39012474 FIELD_NORMAL@3866..39012475 FIELD_NAME_FIXED@3866..38762476 NAME@3866..38762477 IDENT@3866..3876 "asciiLower"2478 COLONCOLON@3876..3878 "::"2479 WHITESPACE@3878..3879 " "2480 EXPR_INTRINSIC@3879..39012481 INTRINSIC@3879..3889 "$intrinsic"2482 L_PAREN@3889..3890 "("2483 NAME@3890..39002484 IDENT@3890..3900 "asciiLower"2485 R_PAREN@3900..3901 ")"2486 COMMA@3901..3902 ","2487 WHITESPACE@3902..3906 "\n\n "2488 MEMBER_FIELD@3906..39312489 FIELD_NORMAL@3906..39312490 FIELD_NAME_FIXED@3906..39112491 NAME@3906..39112492 IDENT@3906..3911 "range"2493 COLONCOLON@3911..3913 "::"2494 WHITESPACE@3913..3914 " "2495 EXPR_INTRINSIC@3914..39312496 INTRINSIC@3914..3924 "$intrinsic"2497 L_PAREN@3924..3925 "("2498 NAME@3925..39302499 IDENT@3925..3930 "range"2500 R_PAREN@3930..3931 ")"2501 COMMA@3931..3932 ","2502 WHITESPACE@3932..3936 "\n\n "2503 MEMBER_FIELD@3936..41882504 FIELD_METHOD@3936..41882505 FIELD_NAME_FIXED@3936..39422506 NAME@3936..39422507 IDENT@3936..3942 "repeat"2508 PARAMS_DESC@3942..39552509 L_PAREN@3942..3943 "("2510 PARAM@3943..39472511 DESTRUCT_FULL@3943..39472512 NAME@3943..39472513 IDENT@3943..3947 "what"2514 COMMA@3947..3948 ","2515 WHITESPACE@3948..3949 " "2516 PARAM@3949..39542517 DESTRUCT_FULL@3949..39542518 NAME@3949..39542519 IDENT@3949..3954 "count"2520 R_PAREN@3954..3955 ")"2521 COLONCOLON@3955..3957 "::"2522 WHITESPACE@3957..3962 "\n "2523 EXPR_LOCAL@3962..41882524 LOCAL_KW@3962..3967 "local"2525 WHITESPACE@3967..3968 " "2526 BIND_DESTRUCT@3968..41262527 DESTRUCT_FULL@3968..39742528 NAME@3968..39742529 IDENT@3968..3974 "joiner"2530 WHITESPACE@3974..3975 " "2531 ASSIGN@3975..3976 "="2532 WHITESPACE@3976..3983 "\n "2533 EXPR_IF_THEN_ELSE@3983..41262534 IF_KW@3983..3985 "if"2535 WHITESPACE@3985..3986 " "2536 EXPR_APPLY@3986..40042537 EXPR_INDEX@3986..39982538 EXPR_VAR@3986..39892539 NAME@3986..39892540 IDENT@3986..3989 "std"2541 DOT@3989..3990 "."2542 NAME@3990..39982543 IDENT@3990..3998 "isString"2544 ARGS_DESC@3998..40042545 L_PAREN@3998..3999 "("2546 ARG@3999..40032547 EXPR_VAR@3999..40032548 NAME@3999..40032549 IDENT@3999..4003 "what"2550 R_PAREN@4003..4004 ")"2551 WHITESPACE@4004..4005 " "2552 THEN_KW@4005..4009 "then"2553 WHITESPACE@4009..4010 " "2554 TRUE_EXPR@4010..40122555 EXPR_STRING@4010..40122556 STRING_SINGLE@4010..4012 "''"2557 WHITESPACE@4012..4019 "\n "2558 ELSE_KW@4019..4023 "else"2559 WHITESPACE@4023..4024 " "2560 FALSE_EXPR@4024..41262561 EXPR_IF_THEN_ELSE@4024..41262562 IF_KW@4024..4026 "if"2563 WHITESPACE@4026..4027 " "2564 EXPR_APPLY@4027..40442565 EXPR_INDEX@4027..40382566 EXPR_VAR@4027..40302567 NAME@4027..40302568 IDENT@4027..4030 "std"2569 DOT@4030..4031 "."2570 NAME@4031..40382571 IDENT@4031..4038 "isArray"2572 ARGS_DESC@4038..40442573 L_PAREN@4038..4039 "("2574 ARG@4039..40432575 EXPR_VAR@4039..40432576 NAME@4039..40432577 IDENT@4039..4043 "what"2578 R_PAREN@4043..4044 ")"2579 WHITESPACE@4044..4045 " "2580 THEN_KW@4045..4049 "then"2581 WHITESPACE@4049..4050 " "2582 TRUE_EXPR@4050..40522583 EXPR_ARRAY@4050..40522584 L_BRACK@4050..4051 "["2585 R_BRACK@4051..4052 "]"2586 WHITESPACE@4052..4059 "\n "2587 ELSE_KW@4059..4063 "else"2588 WHITESPACE@4063..4064 " "2589 FALSE_EXPR@4064..41262590 EXPR_ERROR@4064..41262591 ERROR_KW@4064..4069 "error"2592 WHITESPACE@4069..4070 " "2593 EXPR_STRING@4070..41262594 STRING_SINGLE@4070..4126 "'std.repeat first arg ..."2595 SEMI@4126..4127 ";"2596 WHITESPACE@4127..4132 "\n "2597 EXPR_APPLY@4132..41882598 EXPR_INDEX@4132..41402599 EXPR_VAR@4132..41352600 NAME@4132..41352601 IDENT@4132..4135 "std"2602 DOT@4135..4136 "."2603 NAME@4136..41402604 IDENT@4136..4140 "join"2605 ARGS_DESC@4140..41882606 L_PAREN@4140..4141 "("2607 ARG@4141..41472608 EXPR_VAR@4141..41472609 NAME@4141..41472610 IDENT@4141..4147 "joiner"2611 COMMA@4147..4148 ","2612 WHITESPACE@4148..4149 " "2613 ARG@4149..41872614 EXPR_APPLY@4149..41872615 EXPR_INDEX@4149..41622616 EXPR_VAR@4149..41522617 NAME@4149..41522618 IDENT@4149..4152 "std"2619 DOT@4152..4153 "."2620 NAME@4153..41622621 IDENT@4153..4162 "makeArray"2622 ARGS_DESC@4162..41872623 L_PAREN@4162..4163 "("2624 ARG@4163..41682625 EXPR_VAR@4163..41682626 NAME@4163..41682627 IDENT@4163..4168 "count"2628 COMMA@4168..4169 ","2629 WHITESPACE@4169..4170 " "2630 ARG@4170..41862631 EXPR_FUNCTION@4170..41862632 FUNCTION_KW@4170..4178 "function"2633 PARAMS_DESC@4178..41812634 L_PAREN@4178..4179 "("2635 PARAM@4179..41802636 DESTRUCT_FULL@4179..41802637 NAME@4179..41802638 IDENT@4179..4180 "i"2639 R_PAREN@4180..4181 ")"2640 WHITESPACE@4181..4182 " "2641 EXPR_VAR@4182..41862642 NAME@4182..41862643 IDENT@4182..4186 "what"2644 R_PAREN@4186..4187 ")"2645 R_PAREN@4187..4188 ")"2646 COMMA@4188..4189 ","2647 WHITESPACE@4189..4193 "\n\n "2648 MEMBER_FIELD@4193..42182649 FIELD_NORMAL@4193..42182650 FIELD_NAME_FIXED@4193..41982651 NAME@4193..41982652 IDENT@4193..4198 "slice"2653 COLONCOLON@4198..4200 "::"2654 WHITESPACE@4200..4201 " "2655 EXPR_INTRINSIC@4201..42182656 INTRINSIC@4201..4211 "$intrinsic"2657 L_PAREN@4211..4212 "("2658 NAME@4212..42172659 IDENT@4212..4217 "slice"2660 R_PAREN@4217..4218 ")"2661 COMMA@4218..4219 ","2662 WHITESPACE@4219..4223 "\n\n "2663 MEMBER_FIELD@4223..42502664 FIELD_NORMAL@4223..42502665 FIELD_NAME_FIXED@4223..42292666 NAME@4223..42292667 IDENT@4223..4229 "member"2668 COLONCOLON@4229..4231 "::"2669 WHITESPACE@4231..4232 " "2670 EXPR_INTRINSIC@4232..42502671 INTRINSIC@4232..4242 "$intrinsic"2672 L_PAREN@4242..4243 "("2673 NAME@4243..42492674 IDENT@4243..4249 "member"2675 R_PAREN@4249..4250 ")"2676 COMMA@4250..4251 ","2677 WHITESPACE@4251..4255 "\n\n "2678 MEMBER_FIELD@4255..42802679 FIELD_NORMAL@4255..42802680 FIELD_NAME_FIXED@4255..42602681 NAME@4255..42602682 IDENT@4255..4260 "count"2683 COLONCOLON@4260..4262 "::"2684 WHITESPACE@4262..4263 " "2685 EXPR_INTRINSIC@4263..42802686 INTRINSIC@4263..4273 "$intrinsic"2687 L_PAREN@4273..4274 "("2688 NAME@4274..42792689 IDENT@4274..4279 "count"2690 R_PAREN@4279..4280 ")"2691 COMMA@4280..4281 ","2692 WHITESPACE@4281..4285 "\n\n "2693 MEMBER_FIELD@4285..43062694 FIELD_NORMAL@4285..43062695 FIELD_NAME_FIXED@4285..42882696 NAME@4285..42882697 IDENT@4285..4288 "mod"2698 COLONCOLON@4288..4290 "::"2699 WHITESPACE@4290..4291 " "2700 EXPR_INTRINSIC@4291..43062701 INTRINSIC@4291..4301 "$intrinsic"2702 L_PAREN@4301..4302 "("2703 NAME@4302..43052704 IDENT@4302..4305 "mod"2705 R_PAREN@4305..4306 ")"2706 COMMA@4306..4307 ","2707 WHITESPACE@4307..4311 "\n\n "2708 MEMBER_FIELD@4311..43322709 FIELD_NORMAL@4311..43322710 FIELD_NAME_FIXED@4311..43142711 NAME@4311..43142712 IDENT@4311..4314 "map"2713 COLONCOLON@4314..4316 "::"2714 WHITESPACE@4316..4317 " "2715 EXPR_INTRINSIC@4317..43322716 INTRINSIC@4317..4327 "$intrinsic"2717 L_PAREN@4327..4328 "("2718 NAME@4328..43312719 IDENT@4328..4331 "map"2720 R_PAREN@4331..4332 ")"2721 COMMA@4332..4333 ","2722 WHITESPACE@4333..4337 "\n\n "2723 MEMBER_FIELD@4337..46952724 FIELD_METHOD@4337..46952725 FIELD_NAME_FIXED@4337..43492726 NAME@4337..43492727 IDENT@4337..4349 "mapWithIndex"2728 PARAMS_DESC@4349..43602729 L_PAREN@4349..4350 "("2730 PARAM@4350..43542731 DESTRUCT_FULL@4350..43542732 NAME@4350..43542733 IDENT@4350..4354 "func"2734 COMMA@4354..4355 ","2735 WHITESPACE@4355..4356 " "2736 PARAM@4356..43592737 DESTRUCT_FULL@4356..43592738 NAME@4356..43592739 IDENT@4356..4359 "arr"2740 R_PAREN@4359..4360 ")"2741 COLONCOLON@4360..4362 "::"2742 WHITESPACE@4362..4367 "\n "2743 EXPR_IF_THEN_ELSE@4367..46952744 IF_KW@4367..4369 "if"2745 WHITESPACE@4369..4370 " "2746 EXPR_UNARY@4370..43912747 NOT@4370..4371 "!"2748 EXPR_APPLY@4371..43912749 EXPR_INDEX@4371..43852750 EXPR_VAR@4371..43742751 NAME@4371..43742752 IDENT@4371..4374 "std"2753 DOT@4374..4375 "."2754 NAME@4375..43852755 IDENT@4375..4385 "isFunction"2756 ARGS_DESC@4385..43912757 L_PAREN@4385..4386 "("2758 ARG@4386..43902759 EXPR_VAR@4386..43902760 NAME@4386..43902761 IDENT@4386..4390 "func"2762 R_PAREN@4390..4391 ")"2763 WHITESPACE@4391..4392 " "2764 THEN_KW@4392..4396 "then"2765 WHITESPACE@4396..4403 "\n "2766 TRUE_EXPR@4403..44812767 EXPR_ERROR@4403..44812768 ERROR_KW@4403..4408 "error"2769 WHITESPACE@4408..4409 " "2770 EXPR_PARENED@4409..44812771 L_PAREN@4409..4410 "("2772 EXPR_BINARY@4410..44802773 LHS_EXPR@4410..44632774 EXPR_STRING@4410..44632775 STRING_SINGLE@4410..4463 "'std.mapWithIndex fir ..."2776 WHITESPACE@4463..4464 " "2777 PLUS@4464..4465 "+"2778 WHITESPACE@4465..4466 " "2779 EXPR_APPLY@4466..44802780 EXPR_INDEX@4466..44742781 EXPR_VAR@4466..44692782 NAME@4466..44692783 IDENT@4466..4469 "std"2784 DOT@4469..4470 "."2785 NAME@4470..44742786 IDENT@4470..4474 "type"2787 ARGS_DESC@4474..44802788 L_PAREN@4474..4475 "("2789 ARG@4475..44792790 EXPR_VAR@4475..44792791 NAME@4475..44792792 IDENT@4475..4479 "func"2793 R_PAREN@4479..4480 ")"2794 R_PAREN@4480..4481 ")"2795 WHITESPACE@4481..4486 "\n "2796 ELSE_KW@4486..4490 "else"2797 WHITESPACE@4490..4491 " "2798 FALSE_EXPR@4491..46952799 EXPR_IF_THEN_ELSE@4491..46952800 IF_KW@4491..4493 "if"2801 WHITESPACE@4493..4494 " "2802 EXPR_BINARY@4494..45332803 LHS_EXPR@4494..45112804 EXPR_UNARY@4494..45112805 NOT@4494..4495 "!"2806 EXPR_APPLY@4495..45112807 EXPR_INDEX@4495..45062808 EXPR_VAR@4495..44982809 NAME@4495..44982810 IDENT@4495..4498 "std"2811 DOT@4498..4499 "."2812 NAME@4499..45062813 IDENT@4499..4506 "isArray"2814 ARGS_DESC@4506..45112815 L_PAREN@4506..4507 "("2816 ARG@4507..45102817 EXPR_VAR@4507..45102818 NAME@4507..45102819 IDENT@4507..4510 "arr"2820 R_PAREN@4510..4511 ")"2821 WHITESPACE@4511..4512 " "2822 AND@4512..4514 "&&"2823 WHITESPACE@4514..4515 " "2824 EXPR_UNARY@4515..45332825 NOT@4515..4516 "!"2826 EXPR_APPLY@4516..45332827 EXPR_INDEX@4516..45282828 EXPR_VAR@4516..45192829 NAME@4516..45192830 IDENT@4516..4519 "std"2831 DOT@4519..4520 "."2832 NAME@4520..45282833 IDENT@4520..4528 "isString"2834 ARGS_DESC@4528..45332835 L_PAREN@4528..4529 "("2836 ARG@4529..45322837 EXPR_VAR@4529..45322838 NAME@4529..45322839 IDENT@4529..4532 "arr"2840 R_PAREN@4532..4533 ")"2841 WHITESPACE@4533..4534 " "2842 THEN_KW@4534..4538 "then"2843 WHITESPACE@4538..4545 "\n "2844 TRUE_EXPR@4545..46202845 EXPR_ERROR@4545..46202846 ERROR_KW@4545..4550 "error"2847 WHITESPACE@4550..4551 " "2848 EXPR_PARENED@4551..46202849 L_PAREN@4551..4552 "("2850 EXPR_BINARY@4552..46192851 LHS_EXPR@4552..46032852 EXPR_STRING@4552..46032853 STRING_SINGLE@4552..4603 "'std.mapWithIndex sec ..."2854 WHITESPACE@4603..4604 " "2855 PLUS@4604..4605 "+"2856 WHITESPACE@4605..4606 " "2857 EXPR_APPLY@4606..46192858 EXPR_INDEX@4606..46142859 EXPR_VAR@4606..46092860 NAME@4606..46092861 IDENT@4606..4609 "std"2862 DOT@4609..4610 "."2863 NAME@4610..46142864 IDENT@4610..4614 "type"2865 ARGS_DESC@4614..46192866 L_PAREN@4614..4615 "("2867 ARG@4615..46182868 EXPR_VAR@4615..46182869 NAME@4615..46182870 IDENT@4615..4618 "arr"2871 R_PAREN@4618..4619 ")"2872 R_PAREN@4619..4620 ")"2873 WHITESPACE@4620..4625 "\n "2874 ELSE_KW@4625..4629 "else"2875 WHITESPACE@4629..4636 "\n "2876 FALSE_EXPR@4636..46952877 EXPR_APPLY@4636..46952878 EXPR_INDEX@4636..46492879 EXPR_VAR@4636..46392880 NAME@4636..46392881 IDENT@4636..4639 "std"2882 DOT@4639..4640 "."2883 NAME@4640..46492884 IDENT@4640..4649 "makeArray"2885 ARGS_DESC@4649..46952886 L_PAREN@4649..4650 "("2887 ARG@4650..46652888 EXPR_APPLY@4650..46652889 EXPR_INDEX@4650..46602890 EXPR_VAR@4650..46532891 NAME@4650..46532892 IDENT@4650..4653 "std"2893 DOT@4653..4654 "."2894 NAME@4654..46602895 IDENT@4654..4660 "length"2896 ARGS_DESC@4660..46652897 L_PAREN@4660..4661 "("2898 ARG@4661..46642899 EXPR_VAR@4661..46642900 NAME@4661..46642901 IDENT@4661..4664 "arr"2902 R_PAREN@4664..4665 ")"2903 COMMA@4665..4666 ","2904 WHITESPACE@4666..4667 " "2905 ARG@4667..46942906 EXPR_FUNCTION@4667..46942907 FUNCTION_KW@4667..4675 "function"2908 PARAMS_DESC@4675..46782909 L_PAREN@4675..4676 "("2910 PARAM@4676..46772911 DESTRUCT_FULL@4676..46772912 NAME@4676..46772913 IDENT@4676..4677 "i"2914 R_PAREN@4677..4678 ")"2915 WHITESPACE@4678..4679 " "2916 EXPR_APPLY@4679..46942917 EXPR_VAR@4679..46832918 NAME@4679..46832919 IDENT@4679..4683 "func"2920 ARGS_DESC@4683..46942921 L_PAREN@4683..4684 "("2922 ARG@4684..46852923 EXPR_VAR@4684..46852924 NAME@4684..46852925 IDENT@4684..4685 "i"2926 COMMA@4685..4686 ","2927 WHITESPACE@4686..4687 " "2928 ARG@4687..46932929 EXPR_INDEX_EXPR@4687..46932930 LHS_EXPR@4687..46902931 EXPR_VAR@4687..46902932 NAME@4687..46902933 IDENT@4687..4690 "arr"2934 L_BRACK@4690..4691 "["2935 EXPR_VAR@4691..46922936 NAME@4691..46922937 IDENT@4691..4692 "i"2938 R_BRACK@4692..4693 "]"2939 R_PAREN@4693..4694 ")"2940 R_PAREN@4694..4695 ")"2941 COMMA@4695..4696 ","2942 WHITESPACE@4696..4700 "\n\n "2943 MEMBER_FIELD@4700..50282944 FIELD_METHOD@4700..50282945 FIELD_NAME_FIXED@4700..47102946 NAME@4700..47102947 IDENT@4700..4710 "mapWithKey"2948 PARAMS_DESC@4710..47212949 L_PAREN@4710..4711 "("2950 PARAM@4711..47152951 DESTRUCT_FULL@4711..47152952 NAME@4711..47152953 IDENT@4711..4715 "func"2954 COMMA@4715..4716 ","2955 WHITESPACE@4716..4717 " "2956 PARAM@4717..47202957 DESTRUCT_FULL@4717..47202958 NAME@4717..47202959 IDENT@4717..4720 "obj"2960 R_PAREN@4720..4721 ")"2961 COLONCOLON@4721..4723 "::"2962 WHITESPACE@4723..4728 "\n "2963 EXPR_IF_THEN_ELSE@4728..50282964 IF_KW@4728..4730 "if"2965 WHITESPACE@4730..4731 " "2966 EXPR_UNARY@4731..47522967 NOT@4731..4732 "!"2968 EXPR_APPLY@4732..47522969 EXPR_INDEX@4732..47462970 EXPR_VAR@4732..47352971 NAME@4732..47352972 IDENT@4732..4735 "std"2973 DOT@4735..4736 "."2974 NAME@4736..47462975 IDENT@4736..4746 "isFunction"2976 ARGS_DESC@4746..47522977 L_PAREN@4746..4747 "("2978 ARG@4747..47512979 EXPR_VAR@4747..47512980 NAME@4747..47512981 IDENT@4747..4751 "func"2982 R_PAREN@4751..4752 ")"2983 WHITESPACE@4752..4753 " "2984 THEN_KW@4753..4757 "then"2985 WHITESPACE@4757..4764 "\n "2986 TRUE_EXPR@4764..48402987 EXPR_ERROR@4764..48402988 ERROR_KW@4764..4769 "error"2989 WHITESPACE@4769..4770 " "2990 EXPR_PARENED@4770..48402991 L_PAREN@4770..4771 "("2992 EXPR_BINARY@4771..48392993 LHS_EXPR@4771..48222994 EXPR_STRING@4771..48222995 STRING_SINGLE@4771..4822 "'std.mapWithKey first ..."2996 WHITESPACE@4822..4823 " "2997 PLUS@4823..4824 "+"2998 WHITESPACE@4824..4825 " "2999 EXPR_APPLY@4825..48393000 EXPR_INDEX@4825..48333001 EXPR_VAR@4825..48283002 NAME@4825..48283003 IDENT@4825..4828 "std"3004 DOT@4828..4829 "."3005 NAME@4829..48333006 IDENT@4829..4833 "type"3007 ARGS_DESC@4833..48393008 L_PAREN@4833..4834 "("3009 ARG@4834..48383010 EXPR_VAR@4834..48383011 NAME@4834..48383012 IDENT@4834..4838 "func"3013 R_PAREN@4838..4839 ")"3014 R_PAREN@4839..4840 ")"3015 WHITESPACE@4840..4845 "\n "3016 ELSE_KW@4845..4849 "else"3017 WHITESPACE@4849..4850 " "3018 FALSE_EXPR@4850..50283019 EXPR_IF_THEN_ELSE@4850..50283020 IF_KW@4850..4852 "if"3021 WHITESPACE@4852..4853 " "3022 EXPR_UNARY@4853..48713023 NOT@4853..4854 "!"3024 EXPR_APPLY@4854..48713025 EXPR_INDEX@4854..48663026 EXPR_VAR@4854..48573027 NAME@4854..48573028 IDENT@4854..4857 "std"3029 DOT@4857..4858 "."3030 NAME@4858..48663031 IDENT@4858..4866 "isObject"3032 ARGS_DESC@4866..48713033 L_PAREN@4866..4867 "("3034 ARG@4867..48703035 EXPR_VAR@4867..48703036 NAME@4867..48703037 IDENT@4867..4870 "obj"3038 R_PAREN@4870..4871 ")"3039 WHITESPACE@4871..4872 " "3040 THEN_KW@4872..4876 "then"3041 WHITESPACE@4876..4883 "\n "3042 TRUE_EXPR@4883..49573043 EXPR_ERROR@4883..49573044 ERROR_KW@4883..4888 "error"3045 WHITESPACE@4888..4889 " "3046 EXPR_PARENED@4889..49573047 L_PAREN@4889..4890 "("3048 EXPR_BINARY@4890..49563049 LHS_EXPR@4890..49403050 EXPR_STRING@4890..49403051 STRING_SINGLE@4890..4940 "'std.mapWithKey secon ..."3052 WHITESPACE@4940..4941 " "3053 PLUS@4941..4942 "+"3054 WHITESPACE@4942..4943 " "3055 EXPR_APPLY@4943..49563056 EXPR_INDEX@4943..49513057 EXPR_VAR@4943..49463058 NAME@4943..49463059 IDENT@4943..4946 "std"3060 DOT@4946..4947 "."3061 NAME@4947..49513062 IDENT@4947..4951 "type"3063 ARGS_DESC@4951..49563064 L_PAREN@4951..4952 "("3065 ARG@4952..49553066 EXPR_VAR@4952..49553067 NAME@4952..49553068 IDENT@4952..4955 "obj"3069 R_PAREN@4955..4956 ")"3070 R_PAREN@4956..4957 ")"3071 WHITESPACE@4957..4962 "\n "3072 ELSE_KW@4962..4966 "else"3073 WHITESPACE@4966..4973 "\n "3074 FALSE_EXPR@4973..50283075 EXPR_OBJECT@4973..50283076 OBJ_BODY_MEMBER_LIST@4973..50283077 L_BRACE@4973..4974 "{"3078 WHITESPACE@4974..4975 " "3079 MEMBER_FIELD@4975..50263080 FIELD_NORMAL@4975..49953081 FIELD_NAME_DYNAMIC@4975..49783082 L_BRACK@4975..4976 "["3083 EXPR_VAR@4976..49773084 NAME@4976..49773085 IDENT@4976..4977 "k"3086 R_BRACK@4977..4978 "]"3087 COLON@4978..4979 ":"3088 WHITESPACE@4979..4980 " "3089 EXPR_APPLY@4980..49953090 EXPR_VAR@4980..49843091 NAME@4980..49843092 IDENT@4980..4984 "func"3093 ARGS_DESC@4984..49953094 L_PAREN@4984..4985 "("3095 ARG@4985..49863096 EXPR_VAR@4985..49863097 NAME@4985..49863098 IDENT@4985..4986 "k"3099 COMMA@4986..4987 ","3100 WHITESPACE@4987..4988 " "3101 ARG@4988..49943102 EXPR_INDEX_EXPR@4988..49943103 LHS_EXPR@4988..49913104 EXPR_VAR@4988..49913105 NAME@4988..49913106 IDENT@4988..4991 "obj"3107 L_BRACK@4991..4992 "["3108 EXPR_VAR@4992..49933109 NAME@4992..49933110 IDENT@4992..4993 "k"3111 R_BRACK@4993..4994 "]"3112 R_PAREN@4994..4995 ")"3113 WHITESPACE@4995..4996 " "3114 FOR_SPEC@4996..50263115 FOR_KW@4996..4999 "for"3116 WHITESPACE@4999..5000 " "3117 NAME@5000..50013118 IDENT@5000..5001 "k"3119 WHITESPACE@5001..5002 " "3120 IN_KW@5002..5004 "in"3121 WHITESPACE@5004..5005 " "3122 EXPR_APPLY@5005..50263123 EXPR_INDEX@5005..50213124 EXPR_VAR@5005..50083125 NAME@5005..50083126 IDENT@5005..5008 "std"3127 DOT@5008..5009 "."3128 NAME@5009..50213129 IDENT@5009..5021 "objectFields"3130 ARGS_DESC@5021..50263131 L_PAREN@5021..5022 "("3132 ARG@5022..50253133 EXPR_VAR@5022..50253134 NAME@5022..50253135 IDENT@5022..5025 "obj"3136 R_PAREN@5025..5026 ")"3137 WHITESPACE@5026..5027 " "3138 R_BRACE@5027..5028 "}"3139 COMMA@5028..5029 ","3140 WHITESPACE@5029..5033 "\n\n "3141 MEMBER_FIELD@5033..50623142 FIELD_NORMAL@5033..50623143 FIELD_NAME_FIXED@5033..50403144 NAME@5033..50403145 IDENT@5033..5040 "flatMap"3146 COLONCOLON@5040..5042 "::"3147 WHITESPACE@5042..5043 " "3148 EXPR_INTRINSIC@5043..50623149 INTRINSIC@5043..5053 "$intrinsic"3150 L_PAREN@5053..5054 "("3151 NAME@5054..50613152 IDENT@5054..5061 "flatMap"3153 R_PAREN@5061..5062 ")"3154 COMMA@5062..5063 ","3155 WHITESPACE@5063..5067 "\n\n "3156 MEMBER_FIELD@5067..50903157 FIELD_NORMAL@5067..50903158 FIELD_NAME_FIXED@5067..50713159 NAME@5067..50713160 IDENT@5067..5071 "join"3161 COLONCOLON@5071..5073 "::"3162 WHITESPACE@5073..5074 " "3163 EXPR_INTRINSIC@5074..50903164 INTRINSIC@5074..5084 "$intrinsic"3165 L_PAREN@5084..5085 "("3166 NAME@5085..50893167 IDENT@5085..5089 "join"3168 R_PAREN@5089..5090 ")"3169 COMMA@5090..5091 ","3170 WHITESPACE@5091..5095 "\n\n "3171 MEMBER_FIELD@5095..51383172 FIELD_METHOD@5095..51383173 FIELD_NAME_FIXED@5095..51003174 NAME@5095..51003175 IDENT@5095..5100 "lines"3176 PARAMS_DESC@5100..51053177 L_PAREN@5100..5101 "("3178 PARAM@5101..51043179 DESTRUCT_FULL@5101..51043180 NAME@5101..51043181 IDENT@5101..5104 "arr"3182 R_PAREN@5104..5105 ")"3183 COLONCOLON@5105..5107 "::"3184 WHITESPACE@5107..5112 "\n "3185 EXPR_APPLY@5112..51383186 EXPR_INDEX@5112..51203187 EXPR_VAR@5112..51153188 NAME@5112..51153189 IDENT@5112..5115 "std"3190 DOT@5115..5116 "."3191 NAME@5116..51203192 IDENT@5116..5120 "join"3193 ARGS_DESC@5120..51383194 L_PAREN@5120..5121 "("3195 ARG@5121..51253196 EXPR_STRING@5121..51253197 STRING_SINGLE@5121..5125 "'\\n'"3198 COMMA@5125..5126 ","3199 WHITESPACE@5126..5127 " "3200 ARG@5127..51373201 EXPR_BINARY@5127..51373202 LHS_EXPR@5127..51303203 EXPR_VAR@5127..51303204 NAME@5127..51303205 IDENT@5127..5130 "arr"3206 WHITESPACE@5130..5131 " "3207 PLUS@5131..5132 "+"3208 WHITESPACE@5132..5133 " "3209 EXPR_ARRAY@5133..51373210 L_BRACK@5133..5134 "["3211 EXPR_STRING@5134..51363212 STRING_SINGLE@5134..5136 "''"3213 R_BRACK@5136..5137 "]"3214 R_PAREN@5137..5138 ")"3215 COMMA@5138..5139 ","3216 WHITESPACE@5139..5143 "\n\n "3217 MEMBER_FIELD@5143..53553218 FIELD_METHOD@5143..53553219 FIELD_NAME_FIXED@5143..51513220 NAME@5143..51513221 IDENT@5143..5151 "deepJoin"3222 PARAMS_DESC@5151..51563223 L_PAREN@5151..5152 "("3224 PARAM@5152..51553225 DESTRUCT_FULL@5152..51553226 NAME@5152..51553227 IDENT@5152..5155 "arr"3228 R_PAREN@5155..5156 ")"3229 COLONCOLON@5156..5158 "::"3230 WHITESPACE@5158..5163 "\n "3231 EXPR_IF_THEN_ELSE@5163..53553232 IF_KW@5163..5165 "if"3233 WHITESPACE@5165..5166 " "3234 EXPR_APPLY@5166..51833235 EXPR_INDEX@5166..51783236 EXPR_VAR@5166..51693237 NAME@5166..51693238 IDENT@5166..5169 "std"3239 DOT@5169..5170 "."3240 NAME@5170..51783241 IDENT@5170..5178 "isString"3242 ARGS_DESC@5178..51833243 L_PAREN@5178..5179 "("3244 ARG@5179..51823245 EXPR_VAR@5179..51823246 NAME@5179..51823247 IDENT@5179..5182 "arr"3248 R_PAREN@5182..5183 ")"3249 WHITESPACE@5183..5184 " "3250 THEN_KW@5184..5188 "then"3251 WHITESPACE@5188..5195 "\n "3252 TRUE_EXPR@5195..51983253 EXPR_VAR@5195..51983254 NAME@5195..51983255 IDENT@5195..5198 "arr"3256 WHITESPACE@5198..5203 "\n "3257 ELSE_KW@5203..5207 "else"3258 WHITESPACE@5207..5208 " "3259 FALSE_EXPR@5208..53553260 EXPR_IF_THEN_ELSE@5208..53553261 IF_KW@5208..5210 "if"3262 WHITESPACE@5210..5211 " "3263 EXPR_APPLY@5211..52273264 EXPR_INDEX@5211..52223265 EXPR_VAR@5211..52143266 NAME@5211..52143267 IDENT@5211..5214 "std"3268 DOT@5214..5215 "."3269 NAME@5215..52223270 IDENT@5215..5222 "isArray"3271 ARGS_DESC@5222..52273272 L_PAREN@5222..5223 "("3273 ARG@5223..52263274 EXPR_VAR@5223..52263275 NAME@5223..52263276 IDENT@5223..5226 "arr"3277 R_PAREN@5226..5227 ")"3278 WHITESPACE@5227..5228 " "3279 THEN_KW@5228..5232 "then"3280 WHITESPACE@5232..5239 "\n "3281 TRUE_EXPR@5239..52833282 EXPR_APPLY@5239..52833283 EXPR_INDEX@5239..52473284 EXPR_VAR@5239..52423285 NAME@5239..52423286 IDENT@5239..5242 "std"3287 DOT@5242..5243 "."3288 NAME@5243..52473289 IDENT@5243..5247 "join"3290 ARGS_DESC@5247..52833291 L_PAREN@5247..5248 "("3292 ARG@5248..52503293 EXPR_STRING@5248..52503294 STRING_SINGLE@5248..5250 "''"3295 COMMA@5250..5251 ","3296 WHITESPACE@5251..5252 " "3297 ARG@5252..52823298 EXPR_ARRAY_COMP@5252..52823299 L_BRACK@5252..5253 "["3300 EXPR_APPLY@5253..52683301 EXPR_INDEX@5253..52653302 EXPR_VAR@5253..52563303 NAME@5253..52563304 IDENT@5253..5256 "std"3305 DOT@5256..5257 "."3306 NAME@5257..52653307 IDENT@5257..5265 "deepJoin"3308 ARGS_DESC@5265..52683309 L_PAREN@5265..5266 "("3310 ARG@5266..52673311 EXPR_VAR@5266..52673312 NAME@5266..52673313 IDENT@5266..5267 "x"3314 R_PAREN@5267..5268 ")"3315 WHITESPACE@5268..5269 " "3316 FOR_SPEC@5269..52813317 FOR_KW@5269..5272 "for"3318 WHITESPACE@5272..5273 " "3319 NAME@5273..52743320 IDENT@5273..5274 "x"3321 WHITESPACE@5274..5275 " "3322 IN_KW@5275..5277 "in"3323 WHITESPACE@5277..5278 " "3324 EXPR_VAR@5278..52813325 NAME@5278..52813326 IDENT@5278..5281 "arr"3327 R_BRACK@5281..5282 "]"3328 R_PAREN@5282..5283 ")"3329 WHITESPACE@5283..5288 "\n "3330 ELSE_KW@5288..5292 "else"3331 WHITESPACE@5292..5299 "\n "3332 FALSE_EXPR@5299..53553333 EXPR_ERROR@5299..53553334 ERROR_KW@5299..5304 "error"3335 WHITESPACE@5304..5305 " "3336 EXPR_BINARY@5305..53553337 LHS_EXPR@5305..53393338 EXPR_STRING@5305..53393339 STRING_SINGLE@5305..5339 "'Expected string or a ..."3340 WHITESPACE@5339..5340 " "3341 MODULO@5340..5341 "%"3342 WHITESPACE@5341..5342 " "3343 EXPR_APPLY@5342..53553344 EXPR_INDEX@5342..53503345 EXPR_VAR@5342..53453346 NAME@5342..53453347 IDENT@5342..5345 "std"3348 DOT@5345..5346 "."3349 NAME@5346..53503350 IDENT@5346..5350 "type"3351 ARGS_DESC@5350..53553352 L_PAREN@5350..5351 "("3353 ARG@5351..53543354 EXPR_VAR@5351..53543355 NAME@5351..53543356 IDENT@5351..5354 "arr"3357 R_PAREN@5354..5355 ")"3358 COMMA@5355..5356 ","3359 WHITESPACE@5356..5361 "\n\n\n "3360 MEMBER_FIELD@5361..53883361 FIELD_NORMAL@5361..53883362 FIELD_NAME_FIXED@5361..53673363 NAME@5361..53673364 IDENT@5361..5367 "format"3365 COLONCOLON@5367..5369 "::"3366 WHITESPACE@5369..5370 " "3367 EXPR_INTRINSIC@5370..53883368 INTRINSIC@5370..5380 "$intrinsic"3369 L_PAREN@5380..5381 "("3370 NAME@5381..53873371 IDENT@5381..5387 "format"3372 R_PAREN@5387..5388 ")"3373 COMMA@5388..5389 ","3374 WHITESPACE@5389..5393 "\n\n "3375 MEMBER_FIELD@5393..54183376 FIELD_NORMAL@5393..54183377 FIELD_NAME_FIXED@5393..53983378 NAME@5393..53983379 IDENT@5393..5398 "foldr"3380 COLONCOLON@5398..5400 "::"3381 WHITESPACE@5400..5401 " "3382 EXPR_INTRINSIC@5401..54183383 INTRINSIC@5401..5411 "$intrinsic"3384 L_PAREN@5411..5412 "("3385 NAME@5412..54173386 IDENT@5412..5417 "foldr"3387 R_PAREN@5417..5418 ")"3388 COMMA@5418..5419 ","3389 WHITESPACE@5419..5423 "\n\n "3390 MEMBER_FIELD@5423..54483391 FIELD_NORMAL@5423..54483392 FIELD_NAME_FIXED@5423..54283393 NAME@5423..54283394 IDENT@5423..5428 "foldl"3395 COLONCOLON@5428..5430 "::"3396 WHITESPACE@5430..5431 " "3397 EXPR_INTRINSIC@5431..54483398 INTRINSIC@5431..5441 "$intrinsic"3399 L_PAREN@5441..5442 "("3400 NAME@5442..54473401 IDENT@5442..5447 "foldl"3402 R_PAREN@5447..5448 ")"3403 COMMA@5448..5449 ","3404 WHITESPACE@5449..5453 "\n\n "3405 MEMBER_FIELD@5453..59283406 FIELD_METHOD@5453..59283407 FIELD_NAME_FIXED@5453..54623408 NAME@5453..54623409 IDENT@5453..5462 "filterMap"3410 PARAMS_DESC@5462..54903411 L_PAREN@5462..5463 "("3412 PARAM@5463..54743413 DESTRUCT_FULL@5463..54743414 NAME@5463..54743415 IDENT@5463..5474 "filter_func"3416 COMMA@5474..5475 ","3417 WHITESPACE@5475..5476 " "3418 PARAM@5476..54843419 DESTRUCT_FULL@5476..54843420 NAME@5476..54843421 IDENT@5476..5484 "map_func"3422 COMMA@5484..5485 ","3423 WHITESPACE@5485..5486 " "3424 PARAM@5486..54893425 DESTRUCT_FULL@5486..54893426 NAME@5486..54893427 IDENT@5486..5489 "arr"3428 R_PAREN@5489..5490 ")"3429 COLONCOLON@5490..5492 "::"3430 WHITESPACE@5492..5497 "\n "3431 EXPR_IF_THEN_ELSE@5497..59283432 IF_KW@5497..5499 "if"3433 WHITESPACE@5499..5500 " "3434 EXPR_UNARY@5500..55283435 NOT@5500..5501 "!"3436 EXPR_APPLY@5501..55283437 EXPR_INDEX@5501..55153438 EXPR_VAR@5501..55043439 NAME@5501..55043440 IDENT@5501..5504 "std"3441 DOT@5504..5505 "."3442 NAME@5505..55153443 IDENT@5505..5515 "isFunction"3444 ARGS_DESC@5515..55283445 L_PAREN@5515..5516 "("3446 ARG@5516..55273447 EXPR_VAR@5516..55273448 NAME@5516..55273449 IDENT@5516..5527 "filter_func"3450 R_PAREN@5527..5528 ")"3451 WHITESPACE@5528..5529 " "3452 THEN_KW@5529..5533 "then"3453 WHITESPACE@5533..5540 "\n "3454 TRUE_EXPR@5540..56223455 EXPR_ERROR@5540..56223456 ERROR_KW@5540..5545 "error"3457 WHITESPACE@5545..5546 " "3458 EXPR_PARENED@5546..56223459 L_PAREN@5546..5547 "("3460 EXPR_BINARY@5547..56213461 LHS_EXPR@5547..55973462 EXPR_STRING@5547..55973463 STRING_SINGLE@5547..5597 "'std.filterMap first ..."3464 WHITESPACE@5597..5598 " "3465 PLUS@5598..5599 "+"3466 WHITESPACE@5599..5600 " "3467 EXPR_APPLY@5600..56213468 EXPR_INDEX@5600..56083469 EXPR_VAR@5600..56033470 NAME@5600..56033471 IDENT@5600..5603 "std"3472 DOT@5603..5604 "."3473 NAME@5604..56083474 IDENT@5604..5608 "type"3475 ARGS_DESC@5608..56213476 L_PAREN@5608..5609 "("3477 ARG@5609..56203478 EXPR_VAR@5609..56203479 NAME@5609..56203480 IDENT@5609..5620 "filter_func"3481 R_PAREN@5620..5621 ")"3482 R_PAREN@5621..5622 ")"3483 WHITESPACE@5622..5627 "\n "3484 ELSE_KW@5627..5631 "else"3485 WHITESPACE@5631..5632 " "3486 FALSE_EXPR@5632..59283487 EXPR_IF_THEN_ELSE@5632..59283488 IF_KW@5632..5634 "if"3489 WHITESPACE@5634..5635 " "3490 EXPR_UNARY@5635..56603491 NOT@5635..5636 "!"3492 EXPR_APPLY@5636..56603493 EXPR_INDEX@5636..56503494 EXPR_VAR@5636..56393495 NAME@5636..56393496 IDENT@5636..5639 "std"3497 DOT@5639..5640 "."3498 NAME@5640..56503499 IDENT@5640..5650 "isFunction"3500 ARGS_DESC@5650..56603501 L_PAREN@5650..5651 "("3502 ARG@5651..56593503 EXPR_VAR@5651..56593504 NAME@5651..56593505 IDENT@5651..5659 "map_func"3506 R_PAREN@5659..5660 ")"3507 WHITESPACE@5660..5661 " "3508 THEN_KW@5661..5665 "then"3509 WHITESPACE@5665..5672 "\n "3510 TRUE_EXPR@5672..57523511 EXPR_ERROR@5672..57523512 ERROR_KW@5672..5677 "error"3513 WHITESPACE@5677..5678 " "3514 EXPR_PARENED@5678..57523515 L_PAREN@5678..5679 "("3516 EXPR_BINARY@5679..57513517 LHS_EXPR@5679..57303518 EXPR_STRING@5679..57303519 STRING_SINGLE@5679..5730 "'std.filterMap second ..."3520 WHITESPACE@5730..5731 " "3521 PLUS@5731..5732 "+"3522 WHITESPACE@5732..5733 " "3523 EXPR_APPLY@5733..57513524 EXPR_INDEX@5733..57413525 EXPR_VAR@5733..57363526 NAME@5733..57363527 IDENT@5733..5736 "std"3528 DOT@5736..5737 "."3529 NAME@5737..57413530 IDENT@5737..5741 "type"3531 ARGS_DESC@5741..57513532 L_PAREN@5741..5742 "("3533 ARG@5742..57503534 EXPR_VAR@5742..57503535 NAME@5742..57503536 IDENT@5742..5750 "map_func"3537 R_PAREN@5750..5751 ")"3538 R_PAREN@5751..5752 ")"3539 WHITESPACE@5752..5757 "\n "3540 ELSE_KW@5757..5761 "else"3541 WHITESPACE@5761..5762 " "3542 FALSE_EXPR@5762..59283543 EXPR_IF_THEN_ELSE@5762..59283544 IF_KW@5762..5764 "if"3545 WHITESPACE@5764..5765 " "3546 EXPR_UNARY@5765..57823547 NOT@5765..5766 "!"3548 EXPR_APPLY@5766..57823549 EXPR_INDEX@5766..57773550 EXPR_VAR@5766..57693551 NAME@5766..57693552 IDENT@5766..5769 "std"3553 DOT@5769..5770 "."3554 NAME@5770..57773555 IDENT@5770..5777 "isArray"3556 ARGS_DESC@5777..57823557 L_PAREN@5777..5778 "("3558 ARG@5778..57813559 EXPR_VAR@5778..57813560 NAME@5778..57813561 IDENT@5778..5781 "arr"3562 R_PAREN@5781..5782 ")"3563 WHITESPACE@5782..5783 " "3564 THEN_KW@5783..5787 "then"3565 WHITESPACE@5787..5794 "\n "3566 TRUE_EXPR@5794..58653567 EXPR_ERROR@5794..58653568 ERROR_KW@5794..5799 "error"3569 WHITESPACE@5799..5800 " "3570 EXPR_PARENED@5800..58653571 L_PAREN@5800..5801 "("3572 EXPR_BINARY@5801..58643573 LHS_EXPR@5801..58483574 EXPR_STRING@5801..58483575 STRING_SINGLE@5801..5848 "'std.filterMap third ..."3576 WHITESPACE@5848..5849 " "3577 PLUS@5849..5850 "+"3578 WHITESPACE@5850..5851 " "3579 EXPR_APPLY@5851..58643580 EXPR_INDEX@5851..58593581 EXPR_VAR@5851..58543582 NAME@5851..58543583 IDENT@5851..5854 "std"3584 DOT@5854..5855 "."3585 NAME@5855..58593586 IDENT@5855..5859 "type"3587 ARGS_DESC@5859..58643588 L_PAREN@5859..5860 "("3589 ARG@5860..58633590 EXPR_VAR@5860..58633591 NAME@5860..58633592 IDENT@5860..5863 "arr"3593 R_PAREN@5863..5864 ")"3594 R_PAREN@5864..5865 ")"3595 WHITESPACE@5865..5870 "\n "3596 ELSE_KW@5870..5874 "else"3597 WHITESPACE@5874..5881 "\n "3598 FALSE_EXPR@5881..59283599 EXPR_APPLY@5881..59283600 EXPR_INDEX@5881..58883601 EXPR_VAR@5881..58843602 NAME@5881..58843603 IDENT@5881..5884 "std"3604 DOT@5884..5885 "."3605 NAME@5885..58883606 IDENT@5885..5888 "map"3607 ARGS_DESC@5888..59283608 L_PAREN@5888..5889 "("3609 ARG@5889..58973610 EXPR_VAR@5889..58973611 NAME@5889..58973612 IDENT@5889..5897 "map_func"3613 COMMA@5897..5898 ","3614 WHITESPACE@5898..5899 " "3615 ARG@5899..59273616 EXPR_APPLY@5899..59273617 EXPR_INDEX@5899..59093618 EXPR_VAR@5899..59023619 NAME@5899..59023620 IDENT@5899..5902 "std"3621 DOT@5902..5903 "."3622 NAME@5903..59093623 IDENT@5903..5909 "filter"3624 ARGS_DESC@5909..59273625 L_PAREN@5909..5910 "("3626 ARG@5910..59213627 EXPR_VAR@5910..59213628 NAME@5910..59213629 IDENT@5910..5921 "filter_func"3630 COMMA@5921..5922 ","3631 WHITESPACE@5922..5923 " "3632 ARG@5923..59263633 EXPR_VAR@5923..59263634 NAME@5923..59263635 IDENT@5923..5926 "arr"3636 R_PAREN@5926..5927 ")"3637 R_PAREN@5927..5928 ")"3638 COMMA@5928..5929 ","3639 WHITESPACE@5929..5933 "\n\n "3640 MEMBER_FIELD@5933..60413641 FIELD_METHOD@5933..60413642 FIELD_NAME_FIXED@5933..59443643 NAME@5933..59443644 IDENT@5933..5944 "assertEqual"3645 PARAMS_DESC@5944..59503646 L_PAREN@5944..5945 "("3647 PARAM@5945..59463648 DESTRUCT_FULL@5945..59463649 NAME@5945..59463650 IDENT@5945..5946 "a"3651 COMMA@5946..5947 ","3652 WHITESPACE@5947..5948 " "3653 PARAM@5948..59493654 DESTRUCT_FULL@5948..59493655 NAME@5948..59493656 IDENT@5948..5949 "b"3657 R_PAREN@5949..5950 ")"3658 COLONCOLON@5950..5952 "::"3659 WHITESPACE@5952..5957 "\n "3660 EXPR_IF_THEN_ELSE@5957..60413661 IF_KW@5957..5959 "if"3662 WHITESPACE@5959..5960 " "3663 EXPR_BINARY@5960..59663664 LHS_EXPR@5960..59613665 EXPR_VAR@5960..59613666 NAME@5960..59613667 IDENT@5960..5961 "a"3668 WHITESPACE@5961..5962 " "3669 EQ@5962..5964 "=="3670 WHITESPACE@5964..5965 " "3671 EXPR_VAR@5965..59663672 NAME@5965..59663673 IDENT@5965..5966 "b"3674 WHITESPACE@5966..5967 " "3675 THEN_KW@5967..5971 "then"3676 WHITESPACE@5971..5978 "\n "3677 TRUE_EXPR@5978..59823678 EXPR_LITERAL@5978..59823679 TRUE_KW@5978..5982 "true"3680 WHITESPACE@5982..5987 "\n "3681 ELSE_KW@5987..5991 "else"3682 WHITESPACE@5991..5998 "\n "3683 FALSE_EXPR@5998..60413684 EXPR_ERROR@5998..60413685 ERROR_KW@5998..6003 "error"3686 WHITESPACE@6003..6004 " "3687 EXPR_BINARY@6004..60413688 LHS_EXPR@6004..60373689 EXPR_BINARY@6004..60373690 LHS_EXPR@6004..60283691 EXPR_BINARY@6004..60283692 LHS_EXPR@6004..60243693 EXPR_STRING@6004..60243694 STRING_SINGLE@6004..6024 "'Assertion failed. '"3695 WHITESPACE@6024..6025 " "3696 PLUS@6025..6026 "+"3697 WHITESPACE@6026..6027 " "3698 EXPR_VAR@6027..60283699 NAME@6027..60283700 IDENT@6027..6028 "a"3701 WHITESPACE@6028..6029 " "3702 PLUS@6029..6030 "+"3703 WHITESPACE@6030..6031 " "3704 EXPR_STRING@6031..60373705 STRING_SINGLE@6031..6037 "' != '"3706 WHITESPACE@6037..6038 " "3707 PLUS@6038..6039 "+"3708 WHITESPACE@6039..6040 " "3709 EXPR_VAR@6040..60413710 NAME@6040..60413711 IDENT@6040..6041 "b"3712 COMMA@6041..6042 ","3713 WHITESPACE@6042..6046 "\n\n "3714 MEMBER_FIELD@6046..61803715 FIELD_METHOD@6046..61803716 FIELD_NAME_FIXED@6046..60493717 NAME@6046..60493718 IDENT@6046..6049 "abs"3719 PARAMS_DESC@6049..60523720 L_PAREN@6049..6050 "("3721 PARAM@6050..60513722 DESTRUCT_FULL@6050..60513723 NAME@6050..60513724 IDENT@6050..6051 "n"3725 R_PAREN@6051..6052 ")"3726 COLONCOLON@6052..6054 "::"3727 WHITESPACE@6054..6059 "\n "3728 EXPR_IF_THEN_ELSE@6059..61803729 IF_KW@6059..6061 "if"3730 WHITESPACE@6061..6062 " "3731 EXPR_UNARY@6062..60783732 NOT@6062..6063 "!"3733 EXPR_APPLY@6063..60783734 EXPR_INDEX@6063..60753735 EXPR_VAR@6063..60663736 NAME@6063..60663737 IDENT@6063..6066 "std"3738 DOT@6066..6067 "."3739 NAME@6067..60753740 IDENT@6067..6075 "isNumber"3741 ARGS_DESC@6075..60783742 L_PAREN@6075..6076 "("3743 ARG@6076..60773744 EXPR_VAR@6076..60773745 NAME@6076..60773746 IDENT@6076..6077 "n"3747 R_PAREN@6077..6078 ")"3748 WHITESPACE@6078..6079 " "3749 THEN_KW@6079..6083 "then"3750 WHITESPACE@6083..6090 "\n "3751 TRUE_EXPR@6090..61413752 EXPR_ERROR@6090..61413753 ERROR_KW@6090..6095 "error"3754 WHITESPACE@6095..6096 " "3755 EXPR_BINARY@6096..61413756 LHS_EXPR@6096..61273757 EXPR_STRING@6096..61273758 STRING_SINGLE@6096..6127 "'std.abs expected num ..."3759 WHITESPACE@6127..6128 " "3760 PLUS@6128..6129 "+"3761 WHITESPACE@6129..6130 " "3762 EXPR_APPLY@6130..61413763 EXPR_INDEX@6130..61383764 EXPR_VAR@6130..61333765 NAME@6130..61333766 IDENT@6130..6133 "std"3767 DOT@6133..6134 "."3768 NAME@6134..61383769 IDENT@6134..6138 "type"3770 ARGS_DESC@6138..61413771 L_PAREN@6138..6139 "("3772 ARG@6139..61403773 EXPR_VAR@6139..61403774 NAME@6139..61403775 IDENT@6139..6140 "n"3776 R_PAREN@6140..6141 ")"3777 WHITESPACE@6141..6146 "\n "3778 ELSE_KW@6146..6150 "else"3779 WHITESPACE@6150..6157 "\n "3780 FALSE_EXPR@6157..61803781 EXPR_IF_THEN_ELSE@6157..61803782 IF_KW@6157..6159 "if"3783 WHITESPACE@6159..6160 " "3784 EXPR_BINARY@6160..61653785 LHS_EXPR@6160..61613786 EXPR_VAR@6160..61613787 NAME@6160..61613788 IDENT@6160..6161 "n"3789 WHITESPACE@6161..6162 " "3790 GT@6162..6163 ">"3791 WHITESPACE@6163..6164 " "3792 EXPR_NUMBER@6164..61653793 FLOAT@6164..6165 "0"3794 WHITESPACE@6165..6166 " "3795 THEN_KW@6166..6170 "then"3796 WHITESPACE@6170..6171 " "3797 TRUE_EXPR@6171..61723798 EXPR_VAR@6171..61723799 NAME@6171..61723800 IDENT@6171..6172 "n"3801 WHITESPACE@6172..6173 " "3802 ELSE_KW@6173..6177 "else"3803 WHITESPACE@6177..6178 " "3804 FALSE_EXPR@6178..61803805 EXPR_UNARY@6178..61803806 MINUS@6178..6179 "-"3807 EXPR_VAR@6179..61803808 NAME@6179..61803809 IDENT@6179..6180 "n"3810 COMMA@6180..6181 ","3811 WHITESPACE@6181..6185 "\n\n "3812 MEMBER_FIELD@6185..63703813 FIELD_METHOD@6185..63703814 FIELD_NAME_FIXED@6185..61893815 NAME@6185..61893816 IDENT@6185..6189 "sign"3817 PARAMS_DESC@6189..61923818 L_PAREN@6189..6190 "("3819 PARAM@6190..61913820 DESTRUCT_FULL@6190..61913821 NAME@6190..61913822 IDENT@6190..6191 "n"3823 R_PAREN@6191..6192 ")"3824 COLONCOLON@6192..6194 "::"3825 WHITESPACE@6194..6199 "\n "3826 EXPR_IF_THEN_ELSE@6199..63703827 IF_KW@6199..6201 "if"3828 WHITESPACE@6201..6202 " "3829 EXPR_UNARY@6202..62183830 NOT@6202..6203 "!"3831 EXPR_APPLY@6203..62183832 EXPR_INDEX@6203..62153833 EXPR_VAR@6203..62063834 NAME@6203..62063835 IDENT@6203..6206 "std"3836 DOT@6206..6207 "."3837 NAME@6207..62153838 IDENT@6207..6215 "isNumber"3839 ARGS_DESC@6215..62183840 L_PAREN@6215..6216 "("3841 ARG@6216..62173842 EXPR_VAR@6216..62173843 NAME@6216..62173844 IDENT@6216..6217 "n"3845 R_PAREN@6217..6218 ")"3846 WHITESPACE@6218..6219 " "3847 THEN_KW@6219..6223 "then"3848 WHITESPACE@6223..6230 "\n "3849 TRUE_EXPR@6230..62823850 EXPR_ERROR@6230..62823851 ERROR_KW@6230..6235 "error"3852 WHITESPACE@6235..6236 " "3853 EXPR_BINARY@6236..62823854 LHS_EXPR@6236..62683855 EXPR_STRING@6236..62683856 STRING_SINGLE@6236..6268 "'std.sign expected nu ..."3857 WHITESPACE@6268..6269 " "3858 PLUS@6269..6270 "+"3859 WHITESPACE@6270..6271 " "3860 EXPR_APPLY@6271..62823861 EXPR_INDEX@6271..62793862 EXPR_VAR@6271..62743863 NAME@6271..62743864 IDENT@6271..6274 "std"3865 DOT@6274..6275 "."3866 NAME@6275..62793867 IDENT@6275..6279 "type"3868 ARGS_DESC@6279..62823869 L_PAREN@6279..6280 "("3870 ARG@6280..62813871 EXPR_VAR@6280..62813872 NAME@6280..62813873 IDENT@6280..6281 "n"3874 R_PAREN@6281..6282 ")"3875 WHITESPACE@6282..6287 "\n "3876 ELSE_KW@6287..6291 "else"3877 WHITESPACE@6291..6298 "\n "3878 FALSE_EXPR@6298..63703879 EXPR_IF_THEN_ELSE@6298..63703880 IF_KW@6298..6300 "if"3881 WHITESPACE@6300..6301 " "3882 EXPR_BINARY@6301..63063883 LHS_EXPR@6301..63023884 EXPR_VAR@6301..63023885 NAME@6301..63023886 IDENT@6301..6302 "n"3887 WHITESPACE@6302..6303 " "3888 GT@6303..6304 ">"3889 WHITESPACE@6304..6305 " "3890 EXPR_NUMBER@6305..63063891 FLOAT@6305..6306 "0"3892 WHITESPACE@6306..6307 " "3893 THEN_KW@6307..6311 "then"3894 WHITESPACE@6311..6320 "\n "3895 TRUE_EXPR@6320..63213896 EXPR_NUMBER@6320..63213897 FLOAT@6320..6321 "1"3898 WHITESPACE@6321..6328 "\n "3899 ELSE_KW@6328..6332 "else"3900 WHITESPACE@6332..6333 " "3901 FALSE_EXPR@6333..63703902 EXPR_IF_THEN_ELSE@6333..63703903 IF_KW@6333..6335 "if"3904 WHITESPACE@6335..6336 " "3905 EXPR_BINARY@6336..63413906 LHS_EXPR@6336..63373907 EXPR_VAR@6336..63373908 NAME@6336..63373909 IDENT@6336..6337 "n"3910 WHITESPACE@6337..6338 " "3911 LT@6338..6339 "<"3912 WHITESPACE@6339..6340 " "3913 EXPR_NUMBER@6340..63413914 FLOAT@6340..6341 "0"3915 WHITESPACE@6341..6342 " "3916 THEN_KW@6342..6346 "then"3917 WHITESPACE@6346..6355 "\n "3918 TRUE_EXPR@6355..63573919 EXPR_UNARY@6355..63573920 MINUS@6355..6356 "-"3921 EXPR_NUMBER@6356..63573922 FLOAT@6356..6357 "1"3923 WHITESPACE@6357..6364 "\n "3924 ELSE_KW@6364..6368 "else"3925 WHITESPACE@6368..6369 " "3926 FALSE_EXPR@6369..63703927 EXPR_NUMBER@6369..63703928 FLOAT@6369..6370 "0"3929 COMMA@6370..6371 ","3930 WHITESPACE@6371..6375 "\n\n "3931 MEMBER_FIELD@6375..66283932 FIELD_METHOD@6375..66283933 FIELD_NAME_FIXED@6375..63783934 NAME@6375..63783935 IDENT@6375..6378 "max"3936 PARAMS_DESC@6378..63843937 L_PAREN@6378..6379 "("3938 PARAM@6379..63803939 DESTRUCT_FULL@6379..63803940 NAME@6379..63803941 IDENT@6379..6380 "a"3942 COMMA@6380..6381 ","3943 WHITESPACE@6381..6382 " "3944 PARAM@6382..63833945 DESTRUCT_FULL@6382..63833946 NAME@6382..63833947 IDENT@6382..6383 "b"3948 R_PAREN@6383..6384 ")"3949 COLONCOLON@6384..6386 "::"3950 WHITESPACE@6386..6391 "\n "3951 EXPR_IF_THEN_ELSE@6391..66283952 IF_KW@6391..6393 "if"3953 WHITESPACE@6393..6394 " "3954 EXPR_UNARY@6394..64103955 NOT@6394..6395 "!"3956 EXPR_APPLY@6395..64103957 EXPR_INDEX@6395..64073958 EXPR_VAR@6395..63983959 NAME@6395..63983960 IDENT@6395..6398 "std"3961 DOT@6398..6399 "."3962 NAME@6399..64073963 IDENT@6399..6407 "isNumber"3964 ARGS_DESC@6407..64103965 L_PAREN@6407..6408 "("3966 ARG@6408..64093967 EXPR_VAR@6408..64093968 NAME@6408..64093969 IDENT@6408..6409 "a"3970 R_PAREN@6409..6410 ")"3971 WHITESPACE@6410..6411 " "3972 THEN_KW@6411..6415 "then"3973 WHITESPACE@6415..6422 "\n "3974 TRUE_EXPR@6422..64853975 EXPR_ERROR@6422..64853976 ERROR_KW@6422..6427 "error"3977 WHITESPACE@6427..6428 " "3978 EXPR_BINARY@6428..64853979 LHS_EXPR@6428..64713980 EXPR_STRING@6428..64713981 STRING_SINGLE@6428..6471 "'std.max first param ..."3982 WHITESPACE@6471..6472 " "3983 PLUS@6472..6473 "+"3984 WHITESPACE@6473..6474 " "3985 EXPR_APPLY@6474..64853986 EXPR_INDEX@6474..64823987 EXPR_VAR@6474..64773988 NAME@6474..64773989 IDENT@6474..6477 "std"3990 DOT@6477..6478 "."3991 NAME@6478..64823992 IDENT@6478..6482 "type"3993 ARGS_DESC@6482..64853994 L_PAREN@6482..6483 "("3995 ARG@6483..64843996 EXPR_VAR@6483..64843997 NAME@6483..64843998 IDENT@6483..6484 "a"3999 R_PAREN@6484..6485 ")"4000 WHITESPACE@6485..6490 "\n "4001 ELSE_KW@6490..6494 "else"4002 WHITESPACE@6494..6495 " "4003 FALSE_EXPR@6495..66284004 EXPR_IF_THEN_ELSE@6495..66284005 IF_KW@6495..6497 "if"4006 WHITESPACE@6497..6498 " "4007 EXPR_UNARY@6498..65144008 NOT@6498..6499 "!"4009 EXPR_APPLY@6499..65144010 EXPR_INDEX@6499..65114011 EXPR_VAR@6499..65024012 NAME@6499..65024013 IDENT@6499..6502 "std"4014 DOT@6502..6503 "."4015 NAME@6503..65114016 IDENT@6503..6511 "isNumber"4017 ARGS_DESC@6511..65144018 L_PAREN@6511..6512 "("4019 ARG@6512..65134020 EXPR_VAR@6512..65134021 NAME@6512..65134022 IDENT@6512..6513 "b"4023 R_PAREN@6513..6514 ")"4024 WHITESPACE@6514..6515 " "4025 THEN_KW@6515..6519 "then"4026 WHITESPACE@6519..6526 "\n "4027 TRUE_EXPR@6526..65904028 EXPR_ERROR@6526..65904029 ERROR_KW@6526..6531 "error"4030 WHITESPACE@6531..6532 " "4031 EXPR_BINARY@6532..65904032 LHS_EXPR@6532..65764033 EXPR_STRING@6532..65764034 STRING_SINGLE@6532..6576 "'std.max second param ..."4035 WHITESPACE@6576..6577 " "4036 PLUS@6577..6578 "+"4037 WHITESPACE@6578..6579 " "4038 EXPR_APPLY@6579..65904039 EXPR_INDEX@6579..65874040 EXPR_VAR@6579..65824041 NAME@6579..65824042 IDENT@6579..6582 "std"4043 DOT@6582..6583 "."4044 NAME@6583..65874045 IDENT@6583..6587 "type"4046 ARGS_DESC@6587..65904047 L_PAREN@6587..6588 "("4048 ARG@6588..65894049 EXPR_VAR@6588..65894050 NAME@6588..65894051 IDENT@6588..6589 "b"4052 R_PAREN@6589..6590 ")"4053 WHITESPACE@6590..6595 "\n "4054 ELSE_KW@6595..6599 "else"4055 WHITESPACE@6599..6606 "\n "4056 FALSE_EXPR@6606..66284057 EXPR_IF_THEN_ELSE@6606..66284058 IF_KW@6606..6608 "if"4059 WHITESPACE@6608..6609 " "4060 EXPR_BINARY@6609..66144061 LHS_EXPR@6609..66104062 EXPR_VAR@6609..66104063 NAME@6609..66104064 IDENT@6609..6610 "a"4065 WHITESPACE@6610..6611 " "4066 GT@6611..6612 ">"4067 WHITESPACE@6612..6613 " "4068 EXPR_VAR@6613..66144069 NAME@6613..66144070 IDENT@6613..6614 "b"4071 WHITESPACE@6614..6615 " "4072 THEN_KW@6615..6619 "then"4073 WHITESPACE@6619..6620 " "4074 TRUE_EXPR@6620..66214075 EXPR_VAR@6620..66214076 NAME@6620..66214077 IDENT@6620..6621 "a"4078 WHITESPACE@6621..6622 " "4079 ELSE_KW@6622..6626 "else"4080 WHITESPACE@6626..6627 " "4081 FALSE_EXPR@6627..66284082 EXPR_VAR@6627..66284083 NAME@6627..66284084 IDENT@6627..6628 "b"4085 COMMA@6628..6629 ","4086 WHITESPACE@6629..6633 "\n\n "4087 MEMBER_FIELD@6633..68864088 FIELD_METHOD@6633..68864089 FIELD_NAME_FIXED@6633..66364090 NAME@6633..66364091 IDENT@6633..6636 "min"4092 PARAMS_DESC@6636..66424093 L_PAREN@6636..6637 "("4094 PARAM@6637..66384095 DESTRUCT_FULL@6637..66384096 NAME@6637..66384097 IDENT@6637..6638 "a"4098 COMMA@6638..6639 ","4099 WHITESPACE@6639..6640 " "4100 PARAM@6640..66414101 DESTRUCT_FULL@6640..66414102 NAME@6640..66414103 IDENT@6640..6641 "b"4104 R_PAREN@6641..6642 ")"4105 COLONCOLON@6642..6644 "::"4106 WHITESPACE@6644..6649 "\n "4107 EXPR_IF_THEN_ELSE@6649..68864108 IF_KW@6649..6651 "if"4109 WHITESPACE@6651..6652 " "4110 EXPR_UNARY@6652..66684111 NOT@6652..6653 "!"4112 EXPR_APPLY@6653..66684113 EXPR_INDEX@6653..66654114 EXPR_VAR@6653..66564115 NAME@6653..66564116 IDENT@6653..6656 "std"4117 DOT@6656..6657 "."4118 NAME@6657..66654119 IDENT@6657..6665 "isNumber"4120 ARGS_DESC@6665..66684121 L_PAREN@6665..6666 "("4122 ARG@6666..66674123 EXPR_VAR@6666..66674124 NAME@6666..66674125 IDENT@6666..6667 "a"4126 R_PAREN@6667..6668 ")"4127 WHITESPACE@6668..6669 " "4128 THEN_KW@6669..6673 "then"4129 WHITESPACE@6673..6680 "\n "4130 TRUE_EXPR@6680..67434131 EXPR_ERROR@6680..67434132 ERROR_KW@6680..6685 "error"4133 WHITESPACE@6685..6686 " "4134 EXPR_BINARY@6686..67434135 LHS_EXPR@6686..67294136 EXPR_STRING@6686..67294137 STRING_SINGLE@6686..6729 "'std.min first param ..."4138 WHITESPACE@6729..6730 " "4139 PLUS@6730..6731 "+"4140 WHITESPACE@6731..6732 " "4141 EXPR_APPLY@6732..67434142 EXPR_INDEX@6732..67404143 EXPR_VAR@6732..67354144 NAME@6732..67354145 IDENT@6732..6735 "std"4146 DOT@6735..6736 "."4147 NAME@6736..67404148 IDENT@6736..6740 "type"4149 ARGS_DESC@6740..67434150 L_PAREN@6740..6741 "("4151 ARG@6741..67424152 EXPR_VAR@6741..67424153 NAME@6741..67424154 IDENT@6741..6742 "a"4155 R_PAREN@6742..6743 ")"4156 WHITESPACE@6743..6748 "\n "4157 ELSE_KW@6748..6752 "else"4158 WHITESPACE@6752..6753 " "4159 FALSE_EXPR@6753..68864160 EXPR_IF_THEN_ELSE@6753..68864161 IF_KW@6753..6755 "if"4162 WHITESPACE@6755..6756 " "4163 EXPR_UNARY@6756..67724164 NOT@6756..6757 "!"4165 EXPR_APPLY@6757..67724166 EXPR_INDEX@6757..67694167 EXPR_VAR@6757..67604168 NAME@6757..67604169 IDENT@6757..6760 "std"4170 DOT@6760..6761 "."4171 NAME@6761..67694172 IDENT@6761..6769 "isNumber"4173 ARGS_DESC@6769..67724174 L_PAREN@6769..6770 "("4175 ARG@6770..67714176 EXPR_VAR@6770..67714177 NAME@6770..67714178 IDENT@6770..6771 "b"4179 R_PAREN@6771..6772 ")"4180 WHITESPACE@6772..6773 " "4181 THEN_KW@6773..6777 "then"4182 WHITESPACE@6777..6784 "\n "4183 TRUE_EXPR@6784..68484184 EXPR_ERROR@6784..68484185 ERROR_KW@6784..6789 "error"4186 WHITESPACE@6789..6790 " "4187 EXPR_BINARY@6790..68484188 LHS_EXPR@6790..68344189 EXPR_STRING@6790..68344190 STRING_SINGLE@6790..6834 "'std.min second param ..."4191 WHITESPACE@6834..6835 " "4192 PLUS@6835..6836 "+"4193 WHITESPACE@6836..6837 " "4194 EXPR_APPLY@6837..68484195 EXPR_INDEX@6837..68454196 EXPR_VAR@6837..68404197 NAME@6837..68404198 IDENT@6837..6840 "std"4199 DOT@6840..6841 "."4200 NAME@6841..68454201 IDENT@6841..6845 "type"4202 ARGS_DESC@6845..68484203 L_PAREN@6845..6846 "("4204 ARG@6846..68474205 EXPR_VAR@6846..68474206 NAME@6846..68474207 IDENT@6846..6847 "b"4208 R_PAREN@6847..6848 ")"4209 WHITESPACE@6848..6853 "\n "4210 ELSE_KW@6853..6857 "else"4211 WHITESPACE@6857..6864 "\n "4212 FALSE_EXPR@6864..68864213 EXPR_IF_THEN_ELSE@6864..68864214 IF_KW@6864..6866 "if"4215 WHITESPACE@6866..6867 " "4216 EXPR_BINARY@6867..68724217 LHS_EXPR@6867..68684218 EXPR_VAR@6867..68684219 NAME@6867..68684220 IDENT@6867..6868 "a"4221 WHITESPACE@6868..6869 " "4222 LT@6869..6870 "<"4223 WHITESPACE@6870..6871 " "4224 EXPR_VAR@6871..68724225 NAME@6871..68724226 IDENT@6871..6872 "b"4227 WHITESPACE@6872..6873 " "4228 THEN_KW@6873..6877 "then"4229 WHITESPACE@6877..6878 " "4230 TRUE_EXPR@6878..68794231 EXPR_VAR@6878..68794232 NAME@6878..68794233 IDENT@6878..6879 "a"4234 WHITESPACE@6879..6880 " "4235 ELSE_KW@6880..6884 "else"4236 WHITESPACE@6884..6885 " "4237 FALSE_EXPR@6885..68864238 EXPR_VAR@6885..68864239 NAME@6885..68864240 IDENT@6885..6886 "b"4241 COMMA@6886..6887 ","4242 WHITESPACE@6887..6891 "\n\n "4243 MEMBER_FIELD@6891..69934244 FIELD_METHOD@6891..69934245 FIELD_NAME_FIXED@6891..68964246 NAME@6891..68964247 IDENT@6891..6896 "clamp"4248 PARAMS_DESC@6896..69154249 L_PAREN@6896..6897 "("4250 PARAM@6897..68984251 DESTRUCT_FULL@6897..68984252 NAME@6897..68984253 IDENT@6897..6898 "x"4254 COMMA@6898..6899 ","4255 WHITESPACE@6899..6900 " "4256 PARAM@6900..69064257 DESTRUCT_FULL@6900..69064258 NAME@6900..69064259 IDENT@6900..6906 "minVal"4260 COMMA@6906..6907 ","4261 WHITESPACE@6907..6908 " "4262 PARAM@6908..69144263 DESTRUCT_FULL@6908..69144264 NAME@6908..69144265 IDENT@6908..6914 "maxVal"4266 R_PAREN@6914..6915 ")"4267 COLONCOLON@6915..6917 "::"4268 WHITESPACE@6917..6922 "\n "4269 EXPR_IF_THEN_ELSE@6922..69934270 IF_KW@6922..6924 "if"4271 WHITESPACE@6924..6925 " "4272 EXPR_BINARY@6925..69354273 LHS_EXPR@6925..69264274 EXPR_VAR@6925..69264275 NAME@6925..69264276 IDENT@6925..6926 "x"4277 WHITESPACE@6926..6927 " "4278 LT@6927..6928 "<"4279 WHITESPACE@6928..6929 " "4280 EXPR_VAR@6929..69354281 NAME@6929..69354282 IDENT@6929..6935 "minVal"4283 WHITESPACE@6935..6936 " "4284 THEN_KW@6936..6940 "then"4285 WHITESPACE@6940..6941 " "4286 TRUE_EXPR@6941..69474287 EXPR_VAR@6941..69474288 NAME@6941..69474289 IDENT@6941..6947 "minVal"4290 WHITESPACE@6947..6952 "\n "4291 ELSE_KW@6952..6956 "else"4292 WHITESPACE@6956..6957 " "4293 FALSE_EXPR@6957..69934294 EXPR_IF_THEN_ELSE@6957..69934295 IF_KW@6957..6959 "if"4296 WHITESPACE@6959..6960 " "4297 EXPR_BINARY@6960..69704298 LHS_EXPR@6960..69614299 EXPR_VAR@6960..69614300 NAME@6960..69614301 IDENT@6960..6961 "x"4302 WHITESPACE@6961..6962 " "4303 GT@6962..6963 ">"4304 WHITESPACE@6963..6964 " "4305 EXPR_VAR@6964..69704306 NAME@6964..69704307 IDENT@6964..6970 "maxVal"4308 WHITESPACE@6970..6971 " "4309 THEN_KW@6971..6975 "then"4310 WHITESPACE@6975..6976 " "4311 TRUE_EXPR@6976..69824312 EXPR_VAR@6976..69824313 NAME@6976..69824314 IDENT@6976..6982 "maxVal"4315 WHITESPACE@6982..6987 "\n "4316 ELSE_KW@6987..6991 "else"4317 WHITESPACE@6991..6992 " "4318 FALSE_EXPR@6992..69934319 EXPR_VAR@6992..69934320 NAME@6992..69934321 IDENT@6992..6993 "x"4322 COMMA@6993..6994 ","4323 WHITESPACE@6994..6998 "\n\n "4324 MEMBER_FIELD@6998..70654325 FIELD_METHOD@6998..70654326 FIELD_NAME_FIXED@6998..70114327 NAME@6998..70114328 IDENT@6998..7011 "flattenArrays"4329 PARAMS_DESC@7011..70174330 L_PAREN@7011..7012 "("4331 PARAM@7012..70164332 DESTRUCT_FULL@7012..70164333 NAME@7012..70164334 IDENT@7012..7016 "arrs"4335 R_PAREN@7016..7017 ")"4336 COLONCOLON@7017..7019 "::"4337 WHITESPACE@7019..7024 "\n "4338 EXPR_APPLY@7024..70654339 EXPR_INDEX@7024..70334340 EXPR_VAR@7024..70274341 NAME@7024..70274342 IDENT@7024..7027 "std"4343 DOT@7027..7028 "."4344 NAME@7028..70334345 IDENT@7028..7033 "foldl"4346 ARGS_DESC@7033..70654347 L_PAREN@7033..7034 "("4348 ARG@7034..70544349 EXPR_FUNCTION@7034..70544350 FUNCTION_KW@7034..7042 "function"4351 PARAMS_DESC@7042..70484352 L_PAREN@7042..7043 "("4353 PARAM@7043..70444354 DESTRUCT_FULL@7043..70444355 NAME@7043..70444356 IDENT@7043..7044 "a"4357 COMMA@7044..7045 ","4358 WHITESPACE@7045..7046 " "4359 PARAM@7046..70474360 DESTRUCT_FULL@7046..70474361 NAME@7046..70474362 IDENT@7046..7047 "b"4363 R_PAREN@7047..7048 ")"4364 WHITESPACE@7048..7049 " "4365 EXPR_BINARY@7049..70544366 LHS_EXPR@7049..70504367 EXPR_VAR@7049..70504368 NAME@7049..70504369 IDENT@7049..7050 "a"4370 WHITESPACE@7050..7051 " "4371 PLUS@7051..7052 "+"4372 WHITESPACE@7052..7053 " "4373 EXPR_VAR@7053..70544374 NAME@7053..70544375 IDENT@7053..7054 "b"4376 COMMA@7054..7055 ","4377 WHITESPACE@7055..7056 " "4378 ARG@7056..70604379 EXPR_VAR@7056..70604380 NAME@7056..70604381 IDENT@7056..7060 "arrs"4382 COMMA@7060..7061 ","4383 WHITESPACE@7061..7062 " "4384 ARG@7062..70644385 EXPR_ARRAY@7062..70644386 L_BRACK@7062..7063 "["4387 R_BRACK@7063..7064 "]"4388 R_PAREN@7064..7065 ")"4389 COMMA@7065..7066 ","4390 WHITESPACE@7066..7070 "\n\n "4391 MEMBER_FIELD@7070..77564392 FIELD_METHOD@7070..77564393 FIELD_NAME_FIXED@7070..70814394 NAME@7070..70814395 IDENT@7070..7081 "manifestIni"4396 PARAMS_DESC@7081..70864397 L_PAREN@7081..7082 "("4398 PARAM@7082..70854399 DESTRUCT_FULL@7082..70854400 NAME@7082..70854401 IDENT@7082..7085 "ini"4402 R_PAREN@7085..7086 ")"4403 COLONCOLON@7086..7088 "::"4404 WHITESPACE@7088..7093 "\n "4405 EXPR_LOCAL@7093..77564406 LOCAL_KW@7093..7098 "local"4407 WHITESPACE@7098..7099 " "4408 BIND_FUNCTION@7099..73964409 NAME@7099..71094410 IDENT@7099..7109 "body_lines"4411 PARAMS_DESC@7109..71154412 L_PAREN@7109..7110 "("4413 PARAM@7110..71144414 DESTRUCT_FULL@7110..71144415 NAME@7110..71144416 IDENT@7110..7114 "body"4417 R_PAREN@7114..7115 ")"4418 WHITESPACE@7115..7116 " "4419 ASSIGN@7116..7117 "="4420 WHITESPACE@7117..7124 "\n "4421 EXPR_APPLY@7124..73964422 EXPR_INDEX@7124..71324423 EXPR_VAR@7124..71274424 NAME@7124..71274425 IDENT@7124..7127 "std"4426 DOT@7127..7128 "."4427 NAME@7128..71324428 IDENT@7128..7132 "join"4429 ARGS_DESC@7132..73964430 L_PAREN@7132..7133 "("4431 ARG@7133..71354432 EXPR_ARRAY@7133..71354433 L_BRACK@7133..7134 "["4434 R_BRACK@7134..7135 "]"4435 COMMA@7135..7136 ","4436 WHITESPACE@7136..7137 " "4437 ARG@7137..73954438 EXPR_ARRAY_COMP@7137..73954439 L_BRACK@7137..7138 "["4440 WHITESPACE@7138..7147 "\n "4441 EXPR_LOCAL@7147..73464442 LOCAL_KW@7147..7152 "local"4443 WHITESPACE@7152..7153 " "4444 BIND_DESTRUCT@7153..71784445 DESTRUCT_FULL@7153..71684446 NAME@7153..71684447 IDENT@7153..7168 "value_or_values"4448 WHITESPACE@7168..7169 " "4449 ASSIGN@7169..7170 "="4450 WHITESPACE@7170..7171 " "4451 EXPR_INDEX_EXPR@7171..71784452 LHS_EXPR@7171..71754453 EXPR_VAR@7171..71754454 NAME@7171..71754455 IDENT@7171..7175 "body"4456 L_BRACK@7175..7176 "["4457 EXPR_VAR@7176..71774458 NAME@7176..71774459 IDENT@7176..7177 "k"4460 R_BRACK@7177..7178 "]"4461 SEMI@7178..7179 ";"4462 WHITESPACE@7179..7188 "\n "4463 EXPR_IF_THEN_ELSE@7188..73464464 IF_KW@7188..7190 "if"4465 WHITESPACE@7190..7191 " "4466 EXPR_APPLY@7191..72194467 EXPR_INDEX@7191..72024468 EXPR_VAR@7191..71944469 NAME@7191..71944470 IDENT@7191..7194 "std"4471 DOT@7194..7195 "."4472 NAME@7195..72024473 IDENT@7195..7202 "isArray"4474 ARGS_DESC@7202..72194475 L_PAREN@7202..7203 "("4476 ARG@7203..72184477 EXPR_VAR@7203..72184478 NAME@7203..72184479 IDENT@7203..7218 "value_or_values"4480 R_PAREN@7218..7219 ")"4481 WHITESPACE@7219..7220 " "4482 THEN_KW@7220..7224 "then"4483 WHITESPACE@7224..7235 "\n "4484 TRUE_EXPR@7235..72884485 EXPR_ARRAY_COMP@7235..72884486 L_BRACK@7235..7236 "["4487 EXPR_BINARY@7236..72584488 LHS_EXPR@7236..72454489 EXPR_STRING@7236..72454490 STRING_SINGLE@7236..7245 "'%s = %s'"4491 WHITESPACE@7245..7246 " "4492 MODULO@7246..7247 "%"4493 WHITESPACE@7247..7248 " "4494 EXPR_ARRAY@7248..72584495 L_BRACK@7248..7249 "["4496 EXPR_VAR@7249..72504497 NAME@7249..72504498 IDENT@7249..7250 "k"4499 COMMA@7250..7251 ","4500 WHITESPACE@7251..7252 " "4501 EXPR_VAR@7252..72574502 NAME@7252..72574503 IDENT@7252..7257 "value"4504 R_BRACK@7257..7258 "]"4505 WHITESPACE@7258..7259 " "4506 FOR_SPEC@7259..72874507 FOR_KW@7259..7262 "for"4508 WHITESPACE@7262..7263 " "4509 NAME@7263..72684510 IDENT@7263..7268 "value"4511 WHITESPACE@7268..7269 " "4512 IN_KW@7269..7271 "in"4513 WHITESPACE@7271..7272 " "4514 EXPR_VAR@7272..72874515 NAME@7272..72874516 IDENT@7272..7287 "value_or_values"4517 R_BRACK@7287..7288 "]"4518 WHITESPACE@7288..7297 "\n "4519 ELSE_KW@7297..7301 "else"4520 WHITESPACE@7301..7312 "\n "4521 FALSE_EXPR@7312..73464522 EXPR_ARRAY@7312..73464523 L_BRACK@7312..7313 "["4524 EXPR_BINARY@7313..73454525 LHS_EXPR@7313..73224526 EXPR_STRING@7313..73224527 STRING_SINGLE@7313..7322 "'%s = %s'"4528 WHITESPACE@7322..7323 " "4529 MODULO@7323..7324 "%"4530 WHITESPACE@7324..7325 " "4531 EXPR_ARRAY@7325..73454532 L_BRACK@7325..7326 "["4533 EXPR_VAR@7326..73274534 NAME@7326..73274535 IDENT@7326..7327 "k"4536 COMMA@7327..7328 ","4537 WHITESPACE@7328..7329 " "4538 EXPR_VAR@7329..73444539 NAME@7329..73444540 IDENT@7329..7344 "value_or_values"4541 R_BRACK@7344..7345 "]"4542 R_BRACK@7345..7346 "]"4543 WHITESPACE@7346..7356 "\n\n "4544 FOR_SPEC@7356..73874545 FOR_KW@7356..7359 "for"4546 WHITESPACE@7359..7360 " "4547 NAME@7360..73614548 IDENT@7360..7361 "k"4549 WHITESPACE@7361..7362 " "4550 IN_KW@7362..7364 "in"4551 WHITESPACE@7364..7365 " "4552 EXPR_APPLY@7365..73874553 EXPR_INDEX@7365..73814554 EXPR_VAR@7365..73684555 NAME@7365..73684556 IDENT@7365..7368 "std"4557 DOT@7368..7369 "."4558 NAME@7369..73814559 IDENT@7369..7381 "objectFields"4560 ARGS_DESC@7381..73874561 L_PAREN@7381..7382 "("4562 ARG@7382..73864563 EXPR_VAR@7382..73864564 NAME@7382..73864565 IDENT@7382..7386 "body"4566 R_PAREN@7386..7387 ")"4567 WHITESPACE@7387..7394 "\n "4568 R_BRACK@7394..7395 "]"4569 R_PAREN@7395..7396 ")"4570 SEMI@7396..7397 ";"4571 WHITESPACE@7397..7403 "\n\n "4572 EXPR_LOCAL@7403..77564573 LOCAL_KW@7403..7408 "local"4574 WHITESPACE@7408..7409 " "4575 BIND_FUNCTION@7409..74774576 NAME@7409..74224577 IDENT@7409..7422 "section_lines"4578 PARAMS_DESC@7422..74364579 L_PAREN@7422..7423 "("4580 PARAM@7423..74284581 DESTRUCT_FULL@7423..74284582 NAME@7423..74284583 IDENT@7423..7428 "sname"4584 COMMA@7428..7429 ","4585 WHITESPACE@7429..7430 " "4586 PARAM@7430..74354587 DESTRUCT_FULL@7430..74354588 NAME@7430..74354589 IDENT@7430..7435 "sbody"4590 R_PAREN@7435..7436 ")"4591 WHITESPACE@7436..7437 " "4592 ASSIGN@7437..7438 "="4593 WHITESPACE@7438..7439 " "4594 EXPR_BINARY@7439..74774595 LHS_EXPR@7439..74574596 EXPR_ARRAY@7439..74574597 L_BRACK@7439..7440 "["4598 EXPR_BINARY@7440..74564599 LHS_EXPR@7440..74464600 EXPR_STRING@7440..74464601 STRING_SINGLE@7440..7446 "'[%s]'"4602 WHITESPACE@7446..7447 " "4603 MODULO@7447..7448 "%"4604 WHITESPACE@7448..7449 " "4605 EXPR_ARRAY@7449..74564606 L_BRACK@7449..7450 "["4607 EXPR_VAR@7450..74554608 NAME@7450..74554609 IDENT@7450..7455 "sname"4610 R_BRACK@7455..7456 "]"4611 R_BRACK@7456..7457 "]"4612 WHITESPACE@7457..7458 " "4613 PLUS@7458..7459 "+"4614 WHITESPACE@7459..7460 " "4615 EXPR_APPLY@7460..74774616 EXPR_VAR@7460..74704617 NAME@7460..74704618 IDENT@7460..7470 "body_lines"4619 ARGS_DESC@7470..74774620 L_PAREN@7470..7471 "("4621 ARG@7471..74764622 EXPR_VAR@7471..74764623 NAME@7471..74764624 IDENT@7471..7476 "sbody"4625 R_PAREN@7476..7477 ")"4626 COMMA@7477..7478 ","4627 WHITESPACE@7478..7489 "\n "4628 BIND_DESTRUCT@7489..75644629 DESTRUCT_FULL@7489..74984630 NAME@7489..74984631 IDENT@7489..7498 "main_body"4632 WHITESPACE@7498..7499 " "4633 ASSIGN@7499..7500 "="4634 WHITESPACE@7500..7501 " "4635 EXPR_IF_THEN_ELSE@7501..75644636 IF_KW@7501..7503 "if"4637 WHITESPACE@7503..7504 " "4638 EXPR_APPLY@7504..75304639 EXPR_INDEX@7504..75174640 EXPR_VAR@7504..75074641 NAME@7504..75074642 IDENT@7504..7507 "std"4643 DOT@7507..7508 "."4644 NAME@7508..75174645 IDENT@7508..7517 "objectHas"4646 ARGS_DESC@7517..75304647 L_PAREN@7517..7518 "("4648 ARG@7518..75214649 EXPR_VAR@7518..75214650 NAME@7518..75214651 IDENT@7518..7521 "ini"4652 COMMA@7521..7522 ","4653 WHITESPACE@7522..7523 " "4654 ARG@7523..75294655 EXPR_STRING@7523..75294656 STRING_SINGLE@7523..7529 "'main'"4657 R_PAREN@7529..7530 ")"4658 WHITESPACE@7530..7531 " "4659 THEN_KW@7531..7535 "then"4660 WHITESPACE@7535..7536 " "4661 TRUE_EXPR@7536..75564662 EXPR_APPLY@7536..75564663 EXPR_VAR@7536..75464664 NAME@7536..75464665 IDENT@7536..7546 "body_lines"4666 ARGS_DESC@7546..75564667 L_PAREN@7546..7547 "("4668 ARG@7547..75554669 EXPR_INDEX@7547..75554670 EXPR_VAR@7547..75504671 NAME@7547..75504672 IDENT@7547..7550 "ini"4673 DOT@7550..7551 "."4674 NAME@7551..75554675 IDENT@7551..7555 "main"4676 R_PAREN@7555..7556 ")"4677 WHITESPACE@7556..7557 " "4678 ELSE_KW@7557..7561 "else"4679 WHITESPACE@7561..7562 " "4680 FALSE_EXPR@7562..75644681 EXPR_ARRAY@7562..75644682 L_BRACK@7562..7563 "["4683 R_BRACK@7563..7564 "]"4684 COMMA@7564..7565 ","4685 WHITESPACE@7565..7576 "\n "4686 BIND_DESTRUCT@7576..76844687 DESTRUCT_FULL@7576..75884688 NAME@7576..75884689 IDENT@7576..7588 "all_sections"4690 WHITESPACE@7588..7589 " "4691 ASSIGN@7589..7590 "="4692 WHITESPACE@7590..7591 " "4693 EXPR_ARRAY_COMP@7591..76844694 L_BRACK@7591..7592 "["4695 WHITESPACE@7592..7599 "\n "4696 EXPR_APPLY@7599..76324697 EXPR_VAR@7599..76124698 NAME@7599..76124699 IDENT@7599..7612 "section_lines"4700 ARGS_DESC@7612..76324701 L_PAREN@7612..7613 "("4702 ARG@7613..76144703 EXPR_VAR@7613..76144704 NAME@7613..76144705 IDENT@7613..7614 "k"4706 COMMA@7614..7615 ","4707 WHITESPACE@7615..7616 " "4708 ARG@7616..76314709 EXPR_INDEX_EXPR@7616..76314710 LHS_EXPR@7616..76284711 EXPR_INDEX@7616..76284712 EXPR_VAR@7616..76194713 NAME@7616..76194714 IDENT@7616..7619 "ini"4715 DOT@7619..7620 "."4716 NAME@7620..76284717 IDENT@7620..7628 "sections"4718 L_BRACK@7628..7629 "["4719 EXPR_VAR@7629..76304720 NAME@7629..76304721 IDENT@7629..7630 "k"4722 R_BRACK@7630..7631 "]"4723 R_PAREN@7631..7632 ")"4724 WHITESPACE@7632..7639 "\n "4725 FOR_SPEC@7639..76784726 FOR_KW@7639..7642 "for"4727 WHITESPACE@7642..7643 " "4728 NAME@7643..76444729 IDENT@7643..7644 "k"4730 WHITESPACE@7644..7645 " "4731 IN_KW@7645..7647 "in"4732 WHITESPACE@7647..7648 " "4733 EXPR_APPLY@7648..76784734 EXPR_INDEX@7648..76644735 EXPR_VAR@7648..76514736 NAME@7648..76514737 IDENT@7648..7651 "std"4738 DOT@7651..7652 "."4739 NAME@7652..76644740 IDENT@7652..7664 "objectFields"4741 ARGS_DESC@7664..76784742 L_PAREN@7664..7665 "("4743 ARG@7665..76774744 EXPR_INDEX@7665..76774745 EXPR_VAR@7665..76684746 NAME@7665..76684747 IDENT@7665..7668 "ini"4748 DOT@7668..7669 "."4749 NAME@7669..76774750 IDENT@7669..7677 "sections"4751 R_PAREN@7677..7678 ")"4752 WHITESPACE@7678..7683 "\n "4753 R_BRACK@7683..7684 "]"4754 SEMI@7684..7685 ";"4755 WHITESPACE@7685..7690 "\n "4756 EXPR_APPLY@7690..77564757 EXPR_INDEX@7690..76984758 EXPR_VAR@7690..76934759 NAME@7690..76934760 IDENT@7690..7693 "std"4761 DOT@7693..7694 "."4762 NAME@7694..76984763 IDENT@7694..7698 "join"4764 ARGS_DESC@7698..77564765 L_PAREN@7698..7699 "("4766 ARG@7699..77034767 EXPR_STRING@7699..77034768 STRING_SINGLE@7699..7703 "'\\n'"4769 COMMA@7703..7704 ","4770 WHITESPACE@7704..7705 " "4771 ARG@7705..77554772 EXPR_BINARY@7705..77554773 LHS_EXPR@7705..77484774 EXPR_BINARY@7705..77484775 LHS_EXPR@7705..77144776 EXPR_VAR@7705..77144777 NAME@7705..77144778 IDENT@7705..7714 "main_body"4779 WHITESPACE@7714..7715 " "4780 PLUS@7715..7716 "+"4781 WHITESPACE@7716..7717 " "4782 EXPR_APPLY@7717..77484783 EXPR_INDEX@7717..77344784 EXPR_VAR@7717..77204785 NAME@7717..77204786 IDENT@7717..7720 "std"4787 DOT@7720..7721 "."4788 NAME@7721..77344789 IDENT@7721..7734 "flattenArrays"4790 ARGS_DESC@7734..77484791 L_PAREN@7734..7735 "("4792 ARG@7735..77474793 EXPR_VAR@7735..77474794 NAME@7735..77474795 IDENT@7735..7747 "all_sections"4796 R_PAREN@7747..7748 ")"4797 WHITESPACE@7748..7749 " "4798 PLUS@7749..7750 "+"4799 WHITESPACE@7750..7751 " "4800 EXPR_ARRAY@7751..77554801 L_BRACK@7751..7752 "["4802 EXPR_STRING@7752..77544803 STRING_SINGLE@7752..7754 "''"4804 R_BRACK@7754..7755 "]"4805 R_PAREN@7755..7756 ")"4806 COMMA@7756..7757 ","4807 WHITESPACE@7757..7761 "\n\n "4808 MEMBER_FIELD@7761..78144809 FIELD_METHOD@7761..78144810 FIELD_NAME_FIXED@7761..77734811 NAME@7761..77734812 IDENT@7761..7773 "manifestToml"4813 PARAMS_DESC@7773..77804814 L_PAREN@7773..7774 "("4815 PARAM@7774..77794816 DESTRUCT_FULL@7774..77794817 NAME@7774..77794818 IDENT@7774..7779 "value"4819 R_PAREN@7779..7780 ")"4820 COLONCOLON@7780..7782 "::"4821 WHITESPACE@7782..7783 " "4822 EXPR_APPLY@7783..78144823 EXPR_INDEX@7783..78014824 EXPR_VAR@7783..77864825 NAME@7783..77864826 IDENT@7783..7786 "std"4827 DOT@7786..7787 "."4828 NAME@7787..78014829 IDENT@7787..7801 "manifestTomlEx"4830 ARGS_DESC@7801..78144831 L_PAREN@7801..7802 "("4832 ARG@7802..78074833 EXPR_VAR@7802..78074834 NAME@7802..78074835 IDENT@7802..7807 "value"4836 COMMA@7807..7808 ","4837 WHITESPACE@7808..7809 " "4838 ARG@7809..78134839 EXPR_STRING@7809..78134840 STRING_SINGLE@7809..7813 "' '"4841 R_PAREN@7813..7814 ")"4842 COMMA@7814..7815 ","4843 WHITESPACE@7815..7819 "\n\n "4844 MEMBER_FIELD@7819..114764845 FIELD_METHOD@7819..114764846 FIELD_NAME_FIXED@7819..78334847 NAME@7819..78334848 IDENT@7819..7833 "manifestTomlEx"4849 PARAMS_DESC@7833..78484850 L_PAREN@7833..7834 "("4851 PARAM@7834..78394852 DESTRUCT_FULL@7834..78394853 NAME@7834..78394854 IDENT@7834..7839 "value"4855 COMMA@7839..7840 ","4856 WHITESPACE@7840..7841 " "4857 PARAM@7841..78474858 DESTRUCT_FULL@7841..78474859 NAME@7841..78474860 IDENT@7841..7847 "indent"4861 R_PAREN@7847..7848 ")"4862 COLONCOLON@7848..7850 "::"4863 WHITESPACE@7850..7855 "\n "4864 EXPR_LOCAL@7855..114764865 LOCAL_KW@7855..7860 "local"4866 WHITESPACE@7860..7867 "\n "4867 BIND_DESTRUCT@7867..79064868 DESTRUCT_FULL@7867..78834869 NAME@7867..78834870 IDENT@7867..7883 "escapeStringToml"4871 WHITESPACE@7883..7884 " "4872 ASSIGN@7884..7885 "="4873 WHITESPACE@7885..7886 " "4874 EXPR_INDEX@7886..79064875 EXPR_VAR@7886..78894876 NAME@7886..78894877 IDENT@7886..7889 "std"4878 DOT@7889..7890 "."4879 NAME@7890..79064880 IDENT@7890..7906 "escapeStringJson"4881 COMMA@7906..7907 ","4882 WHITESPACE@7907..7914 "\n "4883 BIND_FUNCTION@7914..81784884 NAME@7914..79274885 IDENT@7914..7927 "escapeKeyToml"4886 PARAMS_DESC@7927..79324887 L_PAREN@7927..7928 "("4888 PARAM@7928..79314889 DESTRUCT_FULL@7928..79314890 NAME@7928..79314891 IDENT@7928..7931 "key"4892 R_PAREN@7931..7932 ")"4893 WHITESPACE@7932..7933 " "4894 ASSIGN@7933..7934 "="4895 WHITESPACE@7934..7943 "\n "4896 EXPR_LOCAL@7943..81784897 LOCAL_KW@7943..7948 "local"4898 WHITESPACE@7948..7949 " "4899 BIND_DESTRUCT@7949..80564900 DESTRUCT_FULL@7949..79614901 NAME@7949..79614902 IDENT@7949..7961 "bare_allowed"4903 WHITESPACE@7961..7962 " "4904 ASSIGN@7962..7963 "="4905 WHITESPACE@7963..7964 " "4906 EXPR_APPLY@7964..80564907 EXPR_INDEX@7964..79714908 EXPR_VAR@7964..79674909 NAME@7964..79674910 IDENT@7964..7967 "std"4911 DOT@7967..7968 "."4912 NAME@7968..79714913 IDENT@7968..7971 "set"4914 ARGS_DESC@7971..80564915 L_PAREN@7971..7972 "("4916 ARG@7972..80554917 EXPR_APPLY@7972..80554918 EXPR_INDEX@7972..79874919 EXPR_VAR@7972..79754920 NAME@7972..79754921 IDENT@7972..7975 "std"4922 DOT@7975..7976 "."4923 NAME@7976..79874924 IDENT@7976..7987 "stringChars"4925 ARGS_DESC@7987..80554926 L_PAREN@7987..7988 "("4927 ARG@7988..80544928 EXPR_STRING@7988..80544929 STRING_SINGLE@7988..8054 "'ABCDEFGHIJKLMNOPQRST ..."4930 R_PAREN@8054..8055 ")"4931 R_PAREN@8055..8056 ")"4932 SEMI@8056..8057 ";"4933 WHITESPACE@8057..8066 "\n "4934 EXPR_IF_THEN_ELSE@8066..81784935 IF_KW@8066..8068 "if"4936 WHITESPACE@8068..8069 " "4937 EXPR_BINARY@8069..81424938 LHS_EXPR@8069..81264939 EXPR_APPLY@8069..81264940 EXPR_INDEX@8069..80814941 EXPR_VAR@8069..80724942 NAME@8069..80724943 IDENT@8069..8072 "std"4944 DOT@8072..8073 "."4945 NAME@8073..80814946 IDENT@8073..8081 "setUnion"4947 ARGS_DESC@8081..81264948 L_PAREN@8081..8082 "("4949 ARG@8082..81114950 EXPR_APPLY@8082..81114951 EXPR_INDEX@8082..80894952 EXPR_VAR@8082..80854953 NAME@8082..80854954 IDENT@8082..8085 "std"4955 DOT@8085..8086 "."4956 NAME@8086..80894957 IDENT@8086..8089 "set"4958 ARGS_DESC@8089..81114959 L_PAREN@8089..8090 "("4960 ARG@8090..81104961 EXPR_APPLY@8090..81104962 EXPR_INDEX@8090..81054963 EXPR_VAR@8090..80934964 NAME@8090..80934965 IDENT@8090..8093 "std"4966 DOT@8093..8094 "."4967 NAME@8094..81054968 IDENT@8094..8105 "stringChars"4969 ARGS_DESC@8105..81104970 L_PAREN@8105..8106 "("4971 ARG@8106..81094972 EXPR_VAR@8106..81094973 NAME@8106..81094974 IDENT@8106..8109 "key"4975 R_PAREN@8109..8110 ")"4976 R_PAREN@8110..8111 ")"4977 COMMA@8111..8112 ","4978 WHITESPACE@8112..8113 " "4979 ARG@8113..81254980 EXPR_VAR@8113..81254981 NAME@8113..81254982 IDENT@8113..8125 "bare_allowed"4983 R_PAREN@8125..8126 ")"4984 WHITESPACE@8126..8127 " "4985 EQ@8127..8129 "=="4986 WHITESPACE@8129..8130 " "4987 EXPR_VAR@8130..81424988 NAME@8130..81424989 IDENT@8130..8142 "bare_allowed"4990 WHITESPACE@8142..8143 " "4991 THEN_KW@8143..8147 "then"4992 WHITESPACE@8147..8148 " "4993 TRUE_EXPR@8148..81514994 EXPR_VAR@8148..81514995 NAME@8148..81514996 IDENT@8148..8151 "key"4997 WHITESPACE@8151..8152 " "4998 ELSE_KW@8152..8156 "else"4999 WHITESPACE@8156..8157 " "5000 FALSE_EXPR@8157..81785001 EXPR_APPLY@8157..81785002 EXPR_VAR@8157..81735003 NAME@8157..81735004 IDENT@8157..8173 "escapeStringToml"5005 ARGS_DESC@8173..81785006 L_PAREN@8173..8174 "("5007 ARG@8174..81775008 EXPR_VAR@8174..81775009 NAME@8174..81775010 IDENT@8174..8177 "key"5011 R_PAREN@8177..8178 ")"5012 COMMA@8178..8179 ","5013 WHITESPACE@8179..8186 "\n "5014 BIND_FUNCTION@8186..82985015 NAME@8186..81985016 IDENT@8186..8198 "isTableArray"5017 PARAMS_DESC@8198..82015018 L_PAREN@8198..8199 "("5019 PARAM@8199..82005020 DESTRUCT_FULL@8199..82005021 NAME@8199..82005022 IDENT@8199..8200 "v"5023 R_PAREN@8200..8201 ")"5024 WHITESPACE@8201..8202 " "5025 ASSIGN@8202..8203 "="5026 WHITESPACE@8203..8204 " "5027 EXPR_BINARY@8204..82985028 LHS_EXPR@8204..82395029 EXPR_BINARY@8204..82395030 LHS_EXPR@8204..82185031 EXPR_APPLY@8204..82185032 EXPR_INDEX@8204..82155033 EXPR_VAR@8204..82075034 NAME@8204..82075035 IDENT@8204..8207 "std"5036 DOT@8207..8208 "."5037 NAME@8208..82155038 IDENT@8208..8215 "isArray"5039 ARGS_DESC@8215..82185040 L_PAREN@8215..8216 "("5041 ARG@8216..82175042 EXPR_VAR@8216..82175043 NAME@8216..82175044 IDENT@8216..8217 "v"5045 R_PAREN@8217..8218 ")"5046 WHITESPACE@8218..8219 " "5047 AND@8219..8221 "&&"5048 WHITESPACE@8221..8222 " "5049 EXPR_BINARY@8222..82395050 LHS_EXPR@8222..82355051 EXPR_APPLY@8222..82355052 EXPR_INDEX@8222..82325053 EXPR_VAR@8222..82255054 NAME@8222..82255055 IDENT@8222..8225 "std"5056 DOT@8225..8226 "."5057 NAME@8226..82325058 IDENT@8226..8232 "length"5059 ARGS_DESC@8232..82355060 L_PAREN@8232..8233 "("5061 ARG@8233..82345062 EXPR_VAR@8233..82345063 NAME@8233..82345064 IDENT@8233..8234 "v"5065 R_PAREN@8234..8235 ")"5066 WHITESPACE@8235..8236 " "5067 GT@8236..8237 ">"5068 WHITESPACE@8237..8238 " "5069 EXPR_NUMBER@8238..82395070 FLOAT@8238..8239 "0"5071 WHITESPACE@8239..8240 " "5072 AND@8240..8242 "&&"5073 WHITESPACE@8242..8243 " "5074 EXPR_APPLY@8243..82985075 EXPR_INDEX@8243..82525076 EXPR_VAR@8243..82465077 NAME@8243..82465078 IDENT@8243..8246 "std"5079 DOT@8246..8247 "."5080 NAME@8247..82525081 IDENT@8247..8252 "foldl"5082 ARGS_DESC@8252..82985083 L_PAREN@8252..8253 "("5084 ARG@8253..82885085 EXPR_FUNCTION@8253..82885086 FUNCTION_KW@8253..8261 "function"5087 PARAMS_DESC@8261..82675088 L_PAREN@8261..8262 "("5089 PARAM@8262..82635090 DESTRUCT_FULL@8262..82635091 NAME@8262..82635092 IDENT@8262..8263 "a"5093 COMMA@8263..8264 ","5094 WHITESPACE@8264..8265 " "5095 PARAM@8265..82665096 DESTRUCT_FULL@8265..82665097 NAME@8265..82665098 IDENT@8265..8266 "b"5099 R_PAREN@8266..8267 ")"5100 WHITESPACE@8267..8268 " "5101 EXPR_BINARY@8268..82885102 LHS_EXPR@8268..82695103 EXPR_VAR@8268..82695104 NAME@8268..82695105 IDENT@8268..8269 "a"5106 WHITESPACE@8269..8270 " "5107 AND@8270..8272 "&&"5108 WHITESPACE@8272..8273 " "5109 EXPR_APPLY@8273..82885110 EXPR_INDEX@8273..82855111 EXPR_VAR@8273..82765112 NAME@8273..82765113 IDENT@8273..8276 "std"5114 DOT@8276..8277 "."5115 NAME@8277..82855116 IDENT@8277..8285 "isObject"5117 ARGS_DESC@8285..82885118 L_PAREN@8285..8286 "("5119 ARG@8286..82875120 EXPR_VAR@8286..82875121 NAME@8286..82875122 IDENT@8286..8287 "b"5123 R_PAREN@8287..8288 ")"5124 COMMA@8288..8289 ","5125 WHITESPACE@8289..8290 " "5126 ARG@8290..82915127 EXPR_VAR@8290..82915128 NAME@8290..82915129 IDENT@8290..8291 "v"5130 COMMA@8291..8292 ","5131 WHITESPACE@8292..8293 " "5132 ARG@8293..82975133 EXPR_LITERAL@8293..82975134 TRUE_KW@8293..8297 "true"5135 R_PAREN@8297..8298 ")"5136 COMMA@8298..8299 ","5137 WHITESPACE@8299..8306 "\n "5138 BIND_FUNCTION@8306..83555139 NAME@8306..83155140 IDENT@8306..8315 "isSection"5141 PARAMS_DESC@8315..83185142 L_PAREN@8315..8316 "("5143 PARAM@8316..83175144 DESTRUCT_FULL@8316..83175145 NAME@8316..83175146 IDENT@8316..8317 "v"5147 R_PAREN@8317..8318 ")"5148 WHITESPACE@8318..8319 " "5149 ASSIGN@8319..8320 "="5150 WHITESPACE@8320..8321 " "5151 EXPR_BINARY@8321..83555152 LHS_EXPR@8321..83365153 EXPR_APPLY@8321..83365154 EXPR_INDEX@8321..83335155 EXPR_VAR@8321..83245156 NAME@8321..83245157 IDENT@8321..8324 "std"5158 DOT@8324..8325 "."5159 NAME@8325..83335160 IDENT@8325..8333 "isObject"5161 ARGS_DESC@8333..83365162 L_PAREN@8333..8334 "("5163 ARG@8334..83355164 EXPR_VAR@8334..83355165 NAME@8334..83355166 IDENT@8334..8335 "v"5167 R_PAREN@8335..8336 ")"5168 WHITESPACE@8336..8337 " "5169 OR@8337..8339 "||"5170 WHITESPACE@8339..8340 " "5171 EXPR_APPLY@8340..83555172 EXPR_VAR@8340..83525173 NAME@8340..83525174 IDENT@8340..8352 "isTableArray"5175 ARGS_DESC@8352..83555176 L_PAREN@8352..8353 "("5177 ARG@8353..83545178 EXPR_VAR@8353..83545179 NAME@8353..83545180 IDENT@8353..8354 "v"5181 R_PAREN@8354..8355 ")"5182 COMMA@8355..8356 ","5183 WHITESPACE@8356..8363 "\n "5184 BIND_FUNCTION@8363..99905185 NAME@8363..83745186 IDENT@8363..8374 "renderValue"5187 PARAMS_DESC@8374..84075188 L_PAREN@8374..8375 "("5189 PARAM@8375..83765190 DESTRUCT_FULL@8375..83765191 NAME@8375..83765192 IDENT@8375..8376 "v"5193 COMMA@8376..8377 ","5194 WHITESPACE@8377..8378 " "5195 PARAM@8378..83895196 DESTRUCT_FULL@8378..83895197 NAME@8378..83895198 IDENT@8378..8389 "indexedPath"5199 COMMA@8389..8390 ","5200 WHITESPACE@8390..8391 " "5201 PARAM@8391..83975202 DESTRUCT_FULL@8391..83975203 NAME@8391..83975204 IDENT@8391..8397 "inline"5205 COMMA@8397..8398 ","5206 WHITESPACE@8398..8399 " "5207 PARAM@8399..84065208 DESTRUCT_FULL@8399..84065209 NAME@8399..84065210 IDENT@8399..8406 "cindent"5211 R_PAREN@8406..8407 ")"5212 WHITESPACE@8407..8408 " "5213 ASSIGN@8408..8409 "="5214 WHITESPACE@8409..8418 "\n "5215 EXPR_IF_THEN_ELSE@8418..99905216 IF_KW@8418..8420 "if"5217 WHITESPACE@8420..8421 " "5218 EXPR_BINARY@8421..84305219 LHS_EXPR@8421..84225220 EXPR_VAR@8421..84225221 NAME@8421..84225222 IDENT@8421..8422 "v"5223 WHITESPACE@8422..8423 " "5224 EQ@8423..8425 "=="5225 WHITESPACE@8425..8426 " "5226 EXPR_LITERAL@8426..84305227 TRUE_KW@8426..8430 "true"5228 WHITESPACE@8430..8431 " "5229 THEN_KW@8431..8435 "then"5230 WHITESPACE@8435..8446 "\n "5231 TRUE_EXPR@8446..84525232 EXPR_STRING@8446..84525233 STRING_SINGLE@8446..8452 "'true'"5234 WHITESPACE@8452..8461 "\n "5235 ELSE_KW@8461..8465 "else"5236 WHITESPACE@8465..8466 " "5237 FALSE_EXPR@8466..99905238 EXPR_IF_THEN_ELSE@8466..99905239 IF_KW@8466..8468 "if"5240 WHITESPACE@8468..8469 " "5241 EXPR_BINARY@8469..84795242 LHS_EXPR@8469..84705243 EXPR_VAR@8469..84705244 NAME@8469..84705245 IDENT@8469..8470 "v"5246 WHITESPACE@8470..8471 " "5247 EQ@8471..8473 "=="5248 WHITESPACE@8473..8474 " "5249 EXPR_LITERAL@8474..84795250 FALSE_KW@8474..8479 "false"5251 WHITESPACE@8479..8480 " "5252 THEN_KW@8480..8484 "then"5253 WHITESPACE@8484..8495 "\n "5254 TRUE_EXPR@8495..85025255 EXPR_STRING@8495..85025256 STRING_SINGLE@8495..8502 "'false'"5257 WHITESPACE@8502..8511 "\n "5258 ELSE_KW@8511..8515 "else"5259 WHITESPACE@8515..8516 " "5260 FALSE_EXPR@8516..99905261 EXPR_IF_THEN_ELSE@8516..99905262 IF_KW@8516..8518 "if"5263 WHITESPACE@8518..8519 " "5264 EXPR_BINARY@8519..85285265 LHS_EXPR@8519..85205266 EXPR_VAR@8519..85205267 NAME@8519..85205268 IDENT@8519..8520 "v"5269 WHITESPACE@8520..8521 " "5270 EQ@8521..8523 "=="5271 WHITESPACE@8523..8524 " "5272 EXPR_LITERAL@8524..85285273 NULL_KW@8524..8528 "null"5274 WHITESPACE@8528..8529 " "5275 THEN_KW@8529..8533 "then"5276 WHITESPACE@8533..8544 "\n "5277 TRUE_EXPR@8544..85945278 EXPR_ERROR@8544..85945279 ERROR_KW@8544..8549 "error"5280 WHITESPACE@8549..8550 " "5281 EXPR_BINARY@8550..85945282 LHS_EXPR@8550..85805283 EXPR_STRING@8550..85805284 STRING_SINGLE@8550..8580 "'Tried to manifest \"n ..."5285 WHITESPACE@8580..8581 " "5286 PLUS@8581..8582 "+"5287 WHITESPACE@8582..8583 " "5288 EXPR_VAR@8583..85945289 NAME@8583..85945290 IDENT@8583..8594 "indexedPath"5291 WHITESPACE@8594..8603 "\n "5292 ELSE_KW@8603..8607 "else"5293 WHITESPACE@8607..8608 " "5294 FALSE_EXPR@8608..99905295 EXPR_IF_THEN_ELSE@8608..99905296 IF_KW@8608..8610 "if"5297 WHITESPACE@8610..8611 " "5298 EXPR_APPLY@8611..86265299 EXPR_INDEX@8611..86235300 EXPR_VAR@8611..86145301 NAME@8611..86145302 IDENT@8611..8614 "std"5303 DOT@8614..8615 "."5304 NAME@8615..86235305 IDENT@8615..8623 "isNumber"5306 ARGS_DESC@8623..86265307 L_PAREN@8623..8624 "("5308 ARG@8624..86255309 EXPR_VAR@8624..86255310 NAME@8624..86255311 IDENT@8624..8625 "v"5312 R_PAREN@8625..8626 ")"5313 WHITESPACE@8626..8627 " "5314 THEN_KW@8627..8631 "then"5315 WHITESPACE@8631..8642 "\n "5316 TRUE_EXPR@8642..86485317 EXPR_BINARY@8642..86485318 LHS_EXPR@8642..86445319 EXPR_STRING@8642..86445320 STRING_SINGLE@8642..8644 "''"5321 WHITESPACE@8644..8645 " "5322 PLUS@8645..8646 "+"5323 WHITESPACE@8646..8647 " "5324 EXPR_VAR@8647..86485325 NAME@8647..86485326 IDENT@8647..8648 "v"5327 WHITESPACE@8648..8657 "\n "5328 ELSE_KW@8657..8661 "else"5329 WHITESPACE@8661..8662 " "5330 FALSE_EXPR@8662..99905331 EXPR_IF_THEN_ELSE@8662..99905332 IF_KW@8662..8664 "if"5333 WHITESPACE@8664..8665 " "5334 EXPR_APPLY@8665..86805335 EXPR_INDEX@8665..86775336 EXPR_VAR@8665..86685337 NAME@8665..86685338 IDENT@8665..8668 "std"5339 DOT@8668..8669 "."5340 NAME@8669..86775341 IDENT@8669..8677 "isString"5342 ARGS_DESC@8677..86805343 L_PAREN@8677..8678 "("5344 ARG@8678..86795345 EXPR_VAR@8678..86795346 NAME@8678..86795347 IDENT@8678..8679 "v"5348 R_PAREN@8679..8680 ")"5349 WHITESPACE@8680..8681 " "5350 THEN_KW@8681..8685 "then"5351 WHITESPACE@8685..8696 "\n "5352 TRUE_EXPR@8696..87155353 EXPR_APPLY@8696..87155354 EXPR_VAR@8696..87125355 NAME@8696..87125356 IDENT@8696..8712 "escapeStringToml"5357 ARGS_DESC@8712..87155358 L_PAREN@8712..8713 "("5359 ARG@8713..87145360 EXPR_VAR@8713..87145361 NAME@8713..87145362 IDENT@8713..8714 "v"5363 R_PAREN@8714..8715 ")"5364 WHITESPACE@8715..8724 "\n "5365 ELSE_KW@8724..8728 "else"5366 WHITESPACE@8728..8729 " "5367 FALSE_EXPR@8729..99905368 EXPR_IF_THEN_ELSE@8729..99905369 IF_KW@8729..8731 "if"5370 WHITESPACE@8731..8732 " "5371 EXPR_APPLY@8732..87495372 EXPR_INDEX@8732..87465373 EXPR_VAR@8732..87355374 NAME@8732..87355375 IDENT@8732..8735 "std"5376 DOT@8735..8736 "."5377 NAME@8736..87465378 IDENT@8736..8746 "isFunction"5379 ARGS_DESC@8746..87495380 L_PAREN@8746..8747 "("5381 ARG@8747..87485382 EXPR_VAR@8747..87485383 NAME@8747..87485384 IDENT@8747..8748 "v"5385 R_PAREN@8748..8749 ")"5386 WHITESPACE@8749..8750 " "5387 THEN_KW@8750..8754 "then"5388 WHITESPACE@8754..8765 "\n "5389 TRUE_EXPR@8765..88175390 EXPR_ERROR@8765..88175391 ERROR_KW@8765..8770 "error"5392 WHITESPACE@8770..8771 " "5393 EXPR_BINARY@8771..88175394 LHS_EXPR@8771..88035395 EXPR_STRING@8771..88035396 STRING_SINGLE@8771..8803 "'Tried to manifest fu ..."5397 WHITESPACE@8803..8804 " "5398 PLUS@8804..8805 "+"5399 WHITESPACE@8805..8806 " "5400 EXPR_VAR@8806..88175401 NAME@8806..88175402 IDENT@8806..8817 "indexedPath"5403 WHITESPACE@8817..8826 "\n "5404 ELSE_KW@8826..8830 "else"5405 WHITESPACE@8830..8831 " "5406 FALSE_EXPR@8831..99905407 EXPR_IF_THEN_ELSE@8831..99905408 IF_KW@8831..8833 "if"5409 WHITESPACE@8833..8834 " "5410 EXPR_APPLY@8834..88485411 EXPR_INDEX@8834..88455412 EXPR_VAR@8834..88375413 NAME@8834..88375414 IDENT@8834..8837 "std"5415 DOT@8837..8838 "."5416 NAME@8838..88455417 IDENT@8838..8845 "isArray"5418 ARGS_DESC@8845..88485419 L_PAREN@8845..8846 "("5420 ARG@8846..88475421 EXPR_VAR@8846..88475422 NAME@8846..88475423 IDENT@8846..8847 "v"5424 R_PAREN@8847..8848 ")"5425 WHITESPACE@8848..8849 " "5426 THEN_KW@8849..8853 "then"5427 WHITESPACE@8853..8864 "\n "5428 TRUE_EXPR@8864..95615429 EXPR_IF_THEN_ELSE@8864..95615430 IF_KW@8864..8866 "if"5431 WHITESPACE@8866..8867 " "5432 EXPR_BINARY@8867..88855433 LHS_EXPR@8867..88805434 EXPR_APPLY@8867..88805435 EXPR_INDEX@8867..88775436 EXPR_VAR@8867..88705437 NAME@8867..88705438 IDENT@8867..8870 "std"5439 DOT@8870..8871 "."5440 NAME@8871..88775441 IDENT@8871..8877 "length"5442 ARGS_DESC@8877..88805443 L_PAREN@8877..8878 "("5444 ARG@8878..88795445 EXPR_VAR@8878..88795446 NAME@8878..88795447 IDENT@8878..8879 "v"5448 R_PAREN@8879..8880 ")"5449 WHITESPACE@8880..8881 " "5450 EQ@8881..8883 "=="5451 WHITESPACE@8883..8884 " "5452 EXPR_NUMBER@8884..88855453 FLOAT@8884..8885 "0"5454 WHITESPACE@8885..8886 " "5455 THEN_KW@8886..8890 "then"5456 WHITESPACE@8890..8903 "\n "5457 TRUE_EXPR@8903..89075458 EXPR_STRING@8903..89075459 STRING_SINGLE@8903..8907 "'[]'"5460 WHITESPACE@8907..8918 "\n "5461 ELSE_KW@8918..8922 "else"5462 WHITESPACE@8922..8935 "\n "5463 FALSE_EXPR@8935..95615464 EXPR_LOCAL@8935..95615465 LOCAL_KW@8935..8940 "local"5466 WHITESPACE@8940..8941 " "5467 BIND_DESTRUCT@8941..89805468 DESTRUCT_FULL@8941..89465469 NAME@8941..89465470 IDENT@8941..8946 "range"5471 WHITESPACE@8946..8947 " "5472 ASSIGN@8947..8948 "="5473 WHITESPACE@8948..8949 " "5474 EXPR_APPLY@8949..89805475 EXPR_INDEX@8949..89585476 EXPR_VAR@8949..89525477 NAME@8949..89525478 IDENT@8949..8952 "std"5479 DOT@8952..8953 "."5480 NAME@8953..89585481 IDENT@8953..8958 "range"5482 ARGS_DESC@8958..89805483 L_PAREN@8958..8959 "("5484 ARG@8959..89605485 EXPR_NUMBER@8959..89605486 FLOAT@8959..8960 "0"5487 COMMA@8960..8961 ","5488 WHITESPACE@8961..8962 " "5489 ARG@8962..89795490 EXPR_BINARY@8962..89795491 LHS_EXPR@8962..89755492 EXPR_APPLY@8962..89755493 EXPR_INDEX@8962..89725494 EXPR_VAR@8962..89655495 NAME@8962..89655496 IDENT@8962..8965 "std"5497 DOT@8965..8966 "."5498 NAME@8966..89725499 IDENT@8966..8972 "length"5500 ARGS_DESC@8972..89755501 L_PAREN@8972..8973 "("5502 ARG@8973..89745503 EXPR_VAR@8973..89745504 NAME@8973..89745505 IDENT@8973..8974 "v"5506 R_PAREN@8974..8975 ")"5507 WHITESPACE@8975..8976 " "5508 MINUS@8976..8977 "-"5509 WHITESPACE@8977..8978 " "5510 EXPR_NUMBER@8978..89795511 FLOAT@8978..8979 "1"5512 R_PAREN@8979..8980 ")"5513 SEMI@8980..8981 ";"5514 WHITESPACE@8981..8994 "\n "5515 EXPR_LOCAL@8994..95615516 LOCAL_KW@8994..8999 "local"5517 WHITESPACE@8999..9000 " "5518 BIND_DESTRUCT@9000..90525519 DESTRUCT_FULL@9000..90105520 NAME@9000..90105521 IDENT@9000..9010 "new_indent"5522 WHITESPACE@9010..9011 " "5523 ASSIGN@9011..9012 "="5524 WHITESPACE@9012..9013 " "5525 EXPR_IF_THEN_ELSE@9013..90525526 IF_KW@9013..9015 "if"5527 WHITESPACE@9015..9016 " "5528 EXPR_VAR@9016..90225529 NAME@9016..90225530 IDENT@9016..9022 "inline"5531 WHITESPACE@9022..9023 " "5532 THEN_KW@9023..9027 "then"5533 WHITESPACE@9027..9028 " "5534 TRUE_EXPR@9028..90305535 EXPR_STRING@9028..90305536 STRING_SINGLE@9028..9030 "''"5537 WHITESPACE@9030..9031 " "5538 ELSE_KW@9031..9035 "else"5539 WHITESPACE@9035..9036 " "5540 FALSE_EXPR@9036..90525541 EXPR_BINARY@9036..90525542 LHS_EXPR@9036..90435543 EXPR_VAR@9036..90435544 NAME@9036..90435545 IDENT@9036..9043 "cindent"5546 WHITESPACE@9043..9044 " "5547 PLUS@9044..9045 "+"5548 WHITESPACE@9045..9046 " "5549 EXPR_VAR@9046..90525550 NAME@9046..90525551 IDENT@9046..9052 "indent"5552 SEMI@9052..9053 ";"5553 WHITESPACE@9053..9066 "\n "5554 EXPR_LOCAL@9066..95615555 LOCAL_KW@9066..9071 "local"5556 WHITESPACE@9071..9072 " "5557 BIND_DESTRUCT@9072..91125558 DESTRUCT_FULL@9072..90815559 NAME@9072..90815560 IDENT@9072..9081 "separator"5561 WHITESPACE@9081..9082 " "5562 ASSIGN@9082..9083 "="5563 WHITESPACE@9083..9084 " "5564 EXPR_IF_THEN_ELSE@9084..91125565 IF_KW@9084..9086 "if"5566 WHITESPACE@9086..9087 " "5567 EXPR_VAR@9087..90935568 NAME@9087..90935569 IDENT@9087..9093 "inline"5570 WHITESPACE@9093..9094 " "5571 THEN_KW@9094..9098 "then"5572 WHITESPACE@9098..9099 " "5573 TRUE_EXPR@9099..91025574 EXPR_STRING@9099..91025575 STRING_SINGLE@9099..9102 "' '"5576 WHITESPACE@9102..9103 " "5577 ELSE_KW@9103..9107 "else"5578 WHITESPACE@9107..9108 " "5579 FALSE_EXPR@9108..91125580 EXPR_STRING@9108..91125581 STRING_SINGLE@9108..9112 "'\\n'"5582 SEMI@9112..9113 ";"5583 WHITESPACE@9113..9126 "\n "5584 EXPR_LOCAL@9126..95615585 LOCAL_KW@9126..9131 "local"5586 WHITESPACE@9131..9132 " "5587 BIND_DESTRUCT@9132..95285588 DESTRUCT_FULL@9132..91375589 NAME@9132..91375590 IDENT@9132..9137 "lines"5591 WHITESPACE@9137..9138 " "5592 ASSIGN@9138..9139 "="5593 WHITESPACE@9139..9140 " "5594 EXPR_BINARY@9140..95285595 LHS_EXPR@9140..94475596 EXPR_BINARY@9140..94475597 LHS_EXPR@9140..91575598 EXPR_ARRAY@9140..91575599 L_BRACK@9140..9141 "["5600 EXPR_BINARY@9141..91565601 LHS_EXPR@9141..91445602 EXPR_STRING@9141..91445603 STRING_SINGLE@9141..9144 "'['"5604 WHITESPACE@9144..9145 " "5605 PLUS@9145..9146 "+"5606 WHITESPACE@9146..9147 " "5607 EXPR_VAR@9147..91565608 NAME@9147..91565609 IDENT@9147..9156 "separator"5610 R_BRACK@9156..9157 "]"5611 WHITESPACE@9157..9184 "\n ..."5612 PLUS@9184..9185 "+"5613 WHITESPACE@9185..9186 " "5614 EXPR_APPLY@9186..94475615 EXPR_INDEX@9186..91945616 EXPR_VAR@9186..91895617 NAME@9186..91895618 IDENT@9186..9189 "std"5619 DOT@9189..9190 "."5620 NAME@9190..91945621 IDENT@9190..9194 "join"5622 ARGS_DESC@9194..94475623 L_PAREN@9194..9195 "("5624 ARG@9195..92125625 EXPR_ARRAY@9195..92125626 L_BRACK@9195..9196 "["5627 EXPR_BINARY@9196..92115628 LHS_EXPR@9196..91995629 EXPR_STRING@9196..91995630 STRING_SINGLE@9196..9199 "','"5631 WHITESPACE@9199..9200 " "5632 PLUS@9200..9201 "+"5633 WHITESPACE@9201..9202 " "5634 EXPR_VAR@9202..92115635 NAME@9202..92115636 IDENT@9202..9211 "separator"5637 R_BRACK@9211..9212 "]"5638 COMMA@9212..9213 ","5639 WHITESPACE@9213..9251 "\n ..."5640 ARG@9251..94465641 EXPR_ARRAY_COMP@9251..94465642 L_BRACK@9251..9252 "["5643 WHITESPACE@9252..9292 "\n ..."5644 EXPR_ARRAY@9292..93535645 L_BRACK@9292..9293 "["5646 EXPR_BINARY@9293..93525647 LHS_EXPR@9293..93035648 EXPR_VAR@9293..93035649 NAME@9293..93035650 IDENT@9293..9303 "new_indent"5651 WHITESPACE@9303..9304 " "5652 PLUS@9304..9305 "+"5653 WHITESPACE@9305..9306 " "5654 EXPR_APPLY@9306..93525655 EXPR_VAR@9306..93175656 NAME@9306..93175657 IDENT@9306..9317 "renderValue"5658 ARGS_DESC@9317..93525659 L_PAREN@9317..9318 "("5660 ARG@9318..93225661 EXPR_INDEX_EXPR@9318..93225662 LHS_EXPR@9318..93195663 EXPR_VAR@9318..93195664 NAME@9318..93195665 IDENT@9318..9319 "v"5666 L_BRACK@9319..9320 "["5667 EXPR_VAR@9320..93215668 NAME@9320..93215669 IDENT@9320..9321 "i"5670 R_BRACK@9321..9322 "]"5671 COMMA@9322..9323 ","5672 WHITESPACE@9323..9324 " "5673 ARG@9324..93415674 EXPR_BINARY@9324..93415675 LHS_EXPR@9324..93355676 EXPR_VAR@9324..93355677 NAME@9324..93355678 IDENT@9324..9335 "indexedPath"5679 WHITESPACE@9335..9336 " "5680 PLUS@9336..9337 "+"5681 WHITESPACE@9337..9338 " "5682 EXPR_ARRAY@9338..93415683 L_BRACK@9338..9339 "["5684 EXPR_VAR@9339..93405685 NAME@9339..93405686 IDENT@9339..9340 "i"5687 R_BRACK@9340..9341 "]"5688 COMMA@9341..9342 ","5689 WHITESPACE@9342..9343 " "5690 ARG@9343..93475691 EXPR_LITERAL@9343..93475692 TRUE_KW@9343..9347 "true"5693 COMMA@9347..9348 ","5694 WHITESPACE@9348..9349 " "5695 ARG@9349..93515696 EXPR_STRING@9349..93515697 STRING_SINGLE@9349..9351 "''"5698 R_PAREN@9351..9352 ")"5699 R_BRACK@9352..9353 "]"5700 WHITESPACE@9353..9393 "\n ..."5701 FOR_SPEC@9393..94075702 FOR_KW@9393..9396 "for"5703 WHITESPACE@9396..9397 " "5704 NAME@9397..93985705 IDENT@9397..9398 "i"5706 WHITESPACE@9398..9399 " "5707 IN_KW@9399..9401 "in"5708 WHITESPACE@9401..9402 " "5709 EXPR_VAR@9402..94075710 NAME@9402..94075711 IDENT@9402..9407 "range"5712 WHITESPACE@9407..9445 "\n ..."5713 R_BRACK@9445..9446 "]"5714 R_PAREN@9446..9447 ")"5715 WHITESPACE@9447..9474 "\n ..."5716 PLUS@9474..9475 "+"5717 WHITESPACE@9475..9476 " "5718 EXPR_ARRAY@9476..95285719 L_BRACK@9476..9477 "["5720 EXPR_BINARY@9477..95275721 LHS_EXPR@9477..95215722 EXPR_BINARY@9477..95215723 LHS_EXPR@9477..94865724 EXPR_VAR@9477..94865725 NAME@9477..94865726 IDENT@9477..9486 "separator"5727 WHITESPACE@9486..9487 " "5728 PLUS@9487..9488 "+"5729 WHITESPACE@9488..9489 " "5730 EXPR_PARENED@9489..95215731 L_PAREN@9489..9490 "("5732 EXPR_IF_THEN_ELSE@9490..95205733 IF_KW@9490..9492 "if"5734 WHITESPACE@9492..9493 " "5735 EXPR_VAR@9493..94995736 NAME@9493..94995737 IDENT@9493..9499 "inline"5738 WHITESPACE@9499..9500 " "5739 THEN_KW@9500..9504 "then"5740 WHITESPACE@9504..9505 " "5741 TRUE_EXPR@9505..95075742 EXPR_STRING@9505..95075743 STRING_SINGLE@9505..9507 "''"5744 WHITESPACE@9507..9508 " "5745 ELSE_KW@9508..9512 "else"5746 WHITESPACE@9512..9513 " "5747 FALSE_EXPR@9513..95205748 EXPR_VAR@9513..95205749 NAME@9513..95205750 IDENT@9513..9520 "cindent"5751 R_PAREN@9520..9521 ")"5752 WHITESPACE@9521..9522 " "5753 PLUS@9522..9523 "+"5754 WHITESPACE@9523..9524 " "5755 EXPR_STRING@9524..95275756 STRING_SINGLE@9524..9527 "']'"5757 R_BRACK@9527..9528 "]"5758 SEMI@9528..9529 ";"5759 WHITESPACE@9529..9542 "\n "5760 EXPR_APPLY@9542..95615761 EXPR_INDEX@9542..95505762 EXPR_VAR@9542..95455763 NAME@9542..95455764 IDENT@9542..9545 "std"5765 DOT@9545..9546 "."5766 NAME@9546..95505767 IDENT@9546..9550 "join"5768 ARGS_DESC@9550..95615769 L_PAREN@9550..9551 "("5770 ARG@9551..95535771 EXPR_STRING@9551..95535772 STRING_SINGLE@9551..9553 "''"5773 COMMA@9553..9554 ","5774 WHITESPACE@9554..9555 " "5775 ARG@9555..95605776 EXPR_VAR@9555..95605777 NAME@9555..95605778 IDENT@9555..9560 "lines"5779 R_PAREN@9560..9561 ")"5780 WHITESPACE@9561..9570 "\n "5781 ELSE_KW@9570..9574 "else"5782 WHITESPACE@9574..9575 " "5783 FALSE_EXPR@9575..99905784 EXPR_IF_THEN_ELSE@9575..99905785 IF_KW@9575..9577 "if"5786 WHITESPACE@9577..9578 " "5787 EXPR_APPLY@9578..95935788 EXPR_INDEX@9578..95905789 EXPR_VAR@9578..95815790 NAME@9578..95815791 IDENT@9578..9581 "std"5792 DOT@9581..9582 "."5793 NAME@9582..95905794 IDENT@9582..9590 "isObject"5795 ARGS_DESC@9590..95935796 L_PAREN@9590..9591 "("5797 ARG@9591..95925798 EXPR_VAR@9591..95925799 NAME@9591..95925800 IDENT@9591..9592 "v"5801 R_PAREN@9592..9593 ")"5802 WHITESPACE@9593..9594 " "5803 THEN_KW@9594..9598 "then"5804 WHITESPACE@9598..9609 "\n "5805 TRUE_EXPR@9609..99905806 EXPR_LOCAL@9609..99905807 LOCAL_KW@9609..9614 "local"5808 WHITESPACE@9614..9615 " "5809 BIND_DESTRUCT@9615..99595810 DESTRUCT_FULL@9615..96205811 NAME@9615..96205812 IDENT@9615..9620 "lines"5813 WHITESPACE@9620..9621 " "5814 ASSIGN@9621..9622 "="5815 WHITESPACE@9622..9623 " "5816 EXPR_BINARY@9623..99595817 LHS_EXPR@9623..99265818 EXPR_BINARY@9623..99265819 LHS_EXPR@9623..96295820 EXPR_ARRAY@9623..96295821 L_BRACK@9623..9624 "["5822 EXPR_STRING@9624..96285823 STRING_SINGLE@9624..9628 "'{ '"5824 R_BRACK@9628..9629 "]"5825 WHITESPACE@9629..9654 "\n ..."5826 PLUS@9654..9655 "+"5827 WHITESPACE@9655..9656 " "5828 EXPR_APPLY@9656..99265829 EXPR_INDEX@9656..96645830 EXPR_VAR@9656..96595831 NAME@9656..96595832 IDENT@9656..9659 "std"5833 DOT@9659..9660 "."5834 NAME@9660..96645835 IDENT@9660..9664 "join"5836 ARGS_DESC@9664..99265837 L_PAREN@9664..9665 "("5838 ARG@9665..96715839 EXPR_ARRAY@9665..96715840 L_BRACK@9665..9666 "["5841 EXPR_STRING@9666..96705842 STRING_SINGLE@9666..9670 "', '"5843 R_BRACK@9670..9671 "]"5844 COMMA@9671..9672 ","5845 WHITESPACE@9672..9708 "\n ..."5846 ARG@9708..99255847 EXPR_ARRAY_COMP@9708..99255848 L_BRACK@9708..9709 "["5849 WHITESPACE@9709..9747 "\n ..."5850 EXPR_ARRAY@9747..98225851 L_BRACK@9747..9748 "["5852 EXPR_BINARY@9748..98215853 LHS_EXPR@9748..97725854 EXPR_BINARY@9748..97725855 LHS_EXPR@9748..97645856 EXPR_APPLY@9748..97645857 EXPR_VAR@9748..97615858 NAME@9748..97615859 IDENT@9748..9761 "escapeKeyToml"5860 ARGS_DESC@9761..97645861 L_PAREN@9761..9762 "("5862 ARG@9762..97635863 EXPR_VAR@9762..97635864 NAME@9762..97635865 IDENT@9762..9763 "k"5866 R_PAREN@9763..9764 ")"5867 WHITESPACE@9764..9765 " "5868 PLUS@9765..9766 "+"5869 WHITESPACE@9766..9767 " "5870 EXPR_STRING@9767..97725871 STRING_SINGLE@9767..9772 "' = '"5872 WHITESPACE@9772..9773 " "5873 PLUS@9773..9774 "+"5874 WHITESPACE@9774..9775 " "5875 EXPR_APPLY@9775..98215876 EXPR_VAR@9775..97865877 NAME@9775..97865878 IDENT@9775..9786 "renderValue"5879 ARGS_DESC@9786..98215880 L_PAREN@9786..9787 "("5881 ARG@9787..97915882 EXPR_INDEX_EXPR@9787..97915883 LHS_EXPR@9787..97885884 EXPR_VAR@9787..97885885 NAME@9787..97885886 IDENT@9787..9788 "v"5887 L_BRACK@9788..9789 "["5888 EXPR_VAR@9789..97905889 NAME@9789..97905890 IDENT@9789..9790 "k"5891 R_BRACK@9790..9791 "]"5892 COMMA@9791..9792 ","5893 WHITESPACE@9792..9793 " "5894 ARG@9793..98105895 EXPR_BINARY@9793..98105896 LHS_EXPR@9793..98045897 EXPR_VAR@9793..98045898 NAME@9793..98045899 IDENT@9793..9804 "indexedPath"5900 WHITESPACE@9804..9805 " "5901 PLUS@9805..9806 "+"5902 WHITESPACE@9806..9807 " "5903 EXPR_ARRAY@9807..98105904 L_BRACK@9807..9808 "["5905 EXPR_VAR@9808..98095906 NAME@9808..98095907 IDENT@9808..9809 "k"5908 R_BRACK@9809..9810 "]"5909 COMMA@9810..9811 ","5910 WHITESPACE@9811..9812 " "5911 ARG@9812..98165912 EXPR_LITERAL@9812..98165913 TRUE_KW@9812..9816 "true"5914 COMMA@9816..9817 ","5915 WHITESPACE@9817..9818 " "5916 ARG@9818..98205917 EXPR_STRING@9818..98205918 STRING_SINGLE@9818..9820 "''"5919 R_PAREN@9820..9821 ")"5920 R_BRACK@9821..9822 "]"5921 WHITESPACE@9822..9860 "\n ..."5922 FOR_SPEC@9860..98885923 FOR_KW@9860..9863 "for"5924 WHITESPACE@9863..9864 " "5925 NAME@9864..98655926 IDENT@9864..9865 "k"5927 WHITESPACE@9865..9866 " "5928 IN_KW@9866..9868 "in"5929 WHITESPACE@9868..9869 " "5930 EXPR_APPLY@9869..98885931 EXPR_INDEX@9869..98855932 EXPR_VAR@9869..98725933 NAME@9869..98725934 IDENT@9869..9872 "std"5935 DOT@9872..9873 "."5936 NAME@9873..98855937 IDENT@9873..9885 "objectFields"5938 ARGS_DESC@9885..98885939 L_PAREN@9885..9886 "("5940 ARG@9886..98875941 EXPR_VAR@9886..98875942 NAME@9886..98875943 IDENT@9886..9887 "v"5944 R_PAREN@9887..9888 ")"5945 WHITESPACE@9888..9924 "\n ..."5946 R_BRACK@9924..9925 "]"5947 R_PAREN@9925..9926 ")"5948 WHITESPACE@9926..9951 "\n ..."5949 PLUS@9951..9952 "+"5950 WHITESPACE@9952..9953 " "5951 EXPR_ARRAY@9953..99595952 L_BRACK@9953..9954 "["5953 EXPR_STRING@9954..99585954 STRING_SINGLE@9954..9958 "' }'"5955 R_BRACK@9958..9959 "]"5956 SEMI@9959..9960 ";"5957 WHITESPACE@9960..9971 "\n "5958 EXPR_APPLY@9971..99905959 EXPR_INDEX@9971..99795960 EXPR_VAR@9971..99745961 NAME@9971..99745962 IDENT@9971..9974 "std"5963 DOT@9974..9975 "."5964 NAME@9975..99795965 IDENT@9975..9979 "join"5966 ARGS_DESC@9979..99905967 L_PAREN@9979..9980 "("5968 ARG@9980..99825969 EXPR_STRING@9980..99825970 STRING_SINGLE@9980..9982 "''"5971 COMMA@9982..9983 ","5972 WHITESPACE@9983..9984 " "5973 ARG@9984..99895974 EXPR_VAR@9984..99895975 NAME@9984..99895976 IDENT@9984..9989 "lines"5977 R_PAREN@9989..9990 ")"5978 COMMA@9990..9991 ","5979 WHITESPACE@9991..9998 "\n "5980 BIND_FUNCTION@9998..106675981 NAME@9998..100175982 IDENT@9998..10017 "renderTableInternal"5983 PARAMS_DESC@10017..100485984 L_PAREN@10017..10018 "("5985 PARAM@10018..100195986 DESTRUCT_FULL@10018..100195987 NAME@10018..100195988 IDENT@10018..10019 "v"5989 COMMA@10019..10020 ","5990 WHITESPACE@10020..10021 " "5991 PARAM@10021..100255992 DESTRUCT_FULL@10021..100255993 NAME@10021..100255994 IDENT@10021..10025 "path"5995 COMMA@10025..10026 ","5996 WHITESPACE@10026..10027 " "5997 PARAM@10027..100385998 DESTRUCT_FULL@10027..100385999 NAME@10027..100386000 IDENT@10027..10038 "indexedPath"6001 COMMA@10038..10039 ","6002 WHITESPACE@10039..10040 " "6003 PARAM@10040..100476004 DESTRUCT_FULL@10040..100476005 NAME@10040..100476006 IDENT@10040..10047 "cindent"6007 R_PAREN@10047..10048 ")"6008 WHITESPACE@10048..10049 " "6009 ASSIGN@10049..10050 "="6010 WHITESPACE@10050..10059 "\n "6011 EXPR_LOCAL@10059..106676012 LOCAL_KW@10059..10064 "local"6013 WHITESPACE@10064..10065 " "6014 BIND_DESTRUCT@10065..102726015 DESTRUCT_FULL@10065..100686016 NAME@10065..100686017 IDENT@10065..10068 "kvp"6018 WHITESPACE@10068..10069 " "6019 ASSIGN@10069..10070 "="6020 WHITESPACE@10070..10071 " "6021 EXPR_APPLY@10071..102726022 EXPR_INDEX@10071..100886023 EXPR_VAR@10071..100746024 NAME@10071..100746025 IDENT@10071..10074 "std"6026 DOT@10074..10075 "."6027 NAME@10075..100886028 IDENT@10075..10088 "flattenArrays"6029 ARGS_DESC@10088..102726030 L_PAREN@10088..10089 "("6031 ARG@10089..102716032 EXPR_ARRAY_COMP@10089..102716033 L_BRACK@10089..10090 "["6034 WHITESPACE@10090..10101 "\n "6035 EXPR_ARRAY@10101..101926036 L_BRACK@10101..10102 "["6037 EXPR_BINARY@10102..101916038 LHS_EXPR@10102..101366039 EXPR_BINARY@10102..101366040 LHS_EXPR@10102..101286041 EXPR_BINARY@10102..101286042 LHS_EXPR@10102..101096043 EXPR_VAR@10102..101096044 NAME@10102..101096045 IDENT@10102..10109 "cindent"6046 WHITESPACE@10109..10110 " "6047 PLUS@10110..10111 "+"6048 WHITESPACE@10111..10112 " "6049 EXPR_APPLY@10112..101286050 EXPR_VAR@10112..101256051 NAME@10112..101256052 IDENT@10112..10125 "escapeKeyToml"6053 ARGS_DESC@10125..101286054 L_PAREN@10125..10126 "("6055 ARG@10126..101276056 EXPR_VAR@10126..101276057 NAME@10126..101276058 IDENT@10126..10127 "k"6059 R_PAREN@10127..10128 ")"6060 WHITESPACE@10128..10129 " "6061 PLUS@10129..10130 "+"6062 WHITESPACE@10130..10131 " "6063 EXPR_STRING@10131..101366064 STRING_SINGLE@10131..10136 "' = '"6065 WHITESPACE@10136..10137 " "6066 PLUS@10137..10138 "+"6067 WHITESPACE@10138..10139 " "6068 EXPR_APPLY@10139..101916069 EXPR_VAR@10139..101506070 NAME@10139..101506071 IDENT@10139..10150 "renderValue"6072 ARGS_DESC@10150..101916073 L_PAREN@10150..10151 "("6074 ARG@10151..101556075 EXPR_INDEX_EXPR@10151..101556076 LHS_EXPR@10151..101526077 EXPR_VAR@10151..101526078 NAME@10151..101526079 IDENT@10151..10152 "v"6080 L_BRACK@10152..10153 "["6081 EXPR_VAR@10153..101546082 NAME@10153..101546083 IDENT@10153..10154 "k"6084 R_BRACK@10154..10155 "]"6085 COMMA@10155..10156 ","6086 WHITESPACE@10156..10157 " "6087 ARG@10157..101746088 EXPR_BINARY@10157..101746089 LHS_EXPR@10157..101686090 EXPR_VAR@10157..101686091 NAME@10157..101686092 IDENT@10157..10168 "indexedPath"6093 WHITESPACE@10168..10169 " "6094 PLUS@10169..10170 "+"6095 WHITESPACE@10170..10171 " "6096 EXPR_ARRAY@10171..101746097 L_BRACK@10171..10172 "["6098 EXPR_VAR@10172..101736099 NAME@10172..101736100 IDENT@10172..10173 "k"6101 R_BRACK@10173..10174 "]"6102 COMMA@10174..10175 ","6103 WHITESPACE@10175..10176 " "6104 ARG@10176..101816105 EXPR_LITERAL@10176..101816106 FALSE_KW@10176..10181 "false"6107 COMMA@10181..10182 ","6108 WHITESPACE@10182..10183 " "6109 ARG@10183..101906110 EXPR_VAR@10183..101906111 NAME@10183..101906112 IDENT@10183..10190 "cindent"6113 R_PAREN@10190..10191 ")"6114 R_BRACK@10191..10192 "]"6115 WHITESPACE@10192..10203 "\n "6116 FOR_SPEC@10203..102316117 FOR_KW@10203..10206 "for"6118 WHITESPACE@10206..10207 " "6119 NAME@10207..102086120 IDENT@10207..10208 "k"6121 WHITESPACE@10208..10209 " "6122 IN_KW@10209..10211 "in"6123 WHITESPACE@10211..10212 " "6124 EXPR_APPLY@10212..102316125 EXPR_INDEX@10212..102286126 EXPR_VAR@10212..102156127 NAME@10212..102156128 IDENT@10212..10215 "std"6129 DOT@10215..10216 "."6130 NAME@10216..102286131 IDENT@10216..10228 "objectFields"6132 ARGS_DESC@10228..102316133 L_PAREN@10228..10229 "("6134 ARG@10229..102306135 EXPR_VAR@10229..102306136 NAME@10229..102306137 IDENT@10229..10230 "v"6138 R_PAREN@10230..10231 ")"6139 WHITESPACE@10231..10242 "\n "6140 IF_SPEC@10242..102616141 IF_KW@10242..10244 "if"6142 WHITESPACE@10244..10245 " "6143 EXPR_UNARY@10245..102616144 NOT@10245..10246 "!"6145 EXPR_APPLY@10246..102616146 EXPR_VAR@10246..102556147 NAME@10246..102556148 IDENT@10246..10255 "isSection"6149 ARGS_DESC@10255..102616150 L_PAREN@10255..10256 "("6151 ARG@10256..102606152 EXPR_INDEX_EXPR@10256..102606153 LHS_EXPR@10256..102576154 EXPR_VAR@10256..102576155 NAME@10256..102576156 IDENT@10256..10257 "v"6157 L_BRACK@10257..10258 "["6158 EXPR_VAR@10258..102596159 NAME@10258..102596160 IDENT@10258..10259 "k"6161 R_BRACK@10259..10260 "]"6162 R_PAREN@10260..10261 ")"6163 WHITESPACE@10261..10270 "\n "6164 R_BRACK@10270..10271 "]"6165 R_PAREN@10271..10272 ")"6166 SEMI@10272..10273 ";"6167 WHITESPACE@10273..10282 "\n "6168 EXPR_LOCAL@10282..106676169 LOCAL_KW@10282..10287 "local"6170 WHITESPACE@10287..10288 " "6171 BIND_DESTRUCT@10288..106316172 DESTRUCT_FULL@10288..102966173 NAME@10288..102966174 IDENT@10288..10296 "sections"6175 WHITESPACE@10296..10297 " "6176 ASSIGN@10297..10298 "="6177 WHITESPACE@10298..10299 " "6178 EXPR_BINARY@10299..106316179 LHS_EXPR@10299..103206180 EXPR_ARRAY@10299..103206181 L_BRACK@10299..10300 "["6182 EXPR_APPLY@10300..103196183 EXPR_INDEX@10300..103086184 EXPR_VAR@10300..103036185 NAME@10300..103036186 IDENT@10300..10303 "std"6187 DOT@10303..10304 "."6188 NAME@10304..103086189 IDENT@10304..10308 "join"6190 ARGS_DESC@10308..103196191 L_PAREN@10308..10309 "("6192 ARG@10309..103136193 EXPR_STRING@10309..103136194 STRING_SINGLE@10309..10313 "'\\n'"6195 COMMA@10313..10314 ","6196 WHITESPACE@10314..10315 " "6197 ARG@10315..103186198 EXPR_VAR@10315..103186199 NAME@10315..103186200 IDENT@10315..10318 "kvp"6201 R_PAREN@10318..10319 ")"6202 R_BRACK@10319..10320 "]"6203 WHITESPACE@10320..10321 " "6204 PLUS@10321..10322 "+"6205 WHITESPACE@10322..10323 " "6206 EXPR_ARRAY_COMP@10323..106316207 L_BRACK@10323..10324 "["6208 WHITESPACE@10324..10335 "\n "6209 EXPR_PARENED@10335..105536210 L_PAREN@10335..10336 "("6211 WHITESPACE@10336..10349 "\n "6212 EXPR_IF_THEN_ELSE@10349..105416213 IF_KW@10349..10351 "if"6214 WHITESPACE@10351..10352 " "6215 EXPR_APPLY@10352..103706216 EXPR_INDEX@10352..103646217 EXPR_VAR@10352..103556218 NAME@10352..103556219 IDENT@10352..10355 "std"6220 DOT@10355..10356 "."6221 NAME@10356..103646222 IDENT@10356..10364 "isObject"6223 ARGS_DESC@10364..103706224 L_PAREN@10364..10365 "("6225 ARG@10365..103696226 EXPR_INDEX_EXPR@10365..103696227 LHS_EXPR@10365..103666228 EXPR_VAR@10365..103666229 NAME@10365..103666230 IDENT@10365..10366 "v"6231 L_BRACK@10366..10367 "["6232 EXPR_VAR@10367..103686233 NAME@10367..103686234 IDENT@10367..10368 "k"6235 R_BRACK@10368..10369 "]"6236 R_PAREN@10369..10370 ")"6237 WHITESPACE@10370..10371 " "6238 THEN_KW@10371..10375 "then"6239 WHITESPACE@10375..10390 "\n "6240 TRUE_EXPR@10390..104476241 EXPR_APPLY@10390..104476242 EXPR_VAR@10390..104016243 NAME@10390..104016244 IDENT@10390..10401 "renderTable"6245 ARGS_DESC@10401..104476246 L_PAREN@10401..10402 "("6247 ARG@10402..104066248 EXPR_INDEX_EXPR@10402..104066249 LHS_EXPR@10402..104036250 EXPR_VAR@10402..104036251 NAME@10402..104036252 IDENT@10402..10403 "v"6253 L_BRACK@10403..10404 "["6254 EXPR_VAR@10404..104056255 NAME@10404..104056256 IDENT@10404..10405 "k"6257 R_BRACK@10405..10406 "]"6258 COMMA@10406..10407 ","6259 WHITESPACE@10407..10408 " "6260 ARG@10408..104186261 EXPR_BINARY@10408..104186262 LHS_EXPR@10408..104126263 EXPR_VAR@10408..104126264 NAME@10408..104126265 IDENT@10408..10412 "path"6266 WHITESPACE@10412..10413 " "6267 PLUS@10413..10414 "+"6268 WHITESPACE@10414..10415 " "6269 EXPR_ARRAY@10415..104186270 L_BRACK@10415..10416 "["6271 EXPR_VAR@10416..104176272 NAME@10416..104176273 IDENT@10416..10417 "k"6274 R_BRACK@10417..10418 "]"6275 COMMA@10418..10419 ","6276 WHITESPACE@10419..10420 " "6277 ARG@10420..104376278 EXPR_BINARY@10420..104376279 LHS_EXPR@10420..104316280 EXPR_VAR@10420..104316281 NAME@10420..104316282 IDENT@10420..10431 "indexedPath"6283 WHITESPACE@10431..10432 " "6284 PLUS@10432..10433 "+"6285 WHITESPACE@10433..10434 " "6286 EXPR_ARRAY@10434..104376287 L_BRACK@10434..10435 "["6288 EXPR_VAR@10435..104366289 NAME@10435..104366290 IDENT@10435..10436 "k"6291 R_BRACK@10436..10437 "]"6292 COMMA@10437..10438 ","6293 WHITESPACE@10438..10439 " "6294 ARG@10439..104466295 EXPR_VAR@10439..104466296 NAME@10439..104466297 IDENT@10439..10446 "cindent"6298 R_PAREN@10446..10447 ")"6299 WHITESPACE@10447..10460 "\n "6300 ELSE_KW@10460..10464 "else"6301 WHITESPACE@10464..10479 "\n "6302 FALSE_EXPR@10479..105416303 EXPR_APPLY@10479..105416304 EXPR_VAR@10479..104956305 NAME@10479..104956306 IDENT@10479..10495 "renderTableArray"6307 ARGS_DESC@10495..105416308 L_PAREN@10495..10496 "("6309 ARG@10496..105006310 EXPR_INDEX_EXPR@10496..105006311 LHS_EXPR@10496..104976312 EXPR_VAR@10496..104976313 NAME@10496..104976314 IDENT@10496..10497 "v"6315 L_BRACK@10497..10498 "["6316 EXPR_VAR@10498..104996317 NAME@10498..104996318 IDENT@10498..10499 "k"6319 R_BRACK@10499..10500 "]"6320 COMMA@10500..10501 ","6321 WHITESPACE@10501..10502 " "6322 ARG@10502..105126323 EXPR_BINARY@10502..105126324 LHS_EXPR@10502..105066325 EXPR_VAR@10502..105066326 NAME@10502..105066327 IDENT@10502..10506 "path"6328 WHITESPACE@10506..10507 " "6329 PLUS@10507..10508 "+"6330 WHITESPACE@10508..10509 " "6331 EXPR_ARRAY@10509..105126332 L_BRACK@10509..10510 "["6333 EXPR_VAR@10510..105116334 NAME@10510..105116335 IDENT@10510..10511 "k"6336 R_BRACK@10511..10512 "]"6337 COMMA@10512..10513 ","6338 WHITESPACE@10513..10514 " "6339 ARG@10514..105316340 EXPR_BINARY@10514..105316341 LHS_EXPR@10514..105256342 EXPR_VAR@10514..105256343 NAME@10514..105256344 IDENT@10514..10525 "indexedPath"6345 WHITESPACE@10525..10526 " "6346 PLUS@10526..10527 "+"6347 WHITESPACE@10527..10528 " "6348 EXPR_ARRAY@10528..105316349 L_BRACK@10528..10529 "["6350 EXPR_VAR@10529..105306351 NAME@10529..105306352 IDENT@10529..10530 "k"6353 R_BRACK@10530..10531 "]"6354 COMMA@10531..10532 ","6355 WHITESPACE@10532..10533 " "6356 ARG@10533..105406357 EXPR_VAR@10533..105406358 NAME@10533..105406359 IDENT@10533..10540 "cindent"6360 R_PAREN@10540..10541 ")"6361 WHITESPACE@10541..10552 "\n "6362 R_PAREN@10552..10553 ")"6363 WHITESPACE@10553..10564 "\n "6364 FOR_SPEC@10564..105926365 FOR_KW@10564..10567 "for"6366 WHITESPACE@10567..10568 " "6367 NAME@10568..105696368 IDENT@10568..10569 "k"6369 WHITESPACE@10569..10570 " "6370 IN_KW@10570..10572 "in"6371 WHITESPACE@10572..10573 " "6372 EXPR_APPLY@10573..105926373 EXPR_INDEX@10573..105896374 EXPR_VAR@10573..105766375 NAME@10573..105766376 IDENT@10573..10576 "std"6377 DOT@10576..10577 "."6378 NAME@10577..105896379 IDENT@10577..10589 "objectFields"6380 ARGS_DESC@10589..105926381 L_PAREN@10589..10590 "("6382 ARG@10590..105916383 EXPR_VAR@10590..105916384 NAME@10590..105916385 IDENT@10590..10591 "v"6386 R_PAREN@10591..10592 ")"6387 WHITESPACE@10592..10603 "\n "6388 IF_SPEC@10603..106216389 IF_KW@10603..10605 "if"6390 WHITESPACE@10605..10606 " "6391 EXPR_APPLY@10606..106216392 EXPR_VAR@10606..106156393 NAME@10606..106156394 IDENT@10606..10615 "isSection"6395 ARGS_DESC@10615..106216396 L_PAREN@10615..10616 "("6397 ARG@10616..106206398 EXPR_INDEX_EXPR@10616..106206399 LHS_EXPR@10616..106176400 EXPR_VAR@10616..106176401 NAME@10616..106176402 IDENT@10616..10617 "v"6403 L_BRACK@10617..10618 "["6404 EXPR_VAR@10618..106196405 NAME@10618..106196406 IDENT@10618..10619 "k"6407 R_BRACK@10619..10620 "]"6408 R_PAREN@10620..10621 ")"6409 WHITESPACE@10621..10630 "\n "6410 R_BRACK@10630..10631 "]"6411 SEMI@10631..10632 ";"6412 WHITESPACE@10632..10641 "\n "6413 EXPR_APPLY@10641..106676414 EXPR_INDEX@10641..106496415 EXPR_VAR@10641..106446416 NAME@10641..106446417 IDENT@10641..10644 "std"6418 DOT@10644..10645 "."6419 NAME@10645..106496420 IDENT@10645..10649 "join"6421 ARGS_DESC@10649..106676422 L_PAREN@10649..10650 "("6423 ARG@10650..106566424 EXPR_STRING@10650..106566425 STRING_SINGLE@10650..10656 "'\\n\\n'"6426 COMMA@10656..10657 ","6427 WHITESPACE@10657..10658 " "6428 ARG@10658..106666429 EXPR_VAR@10658..106666430 NAME@10658..106666431 IDENT@10658..10666 "sections"6432 R_PAREN@10666..10667 ")"6433 COMMA@10667..10668 ","6434 WHITESPACE@10668..10675 "\n "6435 BIND_FUNCTION@10675..109046436 NAME@10675..106866437 IDENT@10675..10686 "renderTable"6438 PARAMS_DESC@10686..107176439 L_PAREN@10686..10687 "("6440 PARAM@10687..106886441 DESTRUCT_FULL@10687..106886442 NAME@10687..106886443 IDENT@10687..10688 "v"6444 COMMA@10688..10689 ","6445 WHITESPACE@10689..10690 " "6446 PARAM@10690..106946447 DESTRUCT_FULL@10690..106946448 NAME@10690..106946449 IDENT@10690..10694 "path"6450 COMMA@10694..10695 ","6451 WHITESPACE@10695..10696 " "6452 PARAM@10696..107076453 DESTRUCT_FULL@10696..107076454 NAME@10696..107076455 IDENT@10696..10707 "indexedPath"6456 COMMA@10707..10708 ","6457 WHITESPACE@10708..10709 " "6458 PARAM@10709..107166459 DESTRUCT_FULL@10709..107166460 NAME@10709..107166461 IDENT@10709..10716 "cindent"6462 R_PAREN@10716..10717 ")"6463 WHITESPACE@10717..10718 " "6464 ASSIGN@10718..10719 "="6465 WHITESPACE@10719..10728 "\n "6466 EXPR_BINARY@10728..109046467 LHS_EXPR@10728..108346468 EXPR_BINARY@10728..108346469 LHS_EXPR@10728..107936470 EXPR_BINARY@10728..107936471 LHS_EXPR@10728..107876472 EXPR_BINARY@10728..107876473 LHS_EXPR@10728..107416474 EXPR_BINARY@10728..107416475 LHS_EXPR@10728..107356476 EXPR_VAR@10728..107356477 NAME@10728..107356478 IDENT@10728..10735 "cindent"6479 WHITESPACE@10735..10736 " "6480 PLUS@10736..10737 "+"6481 WHITESPACE@10737..10738 " "6482 EXPR_STRING@10738..107416483 STRING_SINGLE@10738..10741 "'['"6484 WHITESPACE@10741..10742 " "6485 PLUS@10742..10743 "+"6486 WHITESPACE@10743..10744 " "6487 EXPR_APPLY@10744..107876488 EXPR_INDEX@10744..107526489 EXPR_VAR@10744..107476490 NAME@10744..107476491 IDENT@10744..10747 "std"6492 DOT@10747..10748 "."6493 NAME@10748..107526494 IDENT@10748..10752 "join"6495 ARGS_DESC@10752..107876496 L_PAREN@10752..10753 "("6497 ARG@10753..107566498 EXPR_STRING@10753..107566499 STRING_SINGLE@10753..10756 "'.'"6500 COMMA@10756..10757 ","6501 WHITESPACE@10757..10758 " "6502 ARG@10758..107866503 EXPR_APPLY@10758..107866504 EXPR_INDEX@10758..107656505 EXPR_VAR@10758..107616506 NAME@10758..107616507 IDENT@10758..10761 "std"6508 DOT@10761..10762 "."6509 NAME@10762..107656510 IDENT@10762..10765 "map"6511 ARGS_DESC@10765..107866512 L_PAREN@10765..10766 "("6513 ARG@10766..107796514 EXPR_VAR@10766..107796515 NAME@10766..107796516 IDENT@10766..10779 "escapeKeyToml"6517 COMMA@10779..10780 ","6518 WHITESPACE@10780..10781 " "6519 ARG@10781..107856520 EXPR_VAR@10781..107856521 NAME@10781..107856522 IDENT@10781..10785 "path"6523 R_PAREN@10785..10786 ")"6524 R_PAREN@10786..10787 ")"6525 WHITESPACE@10787..10788 " "6526 PLUS@10788..10789 "+"6527 WHITESPACE@10789..10790 " "6528 EXPR_STRING@10790..107936529 STRING_SINGLE@10790..10793 "']'"6530 WHITESPACE@10793..10802 "\n "6531 PLUS@10802..10803 "+"6532 WHITESPACE@10803..10804 " "6533 EXPR_PARENED@10804..108346534 L_PAREN@10804..10805 "("6535 EXPR_IF_THEN_ELSE@10805..108336536 IF_KW@10805..10807 "if"6537 WHITESPACE@10807..10808 " "6538 EXPR_BINARY@10808..108156539 LHS_EXPR@10808..108096540 EXPR_VAR@10808..108096541 NAME@10808..108096542 IDENT@10808..10809 "v"6543 WHITESPACE@10809..10810 " "6544 EQ@10810..10812 "=="6545 WHITESPACE@10812..10813 " "6546 EXPR_OBJECT@10813..108156547 OBJ_BODY_MEMBER_LIST@10813..108156548 L_BRACE@10813..10814 "{"6549 R_BRACE@10814..10815 "}"6550 WHITESPACE@10815..10816 " "6551 THEN_KW@10816..10820 "then"6552 WHITESPACE@10820..10821 " "6553 TRUE_EXPR@10821..108236554 EXPR_STRING@10821..108236555 STRING_SINGLE@10821..10823 "''"6556 WHITESPACE@10823..10824 " "6557 ELSE_KW@10824..10828 "else"6558 WHITESPACE@10828..10829 " "6559 FALSE_EXPR@10829..108336560 EXPR_STRING@10829..108336561 STRING_SINGLE@10829..10833 "'\\n'"6562 R_PAREN@10833..10834 ")"6563 WHITESPACE@10834..10843 "\n "6564 PLUS@10843..10844 "+"6565 WHITESPACE@10844..10845 " "6566 EXPR_APPLY@10845..109046567 EXPR_VAR@10845..108646568 NAME@10845..108646569 IDENT@10845..10864 "renderTableInternal"6570 ARGS_DESC@10864..109046571 L_PAREN@10864..10865 "("6572 ARG@10865..108666573 EXPR_VAR@10865..108666574 NAME@10865..108666575 IDENT@10865..10866 "v"6576 COMMA@10866..10867 ","6577 WHITESPACE@10867..10868 " "6578 ARG@10868..108726579 EXPR_VAR@10868..108726580 NAME@10868..108726581 IDENT@10868..10872 "path"6582 COMMA@10872..10873 ","6583 WHITESPACE@10873..10874 " "6584 ARG@10874..108856585 EXPR_VAR@10874..108856586 NAME@10874..108856587 IDENT@10874..10885 "indexedPath"6588 COMMA@10885..10886 ","6589 WHITESPACE@10886..10887 " "6590 ARG@10887..109036591 EXPR_BINARY@10887..109036592 LHS_EXPR@10887..108946593 EXPR_VAR@10887..108946594 NAME@10887..108946595 IDENT@10887..10894 "cindent"6596 WHITESPACE@10894..10895 " "6597 PLUS@10895..10896 "+"6598 WHITESPACE@10896..10897 " "6599 EXPR_VAR@10897..109036600 NAME@10897..109036601 IDENT@10897..10903 "indent"6602 R_PAREN@10903..10904 ")"6603 COMMA@10904..10905 ","6604 WHITESPACE@10905..10912 "\n "6605 BIND_FUNCTION@10912..113236606 NAME@10912..109286607 IDENT@10912..10928 "renderTableArray"6608 PARAMS_DESC@10928..109596609 L_PAREN@10928..10929 "("6610 PARAM@10929..109306611 DESTRUCT_FULL@10929..109306612 NAME@10929..109306613 IDENT@10929..10930 "v"6614 COMMA@10930..10931 ","6615 WHITESPACE@10931..10932 " "6616 PARAM@10932..109366617 DESTRUCT_FULL@10932..109366618 NAME@10932..109366619 IDENT@10932..10936 "path"6620 COMMA@10936..10937 ","6621 WHITESPACE@10937..10938 " "6622 PARAM@10938..109496623 DESTRUCT_FULL@10938..109496624 NAME@10938..109496625 IDENT@10938..10949 "indexedPath"6626 COMMA@10949..10950 ","6627 WHITESPACE@10950..10951 " "6628 PARAM@10951..109586629 DESTRUCT_FULL@10951..109586630 NAME@10951..109586631 IDENT@10951..10958 "cindent"6632 R_PAREN@10958..10959 ")"6633 WHITESPACE@10959..10960 " "6634 ASSIGN@10960..10961 "="6635 WHITESPACE@10961..10970 "\n "6636 EXPR_LOCAL@10970..113236637 LOCAL_KW@10970..10975 "local"6638 WHITESPACE@10975..10976 " "6639 BIND_DESTRUCT@10976..110156640 DESTRUCT_FULL@10976..109816641 NAME@10976..109816642 IDENT@10976..10981 "range"6643 WHITESPACE@10981..10982 " "6644 ASSIGN@10982..10983 "="6645 WHITESPACE@10983..10984 " "6646 EXPR_APPLY@10984..110156647 EXPR_INDEX@10984..109936648 EXPR_VAR@10984..109876649 NAME@10984..109876650 IDENT@10984..10987 "std"6651 DOT@10987..10988 "."6652 NAME@10988..109936653 IDENT@10988..10993 "range"6654 ARGS_DESC@10993..110156655 L_PAREN@10993..10994 "("6656 ARG@10994..109956657 EXPR_NUMBER@10994..109956658 FLOAT@10994..10995 "0"6659 COMMA@10995..10996 ","6660 WHITESPACE@10996..10997 " "6661 ARG@10997..110146662 EXPR_BINARY@10997..110146663 LHS_EXPR@10997..110106664 EXPR_APPLY@10997..110106665 EXPR_INDEX@10997..110076666 EXPR_VAR@10997..110006667 NAME@10997..110006668 IDENT@10997..11000 "std"6669 DOT@11000..11001 "."6670 NAME@11001..110076671 IDENT@11001..11007 "length"6672 ARGS_DESC@11007..110106673 L_PAREN@11007..11008 "("6674 ARG@11008..110096675 EXPR_VAR@11008..110096676 NAME@11008..110096677 IDENT@11008..11009 "v"6678 R_PAREN@11009..11010 ")"6679 WHITESPACE@11010..11011 " "6680 MINUS@11011..11012 "-"6681 WHITESPACE@11012..11013 " "6682 EXPR_NUMBER@11013..110146683 FLOAT@11013..11014 "1"6684 R_PAREN@11014..11015 ")"6685 SEMI@11015..11016 ";"6686 WHITESPACE@11016..11025 "\n "6687 EXPR_LOCAL@11025..113236688 LOCAL_KW@11025..11030 "local"6689 WHITESPACE@11030..11031 " "6690 BIND_DESTRUCT@11031..112876691 DESTRUCT_FULL@11031..110396692 NAME@11031..110396693 IDENT@11031..11039 "sections"6694 WHITESPACE@11039..11040 " "6695 ASSIGN@11040..11041 "="6696 WHITESPACE@11041..11042 " "6697 EXPR_ARRAY_COMP@11042..112876698 L_BRACK@11042..11043 "["6699 WHITESPACE@11043..11054 "\n "6700 EXPR_PARENED@11054..112526701 L_PAREN@11054..11055 "("6702 EXPR_BINARY@11055..112516703 LHS_EXPR@11055..111696704 EXPR_BINARY@11055..111696705 LHS_EXPR@11055..111226706 EXPR_BINARY@11055..111226707 LHS_EXPR@11055..111156708 EXPR_BINARY@11055..111156709 LHS_EXPR@11055..110696710 EXPR_BINARY@11055..110696711 LHS_EXPR@11055..110626712 EXPR_VAR@11055..110626713 NAME@11055..110626714 IDENT@11055..11062 "cindent"6715 WHITESPACE@11062..11063 " "6716 PLUS@11063..11064 "+"6717 WHITESPACE@11064..11065 " "6718 EXPR_STRING@11065..110696719 STRING_SINGLE@11065..11069 "'[['"6720 WHITESPACE@11069..11070 " "6721 PLUS@11070..11071 "+"6722 WHITESPACE@11071..11072 " "6723 EXPR_APPLY@11072..111156724 EXPR_INDEX@11072..110806725 EXPR_VAR@11072..110756726 NAME@11072..110756727 IDENT@11072..11075 "std"6728 DOT@11075..11076 "."6729 NAME@11076..110806730 IDENT@11076..11080 "join"6731 ARGS_DESC@11080..111156732 L_PAREN@11080..11081 "("6733 ARG@11081..110846734 EXPR_STRING@11081..110846735 STRING_SINGLE@11081..11084 "'.'"6736 COMMA@11084..11085 ","6737 WHITESPACE@11085..11086 " "6738 ARG@11086..111146739 EXPR_APPLY@11086..111146740 EXPR_INDEX@11086..110936741 EXPR_VAR@11086..110896742 NAME@11086..110896743 IDENT@11086..11089 "std"6744 DOT@11089..11090 "."6745 NAME@11090..110936746 IDENT@11090..11093 "map"6747 ARGS_DESC@11093..111146748 L_PAREN@11093..11094 "("6749 ARG@11094..111076750 EXPR_VAR@11094..111076751 NAME@11094..111076752 IDENT@11094..11107 "escapeKeyToml"6753 COMMA@11107..11108 ","6754 WHITESPACE@11108..11109 " "6755 ARG@11109..111136756 EXPR_VAR@11109..111136757 NAME@11109..111136758 IDENT@11109..11113 "path"6759 R_PAREN@11113..11114 ")"6760 R_PAREN@11114..11115 ")"6761 WHITESPACE@11115..11116 " "6762 PLUS@11116..11117 "+"6763 WHITESPACE@11117..11118 " "6764 EXPR_STRING@11118..111226765 STRING_SINGLE@11118..11122 "']]'"6766 WHITESPACE@11122..11134 "\n "6767 PLUS@11134..11135 "+"6768 WHITESPACE@11135..11136 " "6769 EXPR_PARENED@11136..111696770 L_PAREN@11136..11137 "("6771 EXPR_IF_THEN_ELSE@11137..111686772 IF_KW@11137..11139 "if"6773 WHITESPACE@11139..11140 " "6774 EXPR_BINARY@11140..111506775 LHS_EXPR@11140..111446776 EXPR_INDEX_EXPR@11140..111446777 LHS_EXPR@11140..111416778 EXPR_VAR@11140..111416779 NAME@11140..111416780 IDENT@11140..11141 "v"6781 L_BRACK@11141..11142 "["6782 EXPR_VAR@11142..111436783 NAME@11142..111436784 IDENT@11142..11143 "i"6785 R_BRACK@11143..11144 "]"6786 WHITESPACE@11144..11145 " "6787 EQ@11145..11147 "=="6788 WHITESPACE@11147..11148 " "6789 EXPR_OBJECT@11148..111506790 OBJ_BODY_MEMBER_LIST@11148..111506791 L_BRACE@11148..11149 "{"6792 R_BRACE@11149..11150 "}"6793 WHITESPACE@11150..11151 " "6794 THEN_KW@11151..11155 "then"6795 WHITESPACE@11155..11156 " "6796 TRUE_EXPR@11156..111586797 EXPR_STRING@11156..111586798 STRING_SINGLE@11156..11158 "''"6799 WHITESPACE@11158..11159 " "6800 ELSE_KW@11159..11163 "else"6801 WHITESPACE@11163..11164 " "6802 FALSE_EXPR@11164..111686803 EXPR_STRING@11164..111686804 STRING_SINGLE@11164..11168 "'\\n'"6805 R_PAREN@11168..11169 ")"6806 WHITESPACE@11169..11181 "\n "6807 PLUS@11181..11182 "+"6808 WHITESPACE@11182..11183 " "6809 EXPR_APPLY@11183..112516810 EXPR_VAR@11183..112026811 NAME@11183..112026812 IDENT@11183..11202 "renderTableInternal"6813 ARGS_DESC@11202..112516814 L_PAREN@11202..11203 "("6815 ARG@11203..112076816 EXPR_INDEX_EXPR@11203..112076817 LHS_EXPR@11203..112046818 EXPR_VAR@11203..112046819 NAME@11203..112046820 IDENT@11203..11204 "v"6821 L_BRACK@11204..11205 "["6822 EXPR_VAR@11205..112066823 NAME@11205..112066824 IDENT@11205..11206 "i"6825 R_BRACK@11206..11207 "]"6826 COMMA@11207..11208 ","6827 WHITESPACE@11208..11209 " "6828 ARG@11209..112136829 EXPR_VAR@11209..112136830 NAME@11209..112136831 IDENT@11209..11213 "path"6832 COMMA@11213..11214 ","6833 WHITESPACE@11214..11215 " "6834 ARG@11215..112326835 EXPR_BINARY@11215..112326836 LHS_EXPR@11215..112266837 EXPR_VAR@11215..112266838 NAME@11215..112266839 IDENT@11215..11226 "indexedPath"6840 WHITESPACE@11226..11227 " "6841 PLUS@11227..11228 "+"6842 WHITESPACE@11228..11229 " "6843 EXPR_ARRAY@11229..112326844 L_BRACK@11229..11230 "["6845 EXPR_VAR@11230..112316846 NAME@11230..112316847 IDENT@11230..11231 "i"6848 R_BRACK@11231..11232 "]"6849 COMMA@11232..11233 ","6850 WHITESPACE@11233..11234 " "6851 ARG@11234..112506852 EXPR_BINARY@11234..112506853 LHS_EXPR@11234..112416854 EXPR_VAR@11234..112416855 NAME@11234..112416856 IDENT@11234..11241 "cindent"6857 WHITESPACE@11241..11242 " "6858 PLUS@11242..11243 "+"6859 WHITESPACE@11243..11244 " "6860 EXPR_VAR@11244..112506861 NAME@11244..112506862 IDENT@11244..11250 "indent"6863 R_PAREN@11250..11251 ")"6864 R_PAREN@11251..11252 ")"6865 WHITESPACE@11252..11263 "\n "6866 FOR_SPEC@11263..112776867 FOR_KW@11263..11266 "for"6868 WHITESPACE@11266..11267 " "6869 NAME@11267..112686870 IDENT@11267..11268 "i"6871 WHITESPACE@11268..11269 " "6872 IN_KW@11269..11271 "in"6873 WHITESPACE@11271..11272 " "6874 EXPR_VAR@11272..112776875 NAME@11272..112776876 IDENT@11272..11277 "range"6877 WHITESPACE@11277..11286 "\n "6878 R_BRACK@11286..11287 "]"6879 SEMI@11287..11288 ";"6880 WHITESPACE@11288..11297 "\n "6881 EXPR_APPLY@11297..113236882 EXPR_INDEX@11297..113056883 EXPR_VAR@11297..113006884 NAME@11297..113006885 IDENT@11297..11300 "std"6886 DOT@11300..11301 "."6887 NAME@11301..113056888 IDENT@11301..11305 "join"6889 ARGS_DESC@11305..113236890 L_PAREN@11305..11306 "("6891 ARG@11306..113126892 EXPR_STRING@11306..113126893 STRING_SINGLE@11306..11312 "'\\n\\n'"6894 COMMA@11312..11313 ","6895 WHITESPACE@11313..11314 " "6896 ARG@11314..113226897 EXPR_VAR@11314..113226898 NAME@11314..113226899 IDENT@11314..11322 "sections"6900 R_PAREN@11322..11323 ")"6901 SEMI@11323..11324 ";"6902 WHITESPACE@11324..11329 "\n "6903 EXPR_IF_THEN_ELSE@11329..114766904 IF_KW@11329..11331 "if"6905 WHITESPACE@11331..11332 " "6906 EXPR_APPLY@11332..113516907 EXPR_INDEX@11332..113446908 EXPR_VAR@11332..113356909 NAME@11332..113356910 IDENT@11332..11335 "std"6911 DOT@11335..11336 "."6912 NAME@11336..113446913 IDENT@11336..11344 "isObject"6914 ARGS_DESC@11344..113516915 L_PAREN@11344..11345 "("6916 ARG@11345..113506917 EXPR_VAR@11345..113506918 NAME@11345..113506919 IDENT@11345..11350 "value"6920 R_PAREN@11350..11351 ")"6921 WHITESPACE@11351..11352 " "6922 THEN_KW@11352..11356 "then"6923 WHITESPACE@11356..11363 "\n "6924 TRUE_EXPR@11363..114016925 EXPR_APPLY@11363..114016926 EXPR_VAR@11363..113826927 NAME@11363..113826928 IDENT@11363..11382 "renderTableInternal"6929 ARGS_DESC@11382..114016930 L_PAREN@11382..11383 "("6931 ARG@11383..113886932 EXPR_VAR@11383..113886933 NAME@11383..113886934 IDENT@11383..11388 "value"6935 COMMA@11388..11389 ","6936 WHITESPACE@11389..11390 " "6937 ARG@11390..113926938 EXPR_ARRAY@11390..113926939 L_BRACK@11390..11391 "["6940 R_BRACK@11391..11392 "]"6941 COMMA@11392..11393 ","6942 WHITESPACE@11393..11394 " "6943 ARG@11394..113966944 EXPR_ARRAY@11394..113966945 L_BRACK@11394..11395 "["6946 R_BRACK@11395..11396 "]"6947 COMMA@11396..11397 ","6948 WHITESPACE@11397..11398 " "6949 ARG@11398..114006950 EXPR_STRING@11398..114006951 STRING_SINGLE@11398..11400 "''"6952 R_PAREN@11400..11401 ")"6953 WHITESPACE@11401..11406 "\n "6954 ELSE_KW@11406..11410 "else"6955 WHITESPACE@11410..11417 "\n "6956 FALSE_EXPR@11417..114766957 EXPR_ERROR@11417..114766958 ERROR_KW@11417..11422 "error"6959 WHITESPACE@11422..11423 " "6960 EXPR_BINARY@11423..114766961 LHS_EXPR@11423..114586962 EXPR_STRING@11423..114586963 STRING_SINGLE@11423..11458 "'TOML body must be an ..."6964 WHITESPACE@11458..11459 " "6965 PLUS@11459..11460 "+"6966 WHITESPACE@11460..11461 " "6967 EXPR_APPLY@11461..114766968 EXPR_INDEX@11461..114696969 EXPR_VAR@11461..114646970 NAME@11461..114646971 IDENT@11461..11464 "std"6972 DOT@11464..11465 "."6973 NAME@11465..114696974 IDENT@11465..11469 "type"6975 ARGS_DESC@11469..114766976 L_PAREN@11469..11470 "("6977 ARG@11470..114756978 EXPR_VAR@11470..114756979 NAME@11470..114756980 IDENT@11470..11475 "value"6981 R_PAREN@11475..11476 ")"6982 COMMA@11476..11477 ","6983 WHITESPACE@11477..11481 "\n\n "6984 MEMBER_FIELD@11481..115286985 FIELD_NORMAL@11481..115286986 FIELD_NAME_FIXED@11481..114976987 NAME@11481..114976988 IDENT@11481..11497 "escapeStringJson"6989 COLONCOLON@11497..11499 "::"6990 WHITESPACE@11499..11500 " "6991 EXPR_INTRINSIC@11500..115286992 INTRINSIC@11500..11510 "$intrinsic"6993 L_PAREN@11510..11511 "("6994 NAME@11511..115276995 IDENT@11511..11527 "escapeStringJson"6996 R_PAREN@11527..11528 ")"6997 COMMA@11528..11529 ","6998 WHITESPACE@11529..11533 "\n\n "6999 MEMBER_FIELD@11533..115887000 FIELD_METHOD@11533..115887001 FIELD_NAME_FIXED@11533..115517002 NAME@11533..115517003 IDENT@11533..11551 "escapeStringPython"7004 PARAMS_DESC@11551..115567005 L_PAREN@11551..11552 "("7006 PARAM@11552..115557007 DESTRUCT_FULL@11552..115557008 NAME@11552..115557009 IDENT@11552..11555 "str"7010 R_PAREN@11555..11556 ")"7011 COLONCOLON@11556..11558 "::"7012 WHITESPACE@11558..11563 "\n "7013 EXPR_APPLY@11563..115887014 EXPR_INDEX@11563..115837015 EXPR_VAR@11563..115667016 NAME@11563..115667017 IDENT@11563..11566 "std"7018 DOT@11566..11567 "."7019 NAME@11567..115837020 IDENT@11567..11583 "escapeStringJson"7021 ARGS_DESC@11583..115887022 L_PAREN@11583..11584 "("7023 ARG@11584..115877024 EXPR_VAR@11584..115877025 NAME@11584..115877026 IDENT@11584..11587 "str"7027 R_PAREN@11587..11588 ")"7028 COMMA@11588..11589 ","7029 WHITESPACE@11589..11593 "\n\n "7030 MEMBER_FIELD@11593..118107031 FIELD_METHOD@11593..118107032 FIELD_NAME_FIXED@11593..116097033 NAME@11593..116097034 IDENT@11593..11609 "escapeStringBash"7035 PARAMS_DESC@11609..116157036 L_PAREN@11609..11610 "("7037 PARAM@11610..116147038 DESTRUCT_FULL@11610..116147039 NAME@11610..116147040 IDENT@11610..11614 "str_"7041 R_PAREN@11614..11615 ")"7042 COLONCOLON@11615..11617 "::"7043 WHITESPACE@11617..11622 "\n "7044 EXPR_LOCAL@11622..118107045 LOCAL_KW@11622..11627 "local"7046 WHITESPACE@11627..11628 " "7047 BIND_DESTRUCT@11628..116527048 DESTRUCT_FULL@11628..116317049 NAME@11628..116317050 IDENT@11628..11631 "str"7051 WHITESPACE@11631..11632 " "7052 ASSIGN@11632..11633 "="7053 WHITESPACE@11633..11634 " "7054 EXPR_APPLY@11634..116527055 EXPR_INDEX@11634..116467056 EXPR_VAR@11634..116377057 NAME@11634..116377058 IDENT@11634..11637 "std"7059 DOT@11637..11638 "."7060 NAME@11638..116467061 IDENT@11638..11646 "toString"7062 ARGS_DESC@11646..116527063 L_PAREN@11646..11647 "("7064 ARG@11647..116517065 EXPR_VAR@11647..116517066 NAME@11647..116517067 IDENT@11647..11651 "str_"7068 R_PAREN@11651..11652 ")"7069 SEMI@11652..11653 ";"7070 WHITESPACE@11653..11658 "\n "7071 EXPR_LOCAL@11658..118107072 LOCAL_KW@11658..11663 "local"7073 WHITESPACE@11663..11664 " "7074 BIND_FUNCTION@11664..117397075 NAME@11664..116697076 IDENT@11664..11669 "trans"7077 PARAMS_DESC@11669..116737078 L_PAREN@11669..11670 "("7079 PARAM@11670..116727080 DESTRUCT_FULL@11670..116727081 NAME@11670..116727082 IDENT@11670..11672 "ch"7083 R_PAREN@11672..11673 ")"7084 WHITESPACE@11673..11674 " "7085 ASSIGN@11674..11675 "="7086 WHITESPACE@11675..11682 "\n "7087 EXPR_IF_THEN_ELSE@11682..117397088 IF_KW@11682..11684 "if"7089 WHITESPACE@11684..11685 " "7090 EXPR_BINARY@11685..116947091 LHS_EXPR@11685..116877092 EXPR_VAR@11685..116877093 NAME@11685..116877094 IDENT@11685..11687 "ch"7095 WHITESPACE@11687..11688 " "7096 EQ@11688..11690 "=="7097 WHITESPACE@11690..11691 " "7098 EXPR_STRING@11691..116947099 STRING_DOUBLE@11691..11694 "\"'\""7100 WHITESPACE@11694..11695 " "7101 THEN_KW@11695..11699 "then"7102 WHITESPACE@11699..11708 "\n "7103 TRUE_EXPR@11708..117177104 EXPR_STRING@11708..117177105 STRING_DOUBLE@11708..11717 "\"'\\\"'\\\"'\""7106 WHITESPACE@11717..11724 "\n "7107 ELSE_KW@11724..11728 "else"7108 WHITESPACE@11728..11737 "\n "7109 FALSE_EXPR@11737..117397110 EXPR_VAR@11737..117397111 NAME@11737..117397112 IDENT@11737..11739 "ch"7113 SEMI@11739..11740 ";"7114 WHITESPACE@11740..11745 "\n "7115 EXPR_BINARY@11745..118107116 LHS_EXPR@11745..117517117 EXPR_STRING@11745..117517118 STRING_DOUBLE@11745..11751 "\"'%s'\""7119 WHITESPACE@11751..11752 " "7120 MODULO@11752..11753 "%"7121 WHITESPACE@11753..11754 " "7122 EXPR_APPLY@11754..118107123 EXPR_INDEX@11754..117627124 EXPR_VAR@11754..117577125 NAME@11754..117577126 IDENT@11754..11757 "std"7127 DOT@11757..11758 "."7128 NAME@11758..117627129 IDENT@11758..11762 "join"7130 ARGS_DESC@11762..118107131 L_PAREN@11762..11763 "("7132 ARG@11763..117657133 EXPR_STRING@11763..117657134 STRING_SINGLE@11763..11765 "''"7135 COMMA@11765..11766 ","7136 WHITESPACE@11766..11767 " "7137 ARG@11767..118097138 EXPR_ARRAY_COMP@11767..118097139 L_BRACK@11767..11768 "["7140 EXPR_APPLY@11768..117777141 EXPR_VAR@11768..117737142 NAME@11768..117737143 IDENT@11768..11773 "trans"7144 ARGS_DESC@11773..117777145 L_PAREN@11773..11774 "("7146 ARG@11774..117767147 EXPR_VAR@11774..117767148 NAME@11774..117767149 IDENT@11774..11776 "ch"7150 R_PAREN@11776..11777 ")"7151 WHITESPACE@11777..11778 " "7152 FOR_SPEC@11778..118087153 FOR_KW@11778..11781 "for"7154 WHITESPACE@11781..11782 " "7155 NAME@11782..117847156 IDENT@11782..11784 "ch"7157 WHITESPACE@11784..11785 " "7158 IN_KW@11785..11787 "in"7159 WHITESPACE@11787..11788 " "7160 EXPR_APPLY@11788..118087161 EXPR_INDEX@11788..118037162 EXPR_VAR@11788..117917163 NAME@11788..117917164 IDENT@11788..11791 "std"7165 DOT@11791..11792 "."7166 NAME@11792..118037167 IDENT@11792..11803 "stringChars"7168 ARGS_DESC@11803..118087169 L_PAREN@11803..11804 "("7170 ARG@11804..118077171 EXPR_VAR@11804..118077172 NAME@11804..118077173 IDENT@11804..11807 "str"7174 R_PAREN@11807..11808 ")"7175 R_BRACK@11808..11809 "]"7176 R_PAREN@11809..11810 ")"7177 COMMA@11810..11811 ","7178 WHITESPACE@11811..11815 "\n\n "7179 MEMBER_FIELD@11815..120297180 FIELD_METHOD@11815..120297181 FIELD_NAME_FIXED@11815..118347182 NAME@11815..118347183 IDENT@11815..11834 "escapeStringDollars"7184 PARAMS_DESC@11834..118407185 L_PAREN@11834..11835 "("7186 PARAM@11835..118397187 DESTRUCT_FULL@11835..118397188 NAME@11835..118397189 IDENT@11835..11839 "str_"7190 R_PAREN@11839..11840 ")"7191 COLONCOLON@11840..11842 "::"7192 WHITESPACE@11842..11847 "\n "7193 EXPR_LOCAL@11847..120297194 LOCAL_KW@11847..11852 "local"7195 WHITESPACE@11852..11853 " "7196 BIND_DESTRUCT@11853..118777197 DESTRUCT_FULL@11853..118567198 NAME@11853..118567199 IDENT@11853..11856 "str"7200 WHITESPACE@11856..11857 " "7201 ASSIGN@11857..11858 "="7202 WHITESPACE@11858..11859 " "7203 EXPR_APPLY@11859..118777204 EXPR_INDEX@11859..118717205 EXPR_VAR@11859..118627206 NAME@11859..118627207 IDENT@11859..11862 "std"7208 DOT@11862..11863 "."7209 NAME@11863..118717210 IDENT@11863..11871 "toString"7211 ARGS_DESC@11871..118777212 L_PAREN@11871..11872 "("7213 ARG@11872..118767214 EXPR_VAR@11872..118767215 NAME@11872..118767216 IDENT@11872..11876 "str_"7217 R_PAREN@11876..11877 ")"7218 SEMI@11877..11878 ";"7219 WHITESPACE@11878..11883 "\n "7220 EXPR_LOCAL@11883..120297221 LOCAL_KW@11883..11888 "local"7222 WHITESPACE@11888..11889 " "7223 BIND_FUNCTION@11889..119597224 NAME@11889..118947225 IDENT@11889..11894 "trans"7226 PARAMS_DESC@11894..118987227 L_PAREN@11894..11895 "("7228 PARAM@11895..118977229 DESTRUCT_FULL@11895..118977230 NAME@11895..118977231 IDENT@11895..11897 "ch"7232 R_PAREN@11897..11898 ")"7233 WHITESPACE@11898..11899 " "7234 ASSIGN@11899..11900 "="7235 WHITESPACE@11900..11907 "\n "7236 EXPR_IF_THEN_ELSE@11907..119597237 IF_KW@11907..11909 "if"7238 WHITESPACE@11909..11910 " "7239 EXPR_BINARY@11910..119197240 LHS_EXPR@11910..119127241 EXPR_VAR@11910..119127242 NAME@11910..119127243 IDENT@11910..11912 "ch"7244 WHITESPACE@11912..11913 " "7245 EQ@11913..11915 "=="7246 WHITESPACE@11915..11916 " "7247 EXPR_STRING@11916..119197248 STRING_SINGLE@11916..11919 "'$'"7249 WHITESPACE@11919..11920 " "7250 THEN_KW@11920..11924 "then"7251 WHITESPACE@11924..11933 "\n "7252 TRUE_EXPR@11933..119377253 EXPR_STRING@11933..119377254 STRING_SINGLE@11933..11937 "'$$'"7255 WHITESPACE@11937..11944 "\n "7256 ELSE_KW@11944..11948 "else"7257 WHITESPACE@11948..11957 "\n "7258 FALSE_EXPR@11957..119597259 EXPR_VAR@11957..119597260 NAME@11957..119597261 IDENT@11957..11959 "ch"7262 SEMI@11959..11960 ";"7263 WHITESPACE@11960..11965 "\n "7264 EXPR_APPLY@11965..120297265 EXPR_INDEX@11965..119747266 EXPR_VAR@11965..119687267 NAME@11965..119687268 IDENT@11965..11968 "std"7269 DOT@11968..11969 "."7270 NAME@11969..119747271 IDENT@11969..11974 "foldl"7272 ARGS_DESC@11974..120297273 L_PAREN@11974..11975 "("7274 ARG@11975..120027275 EXPR_FUNCTION@11975..120027276 FUNCTION_KW@11975..11983 "function"7277 PARAMS_DESC@11983..119897278 L_PAREN@11983..11984 "("7279 PARAM@11984..119857280 DESTRUCT_FULL@11984..119857281 NAME@11984..119857282 IDENT@11984..11985 "a"7283 COMMA@11985..11986 ","7284 WHITESPACE@11986..11987 " "7285 PARAM@11987..119887286 DESTRUCT_FULL@11987..119887287 NAME@11987..119887288 IDENT@11987..11988 "b"7289 R_PAREN@11988..11989 ")"7290 WHITESPACE@11989..11990 " "7291 EXPR_BINARY@11990..120027292 LHS_EXPR@11990..119917293 EXPR_VAR@11990..119917294 NAME@11990..119917295 IDENT@11990..11991 "a"7296 WHITESPACE@11991..11992 " "7297 PLUS@11992..11993 "+"7298 WHITESPACE@11993..11994 " "7299 EXPR_APPLY@11994..120027300 EXPR_VAR@11994..119997301 NAME@11994..119997302 IDENT@11994..11999 "trans"7303 ARGS_DESC@11999..120027304 L_PAREN@11999..12000 "("7305 ARG@12000..120017306 EXPR_VAR@12000..120017307 NAME@12000..120017308 IDENT@12000..12001 "b"7309 R_PAREN@12001..12002 ")"7310 COMMA@12002..12003 ","7311 WHITESPACE@12003..12004 " "7312 ARG@12004..120247313 EXPR_APPLY@12004..120247314 EXPR_INDEX@12004..120197315 EXPR_VAR@12004..120077316 NAME@12004..120077317 IDENT@12004..12007 "std"7318 DOT@12007..12008 "."7319 NAME@12008..120197320 IDENT@12008..12019 "stringChars"7321 ARGS_DESC@12019..120247322 L_PAREN@12019..12020 "("7323 ARG@12020..120237324 EXPR_VAR@12020..120237325 NAME@12020..120237326 IDENT@12020..12023 "str"7327 R_PAREN@12023..12024 ")"7328 COMMA@12024..12025 ","7329 WHITESPACE@12025..12026 " "7330 ARG@12026..120287331 EXPR_STRING@12026..120287332 STRING_SINGLE@12026..12028 "''"7333 R_PAREN@12028..12029 ")"7334 COMMA@12029..12030 ","7335 WHITESPACE@12030..12034 "\n\n "7336 MEMBER_FIELD@12034..121007337 FIELD_METHOD@12034..121007338 FIELD_NAME_FIXED@12034..120467339 NAME@12034..120467340 IDENT@12034..12046 "manifestJson"7341 PARAMS_DESC@12046..120537342 L_PAREN@12046..12047 "("7343 PARAM@12047..120527344 DESTRUCT_FULL@12047..120527345 NAME@12047..120527346 IDENT@12047..12052 "value"7347 R_PAREN@12052..12053 ")"7348 COLONCOLON@12053..12055 "::"7349 WHITESPACE@12055..12056 " "7350 EXPR_APPLY@12056..121007351 EXPR_INDEX@12056..120747352 EXPR_VAR@12056..120597353 NAME@12056..120597354 IDENT@12056..12059 "std"7355 DOT@12059..12060 "."7356 NAME@12060..120747357 IDENT@12060..12074 "manifestJsonEx"7358 ARGS_DESC@12074..121007359 L_PAREN@12074..12075 "("7360 ARG@12075..120807361 EXPR_VAR@12075..120807362 NAME@12075..120807363 IDENT@12075..12080 "value"7364 COMMA@12080..12081 ","7365 WHITESPACE@12081..12082 " "7366 ARG@12082..120887367 EXPR_STRING@12082..120887368 STRING_SINGLE@12082..12088 "' '"7369 R_PAREN@12088..12089 ")"7370 WHITESPACE@12089..12090 " "7371 TAILSTRICT_KW@12090..12100 "tailstrict"7372 COMMA@12100..12101 ","7373 WHITESPACE@12101..12105 "\n\n "7374 MEMBER_FIELD@12105..121737375 FIELD_METHOD@12105..121737376 FIELD_NAME_FIXED@12105..121257377 NAME@12105..121257378 IDENT@12105..12125 "manifestJsonMinified"7379 PARAMS_DESC@12125..121327380 L_PAREN@12125..12126 "("7381 PARAM@12126..121317382 DESTRUCT_FULL@12126..121317383 NAME@12126..121317384 IDENT@12126..12131 "value"7385 R_PAREN@12131..12132 ")"7386 COLONCOLON@12132..12134 "::"7387 WHITESPACE@12134..12135 " "7388 EXPR_APPLY@12135..121737389 EXPR_INDEX@12135..121537390 EXPR_VAR@12135..121387391 NAME@12135..121387392 IDENT@12135..12138 "std"7393 DOT@12138..12139 "."7394 NAME@12139..121537395 IDENT@12139..12153 "manifestJsonEx"7396 ARGS_DESC@12153..121737397 L_PAREN@12153..12154 "("7398 ARG@12154..121597399 EXPR_VAR@12154..121597400 NAME@12154..121597401 IDENT@12154..12159 "value"7402 COMMA@12159..12160 ","7403 WHITESPACE@12160..12161 " "7404 ARG@12161..121637405 EXPR_STRING@12161..121637406 STRING_SINGLE@12161..12163 "''"7407 COMMA@12163..12164 ","7408 WHITESPACE@12164..12165 " "7409 ARG@12165..121677410 EXPR_STRING@12165..121677411 STRING_SINGLE@12165..12167 "''"7412 COMMA@12167..12168 ","7413 WHITESPACE@12168..12169 " "7414 ARG@12169..121727415 EXPR_STRING@12169..121727416 STRING_SINGLE@12169..12172 "':'"7417 R_PAREN@12172..12173 ")"7418 COMMA@12173..12174 ","7419 WHITESPACE@12174..12178 "\n\n "7420 MEMBER_FIELD@12178..122217421 FIELD_NORMAL@12178..122217422 FIELD_NAME_FIXED@12178..121927423 NAME@12178..121927424 IDENT@12178..12192 "manifestJsonEx"7425 COLONCOLON@12192..12194 "::"7426 WHITESPACE@12194..12195 " "7427 EXPR_INTRINSIC@12195..122217428 INTRINSIC@12195..12205 "$intrinsic"7429 L_PAREN@12205..12206 "("7430 NAME@12206..122207431 IDENT@12206..12220 "manifestJsonEx"7432 R_PAREN@12220..12221 ")"7433 COMMA@12221..12222 ","7434 WHITESPACE@12222..12226 "\n\n "7435 MEMBER_FIELD@12226..122717436 FIELD_NORMAL@12226..122717437 FIELD_NAME_FIXED@12226..122417438 NAME@12226..122417439 IDENT@12226..12241 "manifestYamlDoc"7440 COLONCOLON@12241..12243 "::"7441 WHITESPACE@12243..12244 " "7442 EXPR_INTRINSIC@12244..122717443 INTRINSIC@12244..12254 "$intrinsic"7444 L_PAREN@12254..12255 "("7445 NAME@12255..122707446 IDENT@12255..12270 "manifestYamlDoc"7447 R_PAREN@12270..12271 ")"7448 COMMA@12271..12272 ","7449 WHITESPACE@12272..12276 "\n\n "7450 MEMBER_FIELD@12276..126327451 FIELD_METHOD@12276..126327452 FIELD_NAME_FIXED@12276..122947453 NAME@12276..122947454 IDENT@12276..12294 "manifestYamlStream"7455 PARAMS_DESC@12294..123527456 L_PAREN@12294..12295 "("7457 PARAM@12295..123007458 DESTRUCT_FULL@12295..123007459 NAME@12295..123007460 IDENT@12295..12300 "value"7461 COMMA@12300..12301 ","7462 WHITESPACE@12301..12302 " "7463 PARAM@12302..123307464 DESTRUCT_FULL@12302..123247465 NAME@12302..123247466 IDENT@12302..12324 "indent_array_in_object"7467 ASSIGN@12324..12325 "="7468 EXPR_LITERAL@12325..123307469 FALSE_KW@12325..12330 "false"7470 COMMA@12330..12331 ","7471 WHITESPACE@12331..12332 " "7472 PARAM@12332..123517473 DESTRUCT_FULL@12332..123467474 NAME@12332..123467475 IDENT@12332..12346 "c_document_end"7476 ASSIGN@12346..12347 "="7477 EXPR_LITERAL@12347..123517478 TRUE_KW@12347..12351 "true"7479 R_PAREN@12351..12352 ")"7480 COLONCOLON@12352..12354 "::"7481 WHITESPACE@12354..12359 "\n "7482 EXPR_IF_THEN_ELSE@12359..126327483 IF_KW@12359..12361 "if"7484 WHITESPACE@12361..12362 " "7485 EXPR_UNARY@12362..123817486 NOT@12362..12363 "!"7487 EXPR_APPLY@12363..123817488 EXPR_INDEX@12363..123747489 EXPR_VAR@12363..123667490 NAME@12363..123667491 IDENT@12363..12366 "std"7492 DOT@12366..12367 "."7493 NAME@12367..123747494 IDENT@12367..12374 "isArray"7495 ARGS_DESC@12374..123817496 L_PAREN@12374..12375 "("7497 ARG@12375..123807498 EXPR_VAR@12375..123807499 NAME@12375..123807500 IDENT@12375..12380 "value"7501 R_PAREN@12380..12381 ")"7502 WHITESPACE@12381..12382 " "7503 THEN_KW@12382..12386 "then"7504 WHITESPACE@12386..12393 "\n "7505 TRUE_EXPR@12393..124617506 EXPR_ERROR@12393..124617507 ERROR_KW@12393..12398 "error"7508 WHITESPACE@12398..12399 " "7509 EXPR_BINARY@12399..124617510 LHS_EXPR@12399..124437511 EXPR_STRING@12399..124437512 STRING_SINGLE@12399..12443 "'manifestYamlStream o ..."7513 WHITESPACE@12443..12444 " "7514 PLUS@12444..12445 "+"7515 WHITESPACE@12445..12446 " "7516 EXPR_APPLY@12446..124617517 EXPR_INDEX@12446..124547518 EXPR_VAR@12446..124497519 NAME@12446..124497520 IDENT@12446..12449 "std"7521 DOT@12449..12450 "."7522 NAME@12450..124547523 IDENT@12450..12454 "type"7524 ARGS_DESC@12454..124617525 L_PAREN@12454..12455 "("7526 ARG@12455..124607527 EXPR_VAR@12455..124607528 NAME@12455..124607529 IDENT@12455..12460 "value"7530 R_PAREN@12460..12461 ")"7531 WHITESPACE@12461..12466 "\n "7532 ELSE_KW@12466..12470 "else"7533 WHITESPACE@12470..12477 "\n "7534 FALSE_EXPR@12477..126327535 EXPR_BINARY@12477..126327536 LHS_EXPR@12477..125877537 EXPR_BINARY@12477..125877538 LHS_EXPR@12477..124847539 EXPR_STRING@12477..124847540 STRING_SINGLE@12477..12484 "'---\\n'"7541 WHITESPACE@12484..12485 " "7542 PLUS@12485..12486 "+"7543 WHITESPACE@12486..12487 " "7544 EXPR_APPLY@12487..125877545 EXPR_INDEX@12487..124957546 EXPR_VAR@12487..124907547 NAME@12487..124907548 IDENT@12487..12490 "std"7549 DOT@12490..12491 "."7550 NAME@12491..124957551 IDENT@12491..12495 "join"7552 ARGS_DESC@12495..125877553 L_PAREN@12495..12496 "("7554 WHITESPACE@12496..12505 "\n "7555 ARG@12505..125147556 EXPR_STRING@12505..125147557 STRING_SINGLE@12505..12514 "'\\n---\\n'"7558 COMMA@12514..12515 ","7559 WHITESPACE@12515..12516 " "7560 ARG@12516..125797561 EXPR_ARRAY_COMP@12516..125797562 L_BRACK@12516..12517 "["7563 EXPR_APPLY@12517..125637564 EXPR_INDEX@12517..125367565 EXPR_VAR@12517..125207566 NAME@12517..125207567 IDENT@12517..12520 "std"7568 DOT@12520..12521 "."7569 NAME@12521..125367570 IDENT@12521..12536 "manifestYamlDoc"7571 ARGS_DESC@12536..125637572 L_PAREN@12536..12537 "("7573 ARG@12537..125387574 EXPR_VAR@12537..125387575 NAME@12537..125387576 IDENT@12537..12538 "e"7577 COMMA@12538..12539 ","7578 WHITESPACE@12539..12540 " "7579 ARG@12540..125627580 EXPR_VAR@12540..125627581 NAME@12540..125627582 IDENT@12540..12562 "indent_array_in_object"7583 R_PAREN@12562..12563 ")"7584 WHITESPACE@12563..12564 " "7585 FOR_SPEC@12564..125787586 FOR_KW@12564..12567 "for"7587 WHITESPACE@12567..12568 " "7588 NAME@12568..125697589 IDENT@12568..12569 "e"7590 WHITESPACE@12569..12570 " "7591 IN_KW@12570..12572 "in"7592 WHITESPACE@12572..12573 " "7593 EXPR_VAR@12573..125787594 NAME@12573..125787595 IDENT@12573..12578 "value"7596 R_BRACK@12578..12579 "]"7597 WHITESPACE@12579..12586 "\n "7598 R_PAREN@12586..12587 ")"7599 WHITESPACE@12587..12588 " "7600 PLUS@12588..12589 "+"7601 WHITESPACE@12589..12590 " "7602 EXPR_IF_THEN_ELSE@12590..126327603 IF_KW@12590..12592 "if"7604 WHITESPACE@12592..12593 " "7605 EXPR_VAR@12593..126077606 NAME@12593..126077607 IDENT@12593..12607 "c_document_end"7608 WHITESPACE@12607..12608 " "7609 THEN_KW@12608..12612 "then"7610 WHITESPACE@12612..12613 " "7611 TRUE_EXPR@12613..126227612 EXPR_STRING@12613..126227613 STRING_SINGLE@12613..12622 "'\\n...\\n'"7614 WHITESPACE@12622..12623 " "7615 ELSE_KW@12623..12627 "else"7616 WHITESPACE@12627..12628 " "7617 FALSE_EXPR@12628..126327618 EXPR_STRING@12628..126327619 STRING_SINGLE@12628..12632 "'\\n'"7620 COMMA@12632..12633 ","7621 WHITESPACE@12633..12638 "\n\n\n "7622 MEMBER_FIELD@12638..132947623 FIELD_METHOD@12638..132947624 FIELD_NAME_FIXED@12638..126527625 NAME@12638..126527626 IDENT@12638..12652 "manifestPython"7627 PARAMS_DESC@12652..126557628 L_PAREN@12652..12653 "("7629 PARAM@12653..126547630 DESTRUCT_FULL@12653..126547631 NAME@12653..126547632 IDENT@12653..12654 "v"7633 R_PAREN@12654..12655 ")"7634 COLONCOLON@12655..12657 "::"7635 WHITESPACE@12657..12662 "\n "7636 EXPR_IF_THEN_ELSE@12662..132947637 IF_KW@12662..12664 "if"7638 WHITESPACE@12664..12665 " "7639 EXPR_APPLY@12665..126807640 EXPR_INDEX@12665..126777641 EXPR_VAR@12665..126687642 NAME@12665..126687643 IDENT@12665..12668 "std"7644 DOT@12668..12669 "."7645 NAME@12669..126777646 IDENT@12669..12677 "isObject"7647 ARGS_DESC@12677..126807648 L_PAREN@12677..12678 "("7649 ARG@12678..126797650 EXPR_VAR@12678..126797651 NAME@12678..126797652 IDENT@12678..12679 "v"7653 R_PAREN@12679..12680 ")"7654 WHITESPACE@12680..12681 " "7655 THEN_KW@12681..12685 "then"7656 WHITESPACE@12685..12692 "\n "7657 TRUE_EXPR@12692..128677658 EXPR_LOCAL@12692..128677659 LOCAL_KW@12692..12697 "local"7660 WHITESPACE@12697..12698 " "7661 BIND_DESTRUCT@12698..128267662 DESTRUCT_FULL@12698..127047663 NAME@12698..127047664 IDENT@12698..12704 "fields"7665 WHITESPACE@12704..12705 " "7666 ASSIGN@12705..12706 "="7667 WHITESPACE@12706..12707 " "7668 EXPR_ARRAY_COMP@12707..128267669 L_BRACK@12707..12708 "["7670 WHITESPACE@12708..12717 "\n "7671 EXPR_BINARY@12717..127817672 LHS_EXPR@12717..127257673 EXPR_STRING@12717..127257674 STRING_SINGLE@12717..12725 "'%s: %s'"7675 WHITESPACE@12725..12726 " "7676 MODULO@12726..12727 "%"7677 WHITESPACE@12727..12728 " "7678 EXPR_ARRAY@12728..127817679 L_BRACK@12728..12729 "["7680 EXPR_APPLY@12729..127547681 EXPR_INDEX@12729..127517682 EXPR_VAR@12729..127327683 NAME@12729..127327684 IDENT@12729..12732 "std"7685 DOT@12732..12733 "."7686 NAME@12733..127517687 IDENT@12733..12751 "escapeStringPython"7688 ARGS_DESC@12751..127547689 L_PAREN@12751..12752 "("7690 ARG@12752..127537691 EXPR_VAR@12752..127537692 NAME@12752..127537693 IDENT@12752..12753 "k"7694 R_PAREN@12753..12754 ")"7695 COMMA@12754..12755 ","7696 WHITESPACE@12755..12756 " "7697 EXPR_APPLY@12756..127807698 EXPR_INDEX@12756..127747699 EXPR_VAR@12756..127597700 NAME@12756..127597701 IDENT@12756..12759 "std"7702 DOT@12759..12760 "."7703 NAME@12760..127747704 IDENT@12760..12774 "manifestPython"7705 ARGS_DESC@12774..127807706 L_PAREN@12774..12775 "("7707 ARG@12775..127797708 EXPR_INDEX_EXPR@12775..127797709 LHS_EXPR@12775..127767710 EXPR_VAR@12775..127767711 NAME@12775..127767712 IDENT@12775..12776 "v"7713 L_BRACK@12776..12777 "["7714 EXPR_VAR@12777..127787715 NAME@12777..127787716 IDENT@12777..12778 "k"7717 R_BRACK@12778..12779 "]"7718 R_PAREN@12779..12780 ")"7719 R_BRACK@12780..12781 "]"7720 WHITESPACE@12781..12790 "\n "7721 FOR_SPEC@12790..128187722 FOR_KW@12790..12793 "for"7723 WHITESPACE@12793..12794 " "7724 NAME@12794..127957725 IDENT@12794..12795 "k"7726 WHITESPACE@12795..12796 " "7727 IN_KW@12796..12798 "in"7728 WHITESPACE@12798..12799 " "7729 EXPR_APPLY@12799..128187730 EXPR_INDEX@12799..128157731 EXPR_VAR@12799..128027732 NAME@12799..128027733 IDENT@12799..12802 "std"7734 DOT@12802..12803 "."7735 NAME@12803..128157736 IDENT@12803..12815 "objectFields"7737 ARGS_DESC@12815..128187738 L_PAREN@12815..12816 "("7739 ARG@12816..128177740 EXPR_VAR@12816..128177741 NAME@12816..128177742 IDENT@12816..12817 "v"7743 R_PAREN@12817..12818 ")"7744 WHITESPACE@12818..12825 "\n "7745 R_BRACK@12825..12826 "]"7746 SEMI@12826..12827 ";"7747 WHITESPACE@12827..12834 "\n "7748 EXPR_BINARY@12834..128677749 LHS_EXPR@12834..128407750 EXPR_STRING@12834..128407751 STRING_SINGLE@12834..12840 "'{%s}'"7752 WHITESPACE@12840..12841 " "7753 MODULO@12841..12842 "%"7754 WHITESPACE@12842..12843 " "7755 EXPR_ARRAY@12843..128677756 L_BRACK@12843..12844 "["7757 EXPR_APPLY@12844..128667758 EXPR_INDEX@12844..128527759 EXPR_VAR@12844..128477760 NAME@12844..128477761 IDENT@12844..12847 "std"7762 DOT@12847..12848 "."7763 NAME@12848..128527764 IDENT@12848..12852 "join"7765 ARGS_DESC@12852..128667766 L_PAREN@12852..12853 "("7767 ARG@12853..128577768 EXPR_STRING@12853..128577769 STRING_SINGLE@12853..12857 "', '"7770 COMMA@12857..12858 ","7771 WHITESPACE@12858..12859 " "7772 ARG@12859..128657773 EXPR_VAR@12859..128657774 NAME@12859..128657775 IDENT@12859..12865 "fields"7776 R_PAREN@12865..12866 ")"7777 R_BRACK@12866..12867 "]"7778 WHITESPACE@12867..12872 "\n "7779 ELSE_KW@12872..12876 "else"7780 WHITESPACE@12876..12877 " "7781 FALSE_EXPR@12877..132947782 EXPR_IF_THEN_ELSE@12877..132947783 IF_KW@12877..12879 "if"7784 WHITESPACE@12879..12880 " "7785 EXPR_APPLY@12880..128947786 EXPR_INDEX@12880..128917787 EXPR_VAR@12880..128837788 NAME@12880..128837789 IDENT@12880..12883 "std"7790 DOT@12883..12884 "."7791 NAME@12884..128917792 IDENT@12884..12891 "isArray"7793 ARGS_DESC@12891..128947794 L_PAREN@12891..12892 "("7795 ARG@12892..128937796 EXPR_VAR@12892..128937797 NAME@12892..128937798 IDENT@12892..12893 "v"7799 R_PAREN@12893..12894 ")"7800 WHITESPACE@12894..12895 " "7801 THEN_KW@12895..12899 "then"7802 WHITESPACE@12899..12906 "\n "7803 TRUE_EXPR@12906..129697804 EXPR_BINARY@12906..129697805 LHS_EXPR@12906..129127806 EXPR_STRING@12906..129127807 STRING_SINGLE@12906..12912 "'[%s]'"7808 WHITESPACE@12912..12913 " "7809 MODULO@12913..12914 "%"7810 WHITESPACE@12914..12915 " "7811 EXPR_ARRAY@12915..129697812 L_BRACK@12915..12916 "["7813 EXPR_APPLY@12916..129687814 EXPR_INDEX@12916..129247815 EXPR_VAR@12916..129197816 NAME@12916..129197817 IDENT@12916..12919 "std"7818 DOT@12919..12920 "."7819 NAME@12920..129247820 IDENT@12920..12924 "join"7821 ARGS_DESC@12924..129687822 L_PAREN@12924..12925 "("7823 ARG@12925..129297824 EXPR_STRING@12925..129297825 STRING_SINGLE@12925..12929 "', '"7826 COMMA@12929..12930 ","7827 WHITESPACE@12930..12931 " "7828 ARG@12931..129677829 EXPR_ARRAY_COMP@12931..129677830 L_BRACK@12931..12932 "["7831 EXPR_APPLY@12932..129547832 EXPR_INDEX@12932..129507833 EXPR_VAR@12932..129357834 NAME@12932..129357835 IDENT@12932..12935 "std"7836 DOT@12935..12936 "."7837 NAME@12936..129507838 IDENT@12936..12950 "manifestPython"7839 ARGS_DESC@12950..129547840 L_PAREN@12950..12951 "("7841 ARG@12951..129537842 EXPR_VAR@12951..129537843 NAME@12951..129537844 IDENT@12951..12953 "v2"7845 R_PAREN@12953..12954 ")"7846 WHITESPACE@12954..12955 " "7847 FOR_SPEC@12955..129667848 FOR_KW@12955..12958 "for"7849 WHITESPACE@12958..12959 " "7850 NAME@12959..129617851 IDENT@12959..12961 "v2"7852 WHITESPACE@12961..12962 " "7853 IN_KW@12962..12964 "in"7854 WHITESPACE@12964..12965 " "7855 EXPR_VAR@12965..129667856 NAME@12965..129667857 IDENT@12965..12966 "v"7858 R_BRACK@12966..12967 "]"7859 R_PAREN@12967..12968 ")"7860 R_BRACK@12968..12969 "]"7861 WHITESPACE@12969..12974 "\n "7862 ELSE_KW@12974..12978 "else"7863 WHITESPACE@12978..12979 " "7864 FALSE_EXPR@12979..132947865 EXPR_IF_THEN_ELSE@12979..132947866 IF_KW@12979..12981 "if"7867 WHITESPACE@12981..12982 " "7868 EXPR_APPLY@12982..129977869 EXPR_INDEX@12982..129947870 EXPR_VAR@12982..129857871 NAME@12982..129857872 IDENT@12982..12985 "std"7873 DOT@12985..12986 "."7874 NAME@12986..129947875 IDENT@12986..12994 "isString"7876 ARGS_DESC@12994..129977877 L_PAREN@12994..12995 "("7878 ARG@12995..129967879 EXPR_VAR@12995..129967880 NAME@12995..129967881 IDENT@12995..12996 "v"7882 R_PAREN@12996..12997 ")"7883 WHITESPACE@12997..12998 " "7884 THEN_KW@12998..13002 "then"7885 WHITESPACE@13002..13009 "\n "7886 TRUE_EXPR@13009..130437887 EXPR_BINARY@13009..130437888 LHS_EXPR@13009..130137889 EXPR_STRING@13009..130137890 STRING_SINGLE@13009..13013 "'%s'"7891 WHITESPACE@13013..13014 " "7892 MODULO@13014..13015 "%"7893 WHITESPACE@13015..13016 " "7894 EXPR_ARRAY@13016..130437895 L_BRACK@13016..13017 "["7896 EXPR_APPLY@13017..130427897 EXPR_INDEX@13017..130397898 EXPR_VAR@13017..130207899 NAME@13017..130207900 IDENT@13017..13020 "std"7901 DOT@13020..13021 "."7902 NAME@13021..130397903 IDENT@13021..13039 "escapeStringPython"7904 ARGS_DESC@13039..130427905 L_PAREN@13039..13040 "("7906 ARG@13040..130417907 EXPR_VAR@13040..130417908 NAME@13040..130417909 IDENT@13040..13041 "v"7910 R_PAREN@13041..13042 ")"7911 R_BRACK@13042..13043 "]"7912 WHITESPACE@13043..13048 "\n "7913 ELSE_KW@13048..13052 "else"7914 WHITESPACE@13052..13053 " "7915 FALSE_EXPR@13053..132947916 EXPR_IF_THEN_ELSE@13053..132947917 IF_KW@13053..13055 "if"7918 WHITESPACE@13055..13056 " "7919 EXPR_APPLY@13056..130737920 EXPR_INDEX@13056..130707921 EXPR_VAR@13056..130597922 NAME@13056..130597923 IDENT@13056..13059 "std"7924 DOT@13059..13060 "."7925 NAME@13060..130707926 IDENT@13060..13070 "isFunction"7927 ARGS_DESC@13070..130737928 L_PAREN@13070..13071 "("7929 ARG@13071..130727930 EXPR_VAR@13071..130727931 NAME@13071..130727932 IDENT@13071..13072 "v"7933 R_PAREN@13072..13073 ")"7934 WHITESPACE@13073..13074 " "7935 THEN_KW@13074..13078 "then"7936 WHITESPACE@13078..13085 "\n "7937 TRUE_EXPR@13085..131177938 EXPR_ERROR@13085..131177939 ERROR_KW@13085..13090 "error"7940 WHITESPACE@13090..13091 " "7941 EXPR_STRING@13091..131177942 STRING_SINGLE@13091..13117 "'cannot manifest func ..."7943 WHITESPACE@13117..13122 "\n "7944 ELSE_KW@13122..13126 "else"7945 WHITESPACE@13126..13127 " "7946 FALSE_EXPR@13127..132947947 EXPR_IF_THEN_ELSE@13127..132947948 IF_KW@13127..13129 "if"7949 WHITESPACE@13129..13130 " "7950 EXPR_APPLY@13130..131457951 EXPR_INDEX@13130..131427952 EXPR_VAR@13130..131337953 NAME@13130..131337954 IDENT@13130..13133 "std"7955 DOT@13133..13134 "."7956 NAME@13134..131427957 IDENT@13134..13142 "isNumber"7958 ARGS_DESC@13142..131457959 L_PAREN@13142..13143 "("7960 ARG@13143..131447961 EXPR_VAR@13143..131447962 NAME@13143..131447963 IDENT@13143..13144 "v"7964 R_PAREN@13144..13145 ")"7965 WHITESPACE@13145..13146 " "7966 THEN_KW@13146..13150 "then"7967 WHITESPACE@13150..13157 "\n "7968 TRUE_EXPR@13157..131727969 EXPR_APPLY@13157..131727970 EXPR_INDEX@13157..131697971 EXPR_VAR@13157..131607972 NAME@13157..131607973 IDENT@13157..13160 "std"7974 DOT@13160..13161 "."7975 NAME@13161..131697976 IDENT@13161..13169 "toString"7977 ARGS_DESC@13169..131727978 L_PAREN@13169..13170 "("7979 ARG@13170..131717980 EXPR_VAR@13170..131717981 NAME@13170..131717982 IDENT@13170..13171 "v"7983 R_PAREN@13171..13172 ")"7984 WHITESPACE@13172..13177 "\n "7985 ELSE_KW@13177..13181 "else"7986 WHITESPACE@13181..13182 " "7987 FALSE_EXPR@13182..132947988 EXPR_IF_THEN_ELSE@13182..132947989 IF_KW@13182..13184 "if"7990 WHITESPACE@13184..13185 " "7991 EXPR_BINARY@13185..131947992 LHS_EXPR@13185..131867993 EXPR_VAR@13185..131867994 NAME@13185..131867995 IDENT@13185..13186 "v"7996 WHITESPACE@13186..13187 " "7997 EQ@13187..13189 "=="7998 WHITESPACE@13189..13190 " "7999 EXPR_LITERAL@13190..131948000 TRUE_KW@13190..13194 "true"8001 WHITESPACE@13194..13195 " "8002 THEN_KW@13195..13199 "then"8003 WHITESPACE@13199..13206 "\n "8004 TRUE_EXPR@13206..132128005 EXPR_STRING@13206..132128006 STRING_SINGLE@13206..13212 "'True'"8007 WHITESPACE@13212..13217 "\n "8008 ELSE_KW@13217..13221 "else"8009 WHITESPACE@13221..13222 " "8010 FALSE_EXPR@13222..132948011 EXPR_IF_THEN_ELSE@13222..132948012 IF_KW@13222..13224 "if"8013 WHITESPACE@13224..13225 " "8014 EXPR_BINARY@13225..132358015 LHS_EXPR@13225..132268016 EXPR_VAR@13225..132268017 NAME@13225..132268018 IDENT@13225..13226 "v"8019 WHITESPACE@13226..13227 " "8020 EQ@13227..13229 "=="8021 WHITESPACE@13229..13230 " "8022 EXPR_LITERAL@13230..132358023 FALSE_KW@13230..13235 "false"8024 WHITESPACE@13235..13236 " "8025 THEN_KW@13236..13240 "then"8026 WHITESPACE@13240..13247 "\n "8027 TRUE_EXPR@13247..132548028 EXPR_STRING@13247..132548029 STRING_SINGLE@13247..13254 "'False'"8030 WHITESPACE@13254..13259 "\n "8031 ELSE_KW@13259..13263 "else"8032 WHITESPACE@13263..13264 " "8033 FALSE_EXPR@13264..132948034 EXPR_IF_THEN_ELSE@13264..132948035 IF_KW@13264..13266 "if"8036 WHITESPACE@13266..13267 " "8037 EXPR_BINARY@13267..132768038 LHS_EXPR@13267..132688039 EXPR_VAR@13267..132688040 NAME@13267..132688041 IDENT@13267..13268 "v"8042 WHITESPACE@13268..13269 " "8043 EQ@13269..13271 "=="8044 WHITESPACE@13271..13272 " "8045 EXPR_LITERAL@13272..132768046 NULL_KW@13272..13276 "null"8047 WHITESPACE@13276..13277 " "8048 THEN_KW@13277..13281 "then"8049 WHITESPACE@13281..13288 "\n "8050 TRUE_EXPR@13288..132948051 EXPR_STRING@13288..132948052 STRING_SINGLE@13288..13294 "'None'"8053 COMMA@13294..13295 ","8054 WHITESPACE@13295..13299 "\n\n "8055 MEMBER_FIELD@13299..134548056 FIELD_METHOD@13299..134548057 FIELD_NAME_FIXED@13299..133178058 NAME@13299..133178059 IDENT@13299..13317 "manifestPythonVars"8060 PARAMS_DESC@13317..133238061 L_PAREN@13317..13318 "("8062 PARAM@13318..133228063 DESTRUCT_FULL@13318..133228064 NAME@13318..133228065 IDENT@13318..13322 "conf"8066 R_PAREN@13322..13323 ")"8067 COLONCOLON@13323..13325 "::"8068 WHITESPACE@13325..13330 "\n "8069 EXPR_LOCAL@13330..134548070 LOCAL_KW@13330..13335 "local"8071 WHITESPACE@13335..13336 " "8072 BIND_DESTRUCT@13336..134218073 DESTRUCT_FULL@13336..133408074 NAME@13336..133408075 IDENT@13336..13340 "vars"8076 WHITESPACE@13340..13341 " "8077 ASSIGN@13341..13342 "="8078 WHITESPACE@13342..13343 " "8079 EXPR_ARRAY_COMP@13343..134218080 L_BRACK@13343..13344 "["8081 EXPR_BINARY@13344..133888082 LHS_EXPR@13344..133538083 EXPR_STRING@13344..133538084 STRING_SINGLE@13344..13353 "'%s = %s'"8085 WHITESPACE@13353..13354 " "8086 MODULO@13354..13355 "%"8087 WHITESPACE@13355..13356 " "8088 EXPR_ARRAY@13356..133888089 L_BRACK@13356..13357 "["8090 EXPR_VAR@13357..133588091 NAME@13357..133588092 IDENT@13357..13358 "k"8093 COMMA@13358..13359 ","8094 WHITESPACE@13359..13360 " "8095 EXPR_APPLY@13360..133878096 EXPR_INDEX@13360..133788097 EXPR_VAR@13360..133638098 NAME@13360..133638099 IDENT@13360..13363 "std"8100 DOT@13363..13364 "."8101 NAME@13364..133788102 IDENT@13364..13378 "manifestPython"8103 ARGS_DESC@13378..133878104 L_PAREN@13378..13379 "("8105 ARG@13379..133868106 EXPR_INDEX_EXPR@13379..133868107 LHS_EXPR@13379..133838108 EXPR_VAR@13379..133838109 NAME@13379..133838110 IDENT@13379..13383 "conf"8111 L_BRACK@13383..13384 "["8112 EXPR_VAR@13384..133858113 NAME@13384..133858114 IDENT@13384..13385 "k"8115 R_BRACK@13385..13386 "]"8116 R_PAREN@13386..13387 ")"8117 R_BRACK@13387..13388 "]"8118 WHITESPACE@13388..13389 " "8119 FOR_SPEC@13389..134208120 FOR_KW@13389..13392 "for"8121 WHITESPACE@13392..13393 " "8122 NAME@13393..133948123 IDENT@13393..13394 "k"8124 WHITESPACE@13394..13395 " "8125 IN_KW@13395..13397 "in"8126 WHITESPACE@13397..13398 " "8127 EXPR_APPLY@13398..134208128 EXPR_INDEX@13398..134148129 EXPR_VAR@13398..134018130 NAME@13398..134018131 IDENT@13398..13401 "std"8132 DOT@13401..13402 "."8133 NAME@13402..134148134 IDENT@13402..13414 "objectFields"8135 ARGS_DESC@13414..134208136 L_PAREN@13414..13415 "("8137 ARG@13415..134198138 EXPR_VAR@13415..134198139 NAME@13415..134198140 IDENT@13415..13419 "conf"8141 R_PAREN@13419..13420 ")"8142 R_BRACK@13420..13421 "]"8143 SEMI@13421..13422 ";"8144 WHITESPACE@13422..13427 "\n "8145 EXPR_APPLY@13427..134548146 EXPR_INDEX@13427..134358147 EXPR_VAR@13427..134308148 NAME@13427..134308149 IDENT@13427..13430 "std"8150 DOT@13430..13431 "."8151 NAME@13431..134358152 IDENT@13431..13435 "join"8153 ARGS_DESC@13435..134548154 L_PAREN@13435..13436 "("8155 ARG@13436..134408156 EXPR_STRING@13436..134408157 STRING_SINGLE@13436..13440 "'\\n'"8158 COMMA@13440..13441 ","8159 WHITESPACE@13441..13442 " "8160 ARG@13442..134538161 EXPR_BINARY@13442..134538162 LHS_EXPR@13442..134468163 EXPR_VAR@13442..134468164 NAME@13442..134468165 IDENT@13442..13446 "vars"8166 WHITESPACE@13446..13447 " "8167 PLUS@13447..13448 "+"8168 WHITESPACE@13448..13449 " "8169 EXPR_ARRAY@13449..134538170 L_BRACK@13449..13450 "["8171 EXPR_STRING@13450..134528172 STRING_SINGLE@13450..13452 "''"8173 R_BRACK@13452..13453 "]"8174 R_PAREN@13453..13454 ")"8175 COMMA@13454..13455 ","8176 WHITESPACE@13455..13459 "\n\n "8177 MEMBER_FIELD@13459..141268178 FIELD_METHOD@13459..141268179 FIELD_NAME_FIXED@13459..134768180 NAME@13459..134768181 IDENT@13459..13476 "manifestXmlJsonml"8182 PARAMS_DESC@13476..134838183 L_PAREN@13476..13477 "("8184 PARAM@13477..134828185 DESTRUCT_FULL@13477..134828186 NAME@13477..134828187 IDENT@13477..13482 "value"8188 R_PAREN@13482..13483 ")"8189 COLONCOLON@13483..13485 "::"8190 WHITESPACE@13485..13490 "\n "8191 EXPR_IF_THEN_ELSE@13490..141268192 IF_KW@13490..13492 "if"8193 WHITESPACE@13492..13493 " "8194 EXPR_UNARY@13493..135128195 NOT@13493..13494 "!"8196 EXPR_APPLY@13494..135128197 EXPR_INDEX@13494..135058198 EXPR_VAR@13494..134978199 NAME@13494..134978200 IDENT@13494..13497 "std"8201 DOT@13497..13498 "."8202 NAME@13498..135058203 IDENT@13498..13505 "isArray"8204 ARGS_DESC@13505..135128205 L_PAREN@13505..13506 "("8206 ARG@13506..135118207 EXPR_VAR@13506..135118208 NAME@13506..135118209 IDENT@13506..13511 "value"8210 R_PAREN@13511..13512 ")"8211 WHITESPACE@13512..13513 " "8212 THEN_KW@13513..13517 "then"8213 WHITESPACE@13517..13524 "\n "8214 TRUE_EXPR@13524..135928215 EXPR_ERROR@13524..135928216 ERROR_KW@13524..13529 "error"8217 WHITESPACE@13529..13530 " "8218 EXPR_BINARY@13530..135928219 LHS_EXPR@13530..135748220 EXPR_STRING@13530..135748221 STRING_SINGLE@13530..13574 "'Expected a JSONML va ..."8222 WHITESPACE@13574..13575 " "8223 MODULO@13575..13576 "%"8224 WHITESPACE@13576..13577 " "8225 EXPR_APPLY@13577..135928226 EXPR_INDEX@13577..135858227 EXPR_VAR@13577..135808228 NAME@13577..135808229 IDENT@13577..13580 "std"8230 DOT@13580..13581 "."8231 NAME@13581..135858232 IDENT@13581..13585 "type"8233 ARGS_DESC@13585..135928234 L_PAREN@13585..13586 "("8235 ARG@13586..135918236 EXPR_VAR@13586..135918237 NAME@13586..135918238 IDENT@13586..13591 "value"8239 R_PAREN@13591..13592 ")"8240 WHITESPACE@13592..13597 "\n "8241 ELSE_KW@13597..13601 "else"8242 WHITESPACE@13601..13608 "\n "8243 FALSE_EXPR@13608..141268244 EXPR_LOCAL@13608..141268245 LOCAL_KW@13608..13613 "local"8246 WHITESPACE@13613..13614 " "8247 BIND_FUNCTION@13614..141078248 NAME@13614..136178249 IDENT@13614..13617 "aux"8250 PARAMS_DESC@13617..136208251 L_PAREN@13617..13618 "("8252 PARAM@13618..136198253 DESTRUCT_FULL@13618..136198254 NAME@13618..136198255 IDENT@13618..13619 "v"8256 R_PAREN@13619..13620 ")"8257 WHITESPACE@13620..13621 " "8258 ASSIGN@13621..13622 "="8259 WHITESPACE@13622..13631 "\n "8260 EXPR_IF_THEN_ELSE@13631..141078261 IF_KW@13631..13633 "if"8262 WHITESPACE@13633..13634 " "8263 EXPR_APPLY@13634..136498264 EXPR_INDEX@13634..136468265 EXPR_VAR@13634..136378266 NAME@13634..136378267 IDENT@13634..13637 "std"8268 DOT@13637..13638 "."8269 NAME@13638..136468270 IDENT@13638..13646 "isString"8271 ARGS_DESC@13646..136498272 L_PAREN@13646..13647 "("8273 ARG@13647..136488274 EXPR_VAR@13647..136488275 NAME@13647..136488276 IDENT@13647..13648 "v"8277 R_PAREN@13648..13649 ")"8278 WHITESPACE@13649..13650 " "8279 THEN_KW@13650..13654 "then"8280 WHITESPACE@13654..13665 "\n "8281 TRUE_EXPR@13665..136668282 EXPR_VAR@13665..136668283 NAME@13665..136668284 IDENT@13665..13666 "v"8285 WHITESPACE@13666..13675 "\n "8286 ELSE_KW@13675..13679 "else"8287 WHITESPACE@13679..13690 "\n "8288 FALSE_EXPR@13690..141078289 EXPR_LOCAL@13690..141078290 LOCAL_KW@13690..13695 "local"8291 WHITESPACE@13695..13696 " "8292 BIND_DESTRUCT@13696..137068293 DESTRUCT_FULL@13696..136998294 NAME@13696..136998295 IDENT@13696..13699 "tag"8296 WHITESPACE@13699..13700 " "8297 ASSIGN@13700..13701 "="8298 WHITESPACE@13701..13702 " "8299 EXPR_INDEX_EXPR@13702..137068300 LHS_EXPR@13702..137038301 EXPR_VAR@13702..137038302 NAME@13702..137038303 IDENT@13702..13703 "v"8304 L_BRACK@13703..13704 "["8305 EXPR_NUMBER@13704..137058306 FLOAT@13704..13705 "0"8307 R_BRACK@13705..13706 "]"8308 SEMI@13706..13707 ";"8309 WHITESPACE@13707..13718 "\n "8310 EXPR_LOCAL@13718..141078311 LOCAL_KW@13718..13723 "local"8312 WHITESPACE@13723..13724 " "8313 BIND_DESTRUCT@13724..137758314 DESTRUCT_FULL@13724..137338315 NAME@13724..137338316 IDENT@13724..13733 "has_attrs"8317 WHITESPACE@13733..13734 " "8318 ASSIGN@13734..13735 "="8319 WHITESPACE@13735..13736 " "8320 EXPR_BINARY@13736..137758321 LHS_EXPR@13736..137538322 EXPR_BINARY@13736..137538323 LHS_EXPR@13736..137498324 EXPR_APPLY@13736..137498325 EXPR_INDEX@13736..137468326 EXPR_VAR@13736..137398327 NAME@13736..137398328 IDENT@13736..13739 "std"8329 DOT@13739..13740 "."8330 NAME@13740..137468331 IDENT@13740..13746 "length"8332 ARGS_DESC@13746..137498333 L_PAREN@13746..13747 "("8334 ARG@13747..137488335 EXPR_VAR@13747..137488336 NAME@13747..137488337 IDENT@13747..13748 "v"8338 R_PAREN@13748..13749 ")"8339 WHITESPACE@13749..13750 " "8340 GT@13750..13751 ">"8341 WHITESPACE@13751..13752 " "8342 EXPR_NUMBER@13752..137538343 FLOAT@13752..13753 "1"8344 WHITESPACE@13753..13754 " "8345 AND@13754..13756 "&&"8346 WHITESPACE@13756..13757 " "8347 EXPR_APPLY@13757..137758348 EXPR_INDEX@13757..137698349 EXPR_VAR@13757..137608350 NAME@13757..137608351 IDENT@13757..13760 "std"8352 DOT@13760..13761 "."8353 NAME@13761..137698354 IDENT@13761..13769 "isObject"8355 ARGS_DESC@13769..137758356 L_PAREN@13769..13770 "("8357 ARG@13770..137748358 EXPR_INDEX_EXPR@13770..137748359 LHS_EXPR@13770..137718360 EXPR_VAR@13770..137718361 NAME@13770..137718362 IDENT@13770..13771 "v"8363 L_BRACK@13771..13772 "["8364 EXPR_NUMBER@13772..137738365 FLOAT@13772..13773 "1"8366 R_BRACK@13773..13774 "]"8367 R_PAREN@13774..13775 ")"8368 SEMI@13775..13776 ";"8369 WHITESPACE@13776..13787 "\n "8370 EXPR_LOCAL@13787..141078371 LOCAL_KW@13787..13792 "local"8372 WHITESPACE@13792..13793 " "8373 BIND_DESTRUCT@13793..138318374 DESTRUCT_FULL@13793..137988375 NAME@13793..137988376 IDENT@13793..13798 "attrs"8377 WHITESPACE@13798..13799 " "8378 ASSIGN@13799..13800 "="8379 WHITESPACE@13800..13801 " "8380 EXPR_IF_THEN_ELSE@13801..138318381 IF_KW@13801..13803 "if"8382 WHITESPACE@13803..13804 " "8383 EXPR_VAR@13804..138138384 NAME@13804..138138385 IDENT@13804..13813 "has_attrs"8386 WHITESPACE@13813..13814 " "8387 THEN_KW@13814..13818 "then"8388 WHITESPACE@13818..13819 " "8389 TRUE_EXPR@13819..138238390 EXPR_INDEX_EXPR@13819..138238391 LHS_EXPR@13819..138208392 EXPR_VAR@13819..138208393 NAME@13819..138208394 IDENT@13819..13820 "v"8395 L_BRACK@13820..13821 "["8396 EXPR_NUMBER@13821..138228397 FLOAT@13821..13822 "1"8398 R_BRACK@13822..13823 "]"8399 WHITESPACE@13823..13824 " "8400 ELSE_KW@13824..13828 "else"8401 WHITESPACE@13828..13829 " "8402 FALSE_EXPR@13829..138318403 EXPR_OBJECT@13829..138318404 OBJ_BODY_MEMBER_LIST@13829..138318405 L_BRACE@13829..13830 "{"8406 R_BRACE@13830..13831 "}"8407 SEMI@13831..13832 ";"8408 WHITESPACE@13832..13843 "\n "8409 EXPR_LOCAL@13843..141078410 LOCAL_KW@13843..13848 "local"8411 WHITESPACE@13848..13849 " "8412 BIND_DESTRUCT@13849..138948413 DESTRUCT_FULL@13849..138578414 NAME@13849..138578415 IDENT@13849..13857 "children"8416 WHITESPACE@13857..13858 " "8417 ASSIGN@13858..13859 "="8418 WHITESPACE@13859..13860 " "8419 EXPR_IF_THEN_ELSE@13860..138948420 IF_KW@13860..13862 "if"8421 WHITESPACE@13862..13863 " "8422 EXPR_VAR@13863..138728423 NAME@13863..138728424 IDENT@13863..13872 "has_attrs"8425 WHITESPACE@13872..13873 " "8426 THEN_KW@13873..13877 "then"8427 WHITESPACE@13877..13878 " "8428 TRUE_EXPR@13878..138838429 EXPR_SLICE@13878..138838430 EXPR_VAR@13878..138798431 NAME@13878..138798432 IDENT@13878..13879 "v"8433 SLICE_DESC@13879..138838434 L_BRACK@13879..13880 "["8435 EXPR_NUMBER@13880..138818436 FLOAT@13880..13881 "2"8437 COLON@13881..13882 ":"8438 R_BRACK@13882..13883 "]"8439 WHITESPACE@13883..13884 " "8440 ELSE_KW@13884..13888 "else"8441 WHITESPACE@13888..13889 " "8442 FALSE_EXPR@13889..138948443 EXPR_SLICE@13889..138948444 EXPR_VAR@13889..138908445 NAME@13889..138908446 IDENT@13889..13890 "v"8447 SLICE_DESC@13890..138948448 L_BRACK@13890..13891 "["8449 EXPR_NUMBER@13891..138928450 FLOAT@13891..13892 "1"8451 COLON@13892..13893 ":"8452 R_BRACK@13893..13894 "]"8453 SEMI@13894..13895 ";"8454 WHITESPACE@13895..13906 "\n "8455 EXPR_LOCAL@13906..141078456 LOCAL_KW@13906..13911 "local"8457 WHITESPACE@13911..13912 " "8458 BIND_DESTRUCT@13912..140118459 DESTRUCT_FULL@13912..139218460 NAME@13912..139218461 IDENT@13912..13921 "attrs_str"8462 WHITESPACE@13921..13922 " "8463 ASSIGN@13922..13923 "="8464 WHITESPACE@13923..13936 "\n "8465 EXPR_APPLY@13936..140118466 EXPR_INDEX@13936..139448467 EXPR_VAR@13936..139398468 NAME@13936..139398469 IDENT@13936..13939 "std"8470 DOT@13939..13940 "."8471 NAME@13940..139448472 IDENT@13940..13944 "join"8473 ARGS_DESC@13944..140118474 L_PAREN@13944..13945 "("8475 ARG@13945..139478476 EXPR_STRING@13945..139478477 STRING_SINGLE@13945..13947 "''"8478 COMMA@13947..13948 ","8479 WHITESPACE@13948..13949 " "8480 ARG@13949..140108481 EXPR_ARRAY_COMP@13949..140108482 L_BRACK@13949..13950 "["8483 EXPR_BINARY@13950..139768484 LHS_EXPR@13950..139608485 EXPR_STRING@13950..139608486 STRING_SINGLE@13950..13960 "' %s=\"%s\"'"8487 WHITESPACE@13960..13961 " "8488 MODULO@13961..13962 "%"8489 WHITESPACE@13962..13963 " "8490 EXPR_ARRAY@13963..139768491 L_BRACK@13963..13964 "["8492 EXPR_VAR@13964..139658493 NAME@13964..139658494 IDENT@13964..13965 "k"8495 COMMA@13965..13966 ","8496 WHITESPACE@13966..13967 " "8497 EXPR_INDEX_EXPR@13967..139758498 LHS_EXPR@13967..139728499 EXPR_VAR@13967..139728500 NAME@13967..139728501 IDENT@13967..13972 "attrs"8502 L_BRACK@13972..13973 "["8503 EXPR_VAR@13973..139748504 NAME@13973..139748505 IDENT@13973..13974 "k"8506 R_BRACK@13974..13975 "]"8507 R_BRACK@13975..13976 "]"8508 WHITESPACE@13976..13977 " "8509 FOR_SPEC@13977..140098510 FOR_KW@13977..13980 "for"8511 WHITESPACE@13980..13981 " "8512 NAME@13981..139828513 IDENT@13981..13982 "k"8514 WHITESPACE@13982..13983 " "8515 IN_KW@13983..13985 "in"8516 WHITESPACE@13985..13986 " "8517 EXPR_APPLY@13986..140098518 EXPR_INDEX@13986..140028519 EXPR_VAR@13986..139898520 NAME@13986..139898521 IDENT@13986..13989 "std"8522 DOT@13989..13990 "."8523 NAME@13990..140028524 IDENT@13990..14002 "objectFields"8525 ARGS_DESC@14002..140098526 L_PAREN@14002..14003 "("8527 ARG@14003..140088528 EXPR_VAR@14003..140088529 NAME@14003..140088530 IDENT@14003..14008 "attrs"8531 R_PAREN@14008..14009 ")"8532 R_BRACK@14009..14010 "]"8533 R_PAREN@14010..14011 ")"8534 SEMI@14011..14012 ";"8535 WHITESPACE@14012..14023 "\n "8536 EXPR_APPLY@14023..141078537 EXPR_INDEX@14023..140358538 EXPR_VAR@14023..140268539 NAME@14023..140268540 IDENT@14023..14026 "std"8541 DOT@14026..14027 "."8542 NAME@14027..140358543 IDENT@14027..14035 "deepJoin"8544 ARGS_DESC@14035..141078545 L_PAREN@14035..14036 "("8546 ARG@14036..141068547 EXPR_ARRAY@14036..141068548 L_BRACK@14036..14037 "["8549 EXPR_STRING@14037..140408550 STRING_SINGLE@14037..14040 "'<'"8551 COMMA@14040..14041 ","8552 WHITESPACE@14041..14042 " "8553 EXPR_VAR@14042..140458554 NAME@14042..140458555 IDENT@14042..14045 "tag"8556 COMMA@14045..14046 ","8557 WHITESPACE@14046..14047 " "8558 EXPR_VAR@14047..140568559 NAME@14047..140568560 IDENT@14047..14056 "attrs_str"8561 COMMA@14056..14057 ","8562 WHITESPACE@14057..14058 " "8563 EXPR_STRING@14058..140618564 STRING_SINGLE@14058..14061 "'>'"8565 COMMA@14061..14062 ","8566 WHITESPACE@14062..14063 " "8567 EXPR_ARRAY_COMP@14063..140898568 L_BRACK@14063..14064 "["8569 EXPR_APPLY@14064..140708570 EXPR_VAR@14064..140678571 NAME@14064..140678572 IDENT@14064..14067 "aux"8573 ARGS_DESC@14067..140708574 L_PAREN@14067..14068 "("8575 ARG@14068..140698576 EXPR_VAR@14068..140698577 NAME@14068..140698578 IDENT@14068..14069 "x"8579 R_PAREN@14069..14070 ")"8580 WHITESPACE@14070..14071 " "8581 FOR_SPEC@14071..140888582 FOR_KW@14071..14074 "for"8583 WHITESPACE@14074..14075 " "8584 NAME@14075..140768585 IDENT@14075..14076 "x"8586 WHITESPACE@14076..14077 " "8587 IN_KW@14077..14079 "in"8588 WHITESPACE@14079..14080 " "8589 EXPR_VAR@14080..140888590 NAME@14080..140888591 IDENT@14080..14088 "children"8592 R_BRACK@14088..14089 "]"8593 COMMA@14089..14090 ","8594 WHITESPACE@14090..14091 " "8595 EXPR_STRING@14091..140958596 STRING_SINGLE@14091..14095 "'</'"8597 COMMA@14095..14096 ","8598 WHITESPACE@14096..14097 " "8599 EXPR_VAR@14097..141008600 NAME@14097..141008601 IDENT@14097..14100 "tag"8602 COMMA@14100..14101 ","8603 WHITESPACE@14101..14102 " "8604 EXPR_STRING@14102..141058605 STRING_SINGLE@14102..14105 "'>'"8606 R_BRACK@14105..14106 "]"8607 R_PAREN@14106..14107 ")"8608 SEMI@14107..14108 ";"8609 WHITESPACE@14108..14116 "\n\n "8610 EXPR_APPLY@14116..141268611 EXPR_VAR@14116..141198612 NAME@14116..141198613 IDENT@14116..14119 "aux"8614 ARGS_DESC@14119..141268615 L_PAREN@14119..14120 "("8616 ARG@14120..141258617 EXPR_VAR@14120..141258618 NAME@14120..141258619 IDENT@14120..14125 "value"8620 R_PAREN@14125..14126 ")"8621 COMMA@14126..14127 ","8622 WHITESPACE@14127..14131 "\n\n "8623 MEMBER_BIND_STMT@14131..142188624 OBJ_LOCAL@14131..142188625 LOCAL_KW@14131..14136 "local"8626 WHITESPACE@14136..14137 " "8627 BIND_DESTRUCT@14137..142188628 DESTRUCT_FULL@14137..141498629 NAME@14137..141498630 IDENT@14137..14149 "base64_table"8631 WHITESPACE@14149..14150 " "8632 ASSIGN@14150..14151 "="8633 WHITESPACE@14151..14152 " "8634 EXPR_STRING@14152..142188635 STRING_SINGLE@14152..14218 "'ABCDEFGHIJKLMNOPQRST ..."8636 COMMA@14218..14219 ","8637 WHITESPACE@14219..14222 "\n "8638 MEMBER_BIND_STMT@14222..142918639 OBJ_LOCAL@14222..142918640 LOCAL_KW@14222..14227 "local"8641 WHITESPACE@14227..14228 " "8642 BIND_DESTRUCT@14228..142918643 DESTRUCT_FULL@14228..142388644 NAME@14228..142388645 IDENT@14228..14238 "base64_inv"8646 WHITESPACE@14238..14239 " "8647 ASSIGN@14239..14240 "="8648 WHITESPACE@14240..14241 " "8649 EXPR_OBJECT@14241..142918650 OBJ_BODY_MEMBER_LIST@14241..142918651 L_BRACE@14241..14242 "{"8652 WHITESPACE@14242..14243 " "8653 MEMBER_FIELD@14243..142898654 FIELD_NORMAL@14243..142638655 FIELD_NAME_DYNAMIC@14243..142608656 L_BRACK@14243..14244 "["8657 EXPR_INDEX_EXPR@14244..142598658 LHS_EXPR@14244..142568659 EXPR_VAR@14244..142568660 NAME@14244..142568661 IDENT@14244..14256 "base64_table"8662 L_BRACK@14256..14257 "["8663 EXPR_VAR@14257..142588664 NAME@14257..142588665 IDENT@14257..14258 "i"8666 R_BRACK@14258..14259 "]"8667 R_BRACK@14259..14260 "]"8668 COLON@14260..14261 ":"8669 WHITESPACE@14261..14262 " "8670 EXPR_VAR@14262..142638671 NAME@14262..142638672 IDENT@14262..14263 "i"8673 WHITESPACE@14263..14264 " "8674 FOR_SPEC@14264..142898675 FOR_KW@14264..14267 "for"8676 WHITESPACE@14267..14268 " "8677 NAME@14268..142698678 IDENT@14268..14269 "i"8679 WHITESPACE@14269..14270 " "8680 IN_KW@14270..14272 "in"8681 WHITESPACE@14272..14273 " "8682 EXPR_APPLY@14273..142898683 EXPR_INDEX@14273..142828684 EXPR_VAR@14273..142768685 NAME@14273..142768686 IDENT@14273..14276 "std"8687 DOT@14276..14277 "."8688 NAME@14277..142828689 IDENT@14277..14282 "range"8690 ARGS_DESC@14282..142898691 L_PAREN@14282..14283 "("8692 ARG@14283..142848693 EXPR_NUMBER@14283..142848694 FLOAT@14283..14284 "0"8695 COMMA@14284..14285 ","8696 WHITESPACE@14285..14286 " "8697 ARG@14286..142888698 EXPR_NUMBER@14286..142888699 FLOAT@14286..14288 "63"8700 R_PAREN@14288..14289 ")"8701 WHITESPACE@14289..14290 " "8702 R_BRACE@14290..14291 "}"8703 COMMA@14291..14292 ","8704 WHITESPACE@14292..14296 "\n\n "8705 MEMBER_FIELD@14296..143238706 FIELD_NORMAL@14296..143238707 FIELD_NAME_FIXED@14296..143028708 NAME@14296..143028709 IDENT@14296..14302 "base64"8710 COLONCOLON@14302..14304 "::"8711 WHITESPACE@14304..14305 " "8712 EXPR_INTRINSIC@14305..143238713 INTRINSIC@14305..14315 "$intrinsic"8714 L_PAREN@14315..14316 "("8715 NAME@14316..143228716 IDENT@14316..14322 "base64"8717 R_PAREN@14322..14323 ")"8718 COMMA@14323..14324 ","8719 WHITESPACE@14324..14328 "\n\n "8720 MEMBER_FIELD@14328..143778721 FIELD_NORMAL@14328..143778722 FIELD_NAME_FIXED@14328..143458723 NAME@14328..143458724 IDENT@14328..14345 "base64DecodeBytes"8725 COLONCOLON@14345..14347 "::"8726 WHITESPACE@14347..14348 " "8727 EXPR_INTRINSIC@14348..143778728 INTRINSIC@14348..14358 "$intrinsic"8729 L_PAREN@14358..14359 "("8730 NAME@14359..143768731 IDENT@14359..14376 "base64DecodeBytes"8732 R_PAREN@14376..14377 ")"8733 COMMA@14377..14378 ","8734 WHITESPACE@14378..14382 "\n\n "8735 MEMBER_FIELD@14382..144218736 FIELD_NORMAL@14382..144218737 FIELD_NAME_FIXED@14382..143948738 NAME@14382..143948739 IDENT@14382..14394 "base64Decode"8740 COLONCOLON@14394..14396 "::"8741 WHITESPACE@14396..14397 " "8742 EXPR_INTRINSIC@14397..144218743 INTRINSIC@14397..14407 "$intrinsic"8744 L_PAREN@14407..14408 "("8745 NAME@14408..144208746 IDENT@14408..14420 "base64Decode"8747 R_PAREN@14420..14421 ")"8748 COMMA@14421..14422 ","8749 WHITESPACE@14422..14426 "\n\n "8750 MEMBER_FIELD@14426..144558751 FIELD_NORMAL@14426..144558752 FIELD_NAME_FIXED@14426..144338753 NAME@14426..144338754 IDENT@14426..14433 "reverse"8755 COLONCOLON@14433..14435 "::"8756 WHITESPACE@14435..14436 " "8757 EXPR_INTRINSIC@14436..144558758 INTRINSIC@14436..14446 "$intrinsic"8759 L_PAREN@14446..14447 "("8760 NAME@14447..144548761 IDENT@14447..14454 "reverse"8762 R_PAREN@14454..14455 ")"8763 COMMA@14455..14456 ","8764 WHITESPACE@14456..14460 "\n\n "8765 MEMBER_FIELD@14460..144838766 FIELD_NORMAL@14460..144838767 FIELD_NAME_FIXED@14460..144648768 NAME@14460..144648769 IDENT@14460..14464 "sort"8770 COLONCOLON@14464..14466 "::"8771 WHITESPACE@14466..14467 " "8772 EXPR_INTRINSIC@14467..144838773 INTRINSIC@14467..14477 "$intrinsic"8774 L_PAREN@14477..14478 "("8775 NAME@14478..144828776 IDENT@14478..14482 "sort"8777 R_PAREN@14482..14483 ")"8778 COMMA@14483..14484 ","8779 WHITESPACE@14484..14488 "\n\n "8780 MEMBER_FIELD@14488..146948781 FIELD_METHOD@14488..146948782 FIELD_NAME_FIXED@14488..144928783 NAME@14488..144928784 IDENT@14488..14492 "uniq"8785 PARAMS_DESC@14492..145068786 L_PAREN@14492..14493 "("8787 PARAM@14493..144968788 DESTRUCT_FULL@14493..144968789 NAME@14493..144968790 IDENT@14493..14496 "arr"8791 COMMA@14496..14497 ","8792 WHITESPACE@14497..14498 " "8793 PARAM@14498..145058794 DESTRUCT_FULL@14498..145028795 NAME@14498..145028796 IDENT@14498..14502 "keyF"8797 ASSIGN@14502..14503 "="8798 EXPR_VAR@14503..145058799 NAME@14503..145058800 IDENT@14503..14505 "id"8801 R_PAREN@14505..14506 ")"8802 COLONCOLON@14506..14508 "::"8803 WHITESPACE@14508..14513 "\n "8804 EXPR_LOCAL@14513..146948805 LOCAL_KW@14513..14518 "local"8806 WHITESPACE@14518..14519 " "8807 BIND_FUNCTION@14519..146678808 NAME@14519..145208809 IDENT@14519..14520 "f"8810 PARAMS_DESC@14520..145268811 L_PAREN@14520..14521 "("8812 PARAM@14521..145228813 DESTRUCT_FULL@14521..145228814 NAME@14521..145228815 IDENT@14521..14522 "a"8816 COMMA@14522..14523 ","8817 WHITESPACE@14523..14524 " "8818 PARAM@14524..145258819 DESTRUCT_FULL@14524..145258820 NAME@14524..145258821 IDENT@14524..14525 "b"8822 R_PAREN@14525..14526 ")"8823 WHITESPACE@14526..14527 " "8824 ASSIGN@14527..14528 "="8825 WHITESPACE@14528..14535 "\n "8826 EXPR_IF_THEN_ELSE@14535..146678827 IF_KW@14535..14537 "if"8828 WHITESPACE@14537..14538 " "8829 EXPR_BINARY@14538..145568830 LHS_EXPR@14538..145518831 EXPR_APPLY@14538..145518832 EXPR_INDEX@14538..145488833 EXPR_VAR@14538..145418834 NAME@14538..145418835 IDENT@14538..14541 "std"8836 DOT@14541..14542 "."8837 NAME@14542..145488838 IDENT@14542..14548 "length"8839 ARGS_DESC@14548..145518840 L_PAREN@14548..14549 "("8841 ARG@14549..145508842 EXPR_VAR@14549..145508843 NAME@14549..145508844 IDENT@14549..14550 "a"8845 R_PAREN@14550..14551 ")"8846 WHITESPACE@14551..14552 " "8847 EQ@14552..14554 "=="8848 WHITESPACE@14554..14555 " "8849 EXPR_NUMBER@14555..145568850 FLOAT@14555..14556 "0"8851 WHITESPACE@14556..14557 " "8852 THEN_KW@14557..14561 "then"8853 WHITESPACE@14561..14570 "\n "8854 TRUE_EXPR@14570..145738855 EXPR_ARRAY@14570..145738856 L_BRACK@14570..14571 "["8857 EXPR_VAR@14571..145728858 NAME@14571..145728859 IDENT@14571..14572 "b"8860 R_BRACK@14572..14573 "]"8861 WHITESPACE@14573..14580 "\n "8862 ELSE_KW@14580..14584 "else"8863 WHITESPACE@14584..14585 " "8864 FALSE_EXPR@14585..146678865 EXPR_IF_THEN_ELSE@14585..146678866 IF_KW@14585..14587 "if"8867 WHITESPACE@14587..14588 " "8868 EXPR_BINARY@14588..146258869 LHS_EXPR@14588..146148870 EXPR_APPLY@14588..146148871 EXPR_VAR@14588..145928872 NAME@14588..145928873 IDENT@14588..14592 "keyF"8874 ARGS_DESC@14592..146148875 L_PAREN@14592..14593 "("8876 ARG@14593..146138877 EXPR_INDEX_EXPR@14593..146138878 LHS_EXPR@14593..145948879 EXPR_VAR@14593..145948880 NAME@14593..145948881 IDENT@14593..14594 "a"8882 L_BRACK@14594..14595 "["8883 EXPR_BINARY@14595..146128884 LHS_EXPR@14595..146088885 EXPR_APPLY@14595..146088886 EXPR_INDEX@14595..146058887 EXPR_VAR@14595..145988888 NAME@14595..145988889 IDENT@14595..14598 "std"8890 DOT@14598..14599 "."8891 NAME@14599..146058892 IDENT@14599..14605 "length"8893 ARGS_DESC@14605..146088894 L_PAREN@14605..14606 "("8895 ARG@14606..146078896 EXPR_VAR@14606..146078897 NAME@14606..146078898 IDENT@14606..14607 "a"8899 R_PAREN@14607..14608 ")"8900 WHITESPACE@14608..14609 " "8901 MINUS@14609..14610 "-"8902 WHITESPACE@14610..14611 " "8903 EXPR_NUMBER@14611..146128904 FLOAT@14611..14612 "1"8905 R_BRACK@14612..14613 "]"8906 R_PAREN@14613..14614 ")"8907 WHITESPACE@14614..14615 " "8908 EQ@14615..14617 "=="8909 WHITESPACE@14617..14618 " "8910 EXPR_APPLY@14618..146258911 EXPR_VAR@14618..146228912 NAME@14618..146228913 IDENT@14618..14622 "keyF"8914 ARGS_DESC@14622..146258915 L_PAREN@14622..14623 "("8916 ARG@14623..146248917 EXPR_VAR@14623..146248918 NAME@14623..146248919 IDENT@14623..14624 "b"8920 R_PAREN@14624..14625 ")"8921 WHITESPACE@14625..14626 " "8922 THEN_KW@14626..14630 "then"8923 WHITESPACE@14630..14639 "\n "8924 TRUE_EXPR@14639..146408925 EXPR_VAR@14639..146408926 NAME@14639..146408927 IDENT@14639..14640 "a"8928 WHITESPACE@14640..14647 "\n "8929 ELSE_KW@14647..14651 "else"8930 WHITESPACE@14651..14660 "\n "8931 FALSE_EXPR@14660..146678932 EXPR_BINARY@14660..146678933 LHS_EXPR@14660..146618934 EXPR_VAR@14660..146618935 NAME@14660..146618936 IDENT@14660..14661 "a"8937 WHITESPACE@14661..14662 " "8938 PLUS@14662..14663 "+"8939 WHITESPACE@14663..14664 " "8940 EXPR_ARRAY@14664..146678941 L_BRACK@14664..14665 "["8942 EXPR_VAR@14665..146668943 NAME@14665..146668944 IDENT@14665..14666 "b"8945 R_BRACK@14666..14667 "]"8946 SEMI@14667..14668 ";"8947 WHITESPACE@14668..14673 "\n "8948 EXPR_APPLY@14673..146948949 EXPR_INDEX@14673..146828950 EXPR_VAR@14673..146768951 NAME@14673..146768952 IDENT@14673..14676 "std"8953 DOT@14676..14677 "."8954 NAME@14677..146828955 IDENT@14677..14682 "foldl"8956 ARGS_DESC@14682..146948957 L_PAREN@14682..14683 "("8958 ARG@14683..146848959 EXPR_VAR@14683..146848960 NAME@14683..146848961 IDENT@14683..14684 "f"8962 COMMA@14684..14685 ","8963 WHITESPACE@14685..14686 " "8964 ARG@14686..146898965 EXPR_VAR@14686..146898966 NAME@14686..146898967 IDENT@14686..14689 "arr"8968 COMMA@14689..14690 ","8969 WHITESPACE@14690..14691 " "8970 ARG@14691..146938971 EXPR_ARRAY@14691..146938972 L_BRACK@14691..14692 "["8973 R_BRACK@14692..14693 "]"8974 R_PAREN@14693..14694 ")"8975 COMMA@14694..14695 ","8976 WHITESPACE@14695..14699 "\n\n "8977 MEMBER_FIELD@14699..147588978 FIELD_METHOD@14699..147588979 FIELD_NAME_FIXED@14699..147028980 NAME@14699..147028981 IDENT@14699..14702 "set"8982 PARAMS_DESC@14702..147168983 L_PAREN@14702..14703 "("8984 PARAM@14703..147068985 DESTRUCT_FULL@14703..147068986 NAME@14703..147068987 IDENT@14703..14706 "arr"8988 COMMA@14706..14707 ","8989 WHITESPACE@14707..14708 " "8990 PARAM@14708..147158991 DESTRUCT_FULL@14708..147128992 NAME@14708..147128993 IDENT@14708..14712 "keyF"8994 ASSIGN@14712..14713 "="8995 EXPR_VAR@14713..147158996 NAME@14713..147158997 IDENT@14713..14715 "id"8998 R_PAREN@14715..14716 ")"8999 COLONCOLON@14716..14718 "::"9000 WHITESPACE@14718..14723 "\n "9001 EXPR_APPLY@14723..147589002 EXPR_INDEX@14723..147319003 EXPR_VAR@14723..147269004 NAME@14723..147269005 IDENT@14723..14726 "std"9006 DOT@14726..14727 "."9007 NAME@14727..147319008 IDENT@14727..14731 "uniq"9009 ARGS_DESC@14731..147589010 L_PAREN@14731..14732 "("9011 ARG@14732..147519012 EXPR_APPLY@14732..147519013 EXPR_INDEX@14732..147409014 EXPR_VAR@14732..147359015 NAME@14732..147359016 IDENT@14732..14735 "std"9017 DOT@14735..14736 "."9018 NAME@14736..147409019 IDENT@14736..14740 "sort"9020 ARGS_DESC@14740..147519021 L_PAREN@14740..14741 "("9022 ARG@14741..147449023 EXPR_VAR@14741..147449024 NAME@14741..147449025 IDENT@14741..14744 "arr"9026 COMMA@14744..14745 ","9027 WHITESPACE@14745..14746 " "9028 ARG@14746..147509029 EXPR_VAR@14746..147509030 NAME@14746..147509031 IDENT@14746..14750 "keyF"9032 R_PAREN@14750..14751 ")"9033 COMMA@14751..14752 ","9034 WHITESPACE@14752..14753 " "9035 ARG@14753..147579036 EXPR_VAR@14753..147579037 NAME@14753..147579038 IDENT@14753..14757 "keyF"9039 R_PAREN@14757..14758 ")"9040 COMMA@14758..14759 ","9041 WHITESPACE@14759..14763 "\n\n "9042 MEMBER_FIELD@14763..148989043 FIELD_METHOD@14763..148989044 FIELD_NAME_FIXED@14763..147729045 NAME@14763..147729046 IDENT@14763..14772 "setMember"9047 PARAMS_DESC@14772..147899048 L_PAREN@14772..14773 "("9049 PARAM@14773..147749050 DESTRUCT_FULL@14773..147749051 NAME@14773..147749052 IDENT@14773..14774 "x"9053 COMMA@14774..14775 ","9054 WHITESPACE@14775..14776 " "9055 PARAM@14776..147799056 DESTRUCT_FULL@14776..147799057 NAME@14776..147799058 IDENT@14776..14779 "arr"9059 COMMA@14779..14780 ","9060 WHITESPACE@14780..14781 " "9061 PARAM@14781..147889062 DESTRUCT_FULL@14781..147859063 NAME@14781..147859064 IDENT@14781..14785 "keyF"9065 ASSIGN@14785..14786 "="9066 EXPR_VAR@14786..147889067 NAME@14786..147889068 IDENT@14786..14788 "id"9069 R_PAREN@14788..14789 ")"9070 COLONCOLON@14789..14791 "::"9071 WHITESPACE@14791..14796 "\n "9072 SINGLE_LINE_SLASH_COMMENT@14796..14850 "// TODO(dcunnin): Bin ..."9073 WHITESPACE@14850..14854 " "9074 EXPR_BINARY@14854..148989075 LHS_EXPR@14854..148949076 EXPR_APPLY@14854..148949077 EXPR_INDEX@14854..148649078 EXPR_VAR@14854..148579079 NAME@14854..148579080 IDENT@14854..14857 "std"9081 DOT@14857..14858 "."9082 NAME@14858..148649083 IDENT@14858..14864 "length"9084 ARGS_DESC@14864..148949085 L_PAREN@14864..14865 "("9086 ARG@14865..148939087 EXPR_APPLY@14865..148939088 EXPR_INDEX@14865..148779089 EXPR_VAR@14865..148689090 NAME@14865..148689091 IDENT@14865..14868 "std"9092 DOT@14868..14869 "."9093 NAME@14869..148779094 IDENT@14869..14877 "setInter"9095 ARGS_DESC@14877..148939096 L_PAREN@14877..14878 "("9097 ARG@14878..148819098 EXPR_ARRAY@14878..148819099 L_BRACK@14878..14879 "["9100 EXPR_VAR@14879..148809101 NAME@14879..148809102 IDENT@14879..14880 "x"9103 R_BRACK@14880..14881 "]"9104 COMMA@14881..14882 ","9105 WHITESPACE@14882..14883 " "9106 ARG@14883..148869107 EXPR_VAR@14883..148869108 NAME@14883..148869109 IDENT@14883..14886 "arr"9110 COMMA@14886..14887 ","9111 WHITESPACE@14887..14888 " "9112 ARG@14888..148929113 EXPR_VAR@14888..148929114 NAME@14888..148929115 IDENT@14888..14892 "keyF"9116 R_PAREN@14892..14893 ")"9117 R_PAREN@14893..14894 ")"9118 WHITESPACE@14894..14895 " "9119 GT@14895..14896 ">"9120 WHITESPACE@14896..14897 " "9121 EXPR_NUMBER@14897..148989122 FLOAT@14897..14898 "0"9123 COMMA@14898..14899 ","9124 WHITESPACE@14899..14903 "\n\n "9125 MEMBER_FIELD@14903..154529126 FIELD_METHOD@14903..154529127 FIELD_NAME_FIXED@14903..149119128 NAME@14903..149119129 IDENT@14903..14911 "setUnion"9130 PARAMS_DESC@14911..149269131 L_PAREN@14911..14912 "("9132 PARAM@14912..149139133 DESTRUCT_FULL@14912..149139134 NAME@14912..149139135 IDENT@14912..14913 "a"9136 COMMA@14913..14914 ","9137 WHITESPACE@14914..14915 " "9138 PARAM@14915..149169139 DESTRUCT_FULL@14915..149169140 NAME@14915..149169141 IDENT@14915..14916 "b"9142 COMMA@14916..14917 ","9143 WHITESPACE@14917..14918 " "9144 PARAM@14918..149259145 DESTRUCT_FULL@14918..149229146 NAME@14918..149229147 IDENT@14918..14922 "keyF"9148 ASSIGN@14922..14923 "="9149 EXPR_VAR@14923..149259150 NAME@14923..149259151 IDENT@14923..14925 "id"9152 R_PAREN@14925..14926 ")"9153 COLONCOLON@14926..14928 "::"9154 WHITESPACE@14928..14933 "\n "9155 SINGLE_LINE_SLASH_COMMENT@14933..14975 "// NOTE: order matter ..."9156 WHITESPACE@14975..14979 " "9157 EXPR_LOCAL@14979..154529158 LOCAL_KW@14979..14984 "local"9159 WHITESPACE@14984..14985 " "9160 BIND_FUNCTION@14985..154279161 NAME@14985..149889162 IDENT@14985..14988 "aux"9163 PARAMS_DESC@14988..150059164 L_PAREN@14988..14989 "("9165 PARAM@14989..149909166 DESTRUCT_FULL@14989..149909167 NAME@14989..149909168 IDENT@14989..14990 "a"9169 COMMA@14990..14991 ","9170 WHITESPACE@14991..14992 " "9171 PARAM@14992..149939172 DESTRUCT_FULL@14992..149939173 NAME@14992..149939174 IDENT@14992..14993 "b"9175 COMMA@14993..14994 ","9176 WHITESPACE@14994..14995 " "9177 PARAM@14995..149969178 DESTRUCT_FULL@14995..149969179 NAME@14995..149969180 IDENT@14995..14996 "i"9181 COMMA@14996..14997 ","9182 WHITESPACE@14997..14998 " "9183 PARAM@14998..149999184 DESTRUCT_FULL@14998..149999185 NAME@14998..149999186 IDENT@14998..14999 "j"9187 COMMA@14999..15000 ","9188 WHITESPACE@15000..15001 " "9189 PARAM@15001..150049190 DESTRUCT_FULL@15001..150049191 NAME@15001..150049192 IDENT@15001..15004 "acc"9193 R_PAREN@15004..15005 ")"9194 WHITESPACE@15005..15006 " "9195 ASSIGN@15006..15007 "="9196 WHITESPACE@15007..15014 "\n "9197 EXPR_IF_THEN_ELSE@15014..154279198 IF_KW@15014..15016 "if"9199 WHITESPACE@15016..15017 " "9200 EXPR_BINARY@15017..150359201 LHS_EXPR@15017..150189202 EXPR_VAR@15017..150189203 NAME@15017..150189204 IDENT@15017..15018 "i"9205 WHITESPACE@15018..15019 " "9206 GE@15019..15021 ">="9207 WHITESPACE@15021..15022 " "9208 EXPR_APPLY@15022..150359209 EXPR_INDEX@15022..150329210 EXPR_VAR@15022..150259211 NAME@15022..150259212 IDENT@15022..15025 "std"9213 DOT@15025..15026 "."9214 NAME@15026..150329215 IDENT@15026..15032 "length"9216 ARGS_DESC@15032..150359217 L_PAREN@15032..15033 "("9218 ARG@15033..150349219 EXPR_VAR@15033..150349220 NAME@15033..150349221 IDENT@15033..15034 "a"9222 R_PAREN@15034..15035 ")"9223 WHITESPACE@15035..15036 " "9224 THEN_KW@15036..15040 "then"9225 WHITESPACE@15040..15049 "\n "9226 TRUE_EXPR@15049..150609227 EXPR_BINARY@15049..150609228 LHS_EXPR@15049..150529229 EXPR_VAR@15049..150529230 NAME@15049..150529231 IDENT@15049..15052 "acc"9232 WHITESPACE@15052..15053 " "9233 PLUS@15053..15054 "+"9234 WHITESPACE@15054..15055 " "9235 EXPR_SLICE@15055..150609236 EXPR_VAR@15055..150569237 NAME@15055..150569238 IDENT@15055..15056 "b"9239 SLICE_DESC@15056..150609240 L_BRACK@15056..15057 "["9241 EXPR_VAR@15057..150589242 NAME@15057..150589243 IDENT@15057..15058 "j"9244 COLON@15058..15059 ":"9245 R_BRACK@15059..15060 "]"9246 WHITESPACE@15060..15067 "\n "9247 ELSE_KW@15067..15071 "else"9248 WHITESPACE@15071..15072 " "9249 FALSE_EXPR@15072..154279250 EXPR_IF_THEN_ELSE@15072..154279251 IF_KW@15072..15074 "if"9252 WHITESPACE@15074..15075 " "9253 EXPR_BINARY@15075..150939254 LHS_EXPR@15075..150769255 EXPR_VAR@15075..150769256 NAME@15075..150769257 IDENT@15075..15076 "j"9258 WHITESPACE@15076..15077 " "9259 GE@15077..15079 ">="9260 WHITESPACE@15079..15080 " "9261 EXPR_APPLY@15080..150939262 EXPR_INDEX@15080..150909263 EXPR_VAR@15080..150839264 NAME@15080..150839265 IDENT@15080..15083 "std"9266 DOT@15083..15084 "."9267 NAME@15084..150909268 IDENT@15084..15090 "length"9269 ARGS_DESC@15090..150939270 L_PAREN@15090..15091 "("9271 ARG@15091..150929272 EXPR_VAR@15091..150929273 NAME@15091..150929274 IDENT@15091..15092 "b"9275 R_PAREN@15092..15093 ")"9276 WHITESPACE@15093..15094 " "9277 THEN_KW@15094..15098 "then"9278 WHITESPACE@15098..15107 "\n "9279 TRUE_EXPR@15107..151189280 EXPR_BINARY@15107..151189281 LHS_EXPR@15107..151109282 EXPR_VAR@15107..151109283 NAME@15107..151109284 IDENT@15107..15110 "acc"9285 WHITESPACE@15110..15111 " "9286 PLUS@15111..15112 "+"9287 WHITESPACE@15112..15113 " "9288 EXPR_SLICE@15113..151189289 EXPR_VAR@15113..151149290 NAME@15113..151149291 IDENT@15113..15114 "a"9292 SLICE_DESC@15114..151189293 L_BRACK@15114..15115 "["9294 EXPR_VAR@15115..151169295 NAME@15115..151169296 IDENT@15115..15116 "i"9297 COLON@15116..15117 ":"9298 R_BRACK@15117..15118 "]"9299 WHITESPACE@15118..15125 "\n "9300 ELSE_KW@15125..15129 "else"9301 WHITESPACE@15129..15138 "\n "9302 FALSE_EXPR@15138..154279303 EXPR_LOCAL@15138..154279304 LOCAL_KW@15138..15143 "local"9305 WHITESPACE@15143..15144 " "9306 BIND_DESTRUCT@15144..151599307 DESTRUCT_FULL@15144..151469308 NAME@15144..151469309 IDENT@15144..15146 "ak"9310 WHITESPACE@15146..15147 " "9311 ASSIGN@15147..15148 "="9312 WHITESPACE@15148..15149 " "9313 EXPR_APPLY@15149..151599314 EXPR_VAR@15149..151539315 NAME@15149..151539316 IDENT@15149..15153 "keyF"9317 ARGS_DESC@15153..151599318 L_PAREN@15153..15154 "("9319 ARG@15154..151589320 EXPR_INDEX_EXPR@15154..151589321 LHS_EXPR@15154..151559322 EXPR_VAR@15154..151559323 NAME@15154..151559324 IDENT@15154..15155 "a"9325 L_BRACK@15155..15156 "["9326 EXPR_VAR@15156..151579327 NAME@15156..151579328 IDENT@15156..15157 "i"9329 R_BRACK@15157..15158 "]"9330 R_PAREN@15158..15159 ")"9331 SEMI@15159..15160 ";"9332 WHITESPACE@15160..15169 "\n "9333 EXPR_LOCAL@15169..154279334 LOCAL_KW@15169..15174 "local"9335 WHITESPACE@15174..15175 " "9336 BIND_DESTRUCT@15175..151909337 DESTRUCT_FULL@15175..151779338 NAME@15175..151779339 IDENT@15175..15177 "bk"9340 WHITESPACE@15177..15178 " "9341 ASSIGN@15178..15179 "="9342 WHITESPACE@15179..15180 " "9343 EXPR_APPLY@15180..151909344 EXPR_VAR@15180..151849345 NAME@15180..151849346 IDENT@15180..15184 "keyF"9347 ARGS_DESC@15184..151909348 L_PAREN@15184..15185 "("9349 ARG@15185..151899350 EXPR_INDEX_EXPR@15185..151899351 LHS_EXPR@15185..151869352 EXPR_VAR@15185..151869353 NAME@15185..151869354 IDENT@15185..15186 "b"9355 L_BRACK@15186..15187 "["9356 EXPR_VAR@15187..151889357 NAME@15187..151889358 IDENT@15187..15188 "j"9359 R_BRACK@15188..15189 "]"9360 R_PAREN@15189..15190 ")"9361 SEMI@15190..15191 ";"9362 WHITESPACE@15191..15200 "\n "9363 EXPR_IF_THEN_ELSE@15200..154279364 IF_KW@15200..15202 "if"9365 WHITESPACE@15202..15203 " "9366 EXPR_BINARY@15203..152119367 LHS_EXPR@15203..152059368 EXPR_VAR@15203..152059369 NAME@15203..152059370 IDENT@15203..15205 "ak"9371 WHITESPACE@15205..15206 " "9372 EQ@15206..15208 "=="9373 WHITESPACE@15208..15209 " "9374 EXPR_VAR@15209..152119375 NAME@15209..152119376 IDENT@15209..15211 "bk"9377 WHITESPACE@15211..15212 " "9378 THEN_KW@15212..15216 "then"9379 WHITESPACE@15216..15227 "\n "9380 TRUE_EXPR@15227..152759381 EXPR_APPLY@15227..152759382 EXPR_VAR@15227..152309383 NAME@15227..152309384 IDENT@15227..15230 "aux"9385 ARGS_DESC@15230..152759386 L_PAREN@15230..15231 "("9387 ARG@15231..152329388 EXPR_VAR@15231..152329389 NAME@15231..152329390 IDENT@15231..15232 "a"9391 COMMA@15232..15233 ","9392 WHITESPACE@15233..15234 " "9393 ARG@15234..152359394 EXPR_VAR@15234..152359395 NAME@15234..152359396 IDENT@15234..15235 "b"9397 COMMA@15235..15236 ","9398 WHITESPACE@15236..15237 " "9399 ARG@15237..152429400 EXPR_BINARY@15237..152429401 LHS_EXPR@15237..152389402 EXPR_VAR@15237..152389403 NAME@15237..152389404 IDENT@15237..15238 "i"9405 WHITESPACE@15238..15239 " "9406 PLUS@15239..15240 "+"9407 WHITESPACE@15240..15241 " "9408 EXPR_NUMBER@15241..152429409 FLOAT@15241..15242 "1"9410 COMMA@15242..15243 ","9411 WHITESPACE@15243..15244 " "9412 ARG@15244..152499413 EXPR_BINARY@15244..152499414 LHS_EXPR@15244..152459415 EXPR_VAR@15244..152459416 NAME@15244..152459417 IDENT@15244..15245 "j"9418 WHITESPACE@15245..15246 " "9419 PLUS@15246..15247 "+"9420 WHITESPACE@15247..15248 " "9421 EXPR_NUMBER@15248..152499422 FLOAT@15248..15249 "1"9423 COMMA@15249..15250 ","9424 WHITESPACE@15250..15251 " "9425 ARG@15251..152639426 EXPR_BINARY@15251..152639427 LHS_EXPR@15251..152549428 EXPR_VAR@15251..152549429 NAME@15251..152549430 IDENT@15251..15254 "acc"9431 WHITESPACE@15254..15255 " "9432 PLUS@15255..15256 "+"9433 WHITESPACE@15256..15257 " "9434 EXPR_ARRAY@15257..152639435 L_BRACK@15257..15258 "["9436 EXPR_INDEX_EXPR@15258..152629437 LHS_EXPR@15258..152599438 EXPR_VAR@15258..152599439 NAME@15258..152599440 IDENT@15258..15259 "a"9441 L_BRACK@15259..15260 "["9442 EXPR_VAR@15260..152619443 NAME@15260..152619444 IDENT@15260..15261 "i"9445 R_BRACK@15261..15262 "]"9446 R_BRACK@15262..15263 "]"9447 R_PAREN@15263..15264 ")"9448 WHITESPACE@15264..15265 " "9449 TAILSTRICT_KW@15265..15275 "tailstrict"9450 WHITESPACE@15275..15284 "\n "9451 ELSE_KW@15284..15288 "else"9452 WHITESPACE@15288..15289 " "9453 FALSE_EXPR@15289..154279454 EXPR_IF_THEN_ELSE@15289..154279455 IF_KW@15289..15291 "if"9456 WHITESPACE@15291..15292 " "9457 EXPR_BINARY@15292..152999458 LHS_EXPR@15292..152949459 EXPR_VAR@15292..152949460 NAME@15292..152949461 IDENT@15292..15294 "ak"9462 WHITESPACE@15294..15295 " "9463 LT@15295..15296 "<"9464 WHITESPACE@15296..15297 " "9465 EXPR_VAR@15297..152999466 NAME@15297..152999467 IDENT@15297..15299 "bk"9468 WHITESPACE@15299..15300 " "9469 THEN_KW@15300..15304 "then"9470 WHITESPACE@15304..15315 "\n "9471 TRUE_EXPR@15315..153599472 EXPR_APPLY@15315..153599473 EXPR_VAR@15315..153189474 NAME@15315..153189475 IDENT@15315..15318 "aux"9476 ARGS_DESC@15318..153599477 L_PAREN@15318..15319 "("9478 ARG@15319..153209479 EXPR_VAR@15319..153209480 NAME@15319..153209481 IDENT@15319..15320 "a"9482 COMMA@15320..15321 ","9483 WHITESPACE@15321..15322 " "9484 ARG@15322..153239485 EXPR_VAR@15322..153239486 NAME@15322..153239487 IDENT@15322..15323 "b"9488 COMMA@15323..15324 ","9489 WHITESPACE@15324..15325 " "9490 ARG@15325..153309491 EXPR_BINARY@15325..153309492 LHS_EXPR@15325..153269493 EXPR_VAR@15325..153269494 NAME@15325..153269495 IDENT@15325..15326 "i"9496 WHITESPACE@15326..15327 " "9497 PLUS@15327..15328 "+"9498 WHITESPACE@15328..15329 " "9499 EXPR_NUMBER@15329..153309500 FLOAT@15329..15330 "1"9501 COMMA@15330..15331 ","9502 WHITESPACE@15331..15332 " "9503 ARG@15332..153339504 EXPR_VAR@15332..153339505 NAME@15332..153339506 IDENT@15332..15333 "j"9507 COMMA@15333..15334 ","9508 WHITESPACE@15334..15335 " "9509 ARG@15335..153479510 EXPR_BINARY@15335..153479511 LHS_EXPR@15335..153389512 EXPR_VAR@15335..153389513 NAME@15335..153389514 IDENT@15335..15338 "acc"9515 WHITESPACE@15338..15339 " "9516 PLUS@15339..15340 "+"9517 WHITESPACE@15340..15341 " "9518 EXPR_ARRAY@15341..153479519 L_BRACK@15341..15342 "["9520 EXPR_INDEX_EXPR@15342..153469521 LHS_EXPR@15342..153439522 EXPR_VAR@15342..153439523 NAME@15342..153439524 IDENT@15342..15343 "a"9525 L_BRACK@15343..15344 "["9526 EXPR_VAR@15344..153459527 NAME@15344..153459528 IDENT@15344..15345 "i"9529 R_BRACK@15345..15346 "]"9530 R_BRACK@15346..15347 "]"9531 R_PAREN@15347..15348 ")"9532 WHITESPACE@15348..15349 " "9533 TAILSTRICT_KW@15349..15359 "tailstrict"9534 WHITESPACE@15359..15368 "\n "9535 ELSE_KW@15368..15372 "else"9536 WHITESPACE@15372..15383 "\n "9537 FALSE_EXPR@15383..154279538 EXPR_APPLY@15383..154279539 EXPR_VAR@15383..153869540 NAME@15383..153869541 IDENT@15383..15386 "aux"9542 ARGS_DESC@15386..154279543 L_PAREN@15386..15387 "("9544 ARG@15387..153889545 EXPR_VAR@15387..153889546 NAME@15387..153889547 IDENT@15387..15388 "a"9548 COMMA@15388..15389 ","9549 WHITESPACE@15389..15390 " "9550 ARG@15390..153919551 EXPR_VAR@15390..153919552 NAME@15390..153919553 IDENT@15390..15391 "b"9554 COMMA@15391..15392 ","9555 WHITESPACE@15392..15393 " "9556 ARG@15393..153949557 EXPR_VAR@15393..153949558 NAME@15393..153949559 IDENT@15393..15394 "i"9560 COMMA@15394..15395 ","9561 WHITESPACE@15395..15396 " "9562 ARG@15396..154019563 EXPR_BINARY@15396..154019564 LHS_EXPR@15396..153979565 EXPR_VAR@15396..153979566 NAME@15396..153979567 IDENT@15396..15397 "j"9568 WHITESPACE@15397..15398 " "9569 PLUS@15398..15399 "+"9570 WHITESPACE@15399..15400 " "9571 EXPR_NUMBER@15400..154019572 FLOAT@15400..15401 "1"9573 COMMA@15401..15402 ","9574 WHITESPACE@15402..15403 " "9575 ARG@15403..154159576 EXPR_BINARY@15403..154159577 LHS_EXPR@15403..154069578 EXPR_VAR@15403..154069579 NAME@15403..154069580 IDENT@15403..15406 "acc"9581 WHITESPACE@15406..15407 " "9582 PLUS@15407..15408 "+"9583 WHITESPACE@15408..15409 " "9584 EXPR_ARRAY@15409..154159585 L_BRACK@15409..15410 "["9586 EXPR_INDEX_EXPR@15410..154149587 LHS_EXPR@15410..154119588 EXPR_VAR@15410..154119589 NAME@15410..154119590 IDENT@15410..15411 "b"9591 L_BRACK@15411..15412 "["9592 EXPR_VAR@15412..154139593 NAME@15412..154139594 IDENT@15412..15413 "j"9595 R_BRACK@15413..15414 "]"9596 R_BRACK@15414..15415 "]"9597 R_PAREN@15415..15416 ")"9598 WHITESPACE@15416..15417 " "9599 TAILSTRICT_KW@15417..15427 "tailstrict"9600 SEMI@15427..15428 ";"9601 WHITESPACE@15428..15433 "\n "9602 EXPR_APPLY@15433..154529603 EXPR_VAR@15433..154369604 NAME@15433..154369605 IDENT@15433..15436 "aux"9606 ARGS_DESC@15436..154529607 L_PAREN@15436..15437 "("9608 ARG@15437..154389609 EXPR_VAR@15437..154389610 NAME@15437..154389611 IDENT@15437..15438 "a"9612 COMMA@15438..15439 ","9613 WHITESPACE@15439..15440 " "9614 ARG@15440..154419615 EXPR_VAR@15440..154419616 NAME@15440..154419617 IDENT@15440..15441 "b"9618 COMMA@15441..15442 ","9619 WHITESPACE@15442..15443 " "9620 ARG@15443..154449621 EXPR_NUMBER@15443..154449622 FLOAT@15443..15444 "0"9623 COMMA@15444..15445 ","9624 WHITESPACE@15445..15446 " "9625 ARG@15446..154479626 EXPR_NUMBER@15446..154479627 FLOAT@15446..15447 "0"9628 COMMA@15447..15448 ","9629 WHITESPACE@15448..15449 " "9630 ARG@15449..154519631 EXPR_ARRAY@15449..154519632 L_BRACK@15449..15450 "["9633 R_BRACK@15450..15451 "]"9634 R_PAREN@15451..15452 ")"9635 COMMA@15452..15453 ","9636 WHITESPACE@15453..15457 "\n\n "9637 MEMBER_FIELD@15457..158799638 FIELD_METHOD@15457..158799639 FIELD_NAME_FIXED@15457..154659640 NAME@15457..154659641 IDENT@15457..15465 "setInter"9642 PARAMS_DESC@15465..154809643 L_PAREN@15465..15466 "("9644 PARAM@15466..154679645 DESTRUCT_FULL@15466..154679646 NAME@15466..154679647 IDENT@15466..15467 "a"9648 COMMA@15467..15468 ","9649 WHITESPACE@15468..15469 " "9650 PARAM@15469..154709651 DESTRUCT_FULL@15469..154709652 NAME@15469..154709653 IDENT@15469..15470 "b"9654 COMMA@15470..15471 ","9655 WHITESPACE@15471..15472 " "9656 PARAM@15472..154799657 DESTRUCT_FULL@15472..154769658 NAME@15472..154769659 IDENT@15472..15476 "keyF"9660 ASSIGN@15476..15477 "="9661 EXPR_VAR@15477..154799662 NAME@15477..154799663 IDENT@15477..15479 "id"9664 R_PAREN@15479..15480 ")"9665 COLONCOLON@15480..15482 "::"9666 WHITESPACE@15482..15487 "\n "9667 EXPR_LOCAL@15487..158799668 LOCAL_KW@15487..15492 "local"9669 WHITESPACE@15492..15493 " "9670 BIND_FUNCTION@15493..158439671 NAME@15493..154969672 IDENT@15493..15496 "aux"9673 PARAMS_DESC@15496..155139674 L_PAREN@15496..15497 "("9675 PARAM@15497..154989676 DESTRUCT_FULL@15497..154989677 NAME@15497..154989678 IDENT@15497..15498 "a"9679 COMMA@15498..15499 ","9680 WHITESPACE@15499..15500 " "9681 PARAM@15500..155019682 DESTRUCT_FULL@15500..155019683 NAME@15500..155019684 IDENT@15500..15501 "b"9685 COMMA@15501..15502 ","9686 WHITESPACE@15502..15503 " "9687 PARAM@15503..155049688 DESTRUCT_FULL@15503..155049689 NAME@15503..155049690 IDENT@15503..15504 "i"9691 COMMA@15504..15505 ","9692 WHITESPACE@15505..15506 " "9693 PARAM@15506..155079694 DESTRUCT_FULL@15506..155079695 NAME@15506..155079696 IDENT@15506..15507 "j"9697 COMMA@15507..15508 ","9698 WHITESPACE@15508..15509 " "9699 PARAM@15509..155129700 DESTRUCT_FULL@15509..155129701 NAME@15509..155129702 IDENT@15509..15512 "acc"9703 R_PAREN@15512..15513 ")"9704 WHITESPACE@15513..15514 " "9705 ASSIGN@15514..15515 "="9706 WHITESPACE@15515..15522 "\n "9707 EXPR_IF_THEN_ELSE@15522..158439708 IF_KW@15522..15524 "if"9709 WHITESPACE@15524..15525 " "9710 EXPR_BINARY@15525..155659711 LHS_EXPR@15525..155439712 EXPR_BINARY@15525..155439713 LHS_EXPR@15525..155269714 EXPR_VAR@15525..155269715 NAME@15525..155269716 IDENT@15525..15526 "i"9717 WHITESPACE@15526..15527 " "9718 GE@15527..15529 ">="9719 WHITESPACE@15529..15530 " "9720 EXPR_APPLY@15530..155439721 EXPR_INDEX@15530..155409722 EXPR_VAR@15530..155339723 NAME@15530..155339724 IDENT@15530..15533 "std"9725 DOT@15533..15534 "."9726 NAME@15534..155409727 IDENT@15534..15540 "length"9728 ARGS_DESC@15540..155439729 L_PAREN@15540..15541 "("9730 ARG@15541..155429731 EXPR_VAR@15541..155429732 NAME@15541..155429733 IDENT@15541..15542 "a"9734 R_PAREN@15542..15543 ")"9735 WHITESPACE@15543..15544 " "9736 OR@15544..15546 "||"9737 WHITESPACE@15546..15547 " "9738 EXPR_BINARY@15547..155659739 LHS_EXPR@15547..155489740 EXPR_VAR@15547..155489741 NAME@15547..155489742 IDENT@15547..15548 "j"9743 WHITESPACE@15548..15549 " "9744 GE@15549..15551 ">="9745 WHITESPACE@15551..15552 " "9746 EXPR_APPLY@15552..155659747 EXPR_INDEX@15552..155629748 EXPR_VAR@15552..155559749 NAME@15552..155559750 IDENT@15552..15555 "std"9751 DOT@15555..15556 "."9752 NAME@15556..155629753 IDENT@15556..15562 "length"9754 ARGS_DESC@15562..155659755 L_PAREN@15562..15563 "("9756 ARG@15563..155649757 EXPR_VAR@15563..155649758 NAME@15563..155649759 IDENT@15563..15564 "b"9760 R_PAREN@15564..15565 ")"9761 WHITESPACE@15565..15566 " "9762 THEN_KW@15566..15570 "then"9763 WHITESPACE@15570..15579 "\n "9764 TRUE_EXPR@15579..155829765 EXPR_VAR@15579..155829766 NAME@15579..155829767 IDENT@15579..15582 "acc"9768 WHITESPACE@15582..15589 "\n "9769 ELSE_KW@15589..15593 "else"9770 WHITESPACE@15593..15602 "\n "9771 FALSE_EXPR@15602..158439772 EXPR_IF_THEN_ELSE@15602..158439773 IF_KW@15602..15604 "if"9774 WHITESPACE@15604..15605 " "9775 EXPR_BINARY@15605..156299776 LHS_EXPR@15605..156159777 EXPR_APPLY@15605..156159778 EXPR_VAR@15605..156099779 NAME@15605..156099780 IDENT@15605..15609 "keyF"9781 ARGS_DESC@15609..156159782 L_PAREN@15609..15610 "("9783 ARG@15610..156149784 EXPR_INDEX_EXPR@15610..156149785 LHS_EXPR@15610..156119786 EXPR_VAR@15610..156119787 NAME@15610..156119788 IDENT@15610..15611 "a"9789 L_BRACK@15611..15612 "["9790 EXPR_VAR@15612..156139791 NAME@15612..156139792 IDENT@15612..15613 "i"9793 R_BRACK@15613..15614 "]"9794 R_PAREN@15614..15615 ")"9795 WHITESPACE@15615..15616 " "9796 EQ@15616..15618 "=="9797 WHITESPACE@15618..15619 " "9798 EXPR_APPLY@15619..156299799 EXPR_VAR@15619..156239800 NAME@15619..156239801 IDENT@15619..15623 "keyF"9802 ARGS_DESC@15623..156299803 L_PAREN@15623..15624 "("9804 ARG@15624..156289805 EXPR_INDEX_EXPR@15624..156289806 LHS_EXPR@15624..156259807 EXPR_VAR@15624..156259808 NAME@15624..156259809 IDENT@15624..15625 "b"9810 L_BRACK@15625..15626 "["9811 EXPR_VAR@15626..156279812 NAME@15626..156279813 IDENT@15626..15627 "j"9814 R_BRACK@15627..15628 "]"9815 R_PAREN@15628..15629 ")"9816 WHITESPACE@15629..15630 " "9817 THEN_KW@15630..15634 "then"9818 WHITESPACE@15634..15645 "\n "9819 TRUE_EXPR@15645..156939820 EXPR_APPLY@15645..156939821 EXPR_VAR@15645..156489822 NAME@15645..156489823 IDENT@15645..15648 "aux"9824 ARGS_DESC@15648..156939825 L_PAREN@15648..15649 "("9826 ARG@15649..156509827 EXPR_VAR@15649..156509828 NAME@15649..156509829 IDENT@15649..15650 "a"9830 COMMA@15650..15651 ","9831 WHITESPACE@15651..15652 " "9832 ARG@15652..156539833 EXPR_VAR@15652..156539834 NAME@15652..156539835 IDENT@15652..15653 "b"9836 COMMA@15653..15654 ","9837 WHITESPACE@15654..15655 " "9838 ARG@15655..156609839 EXPR_BINARY@15655..156609840 LHS_EXPR@15655..156569841 EXPR_VAR@15655..156569842 NAME@15655..156569843 IDENT@15655..15656 "i"9844 WHITESPACE@15656..15657 " "9845 PLUS@15657..15658 "+"9846 WHITESPACE@15658..15659 " "9847 EXPR_NUMBER@15659..156609848 FLOAT@15659..15660 "1"9849 COMMA@15660..15661 ","9850 WHITESPACE@15661..15662 " "9851 ARG@15662..156679852 EXPR_BINARY@15662..156679853 LHS_EXPR@15662..156639854 EXPR_VAR@15662..156639855 NAME@15662..156639856 IDENT@15662..15663 "j"9857 WHITESPACE@15663..15664 " "9858 PLUS@15664..15665 "+"9859 WHITESPACE@15665..15666 " "9860 EXPR_NUMBER@15666..156679861 FLOAT@15666..15667 "1"9862 COMMA@15667..15668 ","9863 WHITESPACE@15668..15669 " "9864 ARG@15669..156819865 EXPR_BINARY@15669..156819866 LHS_EXPR@15669..156729867 EXPR_VAR@15669..156729868 NAME@15669..156729869 IDENT@15669..15672 "acc"9870 WHITESPACE@15672..15673 " "9871 PLUS@15673..15674 "+"9872 WHITESPACE@15674..15675 " "9873 EXPR_ARRAY@15675..156819874 L_BRACK@15675..15676 "["9875 EXPR_INDEX_EXPR@15676..156809876 LHS_EXPR@15676..156779877 EXPR_VAR@15676..156779878 NAME@15676..156779879 IDENT@15676..15677 "a"9880 L_BRACK@15677..15678 "["9881 EXPR_VAR@15678..156799882 NAME@15678..156799883 IDENT@15678..15679 "i"9884 R_BRACK@15679..15680 "]"9885 R_BRACK@15680..15681 "]"9886 R_PAREN@15681..15682 ")"9887 WHITESPACE@15682..15683 " "9888 TAILSTRICT_KW@15683..15693 "tailstrict"9889 WHITESPACE@15693..15702 "\n "9890 ELSE_KW@15702..15706 "else"9891 WHITESPACE@15706..15707 " "9892 FALSE_EXPR@15707..158439893 EXPR_IF_THEN_ELSE@15707..158439894 IF_KW@15707..15709 "if"9895 WHITESPACE@15709..15710 " "9896 EXPR_BINARY@15710..157339897 LHS_EXPR@15710..157209898 EXPR_APPLY@15710..157209899 EXPR_VAR@15710..157149900 NAME@15710..157149901 IDENT@15710..15714 "keyF"9902 ARGS_DESC@15714..157209903 L_PAREN@15714..15715 "("9904 ARG@15715..157199905 EXPR_INDEX_EXPR@15715..157199906 LHS_EXPR@15715..157169907 EXPR_VAR@15715..157169908 NAME@15715..157169909 IDENT@15715..15716 "a"9910 L_BRACK@15716..15717 "["9911 EXPR_VAR@15717..157189912 NAME@15717..157189913 IDENT@15717..15718 "i"9914 R_BRACK@15718..15719 "]"9915 R_PAREN@15719..15720 ")"9916 WHITESPACE@15720..15721 " "9917 LT@15721..15722 "<"9918 WHITESPACE@15722..15723 " "9919 EXPR_APPLY@15723..157339920 EXPR_VAR@15723..157279921 NAME@15723..157279922 IDENT@15723..15727 "keyF"9923 ARGS_DESC@15727..157339924 L_PAREN@15727..15728 "("9925 ARG@15728..157329926 EXPR_INDEX_EXPR@15728..157329927 LHS_EXPR@15728..157299928 EXPR_VAR@15728..157299929 NAME@15728..157299930 IDENT@15728..15729 "b"9931 L_BRACK@15729..15730 "["9932 EXPR_VAR@15730..157319933 NAME@15730..157319934 IDENT@15730..15731 "j"9935 R_BRACK@15731..15732 "]"9936 R_PAREN@15732..15733 ")"9937 WHITESPACE@15733..15734 " "9938 THEN_KW@15734..15738 "then"9939 WHITESPACE@15738..15749 "\n "9940 TRUE_EXPR@15749..157849941 EXPR_APPLY@15749..157849942 EXPR_VAR@15749..157529943 NAME@15749..157529944 IDENT@15749..15752 "aux"9945 ARGS_DESC@15752..157849946 L_PAREN@15752..15753 "("9947 ARG@15753..157549948 EXPR_VAR@15753..157549949 NAME@15753..157549950 IDENT@15753..15754 "a"9951 COMMA@15754..15755 ","9952 WHITESPACE@15755..15756 " "9953 ARG@15756..157579954 EXPR_VAR@15756..157579955 NAME@15756..157579956 IDENT@15756..15757 "b"9957 COMMA@15757..15758 ","9958 WHITESPACE@15758..15759 " "9959 ARG@15759..157649960 EXPR_BINARY@15759..157649961 LHS_EXPR@15759..157609962 EXPR_VAR@15759..157609963 NAME@15759..157609964 IDENT@15759..15760 "i"9965 WHITESPACE@15760..15761 " "9966 PLUS@15761..15762 "+"9967 WHITESPACE@15762..15763 " "9968 EXPR_NUMBER@15763..157649969 FLOAT@15763..15764 "1"9970 COMMA@15764..15765 ","9971 WHITESPACE@15765..15766 " "9972 ARG@15766..157679973 EXPR_VAR@15766..157679974 NAME@15766..157679975 IDENT@15766..15767 "j"9976 COMMA@15767..15768 ","9977 WHITESPACE@15768..15769 " "9978 ARG@15769..157729979 EXPR_VAR@15769..157729980 NAME@15769..157729981 IDENT@15769..15772 "acc"9982 R_PAREN@15772..15773 ")"9983 WHITESPACE@15773..15774 " "9984 TAILSTRICT_KW@15774..15784 "tailstrict"9985 WHITESPACE@15784..15793 "\n "9986 ELSE_KW@15793..15797 "else"9987 WHITESPACE@15797..15808 "\n "9988 FALSE_EXPR@15808..158439989 EXPR_APPLY@15808..158439990 EXPR_VAR@15808..158119991 NAME@15808..158119992 IDENT@15808..15811 "aux"9993 ARGS_DESC@15811..158439994 L_PAREN@15811..15812 "("9995 ARG@15812..158139996 EXPR_VAR@15812..158139997 NAME@15812..158139998 IDENT@15812..15813 "a"9999 COMMA@15813..15814 ","10000 WHITESPACE@15814..15815 " "10001 ARG@15815..1581610002 EXPR_VAR@15815..1581610003 NAME@15815..1581610004 IDENT@15815..15816 "b"10005 COMMA@15816..15817 ","10006 WHITESPACE@15817..15818 " "10007 ARG@15818..1581910008 EXPR_VAR@15818..1581910009 NAME@15818..1581910010 IDENT@15818..15819 "i"10011 COMMA@15819..15820 ","10012 WHITESPACE@15820..15821 " "10013 ARG@15821..1582610014 EXPR_BINARY@15821..1582610015 LHS_EXPR@15821..1582210016 EXPR_VAR@15821..1582210017 NAME@15821..1582210018 IDENT@15821..15822 "j"10019 WHITESPACE@15822..15823 " "10020 PLUS@15823..15824 "+"10021 WHITESPACE@15824..15825 " "10022 EXPR_NUMBER@15825..1582610023 FLOAT@15825..15826 "1"10024 COMMA@15826..15827 ","10025 WHITESPACE@15827..15828 " "10026 ARG@15828..1583110027 EXPR_VAR@15828..1583110028 NAME@15828..1583110029 IDENT@15828..15831 "acc"10030 R_PAREN@15831..15832 ")"10031 WHITESPACE@15832..15833 " "10032 TAILSTRICT_KW@15833..15843 "tailstrict"10033 SEMI@15843..15844 ";"10034 WHITESPACE@15844..15849 "\n "10035 EXPR_APPLY@15849..1587910036 EXPR_VAR@15849..1585210037 NAME@15849..1585210038 IDENT@15849..15852 "aux"10039 ARGS_DESC@15852..1587910040 L_PAREN@15852..15853 "("10041 ARG@15853..1585410042 EXPR_VAR@15853..1585410043 NAME@15853..1585410044 IDENT@15853..15854 "a"10045 COMMA@15854..15855 ","10046 WHITESPACE@15855..15856 " "10047 ARG@15856..1585710048 EXPR_VAR@15856..1585710049 NAME@15856..1585710050 IDENT@15856..15857 "b"10051 COMMA@15857..15858 ","10052 WHITESPACE@15858..15859 " "10053 ARG@15859..1586010054 EXPR_NUMBER@15859..1586010055 FLOAT@15859..15860 "0"10056 COMMA@15860..15861 ","10057 WHITESPACE@15861..15862 " "10058 ARG@15862..1586310059 EXPR_NUMBER@15862..1586310060 FLOAT@15862..15863 "0"10061 COMMA@15863..15864 ","10062 WHITESPACE@15864..15865 " "10063 ARG@15865..1586710064 EXPR_ARRAY@15865..1586710065 L_BRACK@15865..15866 "["10066 R_BRACK@15866..15867 "]"10067 R_PAREN@15867..15868 ")"10068 WHITESPACE@15868..15869 " "10069 TAILSTRICT_KW@15869..15879 "tailstrict"10070 COMMA@15879..15880 ","10071 WHITESPACE@15880..15884 "\n\n "10072 MEMBER_FIELD@15884..1634110073 FIELD_METHOD@15884..1634110074 FIELD_NAME_FIXED@15884..1589110075 NAME@15884..1589110076 IDENT@15884..15891 "setDiff"10077 PARAMS_DESC@15891..1590610078 L_PAREN@15891..15892 "("10079 PARAM@15892..1589310080 DESTRUCT_FULL@15892..1589310081 NAME@15892..1589310082 IDENT@15892..15893 "a"10083 COMMA@15893..15894 ","10084 WHITESPACE@15894..15895 " "10085 PARAM@15895..1589610086 DESTRUCT_FULL@15895..1589610087 NAME@15895..1589610088 IDENT@15895..15896 "b"10089 COMMA@15896..15897 ","10090 WHITESPACE@15897..15898 " "10091 PARAM@15898..1590510092 DESTRUCT_FULL@15898..1590210093 NAME@15898..1590210094 IDENT@15898..15902 "keyF"10095 ASSIGN@15902..15903 "="10096 EXPR_VAR@15903..1590510097 NAME@15903..1590510098 IDENT@15903..15905 "id"10099 R_PAREN@15905..15906 ")"10100 COLONCOLON@15906..15908 "::"10101 WHITESPACE@15908..15913 "\n "10102 EXPR_LOCAL@15913..1634110103 LOCAL_KW@15913..15918 "local"10104 WHITESPACE@15918..15919 " "10105 BIND_FUNCTION@15919..1630510106 NAME@15919..1592210107 IDENT@15919..15922 "aux"10108 PARAMS_DESC@15922..1593910109 L_PAREN@15922..15923 "("10110 PARAM@15923..1592410111 DESTRUCT_FULL@15923..1592410112 NAME@15923..1592410113 IDENT@15923..15924 "a"10114 COMMA@15924..15925 ","10115 WHITESPACE@15925..15926 " "10116 PARAM@15926..1592710117 DESTRUCT_FULL@15926..1592710118 NAME@15926..1592710119 IDENT@15926..15927 "b"10120 COMMA@15927..15928 ","10121 WHITESPACE@15928..15929 " "10122 PARAM@15929..1593010123 DESTRUCT_FULL@15929..1593010124 NAME@15929..1593010125 IDENT@15929..15930 "i"10126 COMMA@15930..15931 ","10127 WHITESPACE@15931..15932 " "10128 PARAM@15932..1593310129 DESTRUCT_FULL@15932..1593310130 NAME@15932..1593310131 IDENT@15932..15933 "j"10132 COMMA@15933..15934 ","10133 WHITESPACE@15934..15935 " "10134 PARAM@15935..1593810135 DESTRUCT_FULL@15935..1593810136 NAME@15935..1593810137 IDENT@15935..15938 "acc"10138 R_PAREN@15938..15939 ")"10139 WHITESPACE@15939..15940 " "10140 ASSIGN@15940..15941 "="10141 WHITESPACE@15941..15948 "\n "10142 EXPR_IF_THEN_ELSE@15948..1630510143 IF_KW@15948..15950 "if"10144 WHITESPACE@15950..15951 " "10145 EXPR_BINARY@15951..1596910146 LHS_EXPR@15951..1595210147 EXPR_VAR@15951..1595210148 NAME@15951..1595210149 IDENT@15951..15952 "i"10150 WHITESPACE@15952..15953 " "10151 GE@15953..15955 ">="10152 WHITESPACE@15955..15956 " "10153 EXPR_APPLY@15956..1596910154 EXPR_INDEX@15956..1596610155 EXPR_VAR@15956..1595910156 NAME@15956..1595910157 IDENT@15956..15959 "std"10158 DOT@15959..15960 "."10159 NAME@15960..1596610160 IDENT@15960..15966 "length"10161 ARGS_DESC@15966..1596910162 L_PAREN@15966..15967 "("10163 ARG@15967..1596810164 EXPR_VAR@15967..1596810165 NAME@15967..1596810166 IDENT@15967..15968 "a"10167 R_PAREN@15968..15969 ")"10168 WHITESPACE@15969..15970 " "10169 THEN_KW@15970..15974 "then"10170 WHITESPACE@15974..15983 "\n "10171 TRUE_EXPR@15983..1598610172 EXPR_VAR@15983..1598610173 NAME@15983..1598610174 IDENT@15983..15986 "acc"10175 WHITESPACE@15986..15993 "\n "10176 ELSE_KW@15993..15997 "else"10177 WHITESPACE@15997..15998 " "10178 FALSE_EXPR@15998..1630510179 EXPR_IF_THEN_ELSE@15998..1630510180 IF_KW@15998..16000 "if"10181 WHITESPACE@16000..16001 " "10182 EXPR_BINARY@16001..1601910183 LHS_EXPR@16001..1600210184 EXPR_VAR@16001..1600210185 NAME@16001..1600210186 IDENT@16001..16002 "j"10187 WHITESPACE@16002..16003 " "10188 GE@16003..16005 ">="10189 WHITESPACE@16005..16006 " "10190 EXPR_APPLY@16006..1601910191 EXPR_INDEX@16006..1601610192 EXPR_VAR@16006..1600910193 NAME@16006..1600910194 IDENT@16006..16009 "std"10195 DOT@16009..16010 "."10196 NAME@16010..1601610197 IDENT@16010..16016 "length"10198 ARGS_DESC@16016..1601910199 L_PAREN@16016..16017 "("10200 ARG@16017..1601810201 EXPR_VAR@16017..1601810202 NAME@16017..1601810203 IDENT@16017..16018 "b"10204 R_PAREN@16018..16019 ")"10205 WHITESPACE@16019..16020 " "10206 THEN_KW@16020..16024 "then"10207 WHITESPACE@16024..16033 "\n "10208 TRUE_EXPR@16033..1604410209 EXPR_BINARY@16033..1604410210 LHS_EXPR@16033..1603610211 EXPR_VAR@16033..1603610212 NAME@16033..1603610213 IDENT@16033..16036 "acc"10214 WHITESPACE@16036..16037 " "10215 PLUS@16037..16038 "+"10216 WHITESPACE@16038..16039 " "10217 EXPR_SLICE@16039..1604410218 EXPR_VAR@16039..1604010219 NAME@16039..1604010220 IDENT@16039..16040 "a"10221 SLICE_DESC@16040..1604410222 L_BRACK@16040..16041 "["10223 EXPR_VAR@16041..1604210224 NAME@16041..1604210225 IDENT@16041..16042 "i"10226 COLON@16042..16043 ":"10227 R_BRACK@16043..16044 "]"10228 WHITESPACE@16044..16051 "\n "10229 ELSE_KW@16051..16055 "else"10230 WHITESPACE@16055..16064 "\n "10231 FALSE_EXPR@16064..1630510232 EXPR_IF_THEN_ELSE@16064..1630510233 IF_KW@16064..16066 "if"10234 WHITESPACE@16066..16067 " "10235 EXPR_BINARY@16067..1609110236 LHS_EXPR@16067..1607710237 EXPR_APPLY@16067..1607710238 EXPR_VAR@16067..1607110239 NAME@16067..1607110240 IDENT@16067..16071 "keyF"10241 ARGS_DESC@16071..1607710242 L_PAREN@16071..16072 "("10243 ARG@16072..1607610244 EXPR_INDEX_EXPR@16072..1607610245 LHS_EXPR@16072..1607310246 EXPR_VAR@16072..1607310247 NAME@16072..1607310248 IDENT@16072..16073 "a"10249 L_BRACK@16073..16074 "["10250 EXPR_VAR@16074..1607510251 NAME@16074..1607510252 IDENT@16074..16075 "i"10253 R_BRACK@16075..16076 "]"10254 R_PAREN@16076..16077 ")"10255 WHITESPACE@16077..16078 " "10256 EQ@16078..16080 "=="10257 WHITESPACE@16080..16081 " "10258 EXPR_APPLY@16081..1609110259 EXPR_VAR@16081..1608510260 NAME@16081..1608510261 IDENT@16081..16085 "keyF"10262 ARGS_DESC@16085..1609110263 L_PAREN@16085..16086 "("10264 ARG@16086..1609010265 EXPR_INDEX_EXPR@16086..1609010266 LHS_EXPR@16086..1608710267 EXPR_VAR@16086..1608710268 NAME@16086..1608710269 IDENT@16086..16087 "b"10270 L_BRACK@16087..16088 "["10271 EXPR_VAR@16088..1608910272 NAME@16088..1608910273 IDENT@16088..16089 "j"10274 R_BRACK@16089..16090 "]"10275 R_PAREN@16090..16091 ")"10276 WHITESPACE@16091..16092 " "10277 THEN_KW@16092..16096 "then"10278 WHITESPACE@16096..16107 "\n "10279 TRUE_EXPR@16107..1614610280 EXPR_APPLY@16107..1614610281 EXPR_VAR@16107..1611010282 NAME@16107..1611010283 IDENT@16107..16110 "aux"10284 ARGS_DESC@16110..1614610285 L_PAREN@16110..16111 "("10286 ARG@16111..1611210287 EXPR_VAR@16111..1611210288 NAME@16111..1611210289 IDENT@16111..16112 "a"10290 COMMA@16112..16113 ","10291 WHITESPACE@16113..16114 " "10292 ARG@16114..1611510293 EXPR_VAR@16114..1611510294 NAME@16114..1611510295 IDENT@16114..16115 "b"10296 COMMA@16115..16116 ","10297 WHITESPACE@16116..16117 " "10298 ARG@16117..1612210299 EXPR_BINARY@16117..1612210300 LHS_EXPR@16117..1611810301 EXPR_VAR@16117..1611810302 NAME@16117..1611810303 IDENT@16117..16118 "i"10304 WHITESPACE@16118..16119 " "10305 PLUS@16119..16120 "+"10306 WHITESPACE@16120..16121 " "10307 EXPR_NUMBER@16121..1612210308 FLOAT@16121..16122 "1"10309 COMMA@16122..16123 ","10310 WHITESPACE@16123..16124 " "10311 ARG@16124..1612910312 EXPR_BINARY@16124..1612910313 LHS_EXPR@16124..1612510314 EXPR_VAR@16124..1612510315 NAME@16124..1612510316 IDENT@16124..16125 "j"10317 WHITESPACE@16125..16126 " "10318 PLUS@16126..16127 "+"10319 WHITESPACE@16127..16128 " "10320 EXPR_NUMBER@16128..1612910321 FLOAT@16128..16129 "1"10322 COMMA@16129..16130 ","10323 WHITESPACE@16130..16131 " "10324 ARG@16131..1613410325 EXPR_VAR@16131..1613410326 NAME@16131..1613410327 IDENT@16131..16134 "acc"10328 R_PAREN@16134..16135 ")"10329 WHITESPACE@16135..16136 " "10330 TAILSTRICT_KW@16136..16146 "tailstrict"10331 WHITESPACE@16146..16155 "\n "10332 ELSE_KW@16155..16159 "else"10333 WHITESPACE@16159..16160 " "10334 FALSE_EXPR@16160..1630510335 EXPR_IF_THEN_ELSE@16160..1630510336 IF_KW@16160..16162 "if"10337 WHITESPACE@16162..16163 " "10338 EXPR_BINARY@16163..1618610339 LHS_EXPR@16163..1617310340 EXPR_APPLY@16163..1617310341 EXPR_VAR@16163..1616710342 NAME@16163..1616710343 IDENT@16163..16167 "keyF"10344 ARGS_DESC@16167..1617310345 L_PAREN@16167..16168 "("10346 ARG@16168..1617210347 EXPR_INDEX_EXPR@16168..1617210348 LHS_EXPR@16168..1616910349 EXPR_VAR@16168..1616910350 NAME@16168..1616910351 IDENT@16168..16169 "a"10352 L_BRACK@16169..16170 "["10353 EXPR_VAR@16170..1617110354 NAME@16170..1617110355 IDENT@16170..16171 "i"10356 R_BRACK@16171..16172 "]"10357 R_PAREN@16172..16173 ")"10358 WHITESPACE@16173..16174 " "10359 LT@16174..16175 "<"10360 WHITESPACE@16175..16176 " "10361 EXPR_APPLY@16176..1618610362 EXPR_VAR@16176..1618010363 NAME@16176..1618010364 IDENT@16176..16180 "keyF"10365 ARGS_DESC@16180..1618610366 L_PAREN@16180..16181 "("10367 ARG@16181..1618510368 EXPR_INDEX_EXPR@16181..1618510369 LHS_EXPR@16181..1618210370 EXPR_VAR@16181..1618210371 NAME@16181..1618210372 IDENT@16181..16182 "b"10373 L_BRACK@16182..16183 "["10374 EXPR_VAR@16183..1618410375 NAME@16183..1618410376 IDENT@16183..16184 "j"10377 R_BRACK@16184..16185 "]"10378 R_PAREN@16185..16186 ")"10379 WHITESPACE@16186..16187 " "10380 THEN_KW@16187..16191 "then"10381 WHITESPACE@16191..16202 "\n "10382 TRUE_EXPR@16202..1624610383 EXPR_APPLY@16202..1624610384 EXPR_VAR@16202..1620510385 NAME@16202..1620510386 IDENT@16202..16205 "aux"10387 ARGS_DESC@16205..1624610388 L_PAREN@16205..16206 "("10389 ARG@16206..1620710390 EXPR_VAR@16206..1620710391 NAME@16206..1620710392 IDENT@16206..16207 "a"10393 COMMA@16207..16208 ","10394 WHITESPACE@16208..16209 " "10395 ARG@16209..1621010396 EXPR_VAR@16209..1621010397 NAME@16209..1621010398 IDENT@16209..16210 "b"10399 COMMA@16210..16211 ","10400 WHITESPACE@16211..16212 " "10401 ARG@16212..1621710402 EXPR_BINARY@16212..1621710403 LHS_EXPR@16212..1621310404 EXPR_VAR@16212..1621310405 NAME@16212..1621310406 IDENT@16212..16213 "i"10407 WHITESPACE@16213..16214 " "10408 PLUS@16214..16215 "+"10409 WHITESPACE@16215..16216 " "10410 EXPR_NUMBER@16216..1621710411 FLOAT@16216..16217 "1"10412 COMMA@16217..16218 ","10413 WHITESPACE@16218..16219 " "10414 ARG@16219..1622010415 EXPR_VAR@16219..1622010416 NAME@16219..1622010417 IDENT@16219..16220 "j"10418 COMMA@16220..16221 ","10419 WHITESPACE@16221..16222 " "10420 ARG@16222..1623410421 EXPR_BINARY@16222..1623410422 LHS_EXPR@16222..1622510423 EXPR_VAR@16222..1622510424 NAME@16222..1622510425 IDENT@16222..16225 "acc"10426 WHITESPACE@16225..16226 " "10427 PLUS@16226..16227 "+"10428 WHITESPACE@16227..16228 " "10429 EXPR_ARRAY@16228..1623410430 L_BRACK@16228..16229 "["10431 EXPR_INDEX_EXPR@16229..1623310432 LHS_EXPR@16229..1623010433 EXPR_VAR@16229..1623010434 NAME@16229..1623010435 IDENT@16229..16230 "a"10436 L_BRACK@16230..16231 "["10437 EXPR_VAR@16231..1623210438 NAME@16231..1623210439 IDENT@16231..16232 "i"10440 R_BRACK@16232..16233 "]"10441 R_BRACK@16233..16234 "]"10442 R_PAREN@16234..16235 ")"10443 WHITESPACE@16235..16236 " "10444 TAILSTRICT_KW@16236..16246 "tailstrict"10445 WHITESPACE@16246..16255 "\n "10446 ELSE_KW@16255..16259 "else"10447 WHITESPACE@16259..16270 "\n "10448 FALSE_EXPR@16270..1630510449 EXPR_APPLY@16270..1630510450 EXPR_VAR@16270..1627310451 NAME@16270..1627310452 IDENT@16270..16273 "aux"10453 ARGS_DESC@16273..1630510454 L_PAREN@16273..16274 "("10455 ARG@16274..1627510456 EXPR_VAR@16274..1627510457 NAME@16274..1627510458 IDENT@16274..16275 "a"10459 COMMA@16275..16276 ","10460 WHITESPACE@16276..16277 " "10461 ARG@16277..1627810462 EXPR_VAR@16277..1627810463 NAME@16277..1627810464 IDENT@16277..16278 "b"10465 COMMA@16278..16279 ","10466 WHITESPACE@16279..16280 " "10467 ARG@16280..1628110468 EXPR_VAR@16280..1628110469 NAME@16280..1628110470 IDENT@16280..16281 "i"10471 COMMA@16281..16282 ","10472 WHITESPACE@16282..16283 " "10473 ARG@16283..1628810474 EXPR_BINARY@16283..1628810475 LHS_EXPR@16283..1628410476 EXPR_VAR@16283..1628410477 NAME@16283..1628410478 IDENT@16283..16284 "j"10479 WHITESPACE@16284..16285 " "10480 PLUS@16285..16286 "+"10481 WHITESPACE@16286..16287 " "10482 EXPR_NUMBER@16287..1628810483 FLOAT@16287..16288 "1"10484 COMMA@16288..16289 ","10485 WHITESPACE@16289..16290 " "10486 ARG@16290..1629310487 EXPR_VAR@16290..1629310488 NAME@16290..1629310489 IDENT@16290..16293 "acc"10490 R_PAREN@16293..16294 ")"10491 WHITESPACE@16294..16295 " "10492 TAILSTRICT_KW@16295..16305 "tailstrict"10493 SEMI@16305..16306 ";"10494 WHITESPACE@16306..16311 "\n "10495 EXPR_APPLY@16311..1634110496 EXPR_VAR@16311..1631410497 NAME@16311..1631410498 IDENT@16311..16314 "aux"10499 ARGS_DESC@16314..1634110500 L_PAREN@16314..16315 "("10501 ARG@16315..1631610502 EXPR_VAR@16315..1631610503 NAME@16315..1631610504 IDENT@16315..16316 "a"10505 COMMA@16316..16317 ","10506 WHITESPACE@16317..16318 " "10507 ARG@16318..1631910508 EXPR_VAR@16318..1631910509 NAME@16318..1631910510 IDENT@16318..16319 "b"10511 COMMA@16319..16320 ","10512 WHITESPACE@16320..16321 " "10513 ARG@16321..1632210514 EXPR_NUMBER@16321..1632210515 FLOAT@16321..16322 "0"10516 COMMA@16322..16323 ","10517 WHITESPACE@16323..16324 " "10518 ARG@16324..1632510519 EXPR_NUMBER@16324..1632510520 FLOAT@16324..16325 "0"10521 COMMA@16325..16326 ","10522 WHITESPACE@16326..16327 " "10523 ARG@16327..1632910524 EXPR_ARRAY@16327..1632910525 L_BRACK@16327..16328 "["10526 R_BRACK@16328..16329 "]"10527 R_PAREN@16329..16330 ")"10528 WHITESPACE@16330..16331 " "10529 TAILSTRICT_KW@16331..16341 "tailstrict"10530 COMMA@16341..16342 ","10531 WHITESPACE@16342..16346 "\n\n "10532 MEMBER_FIELD@16346..1713410533 FIELD_METHOD@16346..1713410534 FIELD_NAME_FIXED@16346..1635610535 NAME@16346..1635610536 IDENT@16346..16356 "mergePatch"10537 PARAMS_DESC@16356..1637110538 L_PAREN@16356..16357 "("10539 PARAM@16357..1636310540 DESTRUCT_FULL@16357..1636310541 NAME@16357..1636310542 IDENT@16357..16363 "target"10543 COMMA@16363..16364 ","10544 WHITESPACE@16364..16365 " "10545 PARAM@16365..1637010546 DESTRUCT_FULL@16365..1637010547 NAME@16365..1637010548 IDENT@16365..16370 "patch"10549 R_PAREN@16370..16371 ")"10550 COLONCOLON@16371..16373 "::"10551 WHITESPACE@16373..16378 "\n "10552 EXPR_IF_THEN_ELSE@16378..1713410553 IF_KW@16378..16380 "if"10554 WHITESPACE@16380..16381 " "10555 EXPR_APPLY@16381..1640010556 EXPR_INDEX@16381..1639310557 EXPR_VAR@16381..1638410558 NAME@16381..1638410559 IDENT@16381..16384 "std"10560 DOT@16384..16385 "."10561 NAME@16385..1639310562 IDENT@16385..16393 "isObject"10563 ARGS_DESC@16393..1640010564 L_PAREN@16393..16394 "("10565 ARG@16394..1639910566 EXPR_VAR@16394..1639910567 NAME@16394..1639910568 IDENT@16394..16399 "patch"10569 R_PAREN@16399..16400 ")"10570 WHITESPACE@16400..16401 " "10571 THEN_KW@16401..16405 "then"10572 WHITESPACE@16405..16412 "\n "10573 TRUE_EXPR@16412..1711310574 EXPR_LOCAL@16412..1711310575 LOCAL_KW@16412..16417 "local"10576 WHITESPACE@16417..16418 " "10577 BIND_DESTRUCT@16418..1648510578 DESTRUCT_FULL@16418..1643110579 NAME@16418..1643110580 IDENT@16418..16431 "target_object"10581 WHITESPACE@16431..16432 " "10582 ASSIGN@16432..16433 "="10583 WHITESPACE@16433..16442 "\n "10584 EXPR_IF_THEN_ELSE@16442..1648510585 IF_KW@16442..16444 "if"10586 WHITESPACE@16444..16445 " "10587 EXPR_APPLY@16445..1646510588 EXPR_INDEX@16445..1645710589 EXPR_VAR@16445..1644810590 NAME@16445..1644810591 IDENT@16445..16448 "std"10592 DOT@16448..16449 "."10593 NAME@16449..1645710594 IDENT@16449..16457 "isObject"10595 ARGS_DESC@16457..1646510596 L_PAREN@16457..16458 "("10597 ARG@16458..1646410598 EXPR_VAR@16458..1646410599 NAME@16458..1646410600 IDENT@16458..16464 "target"10601 R_PAREN@16464..16465 ")"10602 WHITESPACE@16465..16466 " "10603 THEN_KW@16466..16470 "then"10604 WHITESPACE@16470..16471 " "10605 TRUE_EXPR@16471..1647710606 EXPR_VAR@16471..1647710607 NAME@16471..1647710608 IDENT@16471..16477 "target"10609 WHITESPACE@16477..16478 " "10610 ELSE_KW@16478..16482 "else"10611 WHITESPACE@16482..16483 " "10612 FALSE_EXPR@16483..1648510613 EXPR_OBJECT@16483..1648510614 OBJ_BODY_MEMBER_LIST@16483..1648510615 L_BRACE@16483..16484 "{"10616 R_BRACE@16484..16485 "}"10617 SEMI@16485..16486 ";"10618 WHITESPACE@16486..16494 "\n\n "10619 EXPR_LOCAL@16494..1711310620 LOCAL_KW@16494..16499 "local"10621 WHITESPACE@16499..16500 " "10622 BIND_DESTRUCT@16500..1659910623 DESTRUCT_FULL@16500..1651310624 NAME@16500..1651310625 IDENT@16500..16513 "target_fields"10626 WHITESPACE@16513..16514 " "10627 ASSIGN@16514..16515 "="10628 WHITESPACE@16515..16524 "\n "10629 EXPR_IF_THEN_ELSE@16524..1659910630 IF_KW@16524..16526 "if"10631 WHITESPACE@16526..16527 " "10632 EXPR_APPLY@16527..1655410633 EXPR_INDEX@16527..1653910634 EXPR_VAR@16527..1653010635 NAME@16527..1653010636 IDENT@16527..16530 "std"10637 DOT@16530..16531 "."10638 NAME@16531..1653910639 IDENT@16531..16539 "isObject"10640 ARGS_DESC@16539..1655410641 L_PAREN@16539..16540 "("10642 ARG@16540..1655310643 EXPR_VAR@16540..1655310644 NAME@16540..1655310645 IDENT@16540..16553 "target_object"10646 R_PAREN@16553..16554 ")"10647 WHITESPACE@16554..16555 " "10648 THEN_KW@16555..16559 "then"10649 WHITESPACE@16559..16560 " "10650 TRUE_EXPR@16560..1659110651 EXPR_APPLY@16560..1659110652 EXPR_INDEX@16560..1657610653 EXPR_VAR@16560..1656310654 NAME@16560..1656310655 IDENT@16560..16563 "std"10656 DOT@16563..16564 "."10657 NAME@16564..1657610658 IDENT@16564..16576 "objectFields"10659 ARGS_DESC@16576..1659110660 L_PAREN@16576..16577 "("10661 ARG@16577..1659010662 EXPR_VAR@16577..1659010663 NAME@16577..1659010664 IDENT@16577..16590 "target_object"10665 R_PAREN@16590..16591 ")"10666 WHITESPACE@16591..16592 " "10667 ELSE_KW@16592..16596 "else"10668 WHITESPACE@16596..16597 " "10669 FALSE_EXPR@16597..1659910670 EXPR_ARRAY@16597..1659910671 L_BRACK@16597..16598 "["10672 R_BRACK@16598..16599 "]"10673 SEMI@16599..16600 ";"10674 WHITESPACE@16600..16608 "\n\n "10675 EXPR_LOCAL@16608..1711310676 LOCAL_KW@16608..16613 "local"10677 WHITESPACE@16613..16614 " "10678 BIND_DESTRUCT@16614..1668410679 DESTRUCT_FULL@16614..1662510680 NAME@16614..1662510681 IDENT@16614..16625 "null_fields"10682 WHITESPACE@16625..16626 " "10683 ASSIGN@16626..16627 "="10684 WHITESPACE@16627..16628 " "10685 EXPR_ARRAY_COMP@16628..1668410686 L_BRACK@16628..16629 "["10687 EXPR_VAR@16629..1663010688 NAME@16629..1663010689 IDENT@16629..16630 "k"10690 WHITESPACE@16630..16631 " "10691 FOR_SPEC@16631..1666310692 FOR_KW@16631..16634 "for"10693 WHITESPACE@16634..16635 " "10694 NAME@16635..1663610695 IDENT@16635..16636 "k"10696 WHITESPACE@16636..16637 " "10697 IN_KW@16637..16639 "in"10698 WHITESPACE@16639..16640 " "10699 EXPR_APPLY@16640..1666310700 EXPR_INDEX@16640..1665610701 EXPR_VAR@16640..1664310702 NAME@16640..1664310703 IDENT@16640..16643 "std"10704 DOT@16643..16644 "."10705 NAME@16644..1665610706 IDENT@16644..16656 "objectFields"10707 ARGS_DESC@16656..1666310708 L_PAREN@16656..16657 "("10709 ARG@16657..1666210710 EXPR_VAR@16657..1666210711 NAME@16657..1666210712 IDENT@16657..16662 "patch"10713 R_PAREN@16662..16663 ")"10714 WHITESPACE@16663..16664 " "10715 IF_SPEC@16664..1668310716 IF_KW@16664..16666 "if"10717 WHITESPACE@16666..16667 " "10718 EXPR_BINARY@16667..1668310719 LHS_EXPR@16667..1667510720 EXPR_INDEX_EXPR@16667..1667510721 LHS_EXPR@16667..1667210722 EXPR_VAR@16667..1667210723 NAME@16667..1667210724 IDENT@16667..16672 "patch"10725 L_BRACK@16672..16673 "["10726 EXPR_VAR@16673..1667410727 NAME@16673..1667410728 IDENT@16673..16674 "k"10729 R_BRACK@16674..16675 "]"10730 WHITESPACE@16675..16676 " "10731 EQ@16676..16678 "=="10732 WHITESPACE@16678..16679 " "10733 EXPR_LITERAL@16679..1668310734 NULL_KW@16679..16683 "null"10735 R_BRACK@16683..16684 "]"10736 SEMI@16684..16685 ";"10737 WHITESPACE@16685..16692 "\n "10738 EXPR_LOCAL@16692..1711310739 LOCAL_KW@16692..16697 "local"10740 WHITESPACE@16697..16698 " "10741 BIND_DESTRUCT@16698..1676410742 DESTRUCT_FULL@16698..1670910743 NAME@16698..1670910744 IDENT@16698..16709 "both_fields"10745 WHITESPACE@16709..16710 " "10746 ASSIGN@16710..16711 "="10747 WHITESPACE@16711..16712 " "10748 EXPR_APPLY@16712..1676410749 EXPR_INDEX@16712..1672410750 EXPR_VAR@16712..1671510751 NAME@16712..1671510752 IDENT@16712..16715 "std"10753 DOT@16715..16716 "."10754 NAME@16716..1672410755 IDENT@16716..16724 "setUnion"10756 ARGS_DESC@16724..1676410757 L_PAREN@16724..16725 "("10758 ARG@16725..1673810759 EXPR_VAR@16725..1673810760 NAME@16725..1673810761 IDENT@16725..16738 "target_fields"10762 COMMA@16738..16739 ","10763 WHITESPACE@16739..16740 " "10764 ARG@16740..1676310765 EXPR_APPLY@16740..1676310766 EXPR_INDEX@16740..1675610767 EXPR_VAR@16740..1674310768 NAME@16740..1674310769 IDENT@16740..16743 "std"10770 DOT@16743..16744 "."10771 NAME@16744..1675610772 IDENT@16744..16756 "objectFields"10773 ARGS_DESC@16756..1676310774 L_PAREN@16756..16757 "("10775 ARG@16757..1676210776 EXPR_VAR@16757..1676210777 NAME@16757..1676210778 IDENT@16757..16762 "patch"10779 R_PAREN@16762..16763 ")"10780 R_PAREN@16763..16764 ")"10781 SEMI@16764..16765 ";"10782 WHITESPACE@16765..16773 "\n\n "10783 EXPR_OBJECT@16773..1711310784 OBJ_BODY_MEMBER_LIST@16773..1711310785 L_BRACE@16773..16774 "{"10786 WHITESPACE@16774..16783 "\n "10787 MEMBER_FIELD@16783..1710510788 FIELD_NORMAL@16783..1705010789 FIELD_NAME_DYNAMIC@16783..1678610790 L_BRACK@16783..16784 "["10791 EXPR_VAR@16784..1678510792 NAME@16784..1678510793 IDENT@16784..16785 "k"10794 R_BRACK@16785..16786 "]"10795 COLON@16786..16787 ":"10796 WHITESPACE@16787..16798 "\n "10797 EXPR_IF_THEN_ELSE@16798..1705010798 IF_KW@16798..16800 "if"10799 WHITESPACE@16800..16801 " "10800 EXPR_UNARY@16801..1682510801 NOT@16801..16802 "!"10802 EXPR_APPLY@16802..1682510803 EXPR_INDEX@16802..1681510804 EXPR_VAR@16802..1680510805 NAME@16802..1680510806 IDENT@16802..16805 "std"10807 DOT@16805..16806 "."10808 NAME@16806..1681510809 IDENT@16806..16815 "objectHas"10810 ARGS_DESC@16815..1682510811 L_PAREN@16815..16816 "("10812 ARG@16816..1682110813 EXPR_VAR@16816..1682110814 NAME@16816..1682110815 IDENT@16816..16821 "patch"10816 COMMA@16821..16822 ","10817 WHITESPACE@16822..16823 " "10818 ARG@16823..1682410819 EXPR_VAR@16823..1682410820 NAME@16823..1682410821 IDENT@16823..16824 "k"10822 R_PAREN@16824..16825 ")"10823 WHITESPACE@16825..16826 " "10824 THEN_KW@16826..16830 "then"10825 WHITESPACE@16830..16843 "\n "10826 TRUE_EXPR@16843..1685910827 EXPR_INDEX_EXPR@16843..1685910828 LHS_EXPR@16843..1685610829 EXPR_VAR@16843..1685610830 NAME@16843..1685610831 IDENT@16843..16856 "target_object"10832 L_BRACK@16856..16857 "["10833 EXPR_VAR@16857..1685810834 NAME@16857..1685810835 IDENT@16857..16858 "k"10836 R_BRACK@16858..16859 "]"10837 WHITESPACE@16859..16870 "\n "10838 ELSE_KW@16870..16874 "else"10839 WHITESPACE@16874..16875 " "10840 FALSE_EXPR@16875..1705010841 EXPR_IF_THEN_ELSE@16875..1705010842 IF_KW@16875..16877 "if"10843 WHITESPACE@16877..16878 " "10844 EXPR_UNARY@16878..1691010845 NOT@16878..16879 "!"10846 EXPR_APPLY@16879..1691010847 EXPR_INDEX@16879..1689210848 EXPR_VAR@16879..1688210849 NAME@16879..1688210850 IDENT@16879..16882 "std"10851 DOT@16882..16883 "."10852 NAME@16883..1689210853 IDENT@16883..16892 "objectHas"10854 ARGS_DESC@16892..1691010855 L_PAREN@16892..16893 "("10856 ARG@16893..1690610857 EXPR_VAR@16893..1690610858 NAME@16893..1690610859 IDENT@16893..16906 "target_object"10860 COMMA@16906..16907 ","10861 WHITESPACE@16907..16908 " "10862 ARG@16908..1690910863 EXPR_VAR@16908..1690910864 NAME@16908..1690910865 IDENT@16908..16909 "k"10866 R_PAREN@16909..16910 ")"10867 WHITESPACE@16910..16911 " "10868 THEN_KW@16911..16915 "then"10869 WHITESPACE@16915..16928 "\n "10870 TRUE_EXPR@16928..1696910871 EXPR_APPLY@16928..1696910872 EXPR_INDEX@16928..1694210873 EXPR_VAR@16928..1693110874 NAME@16928..1693110875 IDENT@16928..16931 "std"10876 DOT@16931..16932 "."10877 NAME@16932..1694210878 IDENT@16932..16942 "mergePatch"10879 ARGS_DESC@16942..1696910880 L_PAREN@16942..16943 "("10881 ARG@16943..1694710882 EXPR_LITERAL@16943..1694710883 NULL_KW@16943..16947 "null"10884 COMMA@16947..16948 ","10885 WHITESPACE@16948..16949 " "10886 ARG@16949..1695710887 EXPR_INDEX_EXPR@16949..1695710888 LHS_EXPR@16949..1695410889 EXPR_VAR@16949..1695410890 NAME@16949..1695410891 IDENT@16949..16954 "patch"10892 L_BRACK@16954..16955 "["10893 EXPR_VAR@16955..1695610894 NAME@16955..1695610895 IDENT@16955..16956 "k"10896 R_BRACK@16956..16957 "]"10897 R_PAREN@16957..16958 ")"10898 WHITESPACE@16958..16959 " "10899 TAILSTRICT_KW@16959..16969 "tailstrict"10900 WHITESPACE@16969..16980 "\n "10901 ELSE_KW@16980..16984 "else"10902 WHITESPACE@16984..16997 "\n "10903 FALSE_EXPR@16997..1705010904 EXPR_APPLY@16997..1705010905 EXPR_INDEX@16997..1701110906 EXPR_VAR@16997..1700010907 NAME@16997..1700010908 IDENT@16997..17000 "std"10909 DOT@17000..17001 "."10910 NAME@17001..1701110911 IDENT@17001..17011 "mergePatch"10912 ARGS_DESC@17011..1705010913 L_PAREN@17011..17012 "("10914 ARG@17012..1702810915 EXPR_INDEX_EXPR@17012..1702810916 LHS_EXPR@17012..1702510917 EXPR_VAR@17012..1702510918 NAME@17012..1702510919 IDENT@17012..17025 "target_object"10920 L_BRACK@17025..17026 "["10921 EXPR_VAR@17026..1702710922 NAME@17026..1702710923 IDENT@17026..17027 "k"10924 R_BRACK@17027..17028 "]"10925 COMMA@17028..17029 ","10926 WHITESPACE@17029..17030 " "10927 ARG@17030..1703810928 EXPR_INDEX_EXPR@17030..1703810929 LHS_EXPR@17030..1703510930 EXPR_VAR@17030..1703510931 NAME@17030..1703510932 IDENT@17030..17035 "patch"10933 L_BRACK@17035..17036 "["10934 EXPR_VAR@17036..1703710935 NAME@17036..1703710936 IDENT@17036..17037 "k"10937 R_BRACK@17037..17038 "]"10938 R_PAREN@17038..17039 ")"10939 WHITESPACE@17039..17040 " "10940 TAILSTRICT_KW@17040..17050 "tailstrict"10941 WHITESPACE@17050..17059 "\n "10942 FOR_SPEC@17059..1710510943 FOR_KW@17059..17062 "for"10944 WHITESPACE@17062..17063 " "10945 NAME@17063..1706410946 IDENT@17063..17064 "k"10947 WHITESPACE@17064..17065 " "10948 IN_KW@17065..17067 "in"10949 WHITESPACE@17067..17068 " "10950 EXPR_APPLY@17068..1710510951 EXPR_INDEX@17068..1707910952 EXPR_VAR@17068..1707110953 NAME@17068..1707110954 IDENT@17068..17071 "std"10955 DOT@17071..17072 "."10956 NAME@17072..1707910957 IDENT@17072..17079 "setDiff"10958 ARGS_DESC@17079..1710510959 L_PAREN@17079..17080 "("10960 ARG@17080..1709110961 EXPR_VAR@17080..1709110962 NAME@17080..1709110963 IDENT@17080..17091 "both_fields"10964 COMMA@17091..17092 ","10965 WHITESPACE@17092..17093 " "10966 ARG@17093..1710410967 EXPR_VAR@17093..1710410968 NAME@17093..1710410969 IDENT@17093..17104 "null_fields"10970 R_PAREN@17104..17105 ")"10971 WHITESPACE@17105..17112 "\n "10972 R_BRACE@17112..17113 "}"10973 WHITESPACE@17113..17118 "\n "10974 ELSE_KW@17118..17122 "else"10975 WHITESPACE@17122..17129 "\n "10976 FALSE_EXPR@17129..1713410977 EXPR_VAR@17129..1713410978 NAME@17129..1713410979 IDENT@17129..17134 "patch"10980 COMMA@17134..17135 ","10981 WHITESPACE@17135..17139 "\n\n "10982 MEMBER_FIELD@17139..1724910983 FIELD_METHOD@17139..1724910984 FIELD_NAME_FIXED@17139..1714210985 NAME@17139..1714210986 IDENT@17139..17142 "get"10987 PARAMS_DESC@17142..1718310988 L_PAREN@17142..17143 "("10989 PARAM@17143..1714410990 DESTRUCT_FULL@17143..1714410991 NAME@17143..1714410992 IDENT@17143..17144 "o"10993 COMMA@17144..17145 ","10994 WHITESPACE@17145..17146 " "10995 PARAM@17146..1714710996 DESTRUCT_FULL@17146..1714710997 NAME@17146..1714710998 IDENT@17146..17147 "f"10999 COMMA@17147..17148 ","11000 WHITESPACE@17148..17149 " "11001 PARAM@17149..1716311002 DESTRUCT_FULL@17149..1715611003 NAME@17149..1715611004 IDENT@17149..17156 "default"11005 WHITESPACE@17156..17157 " "11006 ASSIGN@17157..17158 "="11007 WHITESPACE@17158..17159 " "11008 EXPR_LITERAL@17159..1716311009 NULL_KW@17159..17163 "null"11010 COMMA@17163..17164 ","11011 WHITESPACE@17164..17165 " "11012 PARAM@17165..1718211013 DESTRUCT_FULL@17165..1717511014 NAME@17165..1717511015 IDENT@17165..17175 "inc_hidden"11016 WHITESPACE@17175..17176 " "11017 ASSIGN@17176..17177 "="11018 WHITESPACE@17177..17178 " "11019 EXPR_LITERAL@17178..1718211020 TRUE_KW@17178..17182 "true"11021 R_PAREN@17182..17183 ")"11022 COLONCOLON@17183..17185 "::"11023 WHITESPACE@17185..17190 "\n "11024 EXPR_IF_THEN_ELSE@17190..1724911025 IF_KW@17190..17192 "if"11026 WHITESPACE@17192..17193 " "11027 EXPR_APPLY@17193..1722611028 EXPR_INDEX@17193..1720811029 EXPR_VAR@17193..1719611030 NAME@17193..1719611031 IDENT@17193..17196 "std"11032 DOT@17196..17197 "."11033 NAME@17197..1720811034 IDENT@17197..17208 "objectHasEx"11035 ARGS_DESC@17208..1722611036 L_PAREN@17208..17209 "("11037 ARG@17209..1721011038 EXPR_VAR@17209..1721011039 NAME@17209..1721011040 IDENT@17209..17210 "o"11041 COMMA@17210..17211 ","11042 WHITESPACE@17211..17212 " "11043 ARG@17212..1721311044 EXPR_VAR@17212..1721311045 NAME@17212..1721311046 IDENT@17212..17213 "f"11047 COMMA@17213..17214 ","11048 WHITESPACE@17214..17215 " "11049 ARG@17215..1722511050 EXPR_VAR@17215..1722511051 NAME@17215..1722511052 IDENT@17215..17225 "inc_hidden"11053 R_PAREN@17225..17226 ")"11054 WHITESPACE@17226..17227 " "11055 THEN_KW@17227..17231 "then"11056 WHITESPACE@17231..17232 " "11057 TRUE_EXPR@17232..1723611058 EXPR_INDEX_EXPR@17232..1723611059 LHS_EXPR@17232..1723311060 EXPR_VAR@17232..1723311061 NAME@17232..1723311062 IDENT@17232..17233 "o"11063 L_BRACK@17233..17234 "["11064 EXPR_VAR@17234..1723511065 NAME@17234..1723511066 IDENT@17234..17235 "f"11067 R_BRACK@17235..17236 "]"11068 WHITESPACE@17236..17237 " "11069 ELSE_KW@17237..17241 "else"11070 WHITESPACE@17241..17242 " "11071 FALSE_EXPR@17242..1724911072 EXPR_VAR@17242..1724911073 NAME@17242..1724911074 IDENT@17242..17249 "default"11075 COMMA@17249..17250 ","11076 WHITESPACE@17250..17254 "\n\n "11077 MEMBER_FIELD@17254..1730411078 FIELD_METHOD@17254..1730411079 FIELD_NAME_FIXED@17254..1726611080 NAME@17254..1726611081 IDENT@17254..17266 "objectFields"11082 PARAMS_DESC@17266..1726911083 L_PAREN@17266..17267 "("11084 PARAM@17267..1726811085 DESTRUCT_FULL@17267..1726811086 NAME@17267..1726811087 IDENT@17267..17268 "o"11088 R_PAREN@17268..17269 ")"11089 COLONCOLON@17269..17271 "::"11090 WHITESPACE@17271..17276 "\n "11091 EXPR_APPLY@17276..1730411092 EXPR_INDEX@17276..1729411093 EXPR_VAR@17276..1727911094 NAME@17276..1727911095 IDENT@17276..17279 "std"11096 DOT@17279..17280 "."11097 NAME@17280..1729411098 IDENT@17280..17294 "objectFieldsEx"11099 ARGS_DESC@17294..1730411100 L_PAREN@17294..17295 "("11101 ARG@17295..1729611102 EXPR_VAR@17295..1729611103 NAME@17295..1729611104 IDENT@17295..17296 "o"11105 COMMA@17296..17297 ","11106 WHITESPACE@17297..17298 " "11107 ARG@17298..1730311108 EXPR_LITERAL@17298..1730311109 FALSE_KW@17298..17303 "false"11110 R_PAREN@17303..17304 ")"11111 COMMA@17304..17305 ","11112 WHITESPACE@17305..17309 "\n\n "11113 MEMBER_FIELD@17309..1736111114 FIELD_METHOD@17309..1736111115 FIELD_NAME_FIXED@17309..1732411116 NAME@17309..1732411117 IDENT@17309..17324 "objectFieldsAll"11118 PARAMS_DESC@17324..1732711119 L_PAREN@17324..17325 "("11120 PARAM@17325..1732611121 DESTRUCT_FULL@17325..1732611122 NAME@17325..1732611123 IDENT@17325..17326 "o"11124 R_PAREN@17326..17327 ")"11125 COLONCOLON@17327..17329 "::"11126 WHITESPACE@17329..17334 "\n "11127 EXPR_APPLY@17334..1736111128 EXPR_INDEX@17334..1735211129 EXPR_VAR@17334..1733711130 NAME@17334..1733711131 IDENT@17334..17337 "std"11132 DOT@17337..17338 "."11133 NAME@17338..1735211134 IDENT@17338..17352 "objectFieldsEx"11135 ARGS_DESC@17352..1736111136 L_PAREN@17352..17353 "("11137 ARG@17353..1735411138 EXPR_VAR@17353..1735411139 NAME@17353..1735411140 IDENT@17353..17354 "o"11141 COMMA@17354..17355 ","11142 WHITESPACE@17355..17356 " "11143 ARG@17356..1736011144 EXPR_LITERAL@17356..1736011145 TRUE_KW@17356..17360 "true"11146 R_PAREN@17360..17361 ")"11147 COMMA@17361..17362 ","11148 WHITESPACE@17362..17366 "\n\n "11149 MEMBER_FIELD@17366..1741611150 FIELD_METHOD@17366..1741611151 FIELD_NAME_FIXED@17366..1737511152 NAME@17366..1737511153 IDENT@17366..17375 "objectHas"11154 PARAMS_DESC@17375..1738111155 L_PAREN@17375..17376 "("11156 PARAM@17376..1737711157 DESTRUCT_FULL@17376..1737711158 NAME@17376..1737711159 IDENT@17376..17377 "o"11160 COMMA@17377..17378 ","11161 WHITESPACE@17378..17379 " "11162 PARAM@17379..1738011163 DESTRUCT_FULL@17379..1738011164 NAME@17379..1738011165 IDENT@17379..17380 "f"11166 R_PAREN@17380..17381 ")"11167 COLONCOLON@17381..17383 "::"11168 WHITESPACE@17383..17388 "\n "11169 EXPR_APPLY@17388..1741611170 EXPR_INDEX@17388..1740311171 EXPR_VAR@17388..1739111172 NAME@17388..1739111173 IDENT@17388..17391 "std"11174 DOT@17391..17392 "."11175 NAME@17392..1740311176 IDENT@17392..17403 "objectHasEx"11177 ARGS_DESC@17403..1741611178 L_PAREN@17403..17404 "("11179 ARG@17404..1740511180 EXPR_VAR@17404..1740511181 NAME@17404..1740511182 IDENT@17404..17405 "o"11183 COMMA@17405..17406 ","11184 WHITESPACE@17406..17407 " "11185 ARG@17407..1740811186 EXPR_VAR@17407..1740811187 NAME@17407..1740811188 IDENT@17407..17408 "f"11189 COMMA@17408..17409 ","11190 WHITESPACE@17409..17410 " "11191 ARG@17410..1741511192 EXPR_LITERAL@17410..1741511193 FALSE_KW@17410..17415 "false"11194 R_PAREN@17415..17416 ")"11195 COMMA@17416..17417 ","11196 WHITESPACE@17417..17421 "\n\n "11197 MEMBER_FIELD@17421..1747311198 FIELD_METHOD@17421..1747311199 FIELD_NAME_FIXED@17421..1743311200 NAME@17421..1743311201 IDENT@17421..17433 "objectHasAll"11202 PARAMS_DESC@17433..1743911203 L_PAREN@17433..17434 "("11204 PARAM@17434..1743511205 DESTRUCT_FULL@17434..1743511206 NAME@17434..1743511207 IDENT@17434..17435 "o"11208 COMMA@17435..17436 ","11209 WHITESPACE@17436..17437 " "11210 PARAM@17437..1743811211 DESTRUCT_FULL@17437..1743811212 NAME@17437..1743811213 IDENT@17437..17438 "f"11214 R_PAREN@17438..17439 ")"11215 COLONCOLON@17439..17441 "::"11216 WHITESPACE@17441..17446 "\n "11217 EXPR_APPLY@17446..1747311218 EXPR_INDEX@17446..1746111219 EXPR_VAR@17446..1744911220 NAME@17446..1744911221 IDENT@17446..17449 "std"11222 DOT@17449..17450 "."11223 NAME@17450..1746111224 IDENT@17450..17461 "objectHasEx"11225 ARGS_DESC@17461..1747311226 L_PAREN@17461..17462 "("11227 ARG@17462..1746311228 EXPR_VAR@17462..1746311229 NAME@17462..1746311230 IDENT@17462..17463 "o"11231 COMMA@17463..17464 ","11232 WHITESPACE@17464..17465 " "11233 ARG@17465..1746611234 EXPR_VAR@17465..1746611235 NAME@17465..1746611236 IDENT@17465..17466 "f"11237 COMMA@17466..17467 ","11238 WHITESPACE@17467..17468 " "11239 ARG@17468..1747211240 EXPR_LITERAL@17468..1747211241 TRUE_KW@17468..17472 "true"11242 R_PAREN@17472..17473 ")"11243 COMMA@17473..17474 ","11244 WHITESPACE@17474..17478 "\n\n "11245 MEMBER_FIELD@17478..1753511246 FIELD_METHOD@17478..1753511247 FIELD_NAME_FIXED@17478..1749011248 NAME@17478..1749011249 IDENT@17478..17490 "objectValues"11250 PARAMS_DESC@17490..1749311251 L_PAREN@17490..17491 "("11252 PARAM@17491..1749211253 DESTRUCT_FULL@17491..1749211254 NAME@17491..1749211255 IDENT@17491..17492 "o"11256 R_PAREN@17492..17493 ")"11257 COLONCOLON@17493..17495 "::"11258 WHITESPACE@17495..17500 "\n "11259 EXPR_ARRAY_COMP@17500..1753511260 L_BRACK@17500..17501 "["11261 EXPR_INDEX_EXPR@17501..1750511262 LHS_EXPR@17501..1750211263 EXPR_VAR@17501..1750211264 NAME@17501..1750211265 IDENT@17501..17502 "o"11266 L_BRACK@17502..17503 "["11267 EXPR_VAR@17503..1750411268 NAME@17503..1750411269 IDENT@17503..17504 "k"11270 R_BRACK@17504..17505 "]"11271 WHITESPACE@17505..17506 " "11272 FOR_SPEC@17506..1753411273 FOR_KW@17506..17509 "for"11274 WHITESPACE@17509..17510 " "11275 NAME@17510..1751111276 IDENT@17510..17511 "k"11277 WHITESPACE@17511..17512 " "11278 IN_KW@17512..17514 "in"11279 WHITESPACE@17514..17515 " "11280 EXPR_APPLY@17515..1753411281 EXPR_INDEX@17515..1753111282 EXPR_VAR@17515..1751811283 NAME@17515..1751811284 IDENT@17515..17518 "std"11285 DOT@17518..17519 "."11286 NAME@17519..1753111287 IDENT@17519..17531 "objectFields"11288 ARGS_DESC@17531..1753411289 L_PAREN@17531..17532 "("11290 ARG@17532..1753311291 EXPR_VAR@17532..1753311292 NAME@17532..1753311293 IDENT@17532..17533 "o"11294 R_PAREN@17533..17534 ")"11295 R_BRACK@17534..17535 "]"11296 COMMA@17535..17536 ","11297 WHITESPACE@17536..17540 "\n\n "11298 MEMBER_FIELD@17540..1760311299 FIELD_METHOD@17540..1760311300 FIELD_NAME_FIXED@17540..1755511301 NAME@17540..1755511302 IDENT@17540..17555 "objectValuesAll"11303 PARAMS_DESC@17555..1755811304 L_PAREN@17555..17556 "("11305 PARAM@17556..1755711306 DESTRUCT_FULL@17556..1755711307 NAME@17556..1755711308 IDENT@17556..17557 "o"11309 R_PAREN@17557..17558 ")"11310 COLONCOLON@17558..17560 "::"11311 WHITESPACE@17560..17565 "\n "11312 EXPR_ARRAY_COMP@17565..1760311313 L_BRACK@17565..17566 "["11314 EXPR_INDEX_EXPR@17566..1757011315 LHS_EXPR@17566..1756711316 EXPR_VAR@17566..1756711317 NAME@17566..1756711318 IDENT@17566..17567 "o"11319 L_BRACK@17567..17568 "["11320 EXPR_VAR@17568..1756911321 NAME@17568..1756911322 IDENT@17568..17569 "k"11323 R_BRACK@17569..17570 "]"11324 WHITESPACE@17570..17571 " "11325 FOR_SPEC@17571..1760211326 FOR_KW@17571..17574 "for"11327 WHITESPACE@17574..17575 " "11328 NAME@17575..1757611329 IDENT@17575..17576 "k"11330 WHITESPACE@17576..17577 " "11331 IN_KW@17577..17579 "in"11332 WHITESPACE@17579..17580 " "11333 EXPR_APPLY@17580..1760211334 EXPR_INDEX@17580..1759911335 EXPR_VAR@17580..1758311336 NAME@17580..1758311337 IDENT@17580..17583 "std"11338 DOT@17583..17584 "."11339 NAME@17584..1759911340 IDENT@17584..17599 "objectFieldsAll"11341 ARGS_DESC@17599..1760211342 L_PAREN@17599..17600 "("11343 ARG@17600..1760111344 EXPR_VAR@17600..1760111345 NAME@17600..1760111346 IDENT@17600..17601 "o"11347 R_PAREN@17601..17602 ")"11348 R_BRACK@17602..17603 "]"11349 COMMA@17603..17604 ","11350 WHITESPACE@17604..17608 "\n\n "11351 MEMBER_FIELD@17608..1763511352 FIELD_NORMAL@17608..1763511353 FIELD_NAME_FIXED@17608..1761411354 NAME@17608..1761411355 IDENT@17608..17614 "equals"11356 COLONCOLON@17614..17616 "::"11357 WHITESPACE@17616..17617 " "11358 EXPR_INTRINSIC@17617..1763511359 INTRINSIC@17617..17627 "$intrinsic"11360 L_PAREN@17627..17628 "("11361 NAME@17628..1763411362 IDENT@17628..17634 "equals"11363 R_PAREN@17634..17635 ")"11364 COMMA@17635..17636 ","11365 WHITESPACE@17636..17640 "\n\n "11366 MEMBER_FIELD@17640..1777411367 FIELD_METHOD@17640..1777411368 FIELD_NAME_FIXED@17640..1765111369 NAME@17640..1765111370 IDENT@17640..17651 "resolvePath"11371 PARAMS_DESC@17651..1765711372 L_PAREN@17651..17652 "("11373 PARAM@17652..1765311374 DESTRUCT_FULL@17652..1765311375 NAME@17652..1765311376 IDENT@17652..17653 "f"11377 COMMA@17653..17654 ","11378 WHITESPACE@17654..17655 " "11379 PARAM@17655..1765611380 DESTRUCT_FULL@17655..1765611381 NAME@17655..1765611382 IDENT@17655..17656 "r"11383 R_PAREN@17656..17657 ")"11384 COLONCOLON@17657..17659 "::"11385 WHITESPACE@17659..17664 "\n "11386 EXPR_LOCAL@17664..1777411387 LOCAL_KW@17664..17669 "local"11388 WHITESPACE@17669..17670 " "11389 BIND_DESTRUCT@17670..1769311390 DESTRUCT_FULL@17670..1767311391 NAME@17670..1767311392 IDENT@17670..17673 "arr"11393 WHITESPACE@17673..17674 " "11394 ASSIGN@17674..17675 "="11395 WHITESPACE@17675..17676 " "11396 EXPR_APPLY@17676..1769311397 EXPR_INDEX@17676..1768511398 EXPR_VAR@17676..1767911399 NAME@17676..1767911400 IDENT@17676..17679 "std"11401 DOT@17679..17680 "."11402 NAME@17680..1768511403 IDENT@17680..17685 "split"11404 ARGS_DESC@17685..1769311405 L_PAREN@17685..17686 "("11406 ARG@17686..1768711407 EXPR_VAR@17686..1768711408 NAME@17686..1768711409 IDENT@17686..17687 "f"11410 COMMA@17687..17688 ","11411 WHITESPACE@17688..17689 " "11412 ARG@17689..1769211413 EXPR_STRING@17689..1769211414 STRING_SINGLE@17689..17692 "'/'"11415 R_PAREN@17692..17693 ")"11416 SEMI@17693..17694 ";"11417 WHITESPACE@17694..17699 "\n "11418 EXPR_APPLY@17699..1777411419 EXPR_INDEX@17699..1770711420 EXPR_VAR@17699..1770211421 NAME@17699..1770211422 IDENT@17699..17702 "std"11423 DOT@17702..17703 "."11424 NAME@17703..1770711425 IDENT@17703..17707 "join"11426 ARGS_DESC@17707..1777411427 L_PAREN@17707..17708 "("11428 ARG@17708..1771111429 EXPR_STRING@17708..1771111430 STRING_SINGLE@17708..17711 "'/'"11431 COMMA@17711..17712 ","11432 WHITESPACE@17712..17713 " "11433 ARG@17713..1777311434 EXPR_BINARY@17713..1777311435 LHS_EXPR@17713..1776711436 EXPR_APPLY@17713..1776711437 EXPR_INDEX@17713..1772611438 EXPR_VAR@17713..1771611439 NAME@17713..1771611440 IDENT@17713..17716 "std"11441 DOT@17716..17717 "."11442 NAME@17717..1772611443 IDENT@17717..17726 "makeArray"11444 ARGS_DESC@17726..1776711445 L_PAREN@17726..17727 "("11446 ARG@17727..1774611447 EXPR_BINARY@17727..1774611448 LHS_EXPR@17727..1774211449 EXPR_APPLY@17727..1774211450 EXPR_INDEX@17727..1773711451 EXPR_VAR@17727..1773011452 NAME@17727..1773011453 IDENT@17727..17730 "std"11454 DOT@17730..17731 "."11455 NAME@17731..1773711456 IDENT@17731..17737 "length"11457 ARGS_DESC@17737..1774211458 L_PAREN@17737..17738 "("11459 ARG@17738..1774111460 EXPR_VAR@17738..1774111461 NAME@17738..1774111462 IDENT@17738..17741 "arr"11463 R_PAREN@17741..17742 ")"11464 WHITESPACE@17742..17743 " "11465 MINUS@17743..17744 "-"11466 WHITESPACE@17744..17745 " "11467 EXPR_NUMBER@17745..1774611468 FLOAT@17745..17746 "1"11469 COMMA@17746..17747 ","11470 WHITESPACE@17747..17748 " "11471 ARG@17748..1776611472 EXPR_FUNCTION@17748..1776611473 FUNCTION_KW@17748..17756 "function"11474 PARAMS_DESC@17756..1775911475 L_PAREN@17756..17757 "("11476 PARAM@17757..1775811477 DESTRUCT_FULL@17757..1775811478 NAME@17757..1775811479 IDENT@17757..17758 "i"11480 R_PAREN@17758..17759 ")"11481 WHITESPACE@17759..17760 " "11482 EXPR_INDEX_EXPR@17760..1776611483 LHS_EXPR@17760..1776311484 EXPR_VAR@17760..1776311485 NAME@17760..1776311486 IDENT@17760..17763 "arr"11487 L_BRACK@17763..17764 "["11488 EXPR_VAR@17764..1776511489 NAME@17764..1776511490 IDENT@17764..17765 "i"11491 R_BRACK@17765..17766 "]"11492 R_PAREN@17766..17767 ")"11493 WHITESPACE@17767..17768 " "11494 PLUS@17768..17769 "+"11495 WHITESPACE@17769..17770 " "11496 EXPR_ARRAY@17770..1777311497 L_BRACK@17770..17771 "["11498 EXPR_VAR@17771..1777211499 NAME@17771..1777211500 IDENT@17771..17772 "r"11501 R_BRACK@17772..17773 "]"11502 R_PAREN@17773..17774 ")"11503 COMMA@17774..17775 ","11504 WHITESPACE@17775..17779 "\n\n "11505 MEMBER_FIELD@17779..1823211506 FIELD_METHOD@17779..1823211507 FIELD_NAME_FIXED@17779..1778411508 NAME@17779..1778411509 IDENT@17779..17784 "prune"11510 PARAMS_DESC@17784..1778711511 L_PAREN@17784..17785 "("11512 PARAM@17785..1778611513 DESTRUCT_FULL@17785..1778611514 NAME@17785..1778611515 IDENT@17785..17786 "a"11516 R_PAREN@17786..17787 ")"11517 COLONCOLON@17787..17789 "::"11518 WHITESPACE@17789..17794 "\n "11519 EXPR_LOCAL@17794..1823211520 LOCAL_KW@17794..17799 "local"11521 WHITESPACE@17799..17800 " "11522 BIND_FUNCTION@17800..1799711523 NAME@17800..1780911524 IDENT@17800..17809 "isContent"11525 PARAMS_DESC@17809..1781211526 L_PAREN@17809..17810 "("11527 PARAM@17810..1781111528 DESTRUCT_FULL@17810..1781111529 NAME@17810..1781111530 IDENT@17810..17811 "b"11531 R_PAREN@17811..17812 ")"11532 WHITESPACE@17812..17813 " "11533 ASSIGN@17813..17814 "="11534 WHITESPACE@17814..17821 "\n "11535 EXPR_IF_THEN_ELSE@17821..1799711536 IF_KW@17821..17823 "if"11537 WHITESPACE@17823..17824 " "11538 EXPR_BINARY@17824..1783311539 LHS_EXPR@17824..1782511540 EXPR_VAR@17824..1782511541 NAME@17824..1782511542 IDENT@17824..17825 "b"11543 WHITESPACE@17825..17826 " "11544 EQ@17826..17828 "=="11545 WHITESPACE@17828..17829 " "11546 EXPR_LITERAL@17829..1783311547 NULL_KW@17829..17833 "null"11548 WHITESPACE@17833..17834 " "11549 THEN_KW@17834..17838 "then"11550 WHITESPACE@17838..17847 "\n "11551 TRUE_EXPR@17847..1785211552 EXPR_LITERAL@17847..1785211553 FALSE_KW@17847..17852 "false"11554 WHITESPACE@17852..17859 "\n "11555 ELSE_KW@17859..17863 "else"11556 WHITESPACE@17863..17864 " "11557 FALSE_EXPR@17864..1799711558 EXPR_IF_THEN_ELSE@17864..1799711559 IF_KW@17864..17866 "if"11560 WHITESPACE@17866..17867 " "11561 EXPR_APPLY@17867..1788111562 EXPR_INDEX@17867..1787811563 EXPR_VAR@17867..1787011564 NAME@17867..1787011565 IDENT@17867..17870 "std"11566 DOT@17870..17871 "."11567 NAME@17871..1787811568 IDENT@17871..17878 "isArray"11569 ARGS_DESC@17878..1788111570 L_PAREN@17878..17879 "("11571 ARG@17879..1788011572 EXPR_VAR@17879..1788011573 NAME@17879..1788011574 IDENT@17879..17880 "b"11575 R_PAREN@17880..17881 ")"11576 WHITESPACE@17881..17882 " "11577 THEN_KW@17882..17886 "then"11578 WHITESPACE@17886..17895 "\n "11579 TRUE_EXPR@17895..1791211580 EXPR_BINARY@17895..1791211581 LHS_EXPR@17895..1790811582 EXPR_APPLY@17895..1790811583 EXPR_INDEX@17895..1790511584 EXPR_VAR@17895..1789811585 NAME@17895..1789811586 IDENT@17895..17898 "std"11587 DOT@17898..17899 "."11588 NAME@17899..1790511589 IDENT@17899..17905 "length"11590 ARGS_DESC@17905..1790811591 L_PAREN@17905..17906 "("11592 ARG@17906..1790711593 EXPR_VAR@17906..1790711594 NAME@17906..1790711595 IDENT@17906..17907 "b"11596 R_PAREN@17907..17908 ")"11597 WHITESPACE@17908..17909 " "11598 GT@17909..17910 ">"11599 WHITESPACE@17910..17911 " "11600 EXPR_NUMBER@17911..1791211601 FLOAT@17911..17912 "0"11602 WHITESPACE@17912..17919 "\n "11603 ELSE_KW@17919..17923 "else"11604 WHITESPACE@17923..17924 " "11605 FALSE_EXPR@17924..1799711606 EXPR_IF_THEN_ELSE@17924..1799711607 IF_KW@17924..17926 "if"11608 WHITESPACE@17926..17927 " "11609 EXPR_APPLY@17927..1794211610 EXPR_INDEX@17927..1793911611 EXPR_VAR@17927..1793011612 NAME@17927..1793011613 IDENT@17927..17930 "std"11614 DOT@17930..17931 "."11615 NAME@17931..1793911616 IDENT@17931..17939 "isObject"11617 ARGS_DESC@17939..1794211618 L_PAREN@17939..17940 "("11619 ARG@17940..1794111620 EXPR_VAR@17940..1794111621 NAME@17940..1794111622 IDENT@17940..17941 "b"11623 R_PAREN@17941..17942 ")"11624 WHITESPACE@17942..17943 " "11625 THEN_KW@17943..17947 "then"11626 WHITESPACE@17947..17956 "\n "11627 TRUE_EXPR@17956..1797311628 EXPR_BINARY@17956..1797311629 LHS_EXPR@17956..1796911630 EXPR_APPLY@17956..1796911631 EXPR_INDEX@17956..1796611632 EXPR_VAR@17956..1795911633 NAME@17956..1795911634 IDENT@17956..17959 "std"11635 DOT@17959..17960 "."11636 NAME@17960..1796611637 IDENT@17960..17966 "length"11638 ARGS_DESC@17966..1796911639 L_PAREN@17966..17967 "("11640 ARG@17967..1796811641 EXPR_VAR@17967..1796811642 NAME@17967..1796811643 IDENT@17967..17968 "b"11644 R_PAREN@17968..17969 ")"11645 WHITESPACE@17969..17970 " "11646 GT@17970..17971 ">"11647 WHITESPACE@17971..17972 " "11648 EXPR_NUMBER@17972..1797311649 FLOAT@17972..17973 "0"11650 WHITESPACE@17973..17980 "\n "11651 ELSE_KW@17980..17984 "else"11652 WHITESPACE@17984..17993 "\n "11653 FALSE_EXPR@17993..1799711654 EXPR_LITERAL@17993..1799711655 TRUE_KW@17993..17997 "true"11656 SEMI@17997..17998 ";"11657 WHITESPACE@17998..18003 "\n "11658 EXPR_IF_THEN_ELSE@18003..1823211659 IF_KW@18003..18005 "if"11660 WHITESPACE@18005..18006 " "11661 EXPR_APPLY@18006..1802011662 EXPR_INDEX@18006..1801711663 EXPR_VAR@18006..1800911664 NAME@18006..1800911665 IDENT@18006..18009 "std"11666 DOT@18009..18010 "."11667 NAME@18010..1801711668 IDENT@18010..18017 "isArray"11669 ARGS_DESC@18017..1802011670 L_PAREN@18017..18018 "("11671 ARG@18018..1801911672 EXPR_VAR@18018..1801911673 NAME@18018..1801911674 IDENT@18018..18019 "a"11675 R_PAREN@18019..18020 ")"11676 WHITESPACE@18020..18021 " "11677 THEN_KW@18021..18025 "then"11678 WHITESPACE@18025..18032 "\n "11679 TRUE_EXPR@18032..1808211680 EXPR_ARRAY_COMP@18032..1808211681 L_BRACK@18032..18033 "["11682 EXPR_APPLY@18033..1804511683 EXPR_INDEX@18033..1804211684 EXPR_VAR@18033..1803611685 NAME@18033..1803611686 IDENT@18033..18036 "std"11687 DOT@18036..18037 "."11688 NAME@18037..1804211689 IDENT@18037..18042 "prune"11690 ARGS_DESC@18042..1804511691 L_PAREN@18042..18043 "("11692 ARG@18043..1804411693 EXPR_VAR@18043..1804411694 NAME@18043..1804411695 IDENT@18043..18044 "x"11696 R_PAREN@18044..18045 ")"11697 WHITESPACE@18045..18046 " "11698 FOR_SPEC@18046..1805611699 FOR_KW@18046..18049 "for"11700 WHITESPACE@18049..18050 " "11701 NAME@18050..1805111702 IDENT@18050..18051 "x"11703 WHITESPACE@18051..18052 " "11704 IN_KW@18052..18054 "in"11705 WHITESPACE@18054..18055 " "11706 EXPR_VAR@18055..1805611707 NAME@18055..1805611708 IDENT@18055..18056 "a"11709 WHITESPACE@18056..18057 " "11710 IF_SPEC@18057..1808111711 IF_KW@18057..18059 "if"11712 WHITESPACE@18059..18060 " "11713 EXPR_APPLY@18060..1808111714 EXPR_VAR@18060..1806911715 NAME@18060..1806911716 IDENT@18060..18069 "isContent"11717 ARGS_DESC@18069..1808111718 L_PAREN@18069..18070 "("11719 ARG@18070..1808011720 EXPR_APPLY@18070..1808011721 EXPR_INDEX@18070..1807711722 EXPR_LITERAL@18070..1807111723 DOLLAR@18070..18071 "$"11724 DOT@18071..18072 "."11725 NAME@18072..1807711726 IDENT@18072..18077 "prune"11727 ARGS_DESC@18077..1808011728 L_PAREN@18077..18078 "("11729 ARG@18078..1807911730 EXPR_VAR@18078..1807911731 NAME@18078..1807911732 IDENT@18078..18079 "x"11733 R_PAREN@18079..18080 ")"11734 R_PAREN@18080..18081 ")"11735 R_BRACK@18081..18082 "]"11736 WHITESPACE@18082..18087 "\n "11737 ELSE_KW@18087..18091 "else"11738 WHITESPACE@18091..18092 " "11739 FALSE_EXPR@18092..1823211740 EXPR_IF_THEN_ELSE@18092..1823211741 IF_KW@18092..18094 "if"11742 WHITESPACE@18094..18095 " "11743 EXPR_APPLY@18095..1811011744 EXPR_INDEX@18095..1810711745 EXPR_VAR@18095..1809811746 NAME@18095..1809811747 IDENT@18095..18098 "std"11748 DOT@18098..18099 "."11749 NAME@18099..1810711750 IDENT@18099..18107 "isObject"11751 ARGS_DESC@18107..1811011752 L_PAREN@18107..18108 "("11753 ARG@18108..1810911754 EXPR_VAR@18108..1810911755 NAME@18108..1810911756 IDENT@18108..18109 "a"11757 R_PAREN@18109..18110 ")"11758 WHITESPACE@18110..18111 " "11759 THEN_KW@18111..18115 "then"11760 WHITESPACE@18115..18116 " "11761 TRUE_EXPR@18116..1821911762 EXPR_OBJECT@18116..1821911763 OBJ_BODY_MEMBER_LIST@18116..1821911764 L_BRACE@18116..18117 "{"11765 WHITESPACE@18117..18124 "\n "11766 MEMBER_FIELD@18124..1821311767 FIELD_NORMAL@18124..1814211768 FIELD_NAME_DYNAMIC@18124..1812711769 L_BRACK@18124..18125 "["11770 EXPR_VAR@18125..1812611771 NAME@18125..1812611772 IDENT@18125..18126 "x"11773 R_BRACK@18126..18127 "]"11774 COLON@18127..18128 ":"11775 WHITESPACE@18128..18129 " "11776 EXPR_APPLY@18129..1814211777 EXPR_INDEX@18129..1813611778 EXPR_LITERAL@18129..1813011779 DOLLAR@18129..18130 "$"11780 DOT@18130..18131 "."11781 NAME@18131..1813611782 IDENT@18131..18136 "prune"11783 ARGS_DESC@18136..1814211784 L_PAREN@18136..18137 "("11785 ARG@18137..1814111786 EXPR_INDEX_EXPR@18137..1814111787 LHS_EXPR@18137..1813811788 EXPR_VAR@18137..1813811789 NAME@18137..1813811790 IDENT@18137..18138 "a"11791 L_BRACK@18138..18139 "["11792 EXPR_VAR@18139..1814011793 NAME@18139..1814011794 IDENT@18139..18140 "x"11795 R_BRACK@18140..18141 "]"11796 R_PAREN@18141..18142 ")"11797 WHITESPACE@18142..18149 "\n "11798 FOR_SPEC@18149..1817711799 FOR_KW@18149..18152 "for"11800 WHITESPACE@18152..18153 " "11801 NAME@18153..1815411802 IDENT@18153..18154 "x"11803 WHITESPACE@18154..18155 " "11804 IN_KW@18155..18157 "in"11805 WHITESPACE@18157..18158 " "11806 EXPR_APPLY@18158..1817711807 EXPR_INDEX@18158..1817411808 EXPR_VAR@18158..1816111809 NAME@18158..1816111810 IDENT@18158..18161 "std"11811 DOT@18161..18162 "."11812 NAME@18162..1817411813 IDENT@18162..18174 "objectFields"11814 ARGS_DESC@18174..1817711815 L_PAREN@18174..18175 "("11816 ARG@18175..1817611817 EXPR_VAR@18175..1817611818 NAME@18175..1817611819 IDENT@18175..18176 "a"11820 R_PAREN@18176..18177 ")"11821 WHITESPACE@18177..18184 "\n "11822 IF_SPEC@18184..1821311823 IF_KW@18184..18186 "if"11824 WHITESPACE@18186..18187 " "11825 EXPR_APPLY@18187..1821311826 EXPR_VAR@18187..1819611827 NAME@18187..1819611828 IDENT@18187..18196 "isContent"11829 ARGS_DESC@18196..1821311830 L_PAREN@18196..18197 "("11831 ARG@18197..1821211832 EXPR_APPLY@18197..1821211833 EXPR_INDEX@18197..1820611834 EXPR_VAR@18197..1820011835 NAME@18197..1820011836 IDENT@18197..18200 "std"11837 DOT@18200..18201 "."11838 NAME@18201..1820611839 IDENT@18201..18206 "prune"11840 ARGS_DESC@18206..1821211841 L_PAREN@18206..18207 "("11842 ARG@18207..1821111843 EXPR_INDEX_EXPR@18207..1821111844 LHS_EXPR@18207..1820811845 EXPR_VAR@18207..1820811846 NAME@18207..1820811847 IDENT@18207..18208 "a"11848 L_BRACK@18208..18209 "["11849 EXPR_VAR@18209..1821011850 NAME@18209..1821011851 IDENT@18209..18210 "x"11852 R_BRACK@18210..18211 "]"11853 R_PAREN@18211..18212 ")"11854 R_PAREN@18212..18213 ")"11855 WHITESPACE@18213..18218 "\n "11856 R_BRACE@18218..18219 "}"11857 WHITESPACE@18219..18220 " "11858 ELSE_KW@18220..18224 "else"11859 WHITESPACE@18224..18231 "\n "11860 FALSE_EXPR@18231..1823211861 EXPR_VAR@18231..1823211862 NAME@18231..1823211863 IDENT@18231..18232 "a"11864 COMMA@18232..18233 ","11865 WHITESPACE@18233..18237 "\n\n "11866 MEMBER_FIELD@18237..1875511867 FIELD_METHOD@18237..1875511868 FIELD_NAME_FIXED@18237..1824711869 NAME@18237..1824711870 IDENT@18237..18247 "findSubstr"11871 PARAMS_DESC@18247..1825711872 L_PAREN@18247..18248 "("11873 PARAM@18248..1825111874 DESTRUCT_FULL@18248..1825111875 NAME@18248..1825111876 IDENT@18248..18251 "pat"11877 COMMA@18251..18252 ","11878 WHITESPACE@18252..18253 " "11879 PARAM@18253..1825611880 DESTRUCT_FULL@18253..1825611881 NAME@18253..1825611882 IDENT@18253..18256 "str"11883 R_PAREN@18256..18257 ")"11884 COLONCOLON@18257..18259 "::"11885 WHITESPACE@18259..18264 "\n "11886 EXPR_IF_THEN_ELSE@18264..1875511887 IF_KW@18264..18266 "if"11888 WHITESPACE@18266..18267 " "11889 EXPR_UNARY@18267..1828511890 NOT@18267..18268 "!"11891 EXPR_APPLY@18268..1828511892 EXPR_INDEX@18268..1828011893 EXPR_VAR@18268..1827111894 NAME@18268..1827111895 IDENT@18268..18271 "std"11896 DOT@18271..18272 "."11897 NAME@18272..1828011898 IDENT@18272..18280 "isString"11899 ARGS_DESC@18280..1828511900 L_PAREN@18280..18281 "("11901 ARG@18281..1828411902 EXPR_VAR@18281..1828411903 NAME@18281..1828411904 IDENT@18281..18284 "pat"11905 R_PAREN@18284..18285 ")"11906 WHITESPACE@18285..18286 " "11907 THEN_KW@18286..18290 "then"11908 WHITESPACE@18290..18297 "\n "11909 TRUE_EXPR@18297..1837211910 EXPR_ERROR@18297..1837211911 ERROR_KW@18297..18302 "error"11912 WHITESPACE@18302..18303 " "11913 EXPR_BINARY@18303..1837211914 LHS_EXPR@18303..1835611915 EXPR_STRING@18303..1835611916 STRING_SINGLE@18303..18356 "'findSubstr first par ..."11917 WHITESPACE@18356..18357 " "11918 PLUS@18357..18358 "+"11919 WHITESPACE@18358..18359 " "11920 EXPR_APPLY@18359..1837211921 EXPR_INDEX@18359..1836711922 EXPR_VAR@18359..1836211923 NAME@18359..1836211924 IDENT@18359..18362 "std"11925 DOT@18362..18363 "."11926 NAME@18363..1836711927 IDENT@18363..18367 "type"11928 ARGS_DESC@18367..1837211929 L_PAREN@18367..18368 "("11930 ARG@18368..1837111931 EXPR_VAR@18368..1837111932 NAME@18368..1837111933 IDENT@18368..18371 "pat"11934 R_PAREN@18371..18372 ")"11935 WHITESPACE@18372..18377 "\n "11936 ELSE_KW@18377..18381 "else"11937 WHITESPACE@18381..18382 " "11938 FALSE_EXPR@18382..1875511939 EXPR_IF_THEN_ELSE@18382..1875511940 IF_KW@18382..18384 "if"11941 WHITESPACE@18384..18385 " "11942 EXPR_UNARY@18385..1840311943 NOT@18385..18386 "!"11944 EXPR_APPLY@18386..1840311945 EXPR_INDEX@18386..1839811946 EXPR_VAR@18386..1838911947 NAME@18386..1838911948 IDENT@18386..18389 "std"11949 DOT@18389..18390 "."11950 NAME@18390..1839811951 IDENT@18390..18398 "isString"11952 ARGS_DESC@18398..1840311953 L_PAREN@18398..18399 "("11954 ARG@18399..1840211955 EXPR_VAR@18399..1840211956 NAME@18399..1840211957 IDENT@18399..18402 "str"11958 R_PAREN@18402..18403 ")"11959 WHITESPACE@18403..18404 " "11960 THEN_KW@18404..18408 "then"11961 WHITESPACE@18408..18415 "\n "11962 TRUE_EXPR@18415..1849111963 EXPR_ERROR@18415..1849111964 ERROR_KW@18415..18420 "error"11965 WHITESPACE@18420..18421 " "11966 EXPR_BINARY@18421..1849111967 LHS_EXPR@18421..1847511968 EXPR_STRING@18421..1847511969 STRING_SINGLE@18421..18475 "'findSubstr second pa ..."11970 WHITESPACE@18475..18476 " "11971 PLUS@18476..18477 "+"11972 WHITESPACE@18477..18478 " "11973 EXPR_APPLY@18478..1849111974 EXPR_INDEX@18478..1848611975 EXPR_VAR@18478..1848111976 NAME@18478..1848111977 IDENT@18478..18481 "std"11978 DOT@18481..18482 "."11979 NAME@18482..1848611980 IDENT@18482..18486 "type"11981 ARGS_DESC@18486..1849111982 L_PAREN@18486..18487 "("11983 ARG@18487..1849011984 EXPR_VAR@18487..1849011985 NAME@18487..1849011986 IDENT@18487..18490 "str"11987 R_PAREN@18490..18491 ")"11988 WHITESPACE@18491..18496 "\n "11989 ELSE_KW@18496..18500 "else"11990 WHITESPACE@18500..18507 "\n "11991 FALSE_EXPR@18507..1875511992 EXPR_LOCAL@18507..1875511993 LOCAL_KW@18507..18512 "local"11994 WHITESPACE@18512..18513 " "11995 BIND_DESTRUCT@18513..1853811996 DESTRUCT_FULL@18513..1852011997 NAME@18513..1852011998 IDENT@18513..18520 "pat_len"11999 WHITESPACE@18520..18521 " "12000 ASSIGN@18521..18522 "="12001 WHITESPACE@18522..18523 " "12002 EXPR_APPLY@18523..1853812003 EXPR_INDEX@18523..1853312004 EXPR_VAR@18523..1852612005 NAME@18523..1852612006 IDENT@18523..18526 "std"12007 DOT@18526..18527 "."12008 NAME@18527..1853312009 IDENT@18527..18533 "length"12010 ARGS_DESC@18533..1853812011 L_PAREN@18533..18534 "("12012 ARG@18534..1853712013 EXPR_VAR@18534..1853712014 NAME@18534..1853712015 IDENT@18534..18537 "pat"12016 R_PAREN@18537..18538 ")"12017 SEMI@18538..18539 ";"12018 WHITESPACE@18539..18546 "\n "12019 EXPR_LOCAL@18546..1875512020 LOCAL_KW@18546..18551 "local"12021 WHITESPACE@18551..18552 " "12022 BIND_DESTRUCT@18552..1857712023 DESTRUCT_FULL@18552..1855912024 NAME@18552..1855912025 IDENT@18552..18559 "str_len"12026 WHITESPACE@18559..18560 " "12027 ASSIGN@18560..18561 "="12028 WHITESPACE@18561..18562 " "12029 EXPR_APPLY@18562..1857712030 EXPR_INDEX@18562..1857212031 EXPR_VAR@18562..1856512032 NAME@18562..1856512033 IDENT@18562..18565 "std"12034 DOT@18565..18566 "."12035 NAME@18566..1857212036 IDENT@18566..18572 "length"12037 ARGS_DESC@18572..1857712038 L_PAREN@18572..18573 "("12039 ARG@18573..1857612040 EXPR_VAR@18573..1857612041 NAME@18573..1857612042 IDENT@18573..18576 "str"12043 R_PAREN@18576..18577 ")"12044 SEMI@18577..18578 ";"12045 WHITESPACE@18578..18585 "\n "12046 EXPR_IF_THEN_ELSE@18585..1875512047 IF_KW@18585..18587 "if"12048 WHITESPACE@18587..18588 " "12049 EXPR_BINARY@18588..1863712050 LHS_EXPR@18588..1861612051 EXPR_BINARY@18588..1861612052 LHS_EXPR@18588..1860012053 EXPR_BINARY@18588..1860012054 LHS_EXPR@18588..1859512055 EXPR_VAR@18588..1859512056 NAME@18588..1859512057 IDENT@18588..18595 "pat_len"12058 WHITESPACE@18595..18596 " "12059 EQ@18596..18598 "=="12060 WHITESPACE@18598..18599 " "12061 EXPR_NUMBER@18599..1860012062 FLOAT@18599..18600 "0"12063 WHITESPACE@18600..18601 " "12064 OR@18601..18603 "||"12065 WHITESPACE@18603..18604 " "12066 EXPR_BINARY@18604..1861612067 LHS_EXPR@18604..1861112068 EXPR_VAR@18604..1861112069 NAME@18604..1861112070 IDENT@18604..18611 "str_len"12071 WHITESPACE@18611..18612 " "12072 EQ@18612..18614 "=="12073 WHITESPACE@18614..18615 " "12074 EXPR_NUMBER@18615..1861612075 FLOAT@18615..18616 "0"12076 WHITESPACE@18616..18617 " "12077 OR@18617..18619 "||"12078 WHITESPACE@18619..18620 " "12079 EXPR_BINARY@18620..1863712080 LHS_EXPR@18620..1862712081 EXPR_VAR@18620..1862712082 NAME@18620..1862712083 IDENT@18620..18627 "pat_len"12084 WHITESPACE@18627..18628 " "12085 GT@18628..18629 ">"12086 WHITESPACE@18629..18630 " "12087 EXPR_VAR@18630..1863712088 NAME@18630..1863712089 IDENT@18630..18637 "str_len"12090 WHITESPACE@18637..18638 " "12091 THEN_KW@18638..18642 "then"12092 WHITESPACE@18642..18651 "\n "12093 TRUE_EXPR@18651..1865312094 EXPR_ARRAY@18651..1865312095 L_BRACK@18651..18652 "["12096 R_BRACK@18652..18653 "]"12097 WHITESPACE@18653..18660 "\n "12098 ELSE_KW@18660..18664 "else"12099 WHITESPACE@18664..18673 "\n "12100 FALSE_EXPR@18673..1875512101 EXPR_APPLY@18673..1875512102 EXPR_INDEX@18673..1868312103 EXPR_VAR@18673..1867612104 NAME@18673..1867612105 IDENT@18673..18676 "std"12106 DOT@18676..18677 "."12107 NAME@18677..1868312108 IDENT@18677..18683 "filter"12109 ARGS_DESC@18683..1875512110 L_PAREN@18683..18684 "("12111 ARG@18684..1872112112 EXPR_FUNCTION@18684..1872112113 FUNCTION_KW@18684..18692 "function"12114 PARAMS_DESC@18692..1869512115 L_PAREN@18692..18693 "("12116 PARAM@18693..1869412117 DESTRUCT_FULL@18693..1869412118 NAME@18693..1869412119 IDENT@18693..18694 "i"12120 R_PAREN@18694..18695 ")"12121 WHITESPACE@18695..18696 " "12122 EXPR_BINARY@18696..1872112123 LHS_EXPR@18696..1871412124 EXPR_SLICE@18696..1871412125 EXPR_VAR@18696..1869912126 NAME@18696..1869912127 IDENT@18696..18699 "str"12128 SLICE_DESC@18699..1871412129 L_BRACK@18699..18700 "["12130 EXPR_VAR@18700..1870112131 NAME@18700..1870112132 IDENT@18700..18701 "i"12133 COLON@18701..18702 ":"12134 SLICE_DESC_END@18702..1871312135 EXPR_BINARY@18702..1871312136 LHS_EXPR@18702..1870312137 EXPR_VAR@18702..1870312138 NAME@18702..1870312139 IDENT@18702..18703 "i"12140 WHITESPACE@18703..18704 " "12141 PLUS@18704..18705 "+"12142 WHITESPACE@18705..18706 " "12143 EXPR_VAR@18706..1871312144 NAME@18706..1871312145 IDENT@18706..18713 "pat_len"12146 R_BRACK@18713..18714 "]"12147 WHITESPACE@18714..18715 " "12148 EQ@18715..18717 "=="12149 WHITESPACE@18717..18718 " "12150 EXPR_VAR@18718..1872112151 NAME@18718..1872112152 IDENT@18718..18721 "pat"12153 COMMA@18721..18722 ","12154 WHITESPACE@18722..18723 " "12155 ARG@18723..1875412156 EXPR_APPLY@18723..1875412157 EXPR_INDEX@18723..1873212158 EXPR_VAR@18723..1872612159 NAME@18723..1872612160 IDENT@18723..18726 "std"12161 DOT@18726..18727 "."12162 NAME@18727..1873212163 IDENT@18727..18732 "range"12164 ARGS_DESC@18732..1875412165 L_PAREN@18732..18733 "("12166 ARG@18733..1873412167 EXPR_NUMBER@18733..1873412168 FLOAT@18733..18734 "0"12169 COMMA@18734..18735 ","12170 WHITESPACE@18735..18736 " "12171 ARG@18736..1875312172 EXPR_BINARY@18736..1875312173 LHS_EXPR@18736..1874312174 EXPR_VAR@18736..1874312175 NAME@18736..1874312176 IDENT@18736..18743 "str_len"12177 WHITESPACE@18743..18744 " "12178 MINUS@18744..18745 "-"12179 WHITESPACE@18745..18746 " "12180 EXPR_VAR@18746..1875312181 NAME@18746..1875312182 IDENT@18746..18753 "pat_len"12183 R_PAREN@18753..18754 ")"12184 R_PAREN@18754..18755 ")"12185 COMMA@18755..18756 ","12186 WHITESPACE@18756..18760 "\n\n "12187 MEMBER_FIELD@18760..1897512188 FIELD_METHOD@18760..1897512189 FIELD_NAME_FIXED@18760..1876412190 NAME@18760..1876412191 IDENT@18760..18764 "find"12192 PARAMS_DESC@18764..1877612193 L_PAREN@18764..18765 "("12194 PARAM@18765..1877012195 DESTRUCT_FULL@18765..1877012196 NAME@18765..1877012197 IDENT@18765..18770 "value"12198 COMMA@18770..18771 ","12199 WHITESPACE@18771..18772 " "12200 PARAM@18772..1877512201 DESTRUCT_FULL@18772..1877512202 NAME@18772..1877512203 IDENT@18772..18775 "arr"12204 R_PAREN@18775..18776 ")"12205 COLONCOLON@18776..18778 "::"12206 WHITESPACE@18778..18783 "\n "12207 EXPR_IF_THEN_ELSE@18783..1897512208 IF_KW@18783..18785 "if"12209 WHITESPACE@18785..18786 " "12210 EXPR_UNARY@18786..1880312211 NOT@18786..18787 "!"12212 EXPR_APPLY@18787..1880312213 EXPR_INDEX@18787..1879812214 EXPR_VAR@18787..1879012215 NAME@18787..1879012216 IDENT@18787..18790 "std"12217 DOT@18790..18791 "."12218 NAME@18791..1879812219 IDENT@18791..18798 "isArray"12220 ARGS_DESC@18798..1880312221 L_PAREN@18798..18799 "("12222 ARG@18799..1880212223 EXPR_VAR@18799..1880212224 NAME@18799..1880212225 IDENT@18799..18802 "arr"12226 R_PAREN@18802..18803 ")"12227 WHITESPACE@18803..18804 " "12228 THEN_KW@18804..18808 "then"12229 WHITESPACE@18808..18815 "\n "12230 TRUE_EXPR@18815..1888512231 EXPR_ERROR@18815..1888512232 ERROR_KW@18815..18820 "error"12233 WHITESPACE@18820..18821 " "12234 EXPR_BINARY@18821..1888512235 LHS_EXPR@18821..1886912236 EXPR_STRING@18821..1886912237 STRING_SINGLE@18821..18869 "'find second paramete ..."12238 WHITESPACE@18869..18870 " "12239 PLUS@18870..18871 "+"12240 WHITESPACE@18871..18872 " "12241 EXPR_APPLY@18872..1888512242 EXPR_INDEX@18872..1888012243 EXPR_VAR@18872..1887512244 NAME@18872..1887512245 IDENT@18872..18875 "std"12246 DOT@18875..18876 "."12247 NAME@18876..1888012248 IDENT@18876..18880 "type"12249 ARGS_DESC@18880..1888512250 L_PAREN@18880..18881 "("12251 ARG@18881..1888412252 EXPR_VAR@18881..1888412253 NAME@18881..1888412254 IDENT@18881..18884 "arr"12255 R_PAREN@18884..18885 ")"12256 WHITESPACE@18885..18890 "\n "12257 ELSE_KW@18890..18894 "else"12258 WHITESPACE@18894..18901 "\n "12259 FALSE_EXPR@18901..1897512260 EXPR_APPLY@18901..1897512261 EXPR_INDEX@18901..1891112262 EXPR_VAR@18901..1890412263 NAME@18901..1890412264 IDENT@18901..18904 "std"12265 DOT@18904..18905 "."12266 NAME@18905..1891112267 IDENT@18905..18911 "filter"12268 ARGS_DESC@18911..1897512269 L_PAREN@18911..18912 "("12270 ARG@18912..1893912271 EXPR_FUNCTION@18912..1893912272 FUNCTION_KW@18912..18920 "function"12273 PARAMS_DESC@18920..1892312274 L_PAREN@18920..18921 "("12275 PARAM@18921..1892212276 DESTRUCT_FULL@18921..1892212277 NAME@18921..1892212278 IDENT@18921..18922 "i"12279 R_PAREN@18922..18923 ")"12280 WHITESPACE@18923..18924 " "12281 EXPR_BINARY@18924..1893912282 LHS_EXPR@18924..1893012283 EXPR_INDEX_EXPR@18924..1893012284 LHS_EXPR@18924..1892712285 EXPR_VAR@18924..1892712286 NAME@18924..1892712287 IDENT@18924..18927 "arr"12288 L_BRACK@18927..18928 "["12289 EXPR_VAR@18928..1892912290 NAME@18928..1892912291 IDENT@18928..18929 "i"12292 R_BRACK@18929..18930 "]"12293 WHITESPACE@18930..18931 " "12294 EQ@18931..18933 "=="12295 WHITESPACE@18933..18934 " "12296 EXPR_VAR@18934..1893912297 NAME@18934..1893912298 IDENT@18934..18939 "value"12299 COMMA@18939..18940 ","12300 WHITESPACE@18940..18941 " "12301 ARG@18941..1897412302 EXPR_APPLY@18941..1897412303 EXPR_INDEX@18941..1895012304 EXPR_VAR@18941..1894412305 NAME@18941..1894412306 IDENT@18941..18944 "std"12307 DOT@18944..18945 "."12308 NAME@18945..1895012309 IDENT@18945..18950 "range"12310 ARGS_DESC@18950..1897412311 L_PAREN@18950..18951 "("12312 ARG@18951..1895212313 EXPR_NUMBER@18951..1895212314 FLOAT@18951..18952 "0"12315 COMMA@18952..18953 ","12316 WHITESPACE@18953..18954 " "12317 ARG@18954..1897312318 EXPR_BINARY@18954..1897312319 LHS_EXPR@18954..1896912320 EXPR_APPLY@18954..1896912321 EXPR_INDEX@18954..1896412322 EXPR_VAR@18954..1895712323 NAME@18954..1895712324 IDENT@18954..18957 "std"12325 DOT@18957..18958 "."12326 NAME@18958..1896412327 IDENT@18958..18964 "length"12328 ARGS_DESC@18964..1896912329 L_PAREN@18964..18965 "("12330 ARG@18965..1896812331 EXPR_VAR@18965..1896812332 NAME@18965..1896812333 IDENT@18965..18968 "arr"12334 R_PAREN@18968..18969 ")"12335 WHITESPACE@18969..18970 " "12336 MINUS@18970..18971 "-"12337 WHITESPACE@18971..18972 " "12338 EXPR_NUMBER@18972..1897312339 FLOAT@18972..18973 "1"12340 R_PAREN@18973..18974 ")"12341 R_PAREN@18974..18975 ")"12342 COMMA@18975..18976 ","12343 WHITESPACE@18976..18977 "\n"12344 R_BRACE@18977..18978 "}"12345crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snap
@@ -0,0 +1,8 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "|||\n"
+---
+SOURCE_FILE@0..4
+ EXPR_STRING@0..4
+ ERROR_STRING_BLOCK_MISSING_INDENT@0..4 "|||\n"
+
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snap
@@ -0,0 +1,8 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "|||\nhello\n"
+---
+SOURCE_FILE@0..10
+ EXPR_STRING@0..10
+ ERROR_STRING_BLOCK_MISSING_INDENT@0..10 "|||\nhello\n"
+
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snap
@@ -0,0 +1,8 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "|||hello\n"
+---
+SOURCE_FILE@0..9
+ EXPR_STRING@0..9
+ ERROR_STRING_BLOCK_MISSING_NEW_LINE@0..9 "|||hello\n"
+
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snap
@@ -0,0 +1,8 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "|||\n\thello\n"
+---
+SOURCE_FILE@0..11
+ EXPR_STRING@0..11
+ ERROR_STRING_BLOCK_UNEXPECTED_END@0..11 "|||\n\thello\n"
+
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snapdiffbeforeafterboth--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap
@@ -0,0 +1,30 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "{\n\ta: 1;\n\tb: 2;\n}\n"
+---
+SOURCE_FILE@0..10
+ OBJ_BODY@0..7
+ L_BRACE@0..1 "{"
+ WHITESPACE@1..3 "\n\t"
+ MEMBER@3..7
+ IDENT@3..4 "a"
+ COLON@4..5 ":"
+ WHITESPACE@5..6 " "
+ EXPR_NUMBER@6..7
+ NUMBER@6..7 "1"
+ SEMI@7..8 ";"
+ WHITESPACE@8..10 "\n\t"
+===
+Missing { expected: Unnamed(R_BRACE), offset: 7 }
+Custom { error: "unexpected input after expression", range: 7..8 }
+===
+ x syntax error
+ ,-[1:1]
+ 1 | {
+ 2 | a: 1;
+ : ^
+ : |`-- unexpected input after expression
+ : `-- missing R_BRACE
+ 3 | b: 2;
+ `----
+
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap.newdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap.new
+++ /dev/null
@@ -1,41 +0,0 @@
----
-source: crates/jrsonnet-rowan-parser/src/lib.rs
-assertion_line: 88
-expression: "{\n\ta: 1;\n\tb: 2;\n}\n"
-
----
-Root@0..18
- Object@0..7
- SymbolLeftBrace@0..1 "{"
- Whitespace@1..3 "\n\t"
- Field@3..7
- Ident@3..4 "a"
- SymbolColon@4..5 ":"
- Whitespace@5..6 " "
- Literal@6..7
- Number@6..7 "1"
- SymbolSemi@7..8 ";"
- Whitespace@8..10 "\n\t"
- Ident@10..11 "b"
- SymbolColon@11..12 ":"
- Whitespace@12..13 " "
- Number@13..14 "2"
- SymbolSemi@14..15 ";"
- Whitespace@15..16 "\n"
- SymbolRightBrace@16..17 "}"
- Whitespace@17..18 "\n"
-===
-Missing { expected: Unnamed(SymbolRightBrace), offset: 7 }
-Custom { error: "unexpected input after expression", range: 7..17 }
-===
- [38;2;255;30;30m×[0m syntax error
- ╭─[1:1]
- [2m1[0m │ {
- [2m2[0m │ [38;2;246;87;248m╭[0m[38;2;246;87;248m─[0m[38;2;246;87;248m▶[0m a: 1;
- · [38;2;246;87;248m│[0m[38;2;30;201;212m│[0m[38;2;246;87;248m ▲[0m
- · [38;2;246;87;248m│[0m[38;2;30;201;212m│[0m [38;2;246;87;248m╰── [38;2;246;87;248mmissing SymbolRightBrace[0m[0m
- [2m3[0m │ [38;2;30;201;212m│[0m b: 2;
- [2m4[0m │ [38;2;30;201;212m├[0m[38;2;30;201;212m─[0m[38;2;30;201;212m▶[0m }
- · [38;2;30;201;212m╰[0m[38;2;30;201;212m───[0m[38;2;30;201;212m─[0m [38;2;30;201;212munexpected input after expression[0m
- ╰────
-
crates/jrsonnet-rowan-parser/src/string_block.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/string_block.rs
+++ b/crates/jrsonnet-rowan-parser/src/string_block.rs
@@ -1,23 +1,23 @@
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
-pub enum StringBlockToken {
- Valid,
- UnexpectedEndOfString,
- MissingTextBlockNewLine,
- MissingTextBlockTermination,
- MissingTextBlockIndent,
+pub enum StringBlockError {
+ UnexpectedEnd,
+ MissingNewLine,
+ MissingTermination,
+ MissingIndent,
}
use std::ops::Range;
-use StringBlockToken::*;
+use logos::Lexer;
+use StringBlockError::*;
use crate::SyntaxKind;
-pub fn lex_str_block_test<'a>(lex: &mut logos::Lexer<'a, SyntaxKind>) {
- lex_str_block(lex);
+pub fn lex_str_block_test(lex: &mut Lexer<SyntaxKind>) {
+ let _ = lex_str_block(lex);
}
-fn lex_str_block<'a>(lex: &mut logos::Lexer<'a, SyntaxKind>) -> StringBlockToken {
+pub fn lex_str_block(lex: &mut Lexer<SyntaxKind>) -> Result<(), StringBlockError> {
struct Context<'a> {
source: &'a str,
index: usize,
@@ -116,7 +116,7 @@
a.len()
}
- fn guess_token_end_and_bump<'a>(lex: &mut logos::Lexer<'a, SyntaxKind>, ctx: &Context<'a>) {
+ fn guess_token_end_and_bump<'a>(lex: &mut Lexer<'a, SyntaxKind>, ctx: &Context<'a>) {
let end_index = ctx
.rest()
.find("|||")
@@ -140,12 +140,12 @@
Some('\n') => (),
None => {
guess_token_end_and_bump(lex, &ctx);
- return UnexpectedEndOfString;
+ return Err(UnexpectedEnd);
}
// Text block requires new line after |||.
Some(_) => {
guess_token_end_and_bump(lex, &ctx);
- return MissingTextBlockNewLine;
+ return Err(MissingNewLine);
}
}
@@ -160,7 +160,7 @@
if num_whitespace == 0 {
// Text block's first line must start with whitespace
guess_token_end_and_bump(lex, &ctx);
- return MissingTextBlockIndent;
+ return Err(MissingIndent);
}
loop {
@@ -171,7 +171,7 @@
match ctx.next() {
None => {
guess_token_end_and_bump(lex, &ctx);
- return UnexpectedEndOfString;
+ return Err(UnexpectedEnd);
}
Some('\n') => break,
Some(_) => (),
@@ -188,26 +188,21 @@
if num_whitespace == 0 {
// End of the text block
let mut term_indent = String::with_capacity(num_whitespace);
- loop {
- match ctx.peek() {
- Some(' ') | Some('\t') => {
- term_indent.push(ctx.next().unwrap());
- }
- _ => break,
- }
+ while let Some(' ' | '\t') = ctx.peek() {
+ term_indent.push(ctx.next().unwrap());
}
if !ctx.rest().starts_with("|||") {
// Text block not terminated with |||
let pos = ctx.pos();
- if pos.len() == 0 {
+ if pos.is_empty() {
// eof
lex.bump(ctx.index);
- return UnexpectedEndOfString;
+ return Err(UnexpectedEnd);
}
guess_token_end_and_bump(lex, &ctx);
- return MissingTextBlockTermination;
+ return Err(MissingTermination);
}
// Skip '|||'
@@ -217,5 +212,5 @@
}
lex.bump(ctx.index);
- Valid
+ Ok(())
}
crates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/tests.rs
+++ b/crates/jrsonnet-rowan-parser/src/tests.rs
@@ -1,9 +1,11 @@
#![cfg(test)]
-use miette::{Diagnostic, GraphicalReportHandler, LabeledSpan};
+use miette::{
+ Diagnostic, GraphicalReportHandler, GraphicalTheme, LabeledSpan, ThemeCharacters, ThemeStyles,
+};
use thiserror::Error;
-use crate::parser::parse;
+use crate::{parse, AstNode};
#[derive(Debug, Error)]
#[error("syntax error")]
@@ -44,19 +46,22 @@
fn process(text: &str) -> String {
use std::fmt::Write;
let mut out = String::new();
- let node = parse(text);
+ let (node, errors) = parse(text);
write!(out, "{:#?}", node.syntax()).unwrap();
- if !node.errors.is_empty() && !text.is_empty() {
+ if !errors.is_empty() && !text.is_empty() {
writeln!(out, "===").unwrap();
- for err in &node.errors {
+ for err in &errors {
writeln!(out, "{:?}", err).unwrap();
}
let diag = MyDiagnostic {
code: text.to_string(),
- spans: node.errors.into_iter().map(|e| e.into()).collect(),
+ spans: errors.into_iter().map(|e| e.into()).collect(),
};
- let handler = GraphicalReportHandler::new();
+ let handler = GraphicalReportHandler::new_themed(GraphicalTheme {
+ characters: ThemeCharacters::ascii(),
+ styles: ThemeStyles::none(),
+ });
write!(out, "===").unwrap();
handler.render_report(&mut out, &diag).unwrap();
@@ -77,51 +82,94 @@
mk_test!(
empty => r#" "#
function => r#"
- function(a, b = 1) a + b
- "#
+ function(a, b = 1) a + b
+ "#
function_error_no_value => r#"
- function(a, b = ) a + b
- "#
+ function(a, b = ) a + b
+ "#
function_error_rparen => r#"
- function(a, b
- "#
+ function(a, b
+ "#
function_error_body => r#"
- function(a, b)
- "#
+ function(a, b)
+ "#
local_novalue => r#"
- local a =
- "#
+ local a =
+ "#
local_no_value_recovery => r#"
- local a =
- local b = 3;
- 1
- "#
+ local a =
+ local b = 3;
+ 1
+ "#
array_comp => r#"
- [a for a in [1, 2, 3]]
- "#
+ [a for a in [1, 2, 3]]
+ "#
array_comp_incompatible_with_multiple_elems => r#"
- [a for a in [1, 2, 3], b]
- "#
+ [a for a in [1, 2, 3], b]
+ "#
no_rhs => r#"
- a +
- "#
+ a +
+ "#
no_lhs => r#"
- + 2
- "#
+ + 2
+ "#
no_operator => "
- 2 2
- "
+ 2 2
+ "
named_before_positional => "
- a(1, 2, b=4, 3, 5, k = 12, 6)
- "
+ a(1, 2, b=4, 3, 5, k = 12, 6)
+ "
wrong_field_end => "
- {
- a: 1;
- b: 2;
- }
- "
+ {
+ a: 1;
+ b: 2;
+ }
+ "
+
+
+ plain_call => "
+ std.substr(a, 0, std.length(b)) == b
+ "
+
+ destruct => "
+ local [a, b, c] = arr;
+ local [a, ...] = arr_rest;
+ local [..., a] = rest_arr;
+ local [...] = rest_in_arr;
+ local [a, ...n] = arr_rest_n;
+ local [...n, a] = rest_arr_n;
+ local [...n] = rest_in_arr_n;
+
+ local {a, b, c} = obj;
+ local {a, b, c, ...} = obj_rest;
+ local {a, b, c, ...n} = obj_rest_n;
+
+ null
+ "
+
+ str_block_missing_indent => "
+ |||
+ "
+ str_block_missing_termination => "
+ |||
+ hello
+ "
+ str_block_missing_newline => "
+ |||hello
+ "
+ str_block_missing_indent_text => "
+ |||
+ hello
+ "
);
+
+#[test]
+fn stdlib() {
+ let src = jrsonnet_stdlib::STDLIB_STR;
+ let result = process(src);
+ insta::assert_snapshot!("stdlib", result, src);
+}
crates/jrsonnet-rowan-parser/src/token_set.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/token_set.rs
+++ b/crates/jrsonnet-rowan-parser/src/token_set.rs
@@ -1,14 +1,15 @@
use crate::SyntaxKind;
#[derive(Clone, Copy, Default)]
-pub struct SyntaxKindSet(u64);
+pub struct SyntaxKindSet(u128);
impl SyntaxKindSet {
+ #[allow(dead_code)]
pub const EMPTY: Self = Self(0);
- pub const ALL: Self = Self(u64::MAX);
+ pub const ALL: Self = Self(u128::MAX);
pub const fn new(kinds: &[SyntaxKind]) -> SyntaxKindSet {
- let mut res = 0u64;
+ let mut res = 0u128;
let mut i = 0;
while i < kinds.len() {
res |= mask(kinds[i]);
@@ -26,8 +27,8 @@
}
}
-const fn mask(kind: SyntaxKind) -> u64 {
- 1u64 << (kind as usize)
+const fn mask(kind: SyntaxKind) -> u128 {
+ 1u128 << (kind as u128)
}
#[macro_export]
@@ -40,3 +41,11 @@
])
};
}
+
+#[test]
+fn sanity() {
+ assert!(
+ (SyntaxKind::ERROR as u32) < 127,
+ "can't keep KindSet as bitset"
+ );
+}
xtask/Cargo.tomldiffbeforeafterboth--- a/xtask/Cargo.toml
+++ b/xtask/Cargo.toml
@@ -5,6 +5,7 @@
[dependencies]
anyhow = "1.0.57"
+indexmap = "1.9.0"
itertools = "0.10.3"
proc-macro2 = "1.0.39"
quote = "1.0.18"
xtask/src/sourcegen/ast.rsdiffbeforeafterboth--- a/xtask/src/sourcegen/ast.rs
+++ b/xtask/src/sourcegen/ast.rs
@@ -1,7 +1,13 @@
+use std::collections::{BTreeSet, HashMap};
+
use proc_macro2::TokenStream;
-use quote::{format_ident, quote};
+use quote::format_ident;
+use ungrammar::{Grammar, Rule};
-use super::{escape_token_macro, KindsSrc};
+use super::{
+ util::{pluralize, to_lower_snake_case},
+ KindsSrc,
+};
impl AstNodeSrc {
pub fn remove_field(&mut self, to_remove: Vec<usize>) {
@@ -14,9 +20,9 @@
#[allow(dead_code)]
#[derive(Default, Debug)]
pub struct AstSrc {
- pub tokens: Vec<String>,
pub nodes: Vec<AstNodeSrc>,
pub enums: Vec<AstEnumSrc>,
+ pub token_enums: Vec<AstTokenEnumSrc>,
}
#[derive(Debug)]
pub struct AstNodeSrc {
@@ -38,7 +44,11 @@
#[derive(Debug, Eq, PartialEq)]
pub enum Cardinality {
+ /// This field may not exist in code
Optional,
+ /// This field should exist in correctly parsed code
+ Required,
+ /// There may be multiple field values of this kind
Many,
}
@@ -50,6 +60,13 @@
pub variants: Vec<String>,
}
+#[derive(Debug, Clone)]
+pub struct AstTokenEnumSrc {
+ pub doc: Vec<String>,
+ pub name: String,
+ pub variants: Vec<String>,
+}
+
impl Field {
pub fn is_many(&self) -> bool {
matches!(
@@ -60,25 +77,29 @@
}
)
}
- pub fn token_kind(&self) -> Option<TokenStream> {
+
+ pub fn token_name(&self) -> Option<String> {
+ match self {
+ Field::Token(token) => Some(token.clone()),
+ _ => None,
+ }
+ }
+ pub fn token_kind(&self, kinds: &KindsSrc) -> Option<TokenStream> {
match self {
- Field::Token(token) => {
- let token: TokenStream = escape_token_macro(token);
- Some(quote! { T![#token] })
- }
+ Field::Token(token) => Some(kinds.token(token).expect("token exists").reference()),
_ => None,
}
}
+ pub fn is_token_enum(&self, grammar: &AstSrc) -> bool {
+ match self {
+ Field::Node { ty, .. } => grammar.token_enums.iter().any(|e| &e.name == ty),
+ _ => false,
+ }
+ }
pub fn method_name(&self, kinds: &KindsSrc) -> proc_macro2::Ident {
match self {
- Field::Token(name) => {
- if let Some(punct_name) = kinds.get_punct_name(name) {
- format_ident!("{}_token", punct_name.to_lowercase())
- } else {
- format_ident!("{}_token", name.to_lowercase())
- }
- }
+ Field::Token(name) => kinds.token(name).expect("token exists").method_name(),
Field::Node { name, .. } => {
format_ident!("{}", name)
}
@@ -91,3 +112,275 @@
}
}
}
+
+pub fn lower(kinds: &KindsSrc, grammar: &Grammar) -> AstSrc {
+ let mut res = AstSrc {
+ // tokens,
+ ..Default::default()
+ };
+
+ let nodes = grammar.iter().collect::<Vec<_>>();
+
+ for &node in &nodes {
+ let name = grammar[node].name.clone();
+ let rule = &grammar[node].rule;
+ match lower_enum(grammar, rule) {
+ Some(variants) => {
+ let enum_src = AstEnumSrc {
+ doc: Vec::new(),
+ name,
+ traits: Vec::new(),
+ variants,
+ };
+ res.enums.push(enum_src);
+ }
+ None => match lower_token_enum(grammar, rule) {
+ Some(variants) => {
+ let tokens_enum_src = AstTokenEnumSrc {
+ doc: Vec::new(),
+ name,
+ variants,
+ };
+ res.token_enums.push(tokens_enum_src);
+ }
+ None => {
+ let mut fields = Vec::new();
+ lower_rule(&mut fields, grammar, None, rule, false);
+ 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());
+ }
+ }
+ res.nodes.push(AstNodeSrc {
+ doc: Vec::new(),
+ name,
+ traits: Vec::new(),
+ fields,
+ });
+ }
+ },
+ }
+ }
+
+ deduplicate_fields(&mut res);
+ extract_struct_traits(kinds, &mut res);
+ extract_enum_traits(&mut res);
+ res
+}
+
+fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {
+ let alternatives = match rule {
+ Rule::Alt(it) => it,
+ _ => return None,
+ };
+ let mut variants = Vec::new();
+ for alternative in alternatives {
+ match alternative {
+ Rule::Node(it) => variants.push(grammar[*it].name.clone()),
+ Rule::Token(it) if grammar[*it].name == ";" => (),
+ _ => return None,
+ }
+ }
+ Some(variants)
+}
+fn lower_token_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {
+ let alternatives = match rule {
+ Rule::Alt(it) => it,
+ _ => return None,
+ };
+ let mut variants = Vec::new();
+ for alternative in alternatives {
+ match alternative {
+ Rule::Token(it) => variants.push(grammar[*it].name.clone()),
+ _ => return None,
+ }
+ }
+ Some(variants)
+}
+
+fn lower_rule(
+ acc: &mut Vec<Field>,
+ grammar: &Grammar,
+ label: Option<&String>,
+ rule: &Rule,
+ in_optional: bool,
+) {
+ if lower_comma_list(acc, grammar, label, rule) {
+ return;
+ }
+
+ match rule {
+ Rule::Node(node) => {
+ let ty = grammar[*node].name.clone();
+ let name = label.cloned().unwrap_or_else(|| to_lower_snake_case(&ty));
+ let field = Field::Node {
+ name,
+ ty,
+ cardinality: if in_optional {
+ Cardinality::Optional
+ } else {
+ Cardinality::Required
+ },
+ };
+ acc.push(field);
+ }
+ Rule::Token(token) => {
+ assert!(label.is_none(), "uexpected label: {:?}", label);
+ let name = grammar[*token].name.clone();
+ let field = Field::Token(name);
+ acc.push(field);
+ }
+ Rule::Rep(inner) => {
+ if let Rule::Node(node) = &**inner {
+ let ty = grammar[*node].name.clone();
+ let name = label
+ .cloned()
+ .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));
+ let field = Field::Node {
+ name,
+ ty,
+ cardinality: Cardinality::Many,
+ };
+ acc.push(field);
+ return;
+ }
+ todo!("unsupported repitition: {:?}", rule)
+ }
+ Rule::Labeled { label: l, rule } => {
+ assert!(label.is_none());
+ lower_rule(acc, grammar, Some(l), rule, in_optional);
+ }
+ Rule::Seq(rules) | Rule::Alt(rules) => {
+ for rule in rules {
+ lower_rule(acc, grammar, label, rule, in_optional)
+ }
+ }
+ Rule::Opt(rule) => lower_rule(acc, grammar, label, rule, true),
+ }
+}
+
+// (T (',' T)* ','?)
+fn lower_comma_list(
+ acc: &mut Vec<Field>,
+ grammar: &Grammar,
+ label: Option<&String>,
+ rule: &Rule,
+) -> bool {
+ let rule = match rule {
+ Rule::Seq(it) => it,
+ _ => return false,
+ };
+ let (node, repeat, trailing_comma) = match rule.as_slice() {
+ [Rule::Node(node), Rule::Rep(repeat), Rule::Opt(trailing_comma)] => {
+ (node, repeat, trailing_comma)
+ }
+ _ => return false,
+ };
+ let repeat = match &**repeat {
+ Rule::Seq(it) => it,
+ _ => return false,
+ };
+ match repeat.as_slice() {
+ [comma, Rule::Node(n)] if comma == &**trailing_comma && n == node => (),
+ _ => return false,
+ }
+ let ty = grammar[*node].name.clone();
+ let name = label
+ .cloned()
+ .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));
+ let field = Field::Node {
+ name,
+ ty,
+ cardinality: Cardinality::Many,
+ };
+ acc.push(field);
+ true
+}
+
+fn deduplicate_fields(ast: &mut AstSrc) {
+ for node in &mut ast.nodes {
+ let mut i = 0;
+ 'outer: while i < node.fields.len() {
+ for j in 0..i {
+ let f1 = &node.fields[i];
+ let f2 = &node.fields[j];
+ if f1 == f2 {
+ node.fields.remove(i);
+ continue 'outer;
+ }
+ }
+ i += 1;
+ }
+ }
+}
+
+fn extract_struct_traits(kinds: &KindsSrc, ast: &mut AstSrc) {
+ // TODO: add common accessor traits here.
+ let traits: &[(&str, &[&str])] = &[];
+
+ for node in &mut ast.nodes {
+ for (name, methods) in traits {
+ extract_struct_trait(kinds, node, name, methods);
+ }
+ }
+}
+
+fn extract_struct_trait(
+ kinds: &KindsSrc,
+ node: &mut AstNodeSrc,
+ trait_name: &str,
+ methods: &[&str],
+) {
+ let mut to_remove = Vec::new();
+ for (i, field) in node.fields.iter().enumerate() {
+ let method_name = field.method_name(kinds).to_string();
+ if methods.iter().any(|&it| it == method_name) {
+ to_remove.push(i);
+ }
+ }
+ if to_remove.len() == methods.len() {
+ node.traits.push(trait_name.to_string());
+ node.remove_field(to_remove);
+ }
+}
+
+fn extract_enum_traits(ast: &mut AstSrc) {
+ let enums = ast.enums.clone();
+ for enm in &mut ast.enums {
+ let nodes = &ast.nodes;
+
+ let mut variant_traits = enm.variants.iter().map(|var| {
+ nodes
+ .iter()
+ .find_map(|node| {
+ if &node.name != var {
+ return None;
+ }
+ Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())
+ })
+ .unwrap_or_else(|| {
+ enums
+ .iter()
+ .find_map(|node| {
+ if &node.name != var {
+ return None;
+ }
+ Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())
+ })
+ .unwrap_or_else(|| {
+ panic!("could not find struct {var} for enum {}::{var}", enm.name)
+ })
+ })
+ });
+
+ let mut enum_traits = match variant_traits.next() {
+ Some(it) => it,
+ None => continue,
+ };
+ for traits in variant_traits {
+ enum_traits = enum_traits.intersection(&traits).cloned().collect();
+ }
+ enm.traits = enum_traits.into_iter().collect();
+ }
+}
xtask/src/sourcegen/kinds.rsdiffbeforeafterboth--- /dev/null
+++ b/xtask/src/sourcegen/kinds.rs
@@ -0,0 +1,274 @@
+#[derive(Debug)]
+pub struct KindsSrc {
+ /// Key - how this token appears in ungrammar
+ defined_tokens: IndexMap<String, TokenKind>,
+ defined_node_names: HashSet<String>,
+ pub nodes: Vec<String>,
+}
+
+#[derive(Debug, Clone)]
+pub enum TokenKind {
+ /// May exist in token tree, but never in source code
+ Meta { grammar_name: String, name: String },
+ /// Specific parsing errors may be emitted as this type of kind
+ Error {
+ grammar_name: String,
+ name: String,
+ regex: Option<String>,
+ priority: Option<u32>,
+ },
+ /// Keyword - literal match of token
+ Keyword {
+ /// How this keyword appears in grammar/code, should be same as Kinds key
+ code: String,
+ name: String,
+ },
+ /// Literal - something defined by user, i.e strings, identifiers, smth
+ Literal {
+ /// How this keyword appears in grammar, should be same as Kinds key
+ grammar_name: String,
+ name: String,
+ /// Regex for Logos lexer
+ regex: String,
+ /// Path to custom lexer
+ lexer: Option<String>,
+ },
+}
+
+impl TokenKind {
+ pub fn grammar_name(&self) -> &str {
+ match self {
+ TokenKind::Keyword { code, .. } => code,
+ TokenKind::Literal { grammar_name, .. } => grammar_name,
+ TokenKind::Meta { grammar_name, .. } => grammar_name,
+ TokenKind::Error { grammar_name, .. } => grammar_name,
+ }
+ }
+ /// How this keyword should appear in kinds enum, screaming snake cased
+ pub fn name(&self) -> &str {
+ match self {
+ TokenKind::Keyword { name, .. } => name,
+ TokenKind::Literal { name, .. } => name,
+ TokenKind::Meta { name, .. } => name,
+ TokenKind::Error { name, .. } => name,
+ }
+ }
+ pub fn expand_kind(&self) -> TokenStream {
+ let name = format_ident!("{}", self.name());
+ let attr = match self {
+ TokenKind::Keyword { code, .. } => quote! {#[token(#code)]},
+ TokenKind::Literal { regex, lexer, .. } => {
+ let lexer = lexer
+ .as_deref()
+ .map(TokenStream::from_str)
+ .map(|r| r.expect("path is correct"));
+ quote! {#[regex(#regex, #lexer)]}
+ }
+ TokenKind::Error {
+ regex, priority, ..
+ } if regex.is_some() => {
+ let priority = priority.map(|p| quote! {, priority = #p});
+ quote! {#[regex(#regex #priority)]}
+ }
+ _ => quote! {},
+ };
+ quote! {
+ #attr
+ #name
+ }
+ }
+ pub fn expand_t_macros(&self) -> Option<TokenStream> {
+ match self {
+ TokenKind::Keyword { code, name } => {
+ let code = escape_token_macro(code);
+ let name = format_ident!("{name}");
+ Some(quote! {
+ [#code] => {$crate::SyntaxKind::#name}
+ })
+ }
+ // Meta items should not appear in T![_]
+ _ => None,
+ }
+ }
+
+ /// How this token should be referenced in code
+ /// Keywords are referenced with `T![_]` macro,
+ /// and literals are referenced directly by name
+ pub fn reference(&self) -> TokenStream {
+ match self {
+ TokenKind::Keyword { code, .. } => {
+ let code = escape_token_macro(code);
+ quote! {T![#code]}
+ }
+ _ => {
+ let name = self.name();
+ let ident = format_ident!("{name}");
+ quote! {#ident}
+ }
+ }
+ }
+
+ pub fn method_name(&self) -> Ident {
+ match self {
+ TokenKind::Keyword { name, .. } => {
+ format_ident!("{}_token", name.to_lowercase())
+ }
+ TokenKind::Literal { name, .. } => {
+ format_ident!("{}_lit", name.to_lowercase())
+ }
+ TokenKind::Meta { name, .. } => format_ident!("{}_meta", name.to_lowercase()),
+ TokenKind::Error { name, .. } => format_ident!("{}_error", name.to_lowercase()),
+ }
+ }
+}
+
+#[macro_export]
+macro_rules! define_kinds {
+ ($into:ident = lit($name:literal) => $regex:literal $(, $lexer:literal)? $(; $($rest:tt)*)?) => {{
+ $into.define_token(TokenKind::Literal {
+ grammar_name: format!("LIT_{}!", $name),
+ name: $name.to_owned(),
+ regex: $regex.to_owned(),
+ lexer: None $(.or_else(|| Some($lexer.to_string())))?,
+ });
+ $(define_kinds!($into = $($rest)*))?
+ }};
+ ($into:ident = error($name:literal$(, priority = $priority:literal)?) $(=> $regex:literal)? $(; $($rest:tt)*)?) => {{
+ $into.define_token(TokenKind::Error {
+ grammar_name: format!("ERROR_{}!", $name),
+ name: format!("ERROR_{}", $name),
+ regex: None$(.or(Some($regex.to_owned())))?,
+ priority: None$(.or(Some($priority)))?,
+ });
+ $(define_kinds!($into = $($rest)*))?
+ }};
+ ($into:ident = $tok:literal => $name:literal $(; $($rest:tt)*)?) => {{
+ $into.define_token(TokenKind::Keyword {
+ code: format!("{}", $tok),
+ name: $name.to_owned(),
+ });
+ $(define_kinds!($into = $($rest)*))?
+ }};
+ ($into:ident =) => {{}}
+}
+use std::{collections::HashSet, str::FromStr};
+
+pub use define_kinds;
+use indexmap::IndexMap;
+use proc_macro2::{Ident, TokenStream};
+use quote::{format_ident, quote};
+
+use super::escape_token_macro;
+
+impl KindsSrc {
+ pub fn new() -> Self {
+ Self {
+ defined_tokens: IndexMap::new(),
+ defined_node_names: HashSet::new(),
+ nodes: Vec::new(),
+ }
+ }
+ pub fn define_token(&mut self, token: TokenKind) {
+ assert!(
+ self.defined_node_names.insert(token.name().to_owned()),
+ "node name already defined: {}",
+ token.name()
+ );
+ assert!(
+ self.defined_tokens
+ .insert(token.grammar_name().to_owned(), token.clone())
+ .is_none(),
+ "token already defined: {}",
+ token.grammar_name()
+ )
+ }
+ pub fn define_node(&mut self, node: &str) {
+ assert!(
+ self.defined_node_names.insert(node.to_owned()),
+ "node name already defined: {}",
+ node
+ );
+ self.nodes.push(node.to_string())
+ }
+ pub fn token(&self, tok: &str) -> Option<&TokenKind> {
+ self.defined_tokens.get(tok)
+ }
+ pub fn is_token(&self, tok: &str) -> bool {
+ self.defined_tokens.contains_key(tok)
+ }
+ pub fn tokens(&self) -> impl Iterator<Item = &TokenKind> {
+ self.defined_tokens.iter().map(|(_, v)| v)
+ }
+}
+
+pub fn jsonnet_kinds() -> KindsSrc {
+ let mut kinds = KindsSrc::new();
+ define_kinds![kinds =
+ "||" => "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";
+ "$intrinsicThisFile" => "INTRINSIC_THIS_FILE";
+ "$intrinsicId" => "INTRINSIC_ID";
+ "$intrinsic" => "INTRINSIC";
+ // Literals
+ lit("FLOAT") => r"(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?";
+ error("FLOAT_JUNK_AFTER_POINT") => r"(?:0|[1-9][0-9]*)\.[^0-9]";
+ error("FLOAT_JUNK_AFTER_EXPONENT") => r"(?:0|[1-9][0-9]*)(?:\.[0-9]+)?[eE][^+\-0-9]";
+ error("FLOAT_JUNK_AFTER_EXPONENT_SIGN") => r"(?:0|[1-9][0-9]*)(?:\.[0-9]+)?[eE][+-][^0-9]";
+ lit("STRING_DOUBLE") => "\"(?s:[^\"\\\\]|\\\\.)*\"";
+ error("STRING_DOUBLE_UNTERMINATED") => "\"(?s:[^\"\\\\]|\\\\.)*";
+ lit("STRING_SINGLE") => "'(?s:[^'\\\\]|\\\\.)*'";
+ error("STRING_SINGLE_UNTERMINATED") => "'(?s:[^'\\\\]|\\\\.)*";
+ lit("STRING_DOUBLE_VERBATIM") => "@\"(?:[^\"]|\"\")*\"";
+ error("STRING_DOUBLE_VERBATIM_UNTERMINATED") => "@\"(?:[^\"]|\"\")*";
+ lit("STRING_SINGLE_VERBATIM") => "@'(?:[^']|'')*'";
+ error("STRING_SINGLE_VERBATIM_UNTERMINATED") => "@'(?:[^']|'')*";
+ error("STRING_VERBATIM_MISSING_QUOTES") => "@[^\"'\\s]\\S+";
+ lit("STRING_BLOCK") => r"\|\|\|", "crate::string_block::lex_str_block_test";
+ error("STRING_BLOCK_UNEXPECTED_END");
+ error("STRING_BLOCK_MISSING_NEW_LINE");
+ error("STRING_BLOCK_MISSING_TERMINATION");
+ error("STRING_BLOCK_MISSING_INDENT");
+ lit("IDENT") => r"[_a-zA-Z][_a-zA-Z0-9]*";
+ lit("WHITESPACE") => r"[ \t\n\r]+";
+ lit("SINGLE_LINE_SLASH_COMMENT") => r"//[^\r\n]*(\r\n|\n)?";
+ lit("SINGLE_LINE_HASH_COMMENT") => r"#[^\r\n]*(\r\n|\n)?";
+ lit("MULTI_LINE_COMMENT") => r"/\*([^*]|\*[^/])*\*/";
+ error("COMMENT_TOO_SHORT") => r"/\*/";
+ error("COMMENT_UNTERMINATED") => r"/\*([^*]|\*[^/])+";
+ ];
+ kinds
+}
xtask/src/sourcegen/mod.rsdiffbeforeafterboth--- a/xtask/src/sourcegen/mod.rs
+++ b/xtask/src/sourcegen/mod.rs
@@ -1,22 +1,36 @@
-use std::{
- collections::{BTreeSet, HashSet},
- path::PathBuf,
-};
+use std::path::PathBuf;
use anyhow::Result;
-use ast::{AstEnumSrc, AstNodeSrc, AstSrc, Cardinality, Field};
+use ast::{lower, AstSrc};
use itertools::Itertools;
+use kinds::{KindsSrc, TokenKind};
use proc_macro2::{Punct, Spacing, TokenStream};
use quote::{format_ident, quote};
-use ungrammar::{Grammar, Rule};
-use util::{
- ensure_file_contents, pluralize, reformat, to_lower_snake_case, to_pascal_case,
- to_upper_snake_case,
-};
+use ungrammar::Grammar;
+use util::{ensure_file_contents, reformat, to_pascal_case, to_upper_snake_case};
mod ast;
+mod kinds;
mod util;
+enum SpecialName {
+ Literal,
+ Meta,
+ Error,
+}
+fn classify_special(name: &str) -> Option<(SpecialName, &str)> {
+ let name = name.strip_suffix('!')?;
+ Some(if let Some(name) = name.strip_prefix("LIT_") {
+ (SpecialName::Literal, name)
+ } else if let Some(name) = name.strip_prefix("META_") {
+ (SpecialName::Meta, name)
+ } else if let Some(name) = name.strip_prefix("ERROR_") {
+ (SpecialName::Error, name)
+ } else {
+ return None;
+ })
+}
+
pub fn generate_ungrammar() -> Result<()> {
let grammar: Grammar = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
@@ -24,93 +38,51 @@
))
.parse()?;
- let mut kinds: KindsSrc = KindsSrc {
- punct: puncts![
- "||" => "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";
- "$intrinsicThisFile" => "INTRINSIC_THIS_FILE";
- "$intrinsicId" => "INTRINSIC_ID";
- "$intrinsic" => "INTRINSIC";
- ],
- keywords: vec![],
- literals: literals![
- "NUMBER" => r"(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?";
- "STRING_DOUBLE" => "\"(?s:[^\"\\\\]|\\\\.)*\"";
- "STRING_SINGLE" => "'(?s:[^'\\\\]|\\\\.)*'";
- "STRING_DOUBLE_VERBATIM" => "@\"(?:[^\"]|\"\")*\"";
- "STRING_SINGLE_VERBATIM" => "@'(?:[^']|'')*'";
- "STRING_BLOCK" => r"\|\|\|";
-
- "IDENT" => r"[_a-zA-Z][_a-zA-Z0-9]*";
- "WHITESPACE" => r"[ \t\n\r]+";
- "SINGLE_LINE_SLASH_COMMENT" => r"//[^\r\n]*(\r\n|\n)?";
- "SINGLE_LINE_HASH_COMMENT" => r"#[^\r\n]*(\r\n|\n)?";
- "MULTI_LINE_COMMENT" => r"/\*([^*]|\*[^/])*\*/";
- ],
- nodes: vec![],
- };
-
+ let mut kinds = kinds::jsonnet_kinds();
let ast = lower(&kinds, &grammar);
+ for token in grammar.tokens() {
+ let token = &grammar[token];
+ let token = &token.name.clone();
+ if !kinds.is_token(token) {
+ if let Some((special, name)) = classify_special(token) {
+ match special {
+ SpecialName::Literal => panic!("literal is not defined: {name}"),
+ SpecialName::Meta => kinds.define_token(TokenKind::Meta {
+ grammar_name: token.to_owned(),
+ name: format!("META_{}", name),
+ }),
+ SpecialName::Error => kinds.define_token(TokenKind::Error {
+ grammar_name: token.to_owned(),
+ name: format!("ERROR_{}", name),
+ regex: None,
+ priority: None,
+ }),
+ };
+ continue;
+ };
+ let name = to_upper_snake_case(token);
+ kinds.define_token(TokenKind::Keyword {
+ code: token.to_owned(),
+ name: format!("{name}_KW"),
+ });
+ }
+ }
for node in &ast.nodes {
let name = to_upper_snake_case(&node.name);
- if !kinds.is_literal(&name) {
- kinds.nodes.push(name);
- }
+ kinds.define_node(&name);
}
for enum_ in &ast.enums {
let name = to_upper_snake_case(&enum_.name);
- if !kinds.is_literal(&name) {
- kinds.nodes.push(name);
- }
+ kinds.define_node(&name);
}
- for token in grammar.tokens() {
- let token = &grammar[token];
- let token = &token.name.clone();
- let name = to_upper_snake_case(token);
- if !kinds.is_punct(token) && !kinds.is_literal(&name) {
- kinds.keywords.push(token.to_owned());
- }
+ for token_enum in &ast.token_enums {
+ let name = to_upper_snake_case(&token_enum.name);
+ kinds.define_node(&name);
}
- let syntax_kinds = generate_syntax_kinds(&kinds)?;
+ let syntax_kinds = generate_syntax_kinds(&kinds, &ast)?;
- let tokens = generate_tokens(&ast)?;
-
let nodes = generate_nodes(&kinds, &ast)?;
ensure_file_contents(
&PathBuf::from(concat!(
@@ -118,13 +90,6 @@
"/../crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs",
)),
&syntax_kinds,
- )?;
- ensure_file_contents(
- &PathBuf::from(concat!(
- env!("CARGO_MANIFEST_DIR"),
- "/../crates/jrsonnet-rowan-parser/src/generated/tokens.rs",
- )),
- &tokens,
)?;
ensure_file_contents(
&PathBuf::from(concat!(
@@ -134,123 +99,37 @@
&nodes,
)?;
Ok(())
-}
-
-fn generate_tokens(grammar: &AstSrc) -> Result<String> {
- let tokens = grammar.tokens.iter().map(|token| {
- let name = format_ident!("{}", token);
- let kind = format_ident!("{}", to_upper_snake_case(token));
- quote! {
- #[derive(Debug, Clone, PartialEq, Eq, Hash)]
- pub struct #name {
- pub(crate) syntax: SyntaxToken,
- }
- 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 AstToken for #name {
- fn can_cast(kind: SyntaxKind) -> bool { kind == #kind }
- fn cast(syntax: SyntaxToken) -> Option<Self> {
- if Self::can_cast(syntax.kind()) { Some(Self { syntax }) } else { None }
- }
- fn syntax(&self) -> &SyntaxToken { &self.syntax }
- }
- }
- });
-
- Ok(reformat(
- "e! {
- use crate::{SyntaxKind::{self, *}, SyntaxToken, ast::AstToken};
- #(#tokens)*
- }
- .to_string(),
- )?
- .replace("#[derive", "\n#[derive"))
}
-fn generate_syntax_kinds(grammar: &KindsSrc) -> Result<String> {
- let (single_byte_tokens_values, single_byte_tokens): (Vec<_>, Vec<_>) = grammar
- .punct
- .iter()
- .filter(|(token, _name)| token.len() == 1)
- .map(|(token, name)| (token.chars().next().unwrap(), format_ident!("{}", name)))
- .unzip();
+fn generate_syntax_kinds(kinds: &KindsSrc, grammar: &AstSrc) -> Result<String> {
+ let t_macros = kinds.tokens().filter_map(TokenKind::expand_t_macros);
+ let token_kinds = kinds.tokens().map(TokenKind::expand_kind);
- let punctuation_values = grammar
- .punct
- .iter()
- .map(|(token, _name)| escape_token_macro(token));
- let punctuation = grammar
- .punct
- .iter()
- .map(|(_token, name)| format_ident!("{}", name))
- .collect::<Vec<_>>();
- let punctuation_enum = grammar
- .punct
- .iter()
- .map(|(token, name)| {
- let id = format_ident!("{}", name);
- quote! {
- #[token(#token)]
- #id
- }
- })
- .collect::<Vec<_>>();
+ let keywords = kinds
+ .tokens()
+ .filter(|k| matches!(k, TokenKind::Keyword { .. }))
+ .map(TokenKind::name)
+ .map(|n| format_ident!("{n}"));
- let x = |name: &str| format_ident!("{}_KW", to_upper_snake_case(name));
- let full_keywords_values = &grammar.keywords;
- let full_keywords = full_keywords_values.iter().map(|s| x(s.as_str()));
-
- let all_keywords_values = grammar.keywords.to_vec();
- let all_keywords_idents = all_keywords_values.iter().map(|kw| format_ident!("{}", kw));
- let all_keywords = all_keywords_values
+ let nodes = kinds
+ .nodes
.iter()
- .map(|s| x(&**s))
+ .map(|name| format_ident!("{}", name))
.collect::<Vec<_>>();
- let all_keywords_enum = all_keywords_values
- .iter()
- .map(|s| {
- let id = x(&**s);
- quote! {
- #[token(#s)]
- #id
- }
- })
- .collect::<Vec<_>>();
- let tokens_enum = grammar
- .literals
+ let enums = grammar
+ .enums
.iter()
- .map(|l| {
- let regex = &l.regex;
- let id = format_ident!("{}", l.name);
- let lexer = l
- .lexer
- .as_ref()
- .map(|l| {
- let id: TokenStream = l.parse().expect("path");
- quote! {
- , #id
- }
- })
- .unwrap_or_else(|| quote! {});
- quote! {
- #[regex(#regex #lexer)]
- #id
- }
- })
- .collect::<Vec<_>>();
-
- let nodes = grammar
- .nodes
- .iter()
- .map(|name| format_ident!("{}", name))
- .collect::<Vec<_>>();
+ .map(|e| format_ident!("{}", to_upper_snake_case(&e.name)))
+ .chain(
+ grammar
+ .token_enums
+ .iter()
+ .map(|e| format_ident!("{}", to_upper_snake_case(&e.name))),
+ );
let ast = quote! {
- #![allow(bad_style, missing_docs, unreachable_pub)]
+ #![allow(bad_style, missing_docs, unreachable_pub, clippy::manual_non_exhaustive, clippy::match_like_matches_macro)]
use logos::Logos;
/// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`.
@@ -261,9 +140,7 @@
TOMBSTONE,
#[doc(hidden)]
EOF,
- #(#punctuation_enum,)*
- #(#all_keywords_enum,)*
- #(#tokens_enum,)*
+ #(#token_kinds,)*
#[error]
ERROR,
#(#nodes,)*
@@ -275,32 +152,15 @@
impl SyntaxKind {
pub fn is_keyword(self) -> bool {
match self {
- #(#all_keywords)|* => true,
+ #(#keywords)|* => true,
_ => false,
}
}
-
- pub fn is_punct(self) -> bool {
+ pub fn is_enum(self) -> bool {
match self {
- #(#punctuation)|* => true,
+ #(#enums)|* => true,
_ => false,
}
- }
-
- pub fn from_keyword(ident: &str) -> Option<SyntaxKind> {
- let kw = match ident {
- #(#full_keywords_values => #full_keywords,)*
- _ => return None,
- };
- Some(kw)
- }
-
- pub fn from_char(c: char) -> Option<SyntaxKind> {
- let tok = match c {
- #(#single_byte_tokens_values => #single_byte_tokens,)*
- _ => return None,
- };
- Some(tok)
}
pub fn from_raw(r: u16) -> Self {
@@ -313,71 +173,13 @@
}
#[macro_export]
- macro_rules! T {
- #([#punctuation_values] => { $crate::SyntaxKind::#punctuation };)*
- #([#all_keywords_idents] => { $crate::SyntaxKind::#all_keywords };)*
- [lifetime_ident] => { $crate::SyntaxKind::LIFETIME_IDENT };
- [ident] => { $crate::SyntaxKind::IDENT };
- [shebang] => { $crate::SyntaxKind::SHEBANG };
- }
+ macro_rules! T {#(#t_macros);*}
pub use T;
};
reformat(&ast.to_string())
-}
-
-pub struct KindsSrc {
- pub punct: Vec<(String, String)>,
- pub keywords: Vec<String>,
- pub literals: Vec<LiteralKind>,
- pub nodes: Vec<String>,
-}
-
-pub struct LiteralKind {
- name: String,
- regex: String,
- lexer: Option<String>,
-}
-
-#[macro_export]
-macro_rules! literals {
- ($($name:expr => $regex:expr $(, $lexer:expr)?);* $(;)?) => {
- vec![
- $(LiteralKind {
- name: $name.to_owned(),
- regex: $regex.to_owned(),
- lexer: None $(.or_else(|| Some($lexer.to_string())))?,
- }),*
- ]
- };
-}
-
-#[macro_export]
-macro_rules! puncts {
- ($($tok:expr => $name:expr);* $(;)?) => {
- vec![
- $(($tok.to_owned(), $name.to_owned())),*
- ]
- };
}
-use crate::{literals, puncts};
-
-impl KindsSrc {
- pub fn is_punct(&self, tok: &str) -> bool {
- self.punct.iter().any(|(t, _)| *t == tok)
- }
- pub fn is_literal(&self, tok: &str) -> bool {
- self.literals.iter().any(|l| l.name == tok)
- }
- fn get_punct_name(&self, tok: &str) -> Option<&str> {
- self.punct
- .iter()
- .find(|(t, _)| *t == tok)
- .map(|(_, n)| n.as_str())
- }
-}
-
fn generate_nodes(kinds: &KindsSrc, grammar: &AstSrc) -> Result<String> {
let (node_defs, node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
.nodes
@@ -400,12 +202,18 @@
support::children(&self.syntax)
}
}
- } else if let Some(token_kind) = field.token_kind() {
+ } else if let Some(token_kind) = field.token_kind(kinds) {
quote! {
pub fn #method_name(&self) -> Option<#ty> {
support::token(&self.syntax, #token_kind)
}
}
+ } else if field.is_token_enum(grammar) {
+ quote! {
+ pub fn #method_name(&self) -> Option<#ty> {
+ support::token_child(&self.syntax)
+ }
+ }
} else {
quote! {
pub fn #method_name(&self) -> Option<#ty> {
@@ -513,6 +321,80 @@
})
.unzip();
+ let (token_enum_defs, token_enum_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
+ .token_enums
+ .iter()
+ .map(|en| {
+ let variants: Vec<_> = en
+ .variants
+ .iter()
+ .map(|token| {
+ format_ident!(
+ "{}",
+ to_pascal_case(kinds.token(token).expect("token exists").name())
+ )
+ })
+ .collect();
+ let name = format_ident!("{}", en.name);
+ let kind_name = format_ident!("{}Kind", en.name);
+ let kinds: Vec<_> = variants
+ .iter()
+ .map(|name| format_ident!("{}", to_upper_snake_case(&name.to_string())))
+ .collect();
+
+ let ast_node = quote! {
+ impl AstToken for #name {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ match kind {
+ #(#kinds)|* => true,
+ _ => false,
+ }
+ }
+ fn cast(syntax: SyntaxToken) -> Option<Self> {
+ let res = match syntax.kind() {
+ #(
+ #kinds => #name { syntax, kind: #kind_name::#variants },
+ )*
+ _ => return None,
+ };
+ Some(res)
+ }
+ fn syntax(&self) -> &SyntaxToken {
+ &self.syntax
+ }
+ }
+ };
+
+ (
+ quote! {
+ #[pretty_doc_comment_placeholder_workaround]
+ #[derive(Debug, Clone, PartialEq, Eq, Hash)]
+ pub struct #name { syntax: SyntaxToken, kind: #kind_name }
+
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+ pub enum #kind_name {
+ #(#variants,)*
+ }
+ },
+ quote! {
+ #ast_node
+
+ impl #name {
+ pub fn kind(&self) -> #kind_name {
+ self.kind
+ }
+ }
+
+ impl std::fmt::Display for #name {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(self.syntax(), f)
+ }
+ }
+ },
+ )
+ })
+ .unzip();
+
let (any_node_defs, any_node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
.nodes
.iter()
@@ -581,32 +463,22 @@
}
});
- let defined_nodes: HashSet<_> = node_names.collect();
-
- for node in kinds
- .nodes
- .iter()
- .map(|kind| to_pascal_case(kind))
- .filter(|name| !defined_nodes.iter().any(|&it| it == name))
- {
- drop(node)
- // FIXME: restore this
- // eprintln!("Warning: node {} not defined in ast source", node);
- }
-
let ast = quote! {
- #![allow(non_snake_case)]
+ #![allow(non_snake_case, clippy::match_like_matches_macro)]
+
use crate::{
SyntaxNode, SyntaxToken, SyntaxKind::{self, *},
- ast::{self, AstNode, AstChildren, support},
+ ast::{AstNode, AstToken, AstChildren, support},
T,
};
#(#node_defs)*
#(#enum_defs)*
+ #(#token_enum_defs)*
#(#any_node_defs)*
#(#node_boilerplate_impls)*
#(#enum_boilerplate_impls)*
+ #(#token_enum_boilerplate_impls)*
#(#any_node_boilerplate_impls)*
#(#display_impls)*
};
@@ -636,276 +508,6 @@
use std::fmt::Write;
for line in contents {
writeln!(dest, "///{}", line).unwrap();
- }
-}
-
-fn lower(kinds: &KindsSrc, grammar: &Grammar) -> AstSrc {
- let tokens = "Whitespace Comment String StringVerbantim StringBlock Number Ident"
- .split_ascii_whitespace()
- .map(|it| it.to_string())
- .collect::<Vec<_>>();
-
- let mut res = AstSrc {
- tokens,
- ..Default::default()
- };
-
- let nodes = grammar.iter().collect::<Vec<_>>();
-
- for &node in &nodes {
- let name = grammar[node].name.clone();
- let rule = &grammar[node].rule;
- match lower_enum(grammar, rule) {
- Some(variants) => {
- let enum_src = AstEnumSrc {
- doc: Vec::new(),
- name,
- traits: Vec::new(),
- variants,
- };
- res.enums.push(enum_src);
- }
- None => {
- let mut fields = Vec::new();
- lower_rule(&mut fields, grammar, None, rule);
- res.nodes.push(AstNodeSrc {
- doc: Vec::new(),
- name,
- traits: Vec::new(),
- fields,
- });
- }
- }
- }
-
- deduplicate_fields(&mut res);
- extract_enums(&mut res);
- extract_struct_traits(kinds, &mut res);
- extract_enum_traits(&mut res);
- res
-}
-
-fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {
- let alternatives = match rule {
- Rule::Alt(it) => it,
- _ => return None,
- };
- let mut variants = Vec::new();
- for alternative in alternatives {
- match alternative {
- Rule::Node(it) => variants.push(grammar[*it].name.clone()),
- Rule::Token(it) if grammar[*it].name == ";" => (),
- _ => return None,
- }
- }
- Some(variants)
-}
-
-fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, label: Option<&String>, rule: &Rule) {
- if lower_comma_list(acc, grammar, label, rule) {
- return;
- }
-
- match rule {
- Rule::Node(node) => {
- let ty = grammar[*node].name.clone();
- let name = label.cloned().unwrap_or_else(|| to_lower_snake_case(&ty));
- let field = Field::Node {
- name,
- ty,
- cardinality: Cardinality::Optional,
- };
- acc.push(field);
- }
- Rule::Token(token) => {
- assert!(label.is_none(), "uexpected label: {:?}", label);
- let name = grammar[*token].name.clone();
- let field = Field::Token(name);
- acc.push(field);
- }
- Rule::Rep(inner) => {
- if let Rule::Node(node) = &**inner {
- let ty = grammar[*node].name.clone();
- let name = label
- .cloned()
- .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));
- let field = Field::Node {
- name,
- ty,
- cardinality: Cardinality::Many,
- };
- acc.push(field);
- return;
- }
- todo!("unsupported repitition: {:?}", rule)
- }
- Rule::Labeled { label: l, rule } => {
- assert!(label.is_none());
- lower_rule(acc, grammar, Some(l), rule);
- }
- Rule::Seq(rules) | Rule::Alt(rules) => {
- for rule in rules {
- lower_rule(acc, grammar, label, rule)
- }
- }
- Rule::Opt(rule) => lower_rule(acc, grammar, label, rule),
- }
-}
-
-// (T (',' T)* ','?)
-fn lower_comma_list(
- acc: &mut Vec<Field>,
- grammar: &Grammar,
- label: Option<&String>,
- rule: &Rule,
-) -> bool {
- let rule = match rule {
- Rule::Seq(it) => it,
- _ => return false,
- };
- let (node, repeat, trailing_comma) = match rule.as_slice() {
- [Rule::Node(node), Rule::Rep(repeat), Rule::Opt(trailing_comma)] => {
- (node, repeat, trailing_comma)
- }
- _ => return false,
- };
- let repeat = match &**repeat {
- Rule::Seq(it) => it,
- _ => return false,
- };
- match repeat.as_slice() {
- [comma, Rule::Node(n)] if comma == &**trailing_comma && n == node => (),
- _ => return false,
- }
- let ty = grammar[*node].name.clone();
- let name = label
- .cloned()
- .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));
- let field = Field::Node {
- name,
- ty,
- cardinality: Cardinality::Many,
- };
- acc.push(field);
- true
-}
-
-fn deduplicate_fields(ast: &mut AstSrc) {
- for node in &mut ast.nodes {
- let mut i = 0;
- 'outer: while i < node.fields.len() {
- for j in 0..i {
- let f1 = &node.fields[i];
- let f2 = &node.fields[j];
- if f1 == f2 {
- node.fields.remove(i);
- continue 'outer;
- }
- }
- i += 1;
- }
- }
-}
-
-fn extract_enums(ast: &mut AstSrc) {
- for node in &mut ast.nodes {
- for enm in &ast.enums {
- let mut to_remove = Vec::new();
- for (i, field) in node.fields.iter().enumerate() {
- let ty = field.ty().to_string();
- if enm.variants.iter().any(|it| it == &ty) {
- to_remove.push(i);
- }
- }
- if to_remove.len() == enm.variants.len() {
- node.remove_field(to_remove);
- let ty = enm.name.clone();
- let name = to_lower_snake_case(&ty);
- node.fields.push(Field::Node {
- name,
- ty,
- cardinality: Cardinality::Optional,
- });
- }
- }
- }
-}
-
-fn extract_struct_traits(kinds: &KindsSrc, ast: &mut AstSrc) {
- // TODO: add common accessor traits here.
- let traits: &[(&str, &[&str])] = &[];
-
- for node in &mut ast.nodes {
- for (name, methods) in traits {
- extract_struct_trait(kinds, node, name, methods);
- }
- }
-}
-
-fn extract_struct_trait(
- kinds: &KindsSrc,
- node: &mut AstNodeSrc,
- trait_name: &str,
- methods: &[&str],
-) {
- let mut to_remove = Vec::new();
- for (i, field) in node.fields.iter().enumerate() {
- let method_name = field.method_name(kinds).to_string();
- if methods.iter().any(|&it| it == method_name) {
- to_remove.push(i);
- }
- }
- if to_remove.len() == methods.len() {
- node.traits.push(trait_name.to_string());
- node.remove_field(to_remove);
- }
-}
-
-fn extract_enum_traits(ast: &mut AstSrc) {
- let enums = ast.enums.clone();
- for enm in &mut ast.enums {
- if enm.name == "Stmt" {
- continue;
- }
- let nodes = &ast.nodes;
-
- let mut variant_traits = enm.variants.iter().map(|var| {
- nodes
- .iter()
- .find_map(|node| {
- if &node.name != var {
- return None;
- }
- Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())
- })
- .unwrap_or_else(|| {
- enums
- .iter()
- .find_map(|node| {
- if &node.name != var {
- return None;
- }
- Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())
- })
- .unwrap_or_else(|| {
- panic!("{}", {
- &format!(
- "Could not find a struct `{}` for enum `{}::{}`",
- var, enm.name, var
- )
- })
- })
- })
- });
-
- let mut enum_traits = match variant_traits.next() {
- Some(it) => it,
- None => continue,
- };
- for traits in variant_traits {
- enum_traits = enum_traits.intersection(&traits).cloned().collect();
- }
- enm.traits = enum_traits.into_iter().collect();
}
}
xtask/src/sourcegen/util.rsdiffbeforeafterboth--- a/xtask/src/sourcegen/util.rs
+++ b/xtask/src/sourcegen/util.rs
@@ -1,6 +1,6 @@
use std::{fs, path::Path};
-use anyhow::{bail, Result};
+use anyhow::Result;
use xshell::{cmd, Shell};
/// Checks that the `file` has the specified `contents`. If that is not the
@@ -15,13 +15,13 @@
eprintln!(" {} was not up-to-date, updating\n", file.display());
if std::env::var("CI").is_ok() {
- eprintln!("NOTE: run `cargo test` locally and commit the updated files\n");
+ eprintln!("NOTE: run `cargo xtask` locally and commit the updated files\n");
}
if let Some(parent) = file.parent() {
let _ = fs::create_dir_all(parent);
}
fs::write(file, contents).unwrap();
- bail!("some file was not up to date and has been updated, simply re-run the tests");
+ Ok(())
}
// Eww, someone configured git to use crlf?
@@ -80,9 +80,7 @@
// let _e = pushenv("RUSTUP_TOOLCHAIN", "stable");
// rustfmt()?;
let sh = Shell::new()?;
- let stdout = cmd!(sh, "rustfmt --config fn_single_line=true")
- .stdin(text)
- .read()?;
+ let stdout = cmd!(sh, "rustfmt").stdin(text).read()?;
Ok(format!(
"{}\n\n{}\n",
"//! This is a generated file, please do not edit manually. Changes can be