(command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Name VARIABLES_SH> suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<true>}) ) } {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (C {<declare>} {<-g>} {<Id.Lit_VarLike 'VARIABLES_SH='> <true>}) (C {<.>} { (braced_var_sub token: <Id.VSub_Name BASH_SOURCE> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<Id.Lit_Slash /> <'*'>}) ) </common.sh> } ) (C {<.>} { (braced_var_sub token: <Id.VSub_Name BASH_SOURCE> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<Id.Lit_Slash /> <'*'>}) ) </logger.sh> } ) (C {<declare>} {<-g>} {<-A>} {<Id.Lit_VarLike 'VARIABLES_METADATA='> (sh_array_literal left:<Id.Op_LParen _>)} ) (C {<declare>} {<-g>} {<-A>} {<Id.Lit_VarLike 'VARIABLES_VALUES='> (sh_array_literal left:<Id.Op_LParen _>)} ) (C {<declare>} {<-g>} {<Id.Lit_VarLike 'VARIABLES_INDEX='> <0>}) (C {<declare>} {<-g>} {<-A>} {<Id.Lit_VarLike 'VARIABLES_OFFSETS='> (word_part.AssocArrayLiteral left:<Id.Op_LParen _> pairs:[{<type>} {<0>}]) } ) (C {<declare>} {<-g>} {<Id.Lit_VarLike 'VARIABLES_DEBUG='> <0>}) (C {<declare>} {<-g>} {<-A>} {<Id.Lit_VarLike 'VARIABLES_TYPES='> (sh_array_literal left:<Id.Op_LParen _>)} ) (command.ShFunction name: 'variable::new' body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(${ Id.VSub_Name VARIABLES_DEBUG)} right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Sentence child: (C {<stderr>} {(DQ <'variable::new '> (${ Id.VSub_At '@'))}) terminator: <Id.Op_Semi _> ) ] spids: [162 177] ) ] ) (C {<declare>} {<token>}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(DQ (${ Id.VSub_Number 1))} right: {(DQ <-name>)} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<shift>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:token) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Number 1))} spids: [225] ) ] ) (C {<shift>}) ] spids: [200 219] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:token) op: assign_op.Equal rhs: {(DQ <'auto#'> (${ Id.VSub_Name VARIABLES_INDEX))} spids: [239] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:VARIABLES_INDEX) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(${ Id.VSub_Name VARIABLES_INDEX)}) right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) } spids: [248] ) ] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalOr left: (bool_expr.Binary op_id: Id.BoolBinary_lt left: { (DQ (braced_var_sub token: <Id.VSub_At '@'> prefix_op: (Id.VSub_Pound) ) ) } right: {<1>} ) right: (bool_expr.Binary op_id: Id.BoolBinary_gt left: { (DQ (braced_var_sub token: <Id.VSub_At '@'> prefix_op: (Id.VSub_Pound) ) ) } right: {<2>} ) ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Usage: variable::new ?name? <type> <value>'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [267 298] ) ] ) (C {<declare>} {<Id.Lit_VarLike 'type='> (DQ (${ Id.VSub_Number 1))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name type)}) ) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Unknown variable type ['> (${ Id.VSub_Name type) <']'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [327 348] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_eq left: { (DQ (braced_var_sub token: <Id.VSub_At '@'> prefix_op: (Id.VSub_Pound) ) ) } right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [(C {<declare>} {<Id.Lit_VarLike 'value='> (DQ )})] spids: [371 389] ) ] else_action: [(C {<declare>} {<Id.Lit_VarLike 'value='> (DQ (${ Id.VSub_Number 2))})] ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'metadata='> (sh_array_literal left: <Id.Op_LParen _> words: [{($ Id.VSub_DollarName '$type')}] ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_METADATA index: (arith_expr.ArithWord w:{(DQ (${ Id.VSub_Name token))}) ) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name metadata> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } spids: [426] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_VALUES index: (arith_expr.ArithWord w:{(DQ (${ Id.VSub_Name token))}) ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$value'))} spids: [449] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$token'))} spids: [476] ) ] ) ] ) ) (command.ShFunction name: '_variable::new_p' body: (command.BraceGroup children: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <new>} {(DQ (${ Id.VSub_At '@'))}) (C {<echo>} {(DQ ($ Id.VSub_DollarName '$RESULT'))}) ] ) ) (command.ShFunction name: 'variable::clone' body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(${ Id.VSub_Name VARIABLES_DEBUG)} right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Sentence child: (C {<stderr>} {(DQ <'variable::clone '> (${ Id.VSub_At '@'))}) terminator: <Id.Op_Semi _> ) ] spids: [529 544] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(DQ (${ Id.VSub_Number 1))} right: {(DQ <-name>)} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<shift>}) (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ (${ Id.VSub_Number 1))}) (C {<shift>}) ] spids: [561 580] ) ] else_action: [ (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ <'auto#'> (${ Id.VSub_Name VARIABLES_INDEX))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:VARIABLES_INDEX) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(${ Id.VSub_Name VARIABLES_INDEX)}) right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) } spids: [613] ) ] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalOr left: (bool_expr.Binary op_id: Id.BoolBinary_lt left: { (DQ (braced_var_sub token: <Id.VSub_At '@'> prefix_op: (Id.VSub_Pound) ) ) } right: {<1>} ) right: (bool_expr.Binary op_id: Id.BoolBinary_gt left: { (DQ (braced_var_sub token: <Id.VSub_At '@'> prefix_op: (Id.VSub_Pound) ) ) } right: {<2>} ) ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Usage: variable::new ?name? <type> <value>'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [632 663] ) ] ) (C {<declare>} {<Id.Lit_VarLike 'from_token='> (DQ (${ Id.VSub_Number 1))}) (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_Name from_token))} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'type='> (DQ (${ Id.VSub_Name RESULT))}) (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {(DQ (${ Id.VSub_Name from_token))} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'value='> (DQ (${ Id.VSub_Name RESULT))}) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'metadata='> (sh_array_literal left: <Id.Op_LParen _> words: [{($ Id.VSub_DollarName '$type')}] ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_METADATA index: (arith_expr.ArithWord w:{(${ Id.VSub_Name token)}) ) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name metadata> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } spids: [749] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_VALUES index: (arith_expr.ArithWord w:{(${ Id.VSub_Name token)}) ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$value'))} spids: [768] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$token'))} spids: [783] ) ] ) ] ) ) (command.ShFunction name: 'variable::set' body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(${ Id.VSub_Name VARIABLES_DEBUG)} right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Sentence child: (C {<stderr>} {(DQ <'variable::set '> (${ Id.VSub_At '@'))}) terminator: <Id.Op_Semi _> ) ] spids: [812 827] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_ne left: {(braced_var_sub token:<Id.VSub_At '@'> prefix_op:(Id.VSub_Pound))} right: {<3>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Usage: variable::set <variable token> <type> <value>'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [843 859] ) ] ) (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ ($ Id.VSub_Number '$1'))}) (C {<declare>} {<Id.Lit_VarLike 'type='> (DQ ($ Id.VSub_Number '$2'))}) (C {<declare>} {<Id.Lit_VarLike 'value='> (DQ ($ Id.VSub_Number '$3'))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name type)}) ) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Unknown variable type ['> (${ Id.VSub_Name type) <']'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [904 925] ) ] ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'metadata='> (sh_array_literal left: <Id.Op_LParen _> words: [{($ Id.VSub_DollarName '$type')}] ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_METADATA index: (arith_expr.ArithWord w:{(${ Id.VSub_Name token)}) ) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name metadata> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } spids: [959] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_VALUES index: (arith_expr.ArithWord w:{(${ Id.VSub_Name token)}) ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$value'))} spids: [978] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ )} spids: [993] ) ] ) ] ) ) (command.ShFunction name: 'variable::type' body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(${ Id.VSub_Name VARIABLES_DEBUG)} right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Sentence child: (C {<stderr>} {(DQ <'variable::type '> (${ Id.VSub_At '@'))}) terminator: <Id.Op_Semi _> ) ] spids: [1021 1036] ) ] ) (C {<declare>} {<Id.Lit_VarLike 'index='> ($ Id.VSub_Number '$1')}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (DQ (braced_var_sub token: <Id.VSub_Name VARIABLES_METADATA> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name index)}) ) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'The variable token ['> (${ Id.VSub_Name index) <'] does not exist'>)} ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1058 1080] ) ] ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'metadata='> (sh_array_literal left: <Id.Op_LParen _> words: [ { (braced_var_sub token: <Id.VSub_Name VARIABLES_METADATA> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$index')}) ) ) } ] ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name metadata> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w: { (braced_var_sub token: <Id.VSub_Name VARIABLES_OFFSETS> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.VarRef token:<Id.Lit_ArithVarLike type>) ) ) } ) ) ) } spids: [1117] ) ] ) ] ) ) (command.ShFunction name: '_variable::type_p' body: (command.BraceGroup children: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_At '@'))}) (C {<echo>} {(DQ ($ Id.VSub_DollarName '$RESULT'))}) ] ) ) (command.ShFunction name: 'variable::type::define' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'typeName='> (DQ (${ Id.VSub_Number 1))}) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'typeParents='> (sh_array_literal left:<Id.Op_LParen _>)} ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name typeName)}) ) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Variable type ['> (${ Id.VSub_Name typeName) <'] already defined'>)} ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1204 1223] ) ] ) (C {<declare>} {<-a>} {<superTypes>}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Number 2> suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<declare>} {<Id.Lit_VarLike 'typeParent='> (DQ (${ Id.VSub_Number 2))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$typeParent')} ) ) suffix_op: (suffix_op.Unary op_id: Id.VTest_Plus arg_word: {<true>} ) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} { (DQ <'Variable type ['> (${ Id.VSub_Name typeName) <'] declare unknown parent type ['> (${ Id.VSub_Name typeParent) <']'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1280 1299] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:typeParents) op: assign_op.PlusEqual rhs: { (sh_array_literal left: <Id.Op_LParen _> words: [{(DQ (${ Id.VSub_Name typeParent))}] ) } spids: [1325] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:typeParents) op: assign_op.PlusEqual rhs: { (sh_array_literal left: <Id.Op_LParen _> words: [ { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name typeParent)}) ) ) } ] ) } spids: [1335] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_TYPES index: (arith_expr.ArithWord w:{(${ Id.VSub_Name typeName)}) ) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name typeParents> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } spids: [1348] ) ] ) ] spids: [1253 1267] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.IndexedName name: VARIABLES_TYPES index: (arith_expr.ArithWord w:{(${ Id.VSub_Name typeName)}) ) op: assign_op.Equal rhs: {(DQ )} spids: [1370] ) ] ) ] ) ] ) ) (command.ShFunction name: 'variable::type::instanceOf' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ (${ Id.VSub_Number 1))}) (C {<declare>} {<Id.Lit_VarLike 'expectedType='> (DQ (${ Id.VSub_Number 2))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <exactlyA> } {(DQ (${ Id.VSub_Name token))} {(DQ (${ Id.VSub_Name expectedType))} ) terminator: <Id.Op_Semi _> ) ] action: [(command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})] spids: [1433 1457] ) ] ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_Name token))}) (C {<declare>} {<Id.Lit_VarLike 'actualType='> (DQ (${ Id.VSub_Name RESULT))}) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'actualSuperTypes='> (sh_array_literal left: <Id.Op_LParen _> words: [ { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$actualType')}) ) ) } ] ) } ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Name actualSuperTypes> prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) } {<-lt>} {<1>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Sentence child: (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<1>}) terminator: <Id.Op_Semi _> ) ] spids: [1507 1527] ) ] ) (C {<declare>} {<superType>}) (command.ForEach iter_name: superType iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name actualSuperTypes> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ (${ Id.VSub_Name expectedType))} {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name superType))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<0>} ) ] spids: [1563 1586] ) ] ) ] ) ) (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<1>}) ] ) ) (command.ShFunction name: 'variable::type::instanceOfOrExit' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'valueToken='> (DQ (${ Id.VSub_Number 1))}) (C {<declare>} {<Id.Lit_VarLike 'expectedType='> (DQ (${ Id.VSub_Number 2))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <instanceOf> } {(DQ (${ Id.VSub_Name valueToken))} {(DQ (${ Id.VSub_Name expectedType))} ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_Name valueToken))} ) (C {<stderr>} { (DQ <'Variable ['> (${ Id.VSub_Name valueToken) <'] is not of type ['> (${ Id.VSub_Name expectedType) <'] (actual type ['> (${ Id.VSub_Name RESULT) <'])'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1644 1670] ) ] ) ] ) ) (command.ShFunction name: 'variable::type::exactlyA' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ (${ Id.VSub_Number 1))}) (C {<declare>} {<Id.Lit_VarLike 'expectedType='> (DQ (${ Id.VSub_Number 2))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$expectedType')} ) ) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<true>}) ) } {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'Unknown type ['> (${ Id.VSub_Name expectedType) <']'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1759 1778] ) ] ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_Name token))}) (C {<declare>} {<Id.Lit_VarLike 'actualType='> (DQ (${ Id.VSub_Name RESULT))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ (${ Id.VSub_Name actualType))} {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name expectedType))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [(command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})] spids: [1824 1846] ) ] else_action: [(command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<1>})] ) ] ) ) (command.ShFunction name: 'variable::value' body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(${ Id.VSub_Name VARIABLES_DEBUG)} right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Sentence child: (C {<stderr>} {(DQ <'variable::value '> (${ Id.VSub_At '@'))}) terminator: <Id.Op_Semi _> ) ] spids: [1880 1895] ) ] ) (C {<declare>} {<Id.Lit_VarLike 'index='> (DQ (${ Id.VSub_Number 1))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [ (C {<Id.Lit_LBracket '['>} { (DQ (braced_var_sub token: <Id.VSub_Name VARIABLES_VALUES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name index)}) ) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) ) } {<Id.Lit_RBracket ']'>} ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<stderr>} {(DQ <'The variable token ['> (${ Id.VSub_Name index) <'] does not exist'>)} ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1921 1943] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name VARIABLES_VALUES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name index)}) ) ) } spids: [1965] ) ] ) ] ) ) (command.ShFunction name: '_variable::value_p' body: (command.BraceGroup children: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {(DQ (${ Id.VSub_At '@'))}) (C {<echo>} {(DQ ($ Id.VSub_DollarName '$RESULT'))}) ] ) ) (command.ShFunction name: 'variable::debug' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ (${ Id.VSub_Number 1))}) (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {($ Id.VSub_DollarName '$token')} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'type='> ($ Id.VSub_DollarName '$RESULT')}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<functionExists>} {(DQ <'variable::'> (${ Id.VSub_Name type) <'::debug'>)}) terminator: <Id.Op_Semi _> ) ] action: [ (C {<eval>} { (DQ <'variable::'> (${ Id.VSub_Name type) <'::debug '> (${ Id.VSub_Name token)) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2080] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [2050 2063] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id: Id.BoolUnary_z child: { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name type)}) ) ) } ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <debug> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <simple> } {($ Id.VSub_DollarName '$token')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2124] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [2092 2110] ) ] ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'actualSuperTypes='> (sh_array_literal left: <Id.Op_LParen _> words: [ { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$type')}) ) ) } ] ) } ) (C {<declare>} {<superType>}) (command.ForEach iter_name: superType iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name actualSuperTypes> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<functionExists>} {(DQ <'variable::'> (${ Id.VSub_Name superType) <'::debug'>)} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<eval>} { (DQ <'variable::'> (${ Id.VSub_Name superType) <'::debug '> (${ Id.VSub_Name token) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2204] ) ] ) (command.ControlFlow token: <Id.ControlFlow_Return return> ) ] spids: [2174 2187] ) ] ) ] ) ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <debug> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <simple> } {($ Id.VSub_DollarName '$token')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2229] ) ] ) ] ) ) (command.ShFunction name: 'variable::debug::simple' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ (${ Id.VSub_Number 1))}) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_Name token))}) (C {<declare>} {<Id.Lit_VarLike 'type='> (DQ (${ Id.VSub_Name RESULT))}) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {(DQ (${ Id.VSub_Name token))}) (C {<declare>} {<Id.Lit_VarLike 'value='> (DQ (${ Id.VSub_Name RESULT))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name type) <' :: '> (${ Id.VSub_Name value))} spids: [2304] ) ] ) ] ) ) (command.ShFunction name: 'variable::debug::join' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'joinChar='> (${ Id.VSub_Number 1)}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(braced_var_sub token:<Id.VSub_At '@'> prefix_op:(Id.VSub_Pound))} right: {<1>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ )} spids: [2362] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [2342 2358] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobDEqual left: {(braced_var_sub token:<Id.VSub_At '@'> prefix_op:(Id.VSub_Pound))} right: {<2>} ) ) terminator: <Id.Op_Semi _> ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Number 2))} spids: [2392] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [2373 2389] ) ] ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'items='> (sh_array_literal left: <Id.Op_LParen _> words: [ { (DQ (braced_var_sub token: <Id.VSub_At '@'> suffix_op: (suffix_op.Slice begin: (arith_expr.ArithWord w:{<Id.Lit_Digits 2>}) ) ) ) } ] ) } ) (C {<declare>} {<size>} {<declare>} {<max_index>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Number 2))} spids: [2432] ) ] ) (command.DParen child: (arith_expr.Binary op_id: Id.Arith_Comma left: (arith_expr.BinaryAssign op_id: Id.Arith_Equal left: (sh_lhs_expr.Name name:size) right: (arith_expr.ArithWord w: { (braced_var_sub token: <Id.VSub_Name items> prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) } ) ) right: (arith_expr.BinaryAssign op_id: Id.Arith_Equal left: (sh_lhs_expr.Name name:max_index) right: (arith_expr.Binary op_id: Id.Arith_Minus left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike size>) right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) ) ) ) (command.ForExpr init: (arith_expr.BinaryAssign op_id: Id.Arith_Equal left: (sh_lhs_expr.Name name:i) right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) cond: (arith_expr.Binary op_id: Id.Arith_LessEqual left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike i>) right: (arith_expr.VarRef token:<Id.Lit_ArithVarLike max_index>) ) update: (arith_expr.BinaryAssign op_id: Id.Arith_PlusEqual left: (sh_lhs_expr.Name name:i) right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>}) ) body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name RESULT) (${ Id.VSub_Name joinChar) (braced_var_sub token: <Id.VSub_Name items> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$i')}) ) ) ) } spids: [2489] ) ] ) ] ) ) ] ) ) (command.ShFunction name: 'variable::toSexp' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'token='> (DQ (${ Id.VSub_Number 1))}) (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {($ Id.VSub_DollarName '$token')} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'type='> ($ Id.VSub_DollarName '$RESULT')}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<functionExists>} {(DQ <'variable::'> (${ Id.VSub_Name type) <'::toSexp'>)}) terminator: <Id.Op_Semi _> ) ] action: [ (C {<eval>} { (DQ <'variable::'> (${ Id.VSub_Name type) <'::toSexp '> (${ Id.VSub_Name token)) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2579] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [2549 2562] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id: Id.BoolUnary_z child: { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name type)}) ) ) } ) ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <debug>} {($ Id.VSub_DollarName '$token')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2620] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [2591 2609] ) ] ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'actualSuperTypes='> (sh_array_literal left: <Id.Op_LParen _> words: [ { (braced_var_sub token: <Id.VSub_Name VARIABLES_TYPES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$type')}) ) ) } ] ) } ) (C {<declare>} {<superType>}) (command.ForEach iter_name: superType iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name actualSuperTypes> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<functionExists>} {(DQ <'variable::'> (${ Id.VSub_Name superType) <'::toSexp'>)} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {<eval>} { (DQ <'variable::'> (${ Id.VSub_Name superType) <'::toSexp '> (${ Id.VSub_Name token) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2700] ) ] ) (command.ControlFlow token: <Id.ControlFlow_Return return> ) ] spids: [2670 2683] ) ] ) ] ) ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <debug>} {($ Id.VSub_DollarName '$token')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$RESULT')} spids: [2722] ) ] ) ] ) ) (command.ShFunction name: 'variable::printMetadata' body: (command.BraceGroup children: [ (C {<stderr>} {(DQ <VARIABLES_METADATA>)}) (C {<declare>} {<keys>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:keys) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [ (command.Pipeline children: [ (command.ForEach iter_name: var iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name VARIABLES_METADATA> prefix_op: (Id.VSub_Bang) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (command.Sentence child: (C {<echo>} {(DQ ($ Id.VSub_DollarName '$var'))}) terminator: <Id.Op_Semi _> ) ] ) ) (C {<sort>} {<-n>}) ] negated: F ) ] ) ) } spids: [2761] ) ] ) (command.ForEach iter_name: key iter_words: [{(${ Id.VSub_Name keys)}] do_arg_iter: F body: (command.DoGroup children: [ (C {<stderr>} { (DQ <' ['> (${ Id.VSub_Name key) <']=['> (braced_var_sub token: <Id.VSub_Name VARIABLES_METADATA> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name key)}) ) ) <']'> ) } ) ] ) ) (C {<stderr>} {(DQ <VARIABLES_VALUES>)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:keys) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [ (command.Pipeline children: [ (command.ForEach iter_name: var iter_words: [ { (DQ (braced_var_sub token: <Id.VSub_Name VARIABLES_VALUES> prefix_op: (Id.VSub_Bang) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (command.Sentence child: (C {<echo>} {(DQ ($ Id.VSub_DollarName '$var'))}) terminator: <Id.Op_Semi _> ) ] ) ) (C {<sort>} {<-n>}) ] negated: F ) ] ) ) } spids: [2843] ) ] ) (command.ForEach iter_name: key iter_words: [{(${ Id.VSub_Name keys)}] do_arg_iter: F body: (command.DoGroup children: [ (C {<stderr>} { (DQ <' ['> (${ Id.VSub_Name key) <']=['> (braced_var_sub token: <Id.VSub_Name VARIABLES_VALUES> bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.ArithWord w:{(${ Id.VSub_Name key)}) ) ) <']'> ) } ) ] ) ) (C {<stderr>} {(DQ <'VARIABLES_INDEX='> (${ Id.VSub_Name VARIABLES_INDEX))}) ] ) ) (command.ShFunction name: 'variable::print' body: (command.BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'token='> ($ Id.VSub_Number '$1')}) (C {<declare>} {<Id.Lit_VarLike 'indent='> ($ Id.VSub_Number '$2')}) (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(${ Id.VSub_Name token)}) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'type='> ($ Id.VSub_DollarName '$RESULT')}) (command.Case to_match: {(${ Id.VSub_Name type)} arms: [ (case_arm pat_list: [{<list>}] action: [ (C {<echo>} { (DQ (${ Id.VSub_Name indent) (${ Id.VSub_Name type) <'('> (${ Id.VSub_Name token) <') :: ['> ) } ) (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {(${ Id.VSub_Name token)} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<-a>} {<Id.Lit_VarLike 'values='> (sh_array_literal left: <Id.Op_LParen _> words: [{($ Id.VSub_DollarName '$RESULT')}] ) } ) (command.ForEach iter_name: value iter_words: [ { (braced_var_sub token: <Id.VSub_Name values> bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) } ] do_arg_iter: F body: (command.DoGroup children: [ (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <print>} {(${ Id.VSub_Name value)} {(DQ (${ Id.VSub_Name indent) <' '>)} ) ] ) ) (C {<echo>} {(DQ (${ Id.VSub_Name indent) <']'>)}) ] spids: [2979 2980 3074 -1] ) (case_arm pat_list: [{<string>}] action: [ (C {<echo>} { (DQ (${ Id.VSub_Name indent) (${ Id.VSub_Name type) <'('> (${ Id.VSub_Name token) <') :: ['> (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [ (C {<_variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value_p>} {(${ Id.VSub_Name token)} ) ] ) ) <']'> ) } ) ] spids: [3077 3078 3109 -1] ) (case_arm pat_list: [{<integer>}] action: [ (C {<echo>} { (DQ (${ Id.VSub_Name indent) (${ Id.VSub_Name type) <'('> (${ Id.VSub_Name token) <') :: ['> (command_sub left_token: <Id.Left_DollarParen '$('> command_list: (command.CommandList children: [ (C {<_variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value_p>} {(${ Id.VSub_Name token)} ) ] ) ) <']'> ) } ) ] spids: [3112 3113 3144 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (C {<stderr>} { (DQ <'Invalid variable type ['> (${ Id.VSub_Name type) <'] for token ['> (${ Id.VSub_Name token) <']'> ) } ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <printMetadata>}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [3147 3148 3177 -1] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Number '$0')} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {($ Id.VSub_DollarName '$BASH_SOURCE')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [(command.ControlFlow token:<Id.ControlFlow_Return return>)] spids: [3189 3203] ) ] ) (C {<declare>} {<testToken>}) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <define> } {<atom>} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <define> } {<string>} {<atom>} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <define> } {<number>} {<atom>} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <define> } {<integer>} {<number>} ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <new>} {<integer>} {<12>}) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'atomId_1='> ($ Id.VSub_DollarName '$RESULT')}) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {($ Id.VSub_DollarName '$atomId_1')} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<integer>} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Type>} {<of>} {<first>} {<atom>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {(DQ (${ Id.VSub_Name atomId_1))} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<integer>} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Type>} {<of>} {<first>} {<atom>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {($ Id.VSub_DollarName '$atomId_1')} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<12>} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Value>} {<of>} {<first>} {<atom>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {($ Id.VSub_DollarName '$atomId_1')} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<12>} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Value>} {<of>} {<first>} {<atom>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <new>} {<string>} {(DQ <'hello there'>)}) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'atomId_2='> ($ Id.VSub_DollarName '$RESULT')}) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {($ Id.VSub_DollarName '$atomId_2')} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<string>} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Type>} {<of>} {<second>} {<atom>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {($ Id.VSub_DollarName '$atomId_2')} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {(DQ <'hello there'>)} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Value>} {<of>} {<second>} {<atom>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <value>} {($ Id.VSub_DollarName '$atomId_1')} ) terminator: <Id.Op_Semi _> ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<12>} {(DQ ($ Id.VSub_DollarName '$RESULT'))} {<Value>} {<of>} {<first>} {<atom>} {<remains>} ) ] ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <new>} {<integer>}) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:testToken) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [3541] ) ] ) ] ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {($ Id.VSub_DollarName '$testToken')}) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <exactlyA> } {(DQ (${ Id.VSub_Name testToken))} {<integer>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<0>} {($ Id.VSub_QMark '$?')} {(DQ <'exactlyA same'>)} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <exactlyA> } {(DQ (${ Id.VSub_Name testToken))} {<number>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<1>} {($ Id.VSub_QMark '$?')} {(DQ <'exactlyA super'>)} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <exactlyA> } {(DQ (${ Id.VSub_Name testToken))} {<string>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<1>} {($ Id.VSub_QMark '$?')} {(DQ <'exactlyA other'>)} ) (command.CommandList children: [ (command.Sentence child: (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <new>} {<number>}) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:testToken) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [3657] ) ] ) ] ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type>} {($ Id.VSub_DollarName '$testToken')}) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <instanceOf> } {(DQ (${ Id.VSub_Name testToken))} {<integer>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<1>} {($ Id.VSub_QMark '$?')} {(DQ <'number instanceOf integer'>)} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <instanceOf> } {(DQ (${ Id.VSub_Name testToken))} {<number>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<0>} {($ Id.VSub_QMark '$?')} {(DQ <'number instanceOf number'>)} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <instanceOf> } {(DQ (${ Id.VSub_Name testToken))} {<atom>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<0>} {($ Id.VSub_QMark '$?')} {(DQ <'number instanceOf atom'>)} ) (C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <type> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <instanceOf> } {(DQ (${ Id.VSub_Name testToken))} {<string>} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <equals>} {<1>} {($ Id.VSub_QMark '$?')} {(DQ <'number instanceOf string'>)} ) (C {<assert> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <report>}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Number 1> suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) } {<Id.Lit_RBracket ']'>} ) (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(DQ <debug>)} {<Id.Lit_RBracket ']'>} ) ] ) terminator: <Id.Op_Semi _> ) ] action: [(C {<variable> <Id.Lit_Other ':'> <Id.Lit_Other ':'> <printMetadata>})] spids: [3795 3825] ) ] ) ] )