@ ProgramNode (location: (1,0)-(16,3)) ├── locals: [] └── statements: @ StatementsNode (location: (1,0)-(16,3)) └── body: (length: 4) ├── @ ModuleNode (location: (1,0)-(2,3)) │ ├── locals: [] │ ├── module_keyword_loc: (1,0)-(1,6) = "module" │ ├── constant_path: │ │ @ ConstantReadNode (location: (1,7)-(1,8)) │ │ └── name: :A │ ├── body: ∅ │ ├── end_keyword_loc: (2,0)-(2,3) = "end" │ └── name: :A ├── @ ModuleNode (location: (4,0)-(5,3)) │ ├── locals: [] │ ├── module_keyword_loc: (4,0)-(4,6) = "module" │ ├── constant_path: │ │ @ ConstantPathNode (location: (4,7)-(4,11)) │ │ ├── parent: │ │ │ @ ConstantReadNode (location: (4,7)-(4,8)) │ │ │ └── name: :A │ │ ├── name: :B │ │ ├── delimiter_loc: (4,8)-(4,10) = "::" │ │ └── name_loc: (4,10)-(4,11) = "B" │ ├── body: ∅ │ ├── end_keyword_loc: (5,0)-(5,3) = "end" │ └── name: :B ├── @ ModuleNode (location: (7,0)-(8,3)) │ ├── locals: [] │ ├── module_keyword_loc: (7,0)-(7,6) = "module" │ ├── constant_path: │ │ @ ConstantPathNode (location: (7,7)-(7,14)) │ │ ├── parent: │ │ │ @ ConstantPathNode (location: (7,7)-(7,11)) │ │ │ ├── parent: │ │ │ │ @ ConstantReadNode (location: (7,7)-(7,8)) │ │ │ │ └── name: :A │ │ │ ├── name: :B │ │ │ ├── delimiter_loc: (7,8)-(7,10) = "::" │ │ │ └── name_loc: (7,10)-(7,11) = "B" │ │ ├── name: :C │ │ ├── delimiter_loc: (7,11)-(7,13) = "::" │ │ └── name_loc: (7,13)-(7,14) = "C" │ ├── body: ∅ │ ├── end_keyword_loc: (8,0)-(8,3) = "end" │ └── name: :C └── @ ModuleNode (location: (10,0)-(16,3)) ├── locals: [] ├── module_keyword_loc: (10,0)-(10,6) = "module" ├── constant_path: │ @ ConstantReadNode (location: (10,7)-(10,8)) │ └── name: :A ├── body: │ @ StatementsNode (location: (11,2)-(15,5)) │ └── body: (length: 2) │ ├── @ CallNode (location: (11,2)-(11,16)) │ │ ├── flags: ignore_visibility │ │ ├── receiver: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── name: :include │ │ ├── message_loc: (11,2)-(11,9) = "include" │ │ ├── opening_loc: (11,9)-(11,10) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (11,10)-(11,15)) │ │ │ ├── flags: ∅ │ │ │ └── arguments: (length: 1) │ │ │ └── @ CallNode (location: (11,10)-(11,15)) │ │ │ ├── flags: ∅ │ │ │ ├── receiver: │ │ │ │ @ ConstantReadNode (location: (11,10)-(11,11)) │ │ │ │ └── name: :B │ │ │ ├── call_operator_loc: (11,11)-(11,12) = "." │ │ │ ├── name: :new │ │ │ ├── message_loc: (11,12)-(11,15) = "new" │ │ │ ├── opening_loc: ∅ │ │ │ ├── arguments: ∅ │ │ │ ├── closing_loc: ∅ │ │ │ └── block: ∅ │ │ ├── closing_loc: (11,15)-(11,16) = ")" │ │ └── block: ∅ │ └── @ DefNode (location: (13,2)-(15,5)) │ ├── name: :foo │ ├── name_loc: (13,6)-(13,9) = "foo" │ ├── receiver: ∅ │ ├── parameters: ∅ │ ├── body: │ │ @ StatementsNode (location: (14,4)-(14,8)) │ │ └── body: (length: 1) │ │ └── @ SymbolNode (location: (14,4)-(14,8)) │ │ ├── flags: forced_us_ascii_encoding │ │ ├── opening_loc: (14,4)-(14,5) = ":" │ │ ├── value_loc: (14,5)-(14,8) = "bar" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "bar" │ ├── locals: [] │ ├── def_keyword_loc: (13,2)-(13,5) = "def" │ ├── operator_loc: ∅ │ ├── lparen_loc: ∅ │ ├── rparen_loc: ∅ │ ├── equal_loc: ∅ │ └── end_keyword_loc: (15,2)-(15,5) = "end" ├── end_keyword_loc: (16,0)-(16,3) = "end" └── name: :A