@ ProgramNode (location: (1,0)-(15,62)) ├── locals: [] └── statements: @ StatementsNode (location: (1,0)-(15,62)) └── body: (length: 8) ├── @ DefNode (location: (1,0)-(1,22)) │ ├── name: :foo │ ├── name_loc: (1,4)-(1,7) = "foo" │ ├── receiver: ∅ │ ├── parameters: ∅ │ ├── body: │ │ @ StatementsNode (location: (1,10)-(1,22)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (1,10)-(1,22)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :puts │ │ ├── message_loc: (1,10)-(1,14) = "puts" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (1,15)-(1,22)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ StringNode (location: (1,15)-(1,22)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: (1,15)-(1,16) = "\"" │ │ │ ├── content_loc: (1,16)-(1,21) = "Hello" │ │ │ ├── closing_loc: (1,21)-(1,22) = "\"" │ │ │ └── unescaped: "Hello" │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── locals: [] │ ├── def_keyword_loc: (1,0)-(1,3) = "def" │ ├── operator_loc: ∅ │ ├── lparen_loc: ∅ │ ├── rparen_loc: ∅ │ ├── equal_loc: (1,8)-(1,9) = "=" │ └── end_keyword_loc: ∅ ├── @ DefNode (location: (3,0)-(3,24)) │ ├── name: :foo │ ├── name_loc: (3,4)-(3,7) = "foo" │ ├── receiver: ∅ │ ├── parameters: ∅ │ ├── body: │ │ @ StatementsNode (location: (3,12)-(3,24)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (3,12)-(3,24)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :puts │ │ ├── message_loc: (3,12)-(3,16) = "puts" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (3,17)-(3,24)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ StringNode (location: (3,17)-(3,24)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: (3,17)-(3,18) = "\"" │ │ │ ├── content_loc: (3,18)-(3,23) = "Hello" │ │ │ ├── closing_loc: (3,23)-(3,24) = "\"" │ │ │ └── unescaped: "Hello" │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── locals: [] │ ├── def_keyword_loc: (3,0)-(3,3) = "def" │ ├── operator_loc: ∅ │ ├── lparen_loc: (3,7)-(3,8) = "(" │ ├── rparen_loc: (3,8)-(3,9) = ")" │ ├── equal_loc: (3,10)-(3,11) = "=" │ └── end_keyword_loc: ∅ ├── @ DefNode (location: (5,0)-(5,19)) │ ├── name: :foo │ ├── name_loc: (5,4)-(5,7) = "foo" │ ├── receiver: ∅ │ ├── parameters: │ │ @ ParametersNode (location: (5,8)-(5,9)) │ │ ├── requireds: (length: 1) │ │ │ └── @ RequiredParameterNode (location: (5,8)-(5,9)) │ │ │ ├── flags: ∅ │ │ │ └── name: :x │ │ ├── optionals: (length: 0) │ │ ├── rest: ∅ │ │ ├── posts: (length: 0) │ │ ├── keywords: (length: 0) │ │ ├── keyword_rest: ∅ │ │ └── block: ∅ │ ├── body: │ │ @ StatementsNode (location: (5,13)-(5,19)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (5,13)-(5,19)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :puts │ │ ├── message_loc: (5,13)-(5,17) = "puts" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (5,18)-(5,19)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ LocalVariableReadNode (location: (5,18)-(5,19)) │ │ │ ├── name: :x │ │ │ └── depth: 0 │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── locals: [:x] │ ├── def_keyword_loc: (5,0)-(5,3) = "def" │ ├── operator_loc: ∅ │ ├── lparen_loc: (5,7)-(5,8) = "(" │ ├── rparen_loc: (5,9)-(5,10) = ")" │ ├── equal_loc: (5,11)-(5,12) = "=" │ └── end_keyword_loc: ∅ ├── @ DefNode (location: (7,0)-(7,26)) │ ├── name: :foo │ ├── name_loc: (7,8)-(7,11) = "foo" │ ├── receiver: │ │ @ CallNode (location: (7,4)-(7,7)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :obj │ │ ├── message_loc: (7,4)-(7,7) = "obj" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── parameters: ∅ │ ├── body: │ │ @ StatementsNode (location: (7,14)-(7,26)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (7,14)-(7,26)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :puts │ │ ├── message_loc: (7,14)-(7,18) = "puts" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (7,19)-(7,26)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ StringNode (location: (7,19)-(7,26)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: (7,19)-(7,20) = "\"" │ │ │ ├── content_loc: (7,20)-(7,25) = "Hello" │ │ │ ├── closing_loc: (7,25)-(7,26) = "\"" │ │ │ └── unescaped: "Hello" │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── locals: [] │ ├── def_keyword_loc: (7,0)-(7,3) = "def" │ ├── operator_loc: (7,7)-(7,8) = "." │ ├── lparen_loc: ∅ │ ├── rparen_loc: ∅ │ ├── equal_loc: (7,12)-(7,13) = "=" │ └── end_keyword_loc: ∅ ├── @ DefNode (location: (9,0)-(9,28)) │ ├── name: :foo │ ├── name_loc: (9,8)-(9,11) = "foo" │ ├── receiver: │ │ @ CallNode (location: (9,4)-(9,7)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :obj │ │ ├── message_loc: (9,4)-(9,7) = "obj" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── parameters: ∅ │ ├── body: │ │ @ StatementsNode (location: (9,16)-(9,28)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (9,16)-(9,28)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :puts │ │ ├── message_loc: (9,16)-(9,20) = "puts" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (9,21)-(9,28)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ StringNode (location: (9,21)-(9,28)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: (9,21)-(9,22) = "\"" │ │ │ ├── content_loc: (9,22)-(9,27) = "Hello" │ │ │ ├── closing_loc: (9,27)-(9,28) = "\"" │ │ │ └── unescaped: "Hello" │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── locals: [] │ ├── def_keyword_loc: (9,0)-(9,3) = "def" │ ├── operator_loc: (9,7)-(9,8) = "." │ ├── lparen_loc: (9,11)-(9,12) = "(" │ ├── rparen_loc: (9,12)-(9,13) = ")" │ ├── equal_loc: (9,14)-(9,15) = "=" │ └── end_keyword_loc: ∅ ├── @ DefNode (location: (11,0)-(11,23)) │ ├── name: :foo │ ├── name_loc: (11,8)-(11,11) = "foo" │ ├── receiver: │ │ @ CallNode (location: (11,4)-(11,7)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :obj │ │ ├── message_loc: (11,4)-(11,7) = "obj" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── parameters: │ │ @ ParametersNode (location: (11,12)-(11,13)) │ │ ├── requireds: (length: 1) │ │ │ └── @ RequiredParameterNode (location: (11,12)-(11,13)) │ │ │ ├── flags: ∅ │ │ │ └── name: :x │ │ ├── optionals: (length: 0) │ │ ├── rest: ∅ │ │ ├── posts: (length: 0) │ │ ├── keywords: (length: 0) │ │ ├── keyword_rest: ∅ │ │ └── block: ∅ │ ├── body: │ │ @ StatementsNode (location: (11,17)-(11,23)) │ │ └── body: (length: 1) │ │ └── @ CallNode (location: (11,17)-(11,23)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :puts │ │ ├── message_loc: (11,17)-(11,21) = "puts" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (11,22)-(11,23)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ LocalVariableReadNode (location: (11,22)-(11,23)) │ │ │ ├── name: :x │ │ │ └── depth: 0 │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── locals: [:x] │ ├── def_keyword_loc: (11,0)-(11,3) = "def" │ ├── operator_loc: (11,7)-(11,8) = "." │ ├── lparen_loc: (11,11)-(11,12) = "(" │ ├── rparen_loc: (11,13)-(11,14) = ")" │ ├── equal_loc: (11,15)-(11,16) = "=" │ └── end_keyword_loc: ∅ ├── @ DefNode (location: (13,0)-(13,60)) │ ├── name: :rescued │ ├── name_loc: (13,4)-(13,11) = "rescued" │ ├── receiver: ∅ │ ├── parameters: │ │ @ ParametersNode (location: (13,12)-(13,13)) │ │ ├── requireds: (length: 1) │ │ │ └── @ RequiredParameterNode (location: (13,12)-(13,13)) │ │ │ ├── flags: ∅ │ │ │ └── name: :x │ │ ├── optionals: (length: 0) │ │ ├── rest: ∅ │ │ ├── posts: (length: 0) │ │ ├── keywords: (length: 0) │ │ ├── keyword_rest: ∅ │ │ └── block: ∅ │ ├── body: │ │ @ StatementsNode (location: (13,17)-(13,60)) │ │ └── body: (length: 1) │ │ └── @ RescueModifierNode (location: (13,17)-(13,60)) │ │ ├── expression: │ │ │ @ CallNode (location: (13,17)-(13,37)) │ │ │ ├── flags: ignore_visibility │ │ │ ├── receiver: ∅ │ │ │ ├── call_operator_loc: ∅ │ │ │ ├── name: :raise │ │ │ ├── message_loc: (13,17)-(13,22) = "raise" │ │ │ ├── opening_loc: ∅ │ │ │ ├── arguments: │ │ │ │ @ ArgumentsNode (location: (13,23)-(13,37)) │ │ │ │ ├── flags: ∅ │ │ │ │ └── arguments: (length: 1) │ │ │ │ └── @ StringNode (location: (13,23)-(13,37)) │ │ │ │ ├── flags: ∅ │ │ │ │ ├── opening_loc: (13,23)-(13,24) = "\"" │ │ │ │ ├── content_loc: (13,24)-(13,36) = "to be caught" │ │ │ │ ├── closing_loc: (13,36)-(13,37) = "\"" │ │ │ │ └── unescaped: "to be caught" │ │ │ ├── closing_loc: ∅ │ │ │ └── block: ∅ │ │ ├── keyword_loc: (13,38)-(13,44) = "rescue" │ │ └── rescue_expression: │ │ @ InterpolatedStringNode (location: (13,45)-(13,60)) │ │ ├── flags: ∅ │ │ ├── opening_loc: (13,45)-(13,46) = "\"" │ │ ├── parts: (length: 2) │ │ │ ├── @ StringNode (location: (13,46)-(13,55)) │ │ │ │ ├── flags: frozen │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── content_loc: (13,46)-(13,55) = "instance " │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── unescaped: "instance " │ │ │ └── @ EmbeddedStatementsNode (location: (13,55)-(13,59)) │ │ │ ├── opening_loc: (13,55)-(13,57) = "\#{" │ │ │ ├── statements: │ │ │ │ @ StatementsNode (location: (13,57)-(13,58)) │ │ │ │ └── body: (length: 1) │ │ │ │ └── @ LocalVariableReadNode (location: (13,57)-(13,58)) │ │ │ │ ├── name: :x │ │ │ │ └── depth: 0 │ │ │ └── closing_loc: (13,58)-(13,59) = "}" │ │ └── closing_loc: (13,59)-(13,60) = "\"" │ ├── locals: [:x] │ ├── def_keyword_loc: (13,0)-(13,3) = "def" │ ├── operator_loc: ∅ │ ├── lparen_loc: (13,11)-(13,12) = "(" │ ├── rparen_loc: (13,13)-(13,14) = ")" │ ├── equal_loc: (13,15)-(13,16) = "=" │ └── end_keyword_loc: ∅ └── @ DefNode (location: (15,0)-(15,62)) ├── name: :rescued ├── name_loc: (15,9)-(15,16) = "rescued" ├── receiver: │ @ SelfNode (location: (15,4)-(15,8)) ├── parameters: │ @ ParametersNode (location: (15,17)-(15,18)) │ ├── requireds: (length: 1) │ │ └── @ RequiredParameterNode (location: (15,17)-(15,18)) │ │ ├── flags: ∅ │ │ └── name: :x │ ├── optionals: (length: 0) │ ├── rest: ∅ │ ├── posts: (length: 0) │ ├── keywords: (length: 0) │ ├── keyword_rest: ∅ │ └── block: ∅ ├── body: │ @ StatementsNode (location: (15,22)-(15,62)) │ └── body: (length: 1) │ └── @ RescueModifierNode (location: (15,22)-(15,62)) │ ├── expression: │ │ @ CallNode (location: (15,22)-(15,42)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :raise │ │ ├── message_loc: (15,22)-(15,27) = "raise" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (15,28)-(15,42)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ StringNode (location: (15,28)-(15,42)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: (15,28)-(15,29) = "\"" │ │ │ ├── content_loc: (15,29)-(15,41) = "to be caught" │ │ │ ├── closing_loc: (15,41)-(15,42) = "\"" │ │ │ └── unescaped: "to be caught" │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── keyword_loc: (15,43)-(15,49) = "rescue" │ └── rescue_expression: │ @ InterpolatedStringNode (location: (15,50)-(15,62)) │ ├── flags: ∅ │ ├── opening_loc: (15,50)-(15,51) = "\"" │ ├── parts: (length: 2) │ │ ├── @ StringNode (location: (15,51)-(15,57)) │ │ │ ├── flags: frozen │ │ │ ├── opening_loc: ∅ │ │ │ ├── content_loc: (15,51)-(15,57) = "class " │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "class " │ │ └── @ EmbeddedStatementsNode (location: (15,57)-(15,61)) │ │ ├── opening_loc: (15,57)-(15,59) = "\#{" │ │ ├── statements: │ │ │ @ StatementsNode (location: (15,59)-(15,60)) │ │ │ └── body: (length: 1) │ │ │ └── @ LocalVariableReadNode (location: (15,59)-(15,60)) │ │ │ ├── name: :x │ │ │ └── depth: 0 │ │ └── closing_loc: (15,60)-(15,61) = "}" │ └── closing_loc: (15,61)-(15,62) = "\"" ├── locals: [:x] ├── def_keyword_loc: (15,0)-(15,3) = "def" ├── operator_loc: (15,8)-(15,9) = "." ├── lparen_loc: (15,16)-(15,17) = "(" ├── rparen_loc: (15,18)-(15,19) = ")" ├── equal_loc: (15,20)-(15,21) = "=" └── end_keyword_loc: ∅