@ ProgramNode (location: (0...313))
├── locals: []
└── statements:
    @ StatementsNode (location: (0...313))
    └── body: (length: 16)
        ├── @ CallNode (location: (0...8))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (0...1) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (2...8))
        │   │   └── arguments: (length: 1)
        │   │       └── @ InterpolatedStringNode (location: (2...8))
        │   │           ├── opening_loc: (2...8) = "<<~\"E\""
        │   │           ├── parts: (length: 3)
        │   │           │   ├── @ StringNode (location: (9...17))
        │   │           │   │   ├── opening_loc: ∅
        │   │           │   │   ├── content_loc: (9...17) = "    x\n  "
        │   │           │   │   ├── closing_loc: ∅
        │   │           │   │   └── unescaped: "  x\n"
        │   │           │   ├── @ EmbeddedStatementsNode (location: (17...25))
        │   │           │   │   ├── opening_loc: (17...19) = "\#{"
        │   │           │   │   ├── statements:
        │   │           │   │   │   @ StatementsNode (location: (19...24))
        │   │           │   │   │   └── body: (length: 1)
        │   │           │   │   │       └── @ StringNode (location: (19...24))
        │   │           │   │   │           ├── opening_loc: (19...20) = "\""
        │   │           │   │   │           ├── content_loc: (20...23) = "  y"
        │   │           │   │   │           ├── closing_loc: (23...24) = "\""
        │   │           │   │   │           └── unescaped: "  y"
        │   │           │   │   └── closing_loc: (24...25) = "}"
        │   │           │   └── @ StringNode (location: (25...26))
        │   │           │       ├── opening_loc: ∅
        │   │           │       ├── content_loc: (25...26) = "\n"
        │   │           │       ├── closing_loc: ∅
        │   │           │       └── unescaped: "\n"
        │   │           └── closing_loc: (26...28) = "E\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (29...37))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (29...30) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (31...37))
        │   │   └── arguments: (length: 1)
        │   │       └── @ InterpolatedStringNode (location: (31...37))
        │   │           ├── opening_loc: (31...37) = "<<~\"E\""
        │   │           ├── parts: (length: 3)
        │   │           │   ├── @ StringNode (location: (38...46))
        │   │           │   │   ├── opening_loc: ∅
        │   │           │   │   ├── content_loc: (38...46) = "    x\n  "
        │   │           │   │   ├── closing_loc: ∅
        │   │           │   │   └── unescaped: "  x\n"
        │   │           │   ├── @ EmbeddedStatementsNode (location: (46...52))
        │   │           │   │   ├── opening_loc: (46...48) = "\#{"
        │   │           │   │   ├── statements:
        │   │           │   │   │   @ StatementsNode (location: (48...51))
        │   │           │   │   │   └── body: (length: 1)
        │   │           │   │   │       └── @ CallNode (location: (48...51))
        │   │           │   │   │           ├── receiver: ∅
        │   │           │   │   │           ├── call_operator_loc: ∅
        │   │           │   │   │           ├── message_loc: (48...51) = "foo"
        │   │           │   │   │           ├── opening_loc: ∅
        │   │           │   │   │           ├── arguments: ∅
        │   │           │   │   │           ├── closing_loc: ∅
        │   │           │   │   │           ├── block: ∅
        │   │           │   │   │           ├── flags: variable_call
        │   │           │   │   │           └── name: "foo"
        │   │           │   │   └── closing_loc: (51...52) = "}"
        │   │           │   └── @ StringNode (location: (52...53))
        │   │           │       ├── opening_loc: ∅
        │   │           │       ├── content_loc: (52...53) = "\n"
        │   │           │       ├── closing_loc: ∅
        │   │           │       └── unescaped: "\n"
        │   │           └── closing_loc: (53...55) = "E\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (56...62))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (56...57) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (58...62))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (58...62))
        │   │           ├── opening_loc: (58...62) = "<<~E"
        │   │           ├── content_loc: (63...76) = "\tx\n        y\n"
        │   │           ├── closing_loc: (76...78) = "E\n"
        │   │           └── unescaped: "x\ny\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (79...85))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (79...80) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (81...85))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (81...85))
        │   │           ├── opening_loc: (81...85) = "<<~E"
        │   │           ├── content_loc: (86...95) = "\tx\n    y\n"
        │   │           ├── closing_loc: (95...97) = "E\n"
        │   │           └── unescaped: "\tx\ny\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (98...104))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (98...99) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (100...104))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (100...104))
        │   │           ├── opening_loc: (100...104) = "<<~E"
        │   │           ├── content_loc: (105...122) = "    \tx\n        y\n"
        │   │           ├── closing_loc: (122...124) = "E\n"
        │   │           └── unescaped: "x\ny\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (125...131))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (125...126) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (127...131))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (127...131))
        │   │           ├── opening_loc: (127...131) = "<<~E"
        │   │           ├── content_loc: (132...146) = "        \tx\n\ty\n"
        │   │           ├── closing_loc: (146...148) = "E\n"
        │   │           └── unescaped: "\tx\ny\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (149...155))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (149...150) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (151...155))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (151...155))
        │   │           ├── opening_loc: (151...155) = "<<~E"
        │   │           ├── content_loc: (156...168) = "    x\n  \\\ty\n"
        │   │           ├── closing_loc: (168...170) = "E\n"
        │   │           └── unescaped: "  x\n\ty\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (171...177))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (171...172) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (173...177))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (173...177))
        │   │           ├── opening_loc: (173...177) = "<<~E"
        │   │           ├── content_loc: (178...191) = "    x\n  \\  y\n"
        │   │           ├── closing_loc: (191...193) = "E\n"
        │   │           └── unescaped: "  x\n  y\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (194...200))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (194...195) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (196...200))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (196...200))
        │   │           ├── opening_loc: (196...200) = "<<~E"
        │   │           ├── content_loc: (200...201) = "\n"
        │   │           ├── closing_loc: (201...205) = "  E\n"
        │   │           └── unescaped: ""
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (206...212))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (206...207) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (208...212))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (208...212))
        │   │           ├── opening_loc: (208...212) = "<<~E"
        │   │           ├── content_loc: (213...220) = "  x\n\ny\n"
        │   │           ├── closing_loc: (220...222) = "E\n"
        │   │           └── unescaped: "  x\n\ny\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (223...229))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (223...224) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (225...229))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (225...229))
        │   │           ├── opening_loc: (225...229) = "<<~E"
        │   │           ├── content_loc: (230...243) = "  x\n    \n  y\n"
        │   │           ├── closing_loc: (243...245) = "E\n"
        │   │           └── unescaped: "x\n  \ny\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (246...252))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (246...247) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (248...252))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (248...252))
        │   │           ├── opening_loc: (248...252) = "<<~E"
        │   │           ├── content_loc: (253...263) = "  x\n    y\n"
        │   │           ├── closing_loc: (263...265) = "E\n"
        │   │           └── unescaped: "x\n  y\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (266...272))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (266...267) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (268...272))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (268...272))
        │   │           ├── opening_loc: (268...272) = "<<~E"
        │   │           ├── content_loc: (273...277) = "  x\n"
        │   │           ├── closing_loc: (277...279) = "E\n"
        │   │           └── unescaped: "x\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (280...286))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (280...281) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (282...286))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (282...286))
        │   │           ├── opening_loc: (282...286) = "<<~E"
        │   │           ├── content_loc: (287...292) = "  ð\n"
        │   │           ├── closing_loc: (292...294) = "E\n"
        │   │           └── unescaped: "ð\n"
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        ├── @ CallNode (location: (295...301))
        │   ├── receiver: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (295...296) = "p"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (297...301))
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (297...301))
        │   │           ├── opening_loc: (297...301) = "<<~E"
        │   │           ├── content_loc: (301...302) = "\n"
        │   │           ├── closing_loc: (302...304) = "E\n"
        │   │           └── unescaped: ""
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: "p"
        └── @ CallNode (location: (305...313))
            ├── receiver: ∅
            ├── call_operator_loc: ∅
            ├── message_loc: (305...306) = "p"
            ├── opening_loc: ∅
            ├── arguments:
            │   @ ArgumentsNode (location: (307...313))
            │   └── arguments: (length: 1)
            │       └── @ InterpolatedXStringNode (location: (307...313))
            │           ├── opening_loc: (307...313) = "<<~`E`"
            │           ├── parts: (length: 3)
            │           │   ├── @ StringNode (location: (314...322))
            │           │   │   ├── opening_loc: ∅
            │           │   │   ├── content_loc: (314...322) = "    x\n  "
            │           │   │   ├── closing_loc: ∅
            │           │   │   └── unescaped: "  x\n"
            │           │   ├── @ EmbeddedStatementsNode (location: (322...328))
            │           │   │   ├── opening_loc: (322...324) = "\#{"
            │           │   │   ├── statements:
            │           │   │   │   @ StatementsNode (location: (324...327))
            │           │   │   │   └── body: (length: 1)
            │           │   │   │       └── @ CallNode (location: (324...327))
            │           │   │   │           ├── receiver: ∅
            │           │   │   │           ├── call_operator_loc: ∅
            │           │   │   │           ├── message_loc: (324...327) = "foo"
            │           │   │   │           ├── opening_loc: ∅
            │           │   │   │           ├── arguments: ∅
            │           │   │   │           ├── closing_loc: ∅
            │           │   │   │           ├── block: ∅
            │           │   │   │           ├── flags: variable_call
            │           │   │   │           └── name: "foo"
            │           │   │   └── closing_loc: (327...328) = "}"
            │           │   └── @ StringNode (location: (328...329))
            │           │       ├── opening_loc: ∅
            │           │       ├── content_loc: (328...329) = "\n"
            │           │       ├── closing_loc: ∅
            │           │       └── unescaped: "\n"
            │           └── closing_loc: (329...331) = "E\n"
            ├── closing_loc: ∅
            ├── block: ∅
            ├── flags: ∅
            └── name: "p"
