@ ProgramNode (location: (1,0)-(5,13)) ├── locals: [] └── statements: @ StatementsNode (location: (1,0)-(5,13)) └── body: (length: 3) ├── @ DefinedNode (location: (1,0)-(1,13)) │ ├── lparen_loc: ∅ │ ├── value: │ │ @ InstanceVariableReadNode (location: (1,9)-(1,13)) │ │ └── name: :@foo │ ├── rparen_loc: ∅ │ └── keyword_loc: (1,0)-(1,8) = "defined?" ├── @ DefinedNode (location: (3,0)-(3,12)) │ ├── lparen_loc: ∅ │ ├── value: │ │ @ CallNode (location: (3,9)-(3,12)) │ │ ├── flags: variable_call, ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :foo │ │ ├── message_loc: (3,9)-(3,12) = "foo" │ │ ├── opening_loc: ∅ │ │ ├── arguments: ∅ │ │ ├── closing_loc: ∅ │ │ └── block: ∅ │ ├── rparen_loc: ∅ │ └── keyword_loc: (3,0)-(3,8) = "defined?" └── @ DefinedNode (location: (5,0)-(5,13)) ├── lparen_loc: (5,8)-(5,9) = "(" ├── value: │ @ CallNode (location: (5,9)-(5,12)) │ ├── flags: variable_call, ignore_visibility │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ │ ├── name: :foo │ ├── message_loc: (5,9)-(5,12) = "foo" │ ├── opening_loc: ∅ │ ├── arguments: ∅ │ ├── closing_loc: ∅ │ └── block: ∅ ├── rparen_loc: (5,12)-(5,13) = ")" └── keyword_loc: (5,0)-(5,8) = "defined?"