@ ProgramNode (location: (0...197))
├── locals: []
└── statements:
    @ StatementsNode (location: (0...197))
    └── body: (length: 4)
        ├── @ WhileNode (location: (0...52))
        │   ├── keyword_loc: (0...5) = "while"
        │   ├── closing_loc: (49...52) = "end"
        │   ├── predicate:
        │   │   @ SingletonClassNode (location: (6...40))
        │   │   ├── locals: [:a]
        │   │   ├── class_keyword_loc: (6...11) = "class"
        │   │   ├── operator_loc: (12...14) = "<<"
        │   │   ├── expression:
        │   │   │   @ SelfNode (location: (15...19))
        │   │   ├── body:
        │   │   │   @ StatementsNode (location: (21...35))
        │   │   │   └── body: (length: 1)
        │   │   │       └── @ LocalVariableWriteNode (location: (21...35))
        │   │   │           ├── name: :a
        │   │   │           ├── depth: 0
        │   │   │           ├── name_loc: (21...22) = "a"
        │   │   │           ├── value:
        │   │   │           │   @ CallNode (location: (25...35))
        │   │   │           │   ├── receiver: ∅
        │   │   │           │   ├── call_operator_loc: ∅
        │   │   │           │   ├── message_loc: (25...28) = "tap"
        │   │   │           │   ├── opening_loc: ∅
        │   │   │           │   ├── arguments: ∅
        │   │   │           │   ├── closing_loc: ∅
        │   │   │           │   ├── block:
        │   │   │           │   │   @ BlockNode (location: (29...35))
        │   │   │           │   │   ├── locals: []
        │   │   │           │   │   ├── parameters: ∅
        │   │   │           │   │   ├── body: ∅
        │   │   │           │   │   ├── opening_loc: (29...31) = "do"
        │   │   │           │   │   └── closing_loc: (32...35) = "end"
        │   │   │           │   ├── flags: ∅
        │   │   │           │   └── name: "tap"
        │   │   │           └── operator_loc: (23...24) = "="
        │   │   └── end_keyword_loc: (37...40) = "end"
        │   ├── statements:
        │   │   @ StatementsNode (location: (42...47))
        │   │   └── body: (length: 1)
        │   │       └── @ BreakNode (location: (42...47))
        │   │           ├── arguments: ∅
        │   │           └── keyword_loc: (42...47) = "break"
        │   └── flags: ∅
        ├── @ WhileNode (location: (54...102))
        │   ├── keyword_loc: (54...59) = "while"
        │   ├── closing_loc: (99...102) = "end"
        │   ├── predicate:
        │   │   @ SingletonClassNode (location: (60...90))
        │   │   ├── locals: []
        │   │   ├── class_keyword_loc: (60...65) = "class"
        │   │   ├── operator_loc: (66...68) = "<<"
        │   │   ├── expression:
        │   │   │   @ SelfNode (location: (69...73))
        │   │   ├── body:
        │   │   │   @ StatementsNode (location: (75...85))
        │   │   │   └── body: (length: 1)
        │   │   │       └── @ CallNode (location: (75...85))
        │   │   │           ├── receiver: ∅
        │   │   │           ├── call_operator_loc: ∅
        │   │   │           ├── message_loc: (75...78) = "tap"
        │   │   │           ├── opening_loc: ∅
        │   │   │           ├── arguments: ∅
        │   │   │           ├── closing_loc: ∅
        │   │   │           ├── block:
        │   │   │           │   @ BlockNode (location: (79...85))
        │   │   │           │   ├── locals: []
        │   │   │           │   ├── parameters: ∅
        │   │   │           │   ├── body: ∅
        │   │   │           │   ├── opening_loc: (79...81) = "do"
        │   │   │           │   └── closing_loc: (82...85) = "end"
        │   │   │           ├── flags: ∅
        │   │   │           └── name: "tap"
        │   │   └── end_keyword_loc: (87...90) = "end"
        │   ├── statements:
        │   │   @ StatementsNode (location: (92...97))
        │   │   └── body: (length: 1)
        │   │       └── @ BreakNode (location: (92...97))
        │   │           ├── arguments: ∅
        │   │           └── keyword_loc: (92...97) = "break"
        │   └── flags: ∅
        ├── @ WhileNode (location: (104...151))
        │   ├── keyword_loc: (104...109) = "while"
        │   ├── closing_loc: (148...151) = "end"
        │   ├── predicate:
        │   │   @ ClassNode (location: (110...139))
        │   │   ├── locals: [:a]
        │   │   ├── class_keyword_loc: (110...115) = "class"
        │   │   ├── constant_path:
        │   │   │   @ ConstantReadNode (location: (116...119))
        │   │   │   └── name: :Foo
        │   │   ├── inheritance_operator_loc: ∅
        │   │   ├── superclass: ∅
        │   │   ├── body:
        │   │   │   @ StatementsNode (location: (120...134))
        │   │   │   └── body: (length: 1)
        │   │   │       └── @ LocalVariableWriteNode (location: (120...134))
        │   │   │           ├── name: :a
        │   │   │           ├── depth: 0
        │   │   │           ├── name_loc: (120...121) = "a"
        │   │   │           ├── value:
        │   │   │           │   @ CallNode (location: (124...134))
        │   │   │           │   ├── receiver: ∅
        │   │   │           │   ├── call_operator_loc: ∅
        │   │   │           │   ├── message_loc: (124...127) = "tap"
        │   │   │           │   ├── opening_loc: ∅
        │   │   │           │   ├── arguments: ∅
        │   │   │           │   ├── closing_loc: ∅
        │   │   │           │   ├── block:
        │   │   │           │   │   @ BlockNode (location: (128...134))
        │   │   │           │   │   ├── locals: []
        │   │   │           │   │   ├── parameters: ∅
        │   │   │           │   │   ├── body: ∅
        │   │   │           │   │   ├── opening_loc: (128...130) = "do"
        │   │   │           │   │   └── closing_loc: (131...134) = "end"
        │   │   │           │   ├── flags: ∅
        │   │   │           │   └── name: "tap"
        │   │   │           └── operator_loc: (122...123) = "="
        │   │   ├── end_keyword_loc: (136...139) = "end"
        │   │   └── name: :Foo
        │   ├── statements:
        │   │   @ StatementsNode (location: (141...146))
        │   │   └── body: (length: 1)
        │   │       └── @ BreakNode (location: (141...146))
        │   │           ├── arguments: ∅
        │   │           └── keyword_loc: (141...146) = "break"
        │   └── flags: ∅
        └── @ WhileNode (location: (153...197))
            ├── keyword_loc: (153...158) = "while"
            ├── closing_loc: (194...197) = "end"
            ├── predicate:
            │   @ ClassNode (location: (159...185))
            │   ├── locals: []
            │   ├── class_keyword_loc: (159...164) = "class"
            │   ├── constant_path:
            │   │   @ ConstantReadNode (location: (165...168))
            │   │   └── name: :Foo
            │   ├── inheritance_operator_loc: ∅
            │   ├── superclass: ∅
            │   ├── body:
            │   │   @ StatementsNode (location: (170...180))
            │   │   └── body: (length: 1)
            │   │       └── @ CallNode (location: (170...180))
            │   │           ├── receiver: ∅
            │   │           ├── call_operator_loc: ∅
            │   │           ├── message_loc: (170...173) = "tap"
            │   │           ├── opening_loc: ∅
            │   │           ├── arguments: ∅
            │   │           ├── closing_loc: ∅
            │   │           ├── block:
            │   │           │   @ BlockNode (location: (174...180))
            │   │           │   ├── locals: []
            │   │           │   ├── parameters: ∅
            │   │           │   ├── body: ∅
            │   │           │   ├── opening_loc: (174...176) = "do"
            │   │           │   └── closing_loc: (177...180) = "end"
            │   │           ├── flags: ∅
            │   │           └── name: "tap"
            │   ├── end_keyword_loc: (182...185) = "end"
            │   └── name: :Foo
            ├── statements:
            │   @ StatementsNode (location: (187...192))
            │   └── body: (length: 1)
            │       └── @ BreakNode (location: (187...192))
            │           ├── arguments: ∅
            │           └── keyword_loc: (187...192) = "break"
            └── flags: ∅
