@ ProgramNode (location: (1,0)-(36,3)) ├── locals: [:foo, :pair] └── statements: @ StatementsNode (location: (1,0)-(36,3)) └── body: (length: 10) ├── @ IfNode (location: (1,0)-(3,3)) │ ├── if_keyword_loc: (1,0)-(1,2) = "if" │ ├── predicate: │ │ @ MatchLastLineNode (location: (1,3)-(1,8)) │ │ ├── flags: forced_us_ascii_encoding │ │ ├── opening_loc: (1,3)-(1,4) = "/" │ │ ├── content_loc: (1,4)-(1,7) = "foo" │ │ ├── closing_loc: (1,7)-(1,8) = "/" │ │ └── unescaped: "foo" │ ├── then_keyword_loc: ∅ │ ├── statements: │ │ @ StatementsNode (location: (2,2)-(2,5)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (2,2)-(2,5)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :bar │ │ ├── message_loc: (2,2)-(2,5) = "bar" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── consequent: ∅ │ └── end_keyword_loc: (3,0)-(3,3) = "end" ├── @ IfNode (location: (4,0)-(6,3)) │ ├── if_keyword_loc: (4,0)-(4,2) = "if" │ ├── predicate: │ │ @ IntegerNode (location: (4,3)-(4,4)) │ │ ├── flags: decimal │ │ └── value: 3 │ ├── then_keyword_loc: ∅ │ ├── statements: │ │ @ StatementsNode (location: (5,2)-(5,3)) │ │ └── body: (length: 1) │ │ └── @ IntegerNode (location: (5,2)-(5,3)) │ │ ├── flags: decimal │ │ └── value: 9 │ ├── consequent: ∅ │ └── end_keyword_loc: (6,0)-(6,3) = "end" ├── @ IfNode (location: (7,0)-(11,3)) │ ├── if_keyword_loc: (7,0)-(7,2) = "if" │ ├── predicate: │ │ @ IntegerNode (location: (7,3)-(7,4)) │ │ ├── flags: decimal │ │ └── value: 4 │ ├── then_keyword_loc: ∅ │ ├── statements: │ │ @ StatementsNode (location: (8,2)-(8,3)) │ │ └── body: (length: 1) │ │ └── @ IntegerNode (location: (8,2)-(8,3)) │ │ ├── flags: decimal │ │ └── value: 5 │ ├── consequent: │ │ @ ElseNode (location: (9,0)-(11,3)) │ │ ├── else_keyword_loc: (9,0)-(9,4) = "else" │ │ ├── statements: │ │ │ @ StatementsNode (location: (10,2)-(10,3)) │ │ │ └── body: (length: 1) │ │ │ └── @ IntegerNode (location: (10,2)-(10,3)) │ │ │ ├── flags: decimal │ │ │ └── value: 6 │ │ └── end_keyword_loc: (11,0)-(11,3) = "end" │ └── end_keyword_loc: (11,0)-(11,3) = "end" ├── @ UnlessNode (location: (12,0)-(14,3)) │ ├── keyword_loc: (12,0)-(12,6) = "unless" │ ├── predicate: │ │ @ IntegerNode (location: (12,7)-(12,8)) │ │ ├── flags: decimal │ │ └── value: 3 │ ├── then_keyword_loc: ∅ │ ├── statements: │ │ @ StatementsNode (location: (13,2)-(13,5)) │ │ └── body: (length: 1) │ │ └── @ NilNode (location: (13,2)-(13,5)) │ ├── consequent: ∅ │ └── end_keyword_loc: (14,0)-(14,3) = "end" ├── @ UnlessNode (location: (15,0)-(17,3)) │ ├── keyword_loc: (15,0)-(15,6) = "unless" │ ├── predicate: │ │ @ IntegerNode (location: (15,7)-(15,8)) │ │ ├── flags: decimal │ │ └── value: 3 │ ├── then_keyword_loc: ∅ │ ├── statements: │ │ @ StatementsNode (location: (16,2)-(16,3)) │ │ └── body: (length: 1) │ │ └── @ IntegerNode (location: (16,2)-(16,3)) │ │ ├── flags: decimal │ │ └── value: 9 │ ├── consequent: ∅ │ └── end_keyword_loc: (17,0)-(17,3) = "end" ├── @ IfNode (location: (18,0)-(19,3)) │ ├── if_keyword_loc: (18,0)-(18,2) = "if" │ ├── predicate: │ │ @ CallNode (location: (18,3)-(18,6)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :foo │ │ ├── message_loc: (18,3)-(18,6) = "foo" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── then_keyword_loc: ∅ │ ├── statements: ∅ │ ├── consequent: ∅ │ └── end_keyword_loc: (19,0)-(19,3) = "end" ├── @ ModuleNode (location: (21,0)-(23,3)) │ ├── locals: [:foo] │ ├── module_keyword_loc: (21,0)-(21,6) = "module" │ ├── constant_path: │ │ @ ConstantReadNode (location: (21,7)-(21,8)) │ │ └── name: :A │ ├── body: │ │ @ StatementsNode (location: (22,2)-(22,18)) │ │ └── body: (length: 1) │ │ └── @ IfNode (location: (22,2)-(22,18)) │ │ ├── if_keyword_loc: (22,12)-(22,14) = "if" │ │ ├── predicate: │ │ │ @ LocalVariableReadNode (location: (22,15)-(22,18)) │ │ │ ├── name: :foo │ │ │ └── depth: 0 │ │ ├── then_keyword_loc: ∅ │ │ ├── statements: │ │ │ @ StatementsNode (location: (22,2)-(22,11)) │ │ │ └── body: (length: 1) │ │ │ └── @ LocalVariableWriteNode (location: (22,2)-(22,11)) │ │ │ ├── name: :foo │ │ │ ├── depth: 0 │ │ │ ├── name_loc: (22,2)-(22,5) = "foo" │ │ │ ├── value: │ │ │ │ @ CallNode (location: (22,8)-(22,11)) │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ ├── receiver: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── name: :bar │ │ │ │ ├── message_loc: (22,8)-(22,11) = "bar" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── block: ∅ │ │ │ └── operator_loc: (22,6)-(22,7) = "=" │ │ ├── consequent: ∅ │ │ └── end_keyword_loc: ∅ │ ├── end_keyword_loc: (23,0)-(23,3) = "end" │ └── name: :A ├── @ ModuleNode (location: (25,0)-(27,3)) │ ├── locals: [:foo] │ ├── module_keyword_loc: (25,0)-(25,6) = "module" │ ├── constant_path: │ │ @ ConstantReadNode (location: (25,7)-(25,8)) │ │ └── name: :B │ ├── body: │ │ @ StatementsNode (location: (26,2)-(26,22)) │ │ └── body: (length: 1) │ │ └── @ UnlessNode (location: (26,2)-(26,22)) │ │ ├── keyword_loc: (26,12)-(26,18) = "unless" │ │ ├── predicate: │ │ │ @ LocalVariableReadNode (location: (26,19)-(26,22)) │ │ │ ├── name: :foo │ │ │ └── depth: 0 │ │ ├── then_keyword_loc: ∅ │ │ ├── statements: │ │ │ @ StatementsNode (location: (26,2)-(26,11)) │ │ │ └── body: (length: 1) │ │ │ └── @ LocalVariableWriteNode (location: (26,2)-(26,11)) │ │ │ ├── name: :foo │ │ │ ├── depth: 0 │ │ │ ├── name_loc: (26,2)-(26,5) = "foo" │ │ │ ├── value: │ │ │ │ @ CallNode (location: (26,8)-(26,11)) │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ ├── receiver: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── name: :bar │ │ │ │ ├── message_loc: (26,8)-(26,11) = "bar" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── block: ∅ │ │ │ └── operator_loc: (26,6)-(26,7) = "=" │ │ ├── consequent: ∅ │ │ └── end_keyword_loc: ∅ │ ├── end_keyword_loc: (27,0)-(27,3) = "end" │ └── name: :B ├── @ UnlessNode (location: (28,0)-(30,3)) │ ├── keyword_loc: (28,0)-(28,6) = "unless" │ ├── predicate: │ │ @ CallNode (location: (28,7)-(28,10)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :foo │ │ ├── message_loc: (28,7)-(28,10) = "foo" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── then_keyword_loc: ∅ │ ├── statements: │ │ @ StatementsNode (location: (29,2)-(29,11)) │ │ └── body: (length: 1) │ │ └── @ LocalVariableWriteNode (location: (29,2)-(29,11)) │ │ ├── name: :foo │ │ ├── depth: 0 │ │ ├── name_loc: (29,2)-(29,5) = "foo" │ │ ├── value: │ │ │ @ CallNode (location: (29,8)-(29,11)) │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ ├── receiver: ∅ │ │ │ ├── call_operator_loc: ∅ │ │ │ ├── name: :bar │ │ │ ├── message_loc: (29,8)-(29,11) = "bar" │ │ │ ├── opening_loc: ∅ │ │ │ ├── arguments: ∅ │ │ │ ├── closing_loc: ∅ │ │ │ └── block: ∅ │ │ └── operator_loc: (29,6)-(29,7) = "=" │ ├── consequent: ∅ │ └── end_keyword_loc: (30,0)-(30,3) = "end" └── @ IfNode (location: (31,0)-(36,3)) ├── if_keyword_loc: (31,0)-(31,2) = "if" ├── predicate: │ @ CallNode (location: (31,3)-(33,1)) │ ├── flags: ignore_visibility │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ │ ├── name: :foo │ ├── message_loc: (31,3)-(31,6) = "foo" │ ├── opening_loc: ∅ │ ├── arguments: ∅ │ ├── closing_loc: ∅ │ └── block: │ @ BlockNode (location: (31,7)-(33,1)) │ ├── locals: [:pair] │ ├── parameters: │ │ @ BlockParametersNode (location: (31,9)-(31,15)) │ │ ├── parameters: │ │ │ @ ParametersNode (location: (31,10)-(31,14)) │ │ │ ├── requireds: (length: 1) │ │ │ │ └── @ RequiredParameterNode (location: (31,10)-(31,14)) │ │ │ │ ├── flags: ∅ │ │ │ │ └── name: :pair │ │ │ ├── optionals: (length: 0) │ │ │ ├── rest: ∅ │ │ │ ├── posts: (length: 0) │ │ │ ├── keywords: (length: 0) │ │ │ ├── keyword_rest: ∅ │ │ │ └── block: ∅ │ │ ├── locals: (length: 0) │ │ ├── opening_loc: (31,9)-(31,10) = "|" │ │ └── closing_loc: (31,14)-(31,15) = "|" │ ├── body: │ │ @ StatementsNode (location: (32,2)-(32,6)) │ │ └── body: (length: 1) │ │ └── @ LocalVariableReadNode (location: (32,2)-(32,6)) │ │ ├── name: :pair │ │ └── depth: 0 │ ├── opening_loc: (31,7)-(31,8) = "{" │ └── closing_loc: (33,0)-(33,1) = "}" ├── then_keyword_loc: ∅ ├── statements: │ @ StatementsNode (location: (34,2)-(35,5)) │ └── body: (length: 2) │ ├── @ LocalVariableWriteNode (location: (34,2)-(34,13)) │ │ ├── name: :pair │ │ ├── depth: 0 │ │ ├── name_loc: (34,2)-(34,6) = "pair" │ │ ├── value: │ │ │ @ SymbolNode (location: (34,9)-(34,13)) │ │ │ ├── flags: forced_us_ascii_encoding │ │ │ ├── opening_loc: (34,9)-(34,10) = ":" │ │ │ ├── value_loc: (34,10)-(34,13) = "foo" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "foo" │ │ └── operator_loc: (34,7)-(34,8) = "=" │ └── @ LocalVariableReadNode (location: (35,2)-(35,5)) │ ├── name: :foo │ └── depth: 0 ├── consequent: ∅ └── end_keyword_loc: (36,0)-(36,3) = "end"