@ ProgramNode (location: (1,0)-(153,15))
├── flags: ∅
├── locals: []
└── statements:
    @ StatementsNode (location: (1,0)-(153,15))
    ├── flags: ∅
    └── body: (length: 65)
        ├── @ StringNode (location: (1,0)-(1,6))
        │   ├── flags: newline
        │   ├── opening_loc: (1,0)-(1,2) = "%%"
        │   ├── content_loc: (1,2)-(1,5) = "abc"
        │   ├── closing_loc: (1,5)-(1,6) = "%"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (3,0)-(3,6))
        │   ├── flags: newline
        │   ├── opening_loc: (3,0)-(3,2) = "%^"
        │   ├── content_loc: (3,2)-(3,5) = "abc"
        │   ├── closing_loc: (3,5)-(3,6) = "^"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (5,0)-(5,6))
        │   ├── flags: newline
        │   ├── opening_loc: (5,0)-(5,2) = "%&"
        │   ├── content_loc: (5,2)-(5,5) = "abc"
        │   ├── closing_loc: (5,5)-(5,6) = "&"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (7,0)-(7,6))
        │   ├── flags: newline
        │   ├── opening_loc: (7,0)-(7,2) = "%*"
        │   ├── content_loc: (7,2)-(7,5) = "abc"
        │   ├── closing_loc: (7,5)-(7,6) = "*"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (9,0)-(9,6))
        │   ├── flags: newline
        │   ├── opening_loc: (9,0)-(9,2) = "%_"
        │   ├── content_loc: (9,2)-(9,5) = "abc"
        │   ├── closing_loc: (9,5)-(9,6) = "_"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (11,0)-(11,6))
        │   ├── flags: newline
        │   ├── opening_loc: (11,0)-(11,2) = "%+"
        │   ├── content_loc: (11,2)-(11,5) = "abc"
        │   ├── closing_loc: (11,5)-(11,6) = "+"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (13,0)-(13,6))
        │   ├── flags: newline
        │   ├── opening_loc: (13,0)-(13,2) = "%-"
        │   ├── content_loc: (13,2)-(13,5) = "abc"
        │   ├── closing_loc: (13,5)-(13,6) = "-"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (15,0)-(15,6))
        │   ├── flags: newline
        │   ├── opening_loc: (15,0)-(15,2) = "%:"
        │   ├── content_loc: (15,2)-(15,5) = "abc"
        │   ├── closing_loc: (15,5)-(15,6) = ":"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (17,0)-(17,6))
        │   ├── flags: newline
        │   ├── opening_loc: (17,0)-(17,2) = "%;"
        │   ├── content_loc: (17,2)-(17,5) = "abc"
        │   ├── closing_loc: (17,5)-(17,6) = ";"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (19,0)-(19,6))
        │   ├── flags: newline
        │   ├── opening_loc: (19,0)-(19,2) = "%'"
        │   ├── content_loc: (19,2)-(19,5) = "abc"
        │   ├── closing_loc: (19,5)-(19,6) = "'"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (21,0)-(21,6))
        │   ├── flags: newline
        │   ├── opening_loc: (21,0)-(21,2) = "%~"
        │   ├── content_loc: (21,2)-(21,5) = "abc"
        │   ├── closing_loc: (21,5)-(21,6) = "~"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (23,0)-(23,6))
        │   ├── flags: newline
        │   ├── opening_loc: (23,0)-(23,2) = "%?"
        │   ├── content_loc: (23,2)-(23,5) = "abc"
        │   ├── closing_loc: (23,5)-(23,6) = "?"
        │   └── unescaped: "abc"
        ├── @ ArrayNode (location: (25,0)-(25,8))
        │   ├── flags: newline, static_literal
        │   ├── elements: (length: 0)
        │   ├── opening_loc: (25,0)-(25,3) = "%w{"
        │   └── closing_loc: (25,7)-(25,8) = "}"
        ├── @ StringNode (location: (27,0)-(27,6))
        │   ├── flags: newline
        │   ├── opening_loc: (27,0)-(27,2) = "%/"
        │   ├── content_loc: (27,2)-(27,5) = "abc"
        │   ├── closing_loc: (27,5)-(27,6) = "/"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (29,0)-(29,6))
        │   ├── flags: newline
        │   ├── opening_loc: (29,0)-(29,2) = "%`"
        │   ├── content_loc: (29,2)-(29,5) = "abc"
        │   ├── closing_loc: (29,5)-(29,6) = "`"
        │   └── unescaped: "abc"
        ├── @ InterpolatedStringNode (location: (31,0)-(31,8))
        │   ├── flags: newline
        │   ├── opening_loc: (31,0)-(31,1) = "\""
        │   ├── parts: (length: 1)
        │   │   └── @ EmbeddedVariableNode (location: (31,1)-(31,7))
        │   │       ├── flags: ∅
        │   │       ├── operator_loc: (31,1)-(31,2) = "#"
        │   │       └── variable:
        │   │           @ ClassVariableReadNode (location: (31,2)-(31,7))
        │   │           ├── flags: ∅
        │   │           └── name: :@@foo
        │   └── closing_loc: (31,7)-(31,8) = "\""
        ├── @ StringNode (location: (33,0)-(33,6))
        │   ├── flags: newline
        │   ├── opening_loc: (33,0)-(33,2) = "%\\"
        │   ├── content_loc: (33,2)-(33,5) = "abc"
        │   ├── closing_loc: (33,5)-(33,6) = "\\"
        │   └── unescaped: "abc"
        ├── @ InterpolatedStringNode (location: (35,0)-(35,17))
        │   ├── flags: newline
        │   ├── opening_loc: (35,0)-(35,2) = "%{"
        │   ├── parts: (length: 3)
        │   │   ├── @ StringNode (location: (35,2)-(35,6))
        │   │   │   ├── flags: static_literal, frozen
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (35,2)-(35,6) = "aaa "
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "aaa "
        │   │   ├── @ EmbeddedStatementsNode (location: (35,6)-(35,12))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: (35,6)-(35,8) = "\#{"
        │   │   │   ├── statements:
        │   │   │   │   @ StatementsNode (location: (35,8)-(35,11))
        │   │   │   │   ├── flags: ∅
        │   │   │   │   └── body: (length: 1)
        │   │   │   │       └── @ CallNode (location: (35,8)-(35,11))
        │   │   │   │           ├── flags: variable_call, ignore_visibility
        │   │   │   │           ├── receiver: ∅
        │   │   │   │           ├── call_operator_loc: ∅
        │   │   │   │           ├── name: :bbb
        │   │   │   │           ├── message_loc: (35,8)-(35,11) = "bbb"
        │   │   │   │           ├── opening_loc: ∅
        │   │   │   │           ├── arguments: ∅
        │   │   │   │           ├── closing_loc: ∅
        │   │   │   │           └── block: ∅
        │   │   │   └── closing_loc: (35,11)-(35,12) = "}"
        │   │   └── @ StringNode (location: (35,12)-(35,16))
        │   │       ├── flags: static_literal, frozen
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (35,12)-(35,16) = " ccc"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: " ccc"
        │   └── closing_loc: (35,16)-(35,17) = "}"
        ├── @ StringNode (location: (37,0)-(37,8))
        │   ├── flags: newline
        │   ├── opening_loc: (37,0)-(37,2) = "%["
        │   ├── content_loc: (37,2)-(37,7) = "foo[]"
        │   ├── closing_loc: (37,7)-(37,8) = "]"
        │   └── unescaped: "foo[]"
        ├── @ CallNode (location: (39,0)-(41,5))
        │   ├── flags: newline
        │   ├── receiver:
        │   │   @ StringNode (location: (39,0)-(39,5))
        │   │   ├── flags: ∅
        │   │   ├── opening_loc: (39,0)-(39,1) = "\""
        │   │   ├── content_loc: (39,1)-(39,4) = "foo"
        │   │   ├── closing_loc: (39,4)-(39,5) = "\""
        │   │   └── unescaped: "foo"
        │   ├── call_operator_loc: ∅
        │   ├── name: :+
        │   ├── message_loc: (39,6)-(39,7) = "+"
        │   ├── opening_loc: ∅
        │   ├── arguments:
        │   │   @ ArgumentsNode (location: (41,0)-(41,5))
        │   │   ├── flags: ∅
        │   │   └── arguments: (length: 1)
        │   │       └── @ StringNode (location: (41,0)-(41,5))
        │   │           ├── flags: ∅
        │   │           ├── opening_loc: (41,0)-(41,1) = "\""
        │   │           ├── content_loc: (41,1)-(41,4) = "bar"
        │   │           ├── closing_loc: (41,4)-(41,5) = "\""
        │   │           └── unescaped: "bar"
        │   ├── closing_loc: ∅
        │   └── block: ∅
        ├── @ StringNode (location: (43,0)-(46,1))
        │   ├── flags: newline
        │   ├── opening_loc: (43,0)-(43,1) = "\""
        │   ├── content_loc: (43,1)-(46,0) = "\nfoo\\\nb\\nar\n"
        │   ├── closing_loc: (46,0)-(46,1) = "\""
        │   └── unescaped: "\nfoob\nar\n"
        ├── @ StringNode (location: (48,0)-(50,12))
        │   ├── flags: newline
        │   ├── opening_loc: (48,0)-(48,1) = "\""
        │   ├── content_loc: (48,1)-(50,11) = "foo\n\\nbar\\n\\n\na\\nb\\n\\nc\\n"
        │   ├── closing_loc: (50,11)-(50,12) = "\""
        │   └── unescaped: "foo\n\nbar\n\n\na\nb\n\nc\n"
        ├── @ StringNode (location: (52,0)-(52,7))
        │   ├── flags: newline
        │   ├── opening_loc: (52,0)-(52,3) = "%q{"
        │   ├── content_loc: (52,3)-(52,6) = "abc"
        │   ├── closing_loc: (52,6)-(52,7) = "}"
        │   └── unescaped: "abc"
        ├── @ SymbolNode (location: (54,0)-(54,7))
        │   ├── flags: newline, static_literal, forced_us_ascii_encoding
        │   ├── opening_loc: (54,0)-(54,3) = "%s["
        │   ├── value_loc: (54,3)-(54,6) = "abc"
        │   ├── closing_loc: (54,6)-(54,7) = "]"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (56,0)-(56,6))
        │   ├── flags: newline
        │   ├── opening_loc: (56,0)-(56,2) = "%{"
        │   ├── content_loc: (56,2)-(56,5) = "abc"
        │   ├── closing_loc: (56,5)-(56,6) = "}"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (58,0)-(58,2))
        │   ├── flags: newline
        │   ├── opening_loc: (58,0)-(58,1) = "'"
        │   ├── content_loc: (58,1)-(58,1) = ""
        │   ├── closing_loc: (58,1)-(58,2) = "'"
        │   └── unescaped: ""
        ├── @ StringNode (location: (60,0)-(60,5))
        │   ├── flags: newline
        │   ├── opening_loc: (60,0)-(60,1) = "\""
        │   ├── content_loc: (60,1)-(60,4) = "abc"
        │   ├── closing_loc: (60,4)-(60,5) = "\""
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (62,0)-(62,7))
        │   ├── flags: newline
        │   ├── opening_loc: (62,0)-(62,1) = "\""
        │   ├── content_loc: (62,1)-(62,6) = "\#@---"
        │   ├── closing_loc: (62,6)-(62,7) = "\""
        │   └── unescaped: "\#@---"
        ├── @ InterpolatedStringNode (location: (64,0)-(64,16))
        │   ├── flags: newline
        │   ├── opening_loc: (64,0)-(64,1) = "\""
        │   ├── parts: (length: 3)
        │   │   ├── @ StringNode (location: (64,1)-(64,5))
        │   │   │   ├── flags: static_literal, frozen
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (64,1)-(64,5) = "aaa "
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "aaa "
        │   │   ├── @ EmbeddedStatementsNode (location: (64,5)-(64,11))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: (64,5)-(64,7) = "\#{"
        │   │   │   ├── statements:
        │   │   │   │   @ StatementsNode (location: (64,7)-(64,10))
        │   │   │   │   ├── flags: ∅
        │   │   │   │   └── body: (length: 1)
        │   │   │   │       └── @ CallNode (location: (64,7)-(64,10))
        │   │   │   │           ├── flags: variable_call, ignore_visibility
        │   │   │   │           ├── receiver: ∅
        │   │   │   │           ├── call_operator_loc: ∅
        │   │   │   │           ├── name: :bbb
        │   │   │   │           ├── message_loc: (64,7)-(64,10) = "bbb"
        │   │   │   │           ├── opening_loc: ∅
        │   │   │   │           ├── arguments: ∅
        │   │   │   │           ├── closing_loc: ∅
        │   │   │   │           └── block: ∅
        │   │   │   └── closing_loc: (64,10)-(64,11) = "}"
        │   │   └── @ StringNode (location: (64,11)-(64,15))
        │   │       ├── flags: static_literal, frozen
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (64,11)-(64,15) = " ccc"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: " ccc"
        │   └── closing_loc: (64,15)-(64,16) = "\""
        ├── @ StringNode (location: (66,0)-(66,5))
        │   ├── flags: newline
        │   ├── opening_loc: (66,0)-(66,1) = "'"
        │   ├── content_loc: (66,1)-(66,4) = "abc"
        │   ├── closing_loc: (66,4)-(66,5) = "'"
        │   └── unescaped: "abc"
        ├── @ ArrayNode (location: (68,0)-(68,9))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ StringNode (location: (68,3)-(68,4))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (68,3)-(68,4) = "a"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a"
        │   │   ├── @ StringNode (location: (68,5)-(68,6))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (68,5)-(68,6) = "b"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "b"
        │   │   └── @ StringNode (location: (68,7)-(68,8))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (68,7)-(68,8) = "c"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "c"
        │   ├── opening_loc: (68,0)-(68,3) = "%w["
        │   └── closing_loc: (68,8)-(68,9) = "]"
        ├── @ ArrayNode (location: (70,0)-(70,17))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ StringNode (location: (70,3)-(70,6))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (70,3)-(70,6) = "a[]"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a[]"
        │   │   ├── @ StringNode (location: (70,7)-(70,12))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (70,7)-(70,12) = "b[[]]"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "b[[]]"
        │   │   └── @ StringNode (location: (70,13)-(70,16))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (70,13)-(70,16) = "c[]"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "c[]"
        │   ├── opening_loc: (70,0)-(70,3) = "%w["
        │   └── closing_loc: (70,16)-(70,17) = "]"
        ├── @ ArrayNode (location: (72,0)-(72,18))
        │   ├── flags: newline
        │   ├── elements: (length: 2)
        │   │   ├── @ StringNode (location: (72,3)-(72,11))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (72,3)-(72,11) = "foo\\ bar"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "foo bar"
        │   │   └── @ StringNode (location: (72,12)-(72,17))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (72,12)-(72,17) = "\\\#{1}"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "\\\#{1}"
        │   ├── opening_loc: (72,0)-(72,3) = "%w["
        │   └── closing_loc: (72,17)-(72,18) = "]"
        ├── @ ArrayNode (location: (74,0)-(74,16))
        │   ├── flags: newline
        │   ├── elements: (length: 2)
        │   │   ├── @ StringNode (location: (74,3)-(74,11))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (74,3)-(74,11) = "foo\\ bar"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "foo bar"
        │   │   └── @ StringNode (location: (74,12)-(74,15))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (74,12)-(74,15) = "baz"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "baz"
        │   ├── opening_loc: (74,0)-(74,3) = "%w["
        │   └── closing_loc: (74,15)-(74,16) = "]"
        ├── @ ArrayNode (location: (76,0)-(77,5))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ StringNode (location: (76,3)-(76,13))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (76,3)-(76,13) = "foo\\ bar\\\\"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "foo bar\\"
        │   │   ├── @ StringNode (location: (76,14)-(77,0))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (76,14)-(77,0) = "baz\\\\\\\n"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "baz\\\n"
        │   │   └── @ StringNode (location: (77,1)-(77,4))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (77,1)-(77,4) = "bat"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "bat"
        │   ├── opening_loc: (76,0)-(76,3) = "%w["
        │   └── closing_loc: (77,4)-(77,5) = "]"
        ├── @ ArrayNode (location: (79,0)-(82,1))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ InterpolatedStringNode (location: (79,3)-(80,3))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── parts: (length: 2)
        │   │   │   │   ├── @ EmbeddedStatementsNode (location: (79,3)-(79,9))
        │   │   │   │   │   ├── flags: ∅
        │   │   │   │   │   ├── opening_loc: (79,3)-(79,5) = "\#{"
        │   │   │   │   │   ├── statements:
        │   │   │   │   │   │   @ StatementsNode (location: (79,5)-(79,8))
        │   │   │   │   │   │   ├── flags: ∅
        │   │   │   │   │   │   └── body: (length: 1)
        │   │   │   │   │   │       └── @ CallNode (location: (79,5)-(79,8))
        │   │   │   │   │   │           ├── flags: variable_call, ignore_visibility
        │   │   │   │   │   │           ├── receiver: ∅
        │   │   │   │   │   │           ├── call_operator_loc: ∅
        │   │   │   │   │   │           ├── name: :foo
        │   │   │   │   │   │           ├── message_loc: (79,5)-(79,8) = "foo"
        │   │   │   │   │   │           ├── opening_loc: ∅
        │   │   │   │   │   │           ├── arguments: ∅
        │   │   │   │   │   │           ├── closing_loc: ∅
        │   │   │   │   │   │           └── block: ∅
        │   │   │   │   │   └── closing_loc: (79,8)-(79,9) = "}"
        │   │   │   │   └── @ StringNode (location: (79,9)-(80,3))
        │   │   │   │       ├── flags: static_literal, frozen
        │   │   │   │       ├── opening_loc: ∅
        │   │   │   │       ├── content_loc: (79,9)-(80,3) = "\\\nbar"
        │   │   │   │       ├── closing_loc: ∅
        │   │   │   │       └── unescaped: "\nbar"
        │   │   │   └── closing_loc: ∅
        │   │   ├── @ StringNode (location: (81,0)-(81,3))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (81,0)-(81,3) = "baz"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "baz"
        │   │   └── @ InterpolatedStringNode (location: (81,4)-(81,10))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── parts: (length: 1)
        │   │       │   └── @ EmbeddedStatementsNode (location: (81,4)-(81,10))
        │   │       │       ├── flags: ∅
        │   │       │       ├── opening_loc: (81,4)-(81,6) = "\#{"
        │   │       │       ├── statements:
        │   │       │       │   @ StatementsNode (location: (81,6)-(81,9))
        │   │       │       │   ├── flags: ∅
        │   │       │       │   └── body: (length: 1)
        │   │       │       │       └── @ CallNode (location: (81,6)-(81,9))
        │   │       │       │           ├── flags: variable_call, ignore_visibility
        │   │       │       │           ├── receiver: ∅
        │   │       │       │           ├── call_operator_loc: ∅
        │   │       │       │           ├── name: :bat
        │   │       │       │           ├── message_loc: (81,6)-(81,9) = "bat"
        │   │       │       │           ├── opening_loc: ∅
        │   │       │       │           ├── arguments: ∅
        │   │       │       │           ├── closing_loc: ∅
        │   │       │       │           └── block: ∅
        │   │       │       └── closing_loc: (81,9)-(81,10) = "}"
        │   │       └── closing_loc: ∅
        │   ├── opening_loc: (79,0)-(79,3) = "%W["
        │   └── closing_loc: (82,0)-(82,1) = "]"
        ├── @ ArrayNode (location: (84,0)-(84,9))
        │   ├── flags: newline
        │   ├── elements: (length: 1)
        │   │   └── @ StringNode (location: (84,3)-(84,8))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (84,3)-(84,8) = "foo\\n"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "foo\\n"
        │   ├── opening_loc: (84,0)-(84,3) = "%w("
        │   └── closing_loc: (84,8)-(84,9) = ")"
        ├── @ ArrayNode (location: (86,0)-(87,1))
        │   ├── flags: newline
        │   ├── elements: (length: 1)
        │   │   └── @ StringNode (location: (86,3)-(87,0))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (86,3)-(87,0) = "foo\\\n"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "foo\n"
        │   ├── opening_loc: (86,0)-(86,3) = "%w("
        │   └── closing_loc: (87,0)-(87,1) = ")"
        ├── @ ArrayNode (location: (89,0)-(89,10))
        │   ├── flags: newline
        │   ├── elements: (length: 2)
        │   │   ├── @ StringNode (location: (89,3)-(89,6))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (89,3)-(89,6) = "foo"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "foo"
        │   │   └── @ StringNode (location: (89,7)-(89,9))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (89,7)-(89,9) = "\\n"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "\\n"
        │   ├── opening_loc: (89,0)-(89,3) = "%w("
        │   └── closing_loc: (89,9)-(89,10) = ")"
        ├── @ ArrayNode (location: (91,0)-(92,4))
        │   ├── flags: newline
        │   ├── elements: (length: 1)
        │   │   └── @ StringNode (location: (91,3)-(92,3))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (91,3)-(92,3) = "foo\\\nbar"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "foo\nbar"
        │   ├── opening_loc: (91,0)-(91,3) = "%W("
        │   └── closing_loc: (92,3)-(92,4) = ")"
        ├── @ ArrayNode (location: (94,0)-(94,15))
        │   ├── flags: newline
        │   ├── elements: (length: 2)
        │   │   ├── @ StringNode (location: (94,3)-(94,6))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (94,3)-(94,6) = "foo"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "foo"
        │   │   └── @ StringNode (location: (94,11)-(94,14))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (94,11)-(94,14) = "bar"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "bar"
        │   ├── opening_loc: (94,0)-(94,3) = "%w["
        │   └── closing_loc: (94,14)-(94,15) = "]"
        ├── @ ArrayNode (location: (96,0)-(100,1))
        │   ├── flags: newline
        │   ├── elements: (length: 4)
        │   │   ├── @ StringNode (location: (97,2)-(97,3))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (97,2)-(97,3) = "a"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a"
        │   │   ├── @ StringNode (location: (98,2)-(98,3))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (98,2)-(98,3) = "b"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "b"
        │   │   ├── @ StringNode (location: (98,6)-(98,7))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (98,6)-(98,7) = "c"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "c"
        │   │   └── @ StringNode (location: (99,1)-(99,2))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (99,1)-(99,2) = "d"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "d"
        │   ├── opening_loc: (96,0)-(96,3) = "%w["
        │   └── closing_loc: (100,0)-(100,1) = "]"
        ├── @ ArrayNode (location: (102,0)-(102,18))
        │   ├── flags: newline
        │   ├── elements: (length: 1)
        │   │   └── @ StringNode (location: (102,3)-(102,17))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (102,3)-(102,17) = "f\\u{006f 006f}"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "foo"
        │   ├── opening_loc: (102,0)-(102,3) = "%W["
        │   └── closing_loc: (102,17)-(102,18) = "]"
        ├── @ ArrayNode (location: (104,0)-(104,14))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ StringNode (location: (104,3)-(104,4))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (104,3)-(104,4) = "a"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a"
        │   │   ├── @ InterpolatedStringNode (location: (104,5)-(104,11))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── parts: (length: 3)
        │   │   │   │   ├── @ StringNode (location: (104,5)-(104,6))
        │   │   │   │   │   ├── flags: static_literal, frozen
        │   │   │   │   │   ├── opening_loc: ∅
        │   │   │   │   │   ├── content_loc: (104,5)-(104,6) = "b"
        │   │   │   │   │   ├── closing_loc: ∅
        │   │   │   │   │   └── unescaped: "b"
        │   │   │   │   ├── @ EmbeddedStatementsNode (location: (104,6)-(104,10))
        │   │   │   │   │   ├── flags: ∅
        │   │   │   │   │   ├── opening_loc: (104,6)-(104,8) = "\#{"
        │   │   │   │   │   ├── statements:
        │   │   │   │   │   │   @ StatementsNode (location: (104,8)-(104,9))
        │   │   │   │   │   │   ├── flags: ∅
        │   │   │   │   │   │   └── body: (length: 1)
        │   │   │   │   │   │       └── @ CallNode (location: (104,8)-(104,9))
        │   │   │   │   │   │           ├── flags: variable_call, ignore_visibility
        │   │   │   │   │   │           ├── receiver: ∅
        │   │   │   │   │   │           ├── call_operator_loc: ∅
        │   │   │   │   │   │           ├── name: :c
        │   │   │   │   │   │           ├── message_loc: (104,8)-(104,9) = "c"
        │   │   │   │   │   │           ├── opening_loc: ∅
        │   │   │   │   │   │           ├── arguments: ∅
        │   │   │   │   │   │           ├── closing_loc: ∅
        │   │   │   │   │   │           └── block: ∅
        │   │   │   │   │   └── closing_loc: (104,9)-(104,10) = "}"
        │   │   │   │   └── @ StringNode (location: (104,10)-(104,11))
        │   │   │   │       ├── flags: static_literal, frozen
        │   │   │   │       ├── opening_loc: ∅
        │   │   │   │       ├── content_loc: (104,10)-(104,11) = "d"
        │   │   │   │       ├── closing_loc: ∅
        │   │   │   │       └── unescaped: "d"
        │   │   │   └── closing_loc: ∅
        │   │   └── @ StringNode (location: (104,12)-(104,13))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (104,12)-(104,13) = "e"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "e"
        │   ├── opening_loc: (104,0)-(104,3) = "%W["
        │   └── closing_loc: (104,13)-(104,14) = "]"
        ├── @ ArrayNode (location: (106,0)-(106,9))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ StringNode (location: (106,3)-(106,4))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (106,3)-(106,4) = "a"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a"
        │   │   ├── @ StringNode (location: (106,5)-(106,6))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (106,5)-(106,6) = "b"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "b"
        │   │   └── @ StringNode (location: (106,7)-(106,8))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (106,7)-(106,8) = "c"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "c"
        │   ├── opening_loc: (106,0)-(106,3) = "%W["
        │   └── closing_loc: (106,8)-(106,9) = "]"
        ├── @ ArrayNode (location: (108,0)-(112,1))
        │   ├── flags: newline
        │   ├── elements: (length: 3)
        │   │   ├── @ StringNode (location: (109,2)-(109,3))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (109,2)-(109,3) = "a"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a"
        │   │   ├── @ StringNode (location: (110,2)-(110,3))
        │   │   │   ├── flags: ∅
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── content_loc: (110,2)-(110,3) = "b"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "b"
        │   │   └── @ StringNode (location: (111,2)-(111,3))
        │   │       ├── flags: ∅
        │   │       ├── opening_loc: ∅
        │   │       ├── content_loc: (111,2)-(111,3) = "c"
        │   │       ├── closing_loc: ∅
        │   │       └── unescaped: "c"
        │   ├── opening_loc: (108,0)-(108,3) = "%w["
        │   └── closing_loc: (112,0)-(112,1) = "]"
        ├── @ StringNode (location: (114,0)-(114,15))
        │   ├── flags: newline
        │   ├── opening_loc: (114,0)-(114,1) = "'"
        │   ├── content_loc: (114,1)-(114,14) = "\\' foo \\' bar"
        │   ├── closing_loc: (114,14)-(114,15) = "'"
        │   └── unescaped: "' foo ' bar"
        ├── @ StringNode (location: (116,0)-(116,15))
        │   ├── flags: newline
        │   ├── opening_loc: (116,0)-(116,1) = "'"
        │   ├── content_loc: (116,1)-(116,14) = "\\\\ foo \\\\ bar"
        │   ├── closing_loc: (116,14)-(116,15) = "'"
        │   └── unescaped: "\\ foo \\ bar"
        ├── @ StringNode (location: (118,0)-(121,1))
        │   ├── flags: newline
        │   ├── opening_loc: (118,0)-(118,1) = "'"
        │   ├── content_loc: (118,1)-(121,0) = "foo\\\nbar\\\\\nbaz\n"
        │   ├── closing_loc: (121,0)-(121,1) = "'"
        │   └── unescaped: "foo\\\nbar\\\nbaz\n"
        ├── @ InterpolatedStringNode (location: (123,0)-(123,7))
        │   ├── flags: newline
        │   ├── opening_loc: (123,0)-(123,1) = "\""
        │   ├── parts: (length: 1)
        │   │   └── @ EmbeddedVariableNode (location: (123,1)-(123,6))
        │   │       ├── flags: ∅
        │   │       ├── operator_loc: (123,1)-(123,2) = "#"
        │   │       └── variable:
        │   │           @ GlobalVariableReadNode (location: (123,2)-(123,6))
        │   │           ├── flags: ∅
        │   │           └── name: :$foo
        │   └── closing_loc: (123,6)-(123,7) = "\""
        ├── @ InterpolatedStringNode (location: (125,0)-(125,7))
        │   ├── flags: newline
        │   ├── opening_loc: (125,0)-(125,1) = "\""
        │   ├── parts: (length: 1)
        │   │   └── @ EmbeddedVariableNode (location: (125,1)-(125,6))
        │   │       ├── flags: ∅
        │   │       ├── operator_loc: (125,1)-(125,2) = "#"
        │   │       └── variable:
        │   │           @ InstanceVariableReadNode (location: (125,2)-(125,6))
        │   │           ├── flags: ∅
        │   │           └── name: :@foo
        │   └── closing_loc: (125,6)-(125,7) = "\""
        ├── @ StringNode (location: (127,0)-(127,15))
        │   ├── flags: newline
        │   ├── opening_loc: (127,0)-(127,1) = "\""
        │   ├── content_loc: (127,1)-(127,14) = "\\x7 \\x23 \\x61"
        │   ├── closing_loc: (127,14)-(127,15) = "\""
        │   └── unescaped: "\a # a"
        ├── @ StringNode (location: (129,0)-(129,13))
        │   ├── flags: newline
        │   ├── opening_loc: (129,0)-(129,1) = "\""
        │   ├── content_loc: (129,1)-(129,12) = "\\7 \\43 \\141"
        │   ├── closing_loc: (129,12)-(129,13) = "\""
        │   └── unescaped: "\a # a"
        ├── @ StringNode (location: (131,0)-(131,17))
        │   ├── flags: newline, forced_utf8_encoding
        │   ├── opening_loc: (131,0)-(131,1) = "\""
        │   ├── content_loc: (131,1)-(131,16) = "ち\\xE3\\x81\\xFF"
        │   ├── closing_loc: (131,16)-(131,17) = "\""
        │   └── unescaped: "ち\xE3\x81\xFF"
        ├── @ StringNode (location: (133,0)-(133,6))
        │   ├── flags: newline, forced_utf8_encoding
        │   ├── opening_loc: (133,0)-(133,1) = "\""
        │   ├── content_loc: (133,1)-(133,5) = "\\777"
        │   ├── closing_loc: (133,5)-(133,6) = "\""
        │   └── unescaped: "\xFF"
        ├── @ StringNode (location: (135,0)-(135,6))
        │   ├── flags: newline
        │   ├── opening_loc: (135,0)-(135,2) = "%["
        │   ├── content_loc: (135,2)-(135,5) = "abc"
        │   ├── closing_loc: (135,5)-(135,6) = "]"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (137,0)-(137,6))
        │   ├── flags: newline
        │   ├── opening_loc: (137,0)-(137,2) = "%("
        │   ├── content_loc: (137,2)-(137,5) = "abc"
        │   ├── closing_loc: (137,5)-(137,6) = ")"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (139,0)-(139,6))
        │   ├── flags: newline
        │   ├── opening_loc: (139,0)-(139,2) = "%@"
        │   ├── content_loc: (139,2)-(139,5) = "abc"
        │   ├── closing_loc: (139,5)-(139,6) = "@"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (141,0)-(141,6))
        │   ├── flags: newline
        │   ├── opening_loc: (141,0)-(141,2) = "%$"
        │   ├── content_loc: (141,2)-(141,5) = "abc"
        │   ├── closing_loc: (141,5)-(141,6) = "$"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (143,0)-(143,2))
        │   ├── flags: newline
        │   ├── opening_loc: (143,0)-(143,1) = "?"
        │   ├── content_loc: (143,1)-(143,2) = "a"
        │   ├── closing_loc: ∅
        │   └── unescaped: "a"
        ├── @ InterpolatedStringNode (location: (145,0)-(145,6))
        │   ├── flags: newline, static_literal
        │   ├── opening_loc: ∅
        │   ├── parts: (length: 2)
        │   │   ├── @ StringNode (location: (145,0)-(145,2))
        │   │   │   ├── flags: static_literal, frozen
        │   │   │   ├── opening_loc: (145,0)-(145,1) = "?"
        │   │   │   ├── content_loc: (145,1)-(145,2) = "a"
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── unescaped: "a"
        │   │   └── @ StringNode (location: (145,3)-(145,6))
        │   │       ├── flags: static_literal, frozen
        │   │       ├── opening_loc: (145,3)-(145,4) = "\""
        │   │       ├── content_loc: (145,4)-(145,5) = "a"
        │   │       ├── closing_loc: (145,5)-(145,6) = "\""
        │   │       └── unescaped: "a"
        │   └── closing_loc: ∅
        ├── @ StringNode (location: (147,0)-(147,7))
        │   ├── flags: newline
        │   ├── opening_loc: (147,0)-(147,3) = "%Q{"
        │   ├── content_loc: (147,3)-(147,6) = "abc"
        │   ├── closing_loc: (147,6)-(147,7) = "}"
        │   └── unescaped: "abc"
        ├── @ StringNode (location: (149,0)-(149,5))
        │   ├── flags: newline
        │   ├── opening_loc: (149,0)-(149,2) = "%^"
        │   ├── content_loc: (149,2)-(149,4) = "\#$"
        │   ├── closing_loc: (149,4)-(149,5) = "^"
        │   └── unescaped: "\#$"
        ├── @ StringNode (location: (151,0)-(151,4))
        │   ├── flags: newline
        │   ├── opening_loc: (151,0)-(151,2) = "%@"
        │   ├── content_loc: (151,2)-(151,3) = "#"
        │   ├── closing_loc: (151,3)-(151,4) = "@"
        │   └── unescaped: "#"
        └── @ InterpolatedStringNode (location: (153,0)-(153,15))
            ├── flags: newline
            ├── opening_loc: (153,0)-(153,1) = "\""
            ├── parts: (length: 2)
            │   ├── @ EmbeddedStatementsNode (location: (153,1)-(153,12))
            │   │   ├── flags: ∅
            │   │   ├── opening_loc: (153,1)-(153,3) = "\#{"
            │   │   ├── statements:
            │   │   │   @ StatementsNode (location: (153,3)-(153,11))
            │   │   │   ├── flags: ∅
            │   │   │   └── body: (length: 1)
            │   │   │       └── @ InterpolatedStringNode (location: (153,3)-(153,11))
            │   │   │           ├── flags: ∅
            │   │   │           ├── opening_loc: (153,3)-(153,4) = "\""
            │   │   │           ├── parts: (length: 2)
            │   │   │           │   ├── @ EmbeddedStatementsNode (location: (153,4)-(153,8))
            │   │   │           │   │   ├── flags: ∅
            │   │   │           │   │   ├── opening_loc: (153,4)-(153,6) = "\#{"
            │   │   │           │   │   ├── statements:
            │   │   │           │   │   │   @ StatementsNode (location: (153,6)-(153,7))
            │   │   │           │   │   │   ├── flags: ∅
            │   │   │           │   │   │   └── body: (length: 1)
            │   │   │           │   │   │       └── @ ConstantReadNode (location: (153,6)-(153,7))
            │   │   │           │   │   │           ├── flags: ∅
            │   │   │           │   │   │           └── name: :B
            │   │   │           │   │   └── closing_loc: (153,7)-(153,8) = "}"
            │   │   │           │   └── @ StringNode (location: (153,8)-(153,10))
            │   │   │           │       ├── flags: static_literal, frozen
            │   │   │           │       ├── opening_loc: ∅
            │   │   │           │       ├── content_loc: (153,8)-(153,10) = " C"
            │   │   │           │       ├── closing_loc: ∅
            │   │   │           │       └── unescaped: " C"
            │   │   │           └── closing_loc: (153,10)-(153,11) = "\""
            │   │   └── closing_loc: (153,11)-(153,12) = "}"
            │   └── @ StringNode (location: (153,12)-(153,14))
            │       ├── flags: static_literal, frozen
            │       ├── opening_loc: ∅
            │       ├── content_loc: (153,12)-(153,14) = " D"
            │       ├── closing_loc: ∅
            │       └── unescaped: " D"
            └── closing_loc: (153,14)-(153,15) = "\""
