@ ProgramNode (location: (1,0)-(6,15))
├── locals: []
└── statements:
    @ StatementsNode (location: (1,0)-(6,15))
    └── body: (length: 4)
        ├── @ CallNode (location: (1,0)-(1,3))
        │   ├── flags: variable_call
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── name: :foo
        │   ├── message_loc: (1,0)-(1,3) = "foo"
        │   ├── opening_loc: ∅
        │   ├── arguments: ∅
        │   ├── closing_loc: ∅
        │   └── block: ∅
        ├── @ CallNode (location: (2,0)-(2,6))
        │   ├── flags: ∅
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── name: :foo
        │   ├── message_loc: (2,0)-(2,3) = "foo"
        │   ├── opening_loc: (2,3)-(2,4) = "("
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (2,4)-(2,5))
        │   │   ├── flags: ∅
        │   │   └── arguments: (length: 1)
        │   │       └── @ IntegerNode (location: (2,4)-(2,5))
        │   │           └── flags: decimal
        │   ├── closing_loc: (2,5)-(2,6) = ")"
        │   └── block: ∅
        ├── @ CallNode (location: (4,0)-(4,15))
        │   ├── flags: ∅
        │   ├── receiver:
        │   │   @ CallNode (location: (4,0)-(4,10))
        │   │   ├── flags: ∅
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (4,0)-(4,8))
        │   │   │   ├── flags: ∅
        │   │   │   ├── receiver:
        │   │   │   │   @ CallNode (location: (4,0)-(4,1))
        │   │   │   │   ├── flags: variable_call
        │   │   │   │   ├── receiver: ∅
        │   │   │   │   ├── call_operator_loc: ∅
        │   │   │   │   ├── name: :a
        │   │   │   │   ├── message_loc: (4,0)-(4,1) = "a"
        │   │   │   │   ├── opening_loc: ∅
        │   │   │   │   ├── arguments: ∅
        │   │   │   │   ├── closing_loc: ∅
        │   │   │   │   └── block: ∅
        │   │   │   ├── call_operator_loc: (4,1)-(4,2) = "."
        │   │   │   ├── name: :===
        │   │   │   ├── message_loc: (4,2)-(4,5) = "==="
        │   │   │   ├── opening_loc: (4,5)-(4,6) = "("
        │   │   │   ├── arguments:
        │   │   │   │   @ ArgumentsNode (location: (4,6)-(4,7))
        │   │   │   │   ├── flags: ∅
        │   │   │   │   └── arguments: (length: 1)
        │   │   │   │       └── @ CallNode (location: (4,6)-(4,7))
        │   │   │   │           ├── flags: variable_call
        │   │   │   │           ├── receiver: ∅
        │   │   │   │           ├── call_operator_loc: ∅
        │   │   │   │           ├── name: :b
        │   │   │   │           ├── message_loc: (4,6)-(4,7) = "b"
        │   │   │   │           ├── opening_loc: ∅
        │   │   │   │           ├── arguments: ∅
        │   │   │   │           ├── closing_loc: ∅
        │   │   │   │           └── block: ∅
        │   │   │   ├── closing_loc: (4,7)-(4,8) = ")"
        │   │   │   └── block: ∅
        │   │   ├── call_operator_loc: (4,8)-(4,9) = "."
        │   │   ├── name: :c
        │   │   ├── message_loc: (4,9)-(4,10) = "c"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   └── block: ∅
        │   ├── call_operator_loc: ∅
        │   ├── name: :==
        │   ├── message_loc: (4,11)-(4,13) = "=="
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (4,14)-(4,15))
        │   │   ├── flags: ∅
        │   │   └── arguments: (length: 1)
        │   │       └── @ CallNode (location: (4,14)-(4,15))
        │   │           ├── flags: variable_call
        │   │           ├── receiver: ∅
        │   │           ├── call_operator_loc: ∅
        │   │           ├── name: :d
        │   │           ├── message_loc: (4,14)-(4,15) = "d"
        │   │           ├── opening_loc: ∅
        │   │           ├── arguments: ∅
        │   │           ├── closing_loc: ∅
        │   │           └── block: ∅
        │   ├── closing_loc: ∅
        │   └── block: ∅
        └── @ CallNode (location: (6,0)-(6,15))
            ├── flags: ∅
            ├── receiver:
            │   @ CallNode (location: (6,0)-(6,1))
            │   ├── flags: variable_call
            │   ├── receiver: ∅
            │   ├── call_operator_loc: ∅
            │   ├── name: :a
            │   ├── message_loc: (6,0)-(6,1) = "a"
            │   ├── opening_loc: ∅
            │   ├── arguments: ∅
            │   ├── closing_loc: ∅
            │   └── block: ∅
            ├── call_operator_loc: ∅
            ├── name: :==
            ├── message_loc: (6,2)-(6,4) = "=="
            ├── opening_loc: ∅
            ├── arguments:
            │   @ ArgumentsNode (location: (6,5)-(6,15))
            │   ├── flags: ∅
            │   └── arguments: (length: 1)
            │       └── @ CallNode (location: (6,5)-(6,15))
            │           ├── flags: ∅
            │           ├── receiver:
            │           │   @ CallNode (location: (6,5)-(6,8))
            │           │   ├── flags: ∅
            │           │   ├── receiver:
            │           │   │   @ CallNode (location: (6,5)-(6,6))
            │           │   │   ├── flags: variable_call
            │           │   │   ├── receiver: ∅
            │           │   │   ├── call_operator_loc: ∅
            │           │   │   ├── name: :d
            │           │   │   ├── message_loc: (6,5)-(6,6) = "d"
            │           │   │   ├── opening_loc: ∅
            │           │   │   ├── arguments: ∅
            │           │   │   ├── closing_loc: ∅
            │           │   │   └── block: ∅
            │           │   ├── call_operator_loc: (6,6)-(6,7) = "."
            │           │   ├── name: :c
            │           │   ├── message_loc: (6,7)-(6,8) = "c"
            │           │   ├── opening_loc: ∅
            │           │   ├── arguments: ∅
            │           │   ├── closing_loc: ∅
            │           │   └── block: ∅
            │           ├── call_operator_loc: (6,8)-(6,9) = "."
            │           ├── name: :===
            │           ├── message_loc: (6,9)-(6,12) = "==="
            │           ├── opening_loc: (6,12)-(6,13) = "("
            │           ├── arguments:
            │           │   @ ArgumentsNode (location: (6,13)-(6,14))
            │           │   ├── flags: ∅
            │           │   └── arguments: (length: 1)
            │           │       └── @ CallNode (location: (6,13)-(6,14))
            │           │           ├── flags: variable_call
            │           │           ├── receiver: ∅
            │           │           ├── call_operator_loc: ∅
            │           │           ├── name: :c
            │           │           ├── message_loc: (6,13)-(6,14) = "c"
            │           │           ├── opening_loc: ∅
            │           │           ├── arguments: ∅
            │           │           ├── closing_loc: ∅
            │           │           └── block: ∅
            │           ├── closing_loc: (6,14)-(6,15) = ")"
            │           └── block: ∅
            ├── closing_loc: ∅
            └── block: ∅
