diff --git a/lib/prism/translation/parser/compiler.rb b/lib/prism/translation/parser/compiler.rb index 388bd4687d..60aed40f71 100644 --- a/lib/prism/translation/parser/compiler.rb +++ b/lib/prism/translation/parser/compiler.rb @@ -2144,7 +2144,9 @@ def string_nodes_from_line_continuations(unescaped, escaped, start_offset, openi .each do |lines| escaped_lengths << lines.sum(&:bytesize) unescaped_lines_count = lines.sum do |line| - line.scan(/(\\*)n/).count { |(backslashes)| backslashes&.length&.odd? || false } + count = line.scan(/(\\*)n/).count { |(backslashes)| backslashes&.length&.odd? } + count -= 1 if !line.end_with?("\n") && count > 0 + count end extra = 1 extra = lines.count if percent_array # Account for line continuations in percent arrays diff --git a/test/prism/fixtures/dstring.txt b/test/prism/fixtures/dstring.txt index 99f6c0dfac..ef698d8fe9 100644 --- a/test/prism/fixtures/dstring.txt +++ b/test/prism/fixtures/dstring.txt @@ -34,5 +34,9 @@ b\nar #{} " +"foo +\n#{}bar\n\n#{} +a\nb\n#{}\nc\n" + " ’" diff --git a/test/prism/fixtures/strings.txt b/test/prism/fixtures/strings.txt index b99ff6e9a3..0787152786 100644 --- a/test/prism/fixtures/strings.txt +++ b/test/prism/fixtures/strings.txt @@ -45,6 +45,10 @@ foo\ b\nar " +"foo +\nbar\n\n +a\nb\n\nc\n" + %q{abc} %s[abc] diff --git a/test/prism/snapshots/dstring.txt b/test/prism/snapshots/dstring.txt index 6bcdd8fab3..7913cd010d 100644 --- a/test/prism/snapshots/dstring.txt +++ b/test/prism/snapshots/dstring.txt @@ -1,10 +1,10 @@ -@ ProgramNode (location: (1,0)-(38,4)) +@ ProgramNode (location: (1,0)-(42,4)) ├── flags: ∅ ├── locals: [] └── statements: - @ StatementsNode (location: (1,0)-(38,4)) + @ StatementsNode (location: (1,0)-(42,4)) ├── flags: ∅ - └── body: (length: 10) + └── body: (length: 11) ├── @ StringNode (location: (1,0)-(2,6)) │ ├── flags: newline │ ├── opening_loc: (1,0)-(1,1) = "\"" @@ -109,9 +109,53 @@ │ │ ├── closing_loc: ∅ │ │ └── unescaped: "\n" │ └── closing_loc: (35,0)-(35,1) = "\"" - └── @ StringNode (location: (37,0)-(38,4)) + ├── @ InterpolatedStringNode (location: (37,0)-(39,15)) + │ ├── flags: newline + │ ├── opening_loc: (37,0)-(37,1) = "\"" + │ ├── parts: (length: 7) + │ │ ├── @ StringNode (location: (37,1)-(38,2)) + │ │ │ ├── flags: static_literal, frozen + │ │ │ ├── opening_loc: ∅ + │ │ │ ├── content_loc: (37,1)-(38,2) = "foo\n\\n" + │ │ │ ├── closing_loc: ∅ + │ │ │ └── unescaped: "foo\n\n" + │ │ ├── @ EmbeddedStatementsNode (location: (38,2)-(38,5)) + │ │ │ ├── flags: ∅ + │ │ │ ├── opening_loc: (38,2)-(38,4) = "\#{" + │ │ │ ├── statements: ∅ + │ │ │ └── closing_loc: (38,4)-(38,5) = "}" + │ │ ├── @ StringNode (location: (38,5)-(38,12)) + │ │ │ ├── flags: static_literal, frozen + │ │ │ ├── opening_loc: ∅ + │ │ │ ├── content_loc: (38,5)-(38,12) = "bar\\n\\n" + │ │ │ ├── closing_loc: ∅ + │ │ │ └── unescaped: "bar\n\n" + │ │ ├── @ EmbeddedStatementsNode (location: (38,12)-(38,15)) + │ │ │ ├── flags: ∅ + │ │ │ ├── opening_loc: (38,12)-(38,14) = "\#{" + │ │ │ ├── statements: ∅ + │ │ │ └── closing_loc: (38,14)-(38,15) = "}" + │ │ ├── @ StringNode (location: (38,15)-(39,6)) + │ │ │ ├── flags: static_literal, frozen + │ │ │ ├── opening_loc: ∅ + │ │ │ ├── content_loc: (38,15)-(39,6) = "\na\\nb\\n" + │ │ │ ├── closing_loc: ∅ + │ │ │ └── unescaped: "\na\nb\n" + │ │ ├── @ EmbeddedStatementsNode (location: (39,6)-(39,9)) + │ │ │ ├── flags: ∅ + │ │ │ ├── opening_loc: (39,6)-(39,8) = "\#{" + │ │ │ ├── statements: ∅ + │ │ │ └── closing_loc: (39,8)-(39,9) = "}" + │ │ └── @ StringNode (location: (39,9)-(39,14)) + │ │ ├── flags: static_literal, frozen + │ │ ├── opening_loc: ∅ + │ │ ├── content_loc: (39,9)-(39,14) = "\\nc\\n" + │ │ ├── closing_loc: ∅ + │ │ └── unescaped: "\nc\n" + │ └── closing_loc: (39,14)-(39,15) = "\"" + └── @ StringNode (location: (41,0)-(42,4)) ├── flags: newline - ├── opening_loc: (37,0)-(37,1) = "\"" - ├── content_loc: (37,1)-(38,3) = "\n’" - ├── closing_loc: (38,3)-(38,4) = "\"" + ├── opening_loc: (41,0)-(41,1) = "\"" + ├── content_loc: (41,1)-(42,3) = "\n’" + ├── closing_loc: (42,3)-(42,4) = "\"" └── unescaped: "\n’" diff --git a/test/prism/snapshots/strings.txt b/test/prism/snapshots/strings.txt index 169444f923..6bf5006305 100644 --- a/test/prism/snapshots/strings.txt +++ b/test/prism/snapshots/strings.txt @@ -1,10 +1,10 @@ -@ ProgramNode (location: (1,0)-(149,15)) +@ ProgramNode (location: (1,0)-(153,15)) ├── flags: ∅ ├── locals: [] └── statements: - @ StatementsNode (location: (1,0)-(149,15)) + @ StatementsNode (location: (1,0)-(153,15)) ├── flags: ∅ - └── body: (length: 64) + └── body: (length: 65) ├── @ StringNode (location: (1,0)-(1,6)) │ ├── flags: newline │ ├── opening_loc: (1,0)-(1,2) = "%%" @@ -184,623 +184,629 @@ │ ├── content_loc: (43,1)-(46,0) = "\nfoo\\\nb\\nar\n" │ ├── closing_loc: (46,0)-(46,1) = "\"" │ └── unescaped: "\nfoob\nar\n" - ├── @ StringNode (location: (48,0)-(48,7)) + ├── @ StringNode (location: (48,0)-(50,12)) │ ├── flags: newline - │ ├── opening_loc: (48,0)-(48,3) = "%q{" - │ ├── content_loc: (48,3)-(48,6) = "abc" - │ ├── closing_loc: (48,6)-(48,7) = "}" + │ ├── 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: (50,0)-(50,7)) + ├── @ SymbolNode (location: (54,0)-(54,7)) │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (50,0)-(50,3) = "%s[" - │ ├── value_loc: (50,3)-(50,6) = "abc" - │ ├── closing_loc: (50,6)-(50,7) = "]" + │ ├── opening_loc: (54,0)-(54,3) = "%s[" + │ ├── value_loc: (54,3)-(54,6) = "abc" + │ ├── closing_loc: (54,6)-(54,7) = "]" │ └── unescaped: "abc" - ├── @ StringNode (location: (52,0)-(52,6)) + ├── @ StringNode (location: (56,0)-(56,6)) │ ├── flags: newline - │ ├── opening_loc: (52,0)-(52,2) = "%{" - │ ├── content_loc: (52,2)-(52,5) = "abc" - │ ├── closing_loc: (52,5)-(52,6) = "}" + │ ├── opening_loc: (56,0)-(56,2) = "%{" + │ ├── content_loc: (56,2)-(56,5) = "abc" + │ ├── closing_loc: (56,5)-(56,6) = "}" │ └── unescaped: "abc" - ├── @ StringNode (location: (54,0)-(54,2)) + ├── @ StringNode (location: (58,0)-(58,2)) │ ├── flags: newline - │ ├── opening_loc: (54,0)-(54,1) = "'" - │ ├── content_loc: (54,1)-(54,1) = "" - │ ├── closing_loc: (54,1)-(54,2) = "'" + │ ├── opening_loc: (58,0)-(58,1) = "'" + │ ├── content_loc: (58,1)-(58,1) = "" + │ ├── closing_loc: (58,1)-(58,2) = "'" │ └── unescaped: "" - ├── @ StringNode (location: (56,0)-(56,5)) + ├── @ StringNode (location: (60,0)-(60,5)) │ ├── flags: newline - │ ├── opening_loc: (56,0)-(56,1) = "\"" - │ ├── content_loc: (56,1)-(56,4) = "abc" - │ ├── closing_loc: (56,4)-(56,5) = "\"" + │ ├── opening_loc: (60,0)-(60,1) = "\"" + │ ├── content_loc: (60,1)-(60,4) = "abc" + │ ├── closing_loc: (60,4)-(60,5) = "\"" │ └── unescaped: "abc" - ├── @ StringNode (location: (58,0)-(58,7)) + ├── @ StringNode (location: (62,0)-(62,7)) │ ├── flags: newline - │ ├── opening_loc: (58,0)-(58,1) = "\"" - │ ├── content_loc: (58,1)-(58,6) = "\#@---" - │ ├── closing_loc: (58,6)-(58,7) = "\"" + │ ├── opening_loc: (62,0)-(62,1) = "\"" + │ ├── content_loc: (62,1)-(62,6) = "\#@---" + │ ├── closing_loc: (62,6)-(62,7) = "\"" │ └── unescaped: "\#@---" - ├── @ InterpolatedStringNode (location: (60,0)-(60,16)) + ├── @ InterpolatedStringNode (location: (64,0)-(64,16)) │ ├── flags: newline - │ ├── opening_loc: (60,0)-(60,1) = "\"" + │ ├── opening_loc: (64,0)-(64,1) = "\"" │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (60,1)-(60,5)) + │ │ ├── @ StringNode (location: (64,1)-(64,5)) │ │ │ ├── flags: static_literal, frozen │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (60,1)-(60,5) = "aaa " + │ │ │ ├── content_loc: (64,1)-(64,5) = "aaa " │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "aaa " - │ │ ├── @ EmbeddedStatementsNode (location: (60,5)-(60,11)) + │ │ ├── @ EmbeddedStatementsNode (location: (64,5)-(64,11)) │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (60,5)-(60,7) = "\#{" + │ │ │ ├── opening_loc: (64,5)-(64,7) = "\#{" │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (60,7)-(60,10)) + │ │ │ │ @ StatementsNode (location: (64,7)-(64,10)) │ │ │ │ ├── flags: ∅ │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (60,7)-(60,10)) + │ │ │ │ └── @ CallNode (location: (64,7)-(64,10)) │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ ├── receiver: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── name: :bbb - │ │ │ │ ├── message_loc: (60,7)-(60,10) = "bbb" + │ │ │ │ ├── message_loc: (64,7)-(64,10) = "bbb" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (60,10)-(60,11) = "}" - │ │ └── @ StringNode (location: (60,11)-(60,15)) + │ │ │ └── closing_loc: (64,10)-(64,11) = "}" + │ │ └── @ StringNode (location: (64,11)-(64,15)) │ │ ├── flags: static_literal, frozen │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (60,11)-(60,15) = " ccc" + │ │ ├── content_loc: (64,11)-(64,15) = " ccc" │ │ ├── closing_loc: ∅ │ │ └── unescaped: " ccc" - │ └── closing_loc: (60,15)-(60,16) = "\"" - ├── @ StringNode (location: (62,0)-(62,5)) + │ └── closing_loc: (64,15)-(64,16) = "\"" + ├── @ StringNode (location: (66,0)-(66,5)) │ ├── flags: newline - │ ├── opening_loc: (62,0)-(62,1) = "'" - │ ├── content_loc: (62,1)-(62,4) = "abc" - │ ├── closing_loc: (62,4)-(62,5) = "'" + │ ├── opening_loc: (66,0)-(66,1) = "'" + │ ├── content_loc: (66,1)-(66,4) = "abc" + │ ├── closing_loc: (66,4)-(66,5) = "'" │ └── unescaped: "abc" - ├── @ ArrayNode (location: (64,0)-(64,9)) + ├── @ ArrayNode (location: (68,0)-(68,9)) │ ├── flags: newline │ ├── elements: (length: 3) - │ │ ├── @ StringNode (location: (64,3)-(64,4)) + │ │ ├── @ StringNode (location: (68,3)-(68,4)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (64,3)-(64,4) = "a" + │ │ │ ├── content_loc: (68,3)-(68,4) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" - │ │ ├── @ StringNode (location: (64,5)-(64,6)) + │ │ ├── @ StringNode (location: (68,5)-(68,6)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (64,5)-(64,6) = "b" + │ │ │ ├── content_loc: (68,5)-(68,6) = "b" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "b" - │ │ └── @ StringNode (location: (64,7)-(64,8)) + │ │ └── @ StringNode (location: (68,7)-(68,8)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (64,7)-(64,8) = "c" + │ │ ├── content_loc: (68,7)-(68,8) = "c" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "c" - │ ├── opening_loc: (64,0)-(64,3) = "%w[" - │ └── closing_loc: (64,8)-(64,9) = "]" - ├── @ ArrayNode (location: (66,0)-(66,17)) + │ ├── 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: (66,3)-(66,6)) + │ │ ├── @ StringNode (location: (70,3)-(70,6)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (66,3)-(66,6) = "a[]" + │ │ │ ├── content_loc: (70,3)-(70,6) = "a[]" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a[]" - │ │ ├── @ StringNode (location: (66,7)-(66,12)) + │ │ ├── @ StringNode (location: (70,7)-(70,12)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (66,7)-(66,12) = "b[[]]" + │ │ │ ├── content_loc: (70,7)-(70,12) = "b[[]]" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "b[[]]" - │ │ └── @ StringNode (location: (66,13)-(66,16)) + │ │ └── @ StringNode (location: (70,13)-(70,16)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (66,13)-(66,16) = "c[]" + │ │ ├── content_loc: (70,13)-(70,16) = "c[]" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "c[]" - │ ├── opening_loc: (66,0)-(66,3) = "%w[" - │ └── closing_loc: (66,16)-(66,17) = "]" - ├── @ ArrayNode (location: (68,0)-(68,18)) + │ ├── 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: (68,3)-(68,11)) + │ │ ├── @ StringNode (location: (72,3)-(72,11)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (68,3)-(68,11) = "foo\\ bar" + │ │ │ ├── content_loc: (72,3)-(72,11) = "foo\\ bar" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "foo bar" - │ │ └── @ StringNode (location: (68,12)-(68,17)) + │ │ └── @ StringNode (location: (72,12)-(72,17)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (68,12)-(68,17) = "\\\#{1}" + │ │ ├── content_loc: (72,12)-(72,17) = "\\\#{1}" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "\\\#{1}" - │ ├── opening_loc: (68,0)-(68,3) = "%w[" - │ └── closing_loc: (68,17)-(68,18) = "]" - ├── @ ArrayNode (location: (70,0)-(70,16)) + │ ├── 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: (70,3)-(70,11)) + │ │ ├── @ StringNode (location: (74,3)-(74,11)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (70,3)-(70,11) = "foo\\ bar" + │ │ │ ├── content_loc: (74,3)-(74,11) = "foo\\ bar" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "foo bar" - │ │ └── @ StringNode (location: (70,12)-(70,15)) + │ │ └── @ StringNode (location: (74,12)-(74,15)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (70,12)-(70,15) = "baz" + │ │ ├── content_loc: (74,12)-(74,15) = "baz" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "baz" - │ ├── opening_loc: (70,0)-(70,3) = "%w[" - │ └── closing_loc: (70,15)-(70,16) = "]" - ├── @ ArrayNode (location: (72,0)-(73,5)) + │ ├── 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: (72,3)-(72,13)) + │ │ ├── @ StringNode (location: (76,3)-(76,13)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (72,3)-(72,13) = "foo\\ bar\\\\" + │ │ │ ├── content_loc: (76,3)-(76,13) = "foo\\ bar\\\\" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "foo bar\\" - │ │ ├── @ StringNode (location: (72,14)-(73,0)) + │ │ ├── @ StringNode (location: (76,14)-(77,0)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (72,14)-(73,0) = "baz\\\\\\\n" + │ │ │ ├── content_loc: (76,14)-(77,0) = "baz\\\\\\\n" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "baz\\\n" - │ │ └── @ StringNode (location: (73,1)-(73,4)) + │ │ └── @ StringNode (location: (77,1)-(77,4)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (73,1)-(73,4) = "bat" + │ │ ├── content_loc: (77,1)-(77,4) = "bat" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "bat" - │ ├── opening_loc: (72,0)-(72,3) = "%w[" - │ └── closing_loc: (73,4)-(73,5) = "]" - ├── @ ArrayNode (location: (75,0)-(78,1)) + │ ├── 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: (75,3)-(76,3)) + │ │ ├── @ InterpolatedStringNode (location: (79,3)-(80,3)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ │ │ │ ├── parts: (length: 2) - │ │ │ │ ├── @ EmbeddedStatementsNode (location: (75,3)-(75,9)) + │ │ │ │ ├── @ EmbeddedStatementsNode (location: (79,3)-(79,9)) │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (75,3)-(75,5) = "\#{" + │ │ │ │ │ ├── opening_loc: (79,3)-(79,5) = "\#{" │ │ │ │ │ ├── statements: - │ │ │ │ │ │ @ StatementsNode (location: (75,5)-(75,8)) + │ │ │ │ │ │ @ StatementsNode (location: (79,5)-(79,8)) │ │ │ │ │ │ ├── flags: ∅ │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ CallNode (location: (75,5)-(75,8)) + │ │ │ │ │ │ └── @ CallNode (location: (79,5)-(79,8)) │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ │ │ ├── receiver: ∅ │ │ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ │ │ ├── name: :foo - │ │ │ │ │ │ ├── message_loc: (75,5)-(75,8) = "foo" + │ │ │ │ │ │ ├── message_loc: (79,5)-(79,8) = "foo" │ │ │ │ │ │ ├── opening_loc: ∅ │ │ │ │ │ │ ├── arguments: ∅ │ │ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ └── closing_loc: (75,8)-(75,9) = "}" - │ │ │ │ └── @ StringNode (location: (75,9)-(76,3)) + │ │ │ │ │ └── closing_loc: (79,8)-(79,9) = "}" + │ │ │ │ └── @ StringNode (location: (79,9)-(80,3)) │ │ │ │ ├── flags: static_literal, frozen │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (75,9)-(76,3) = "\\\nbar" + │ │ │ │ ├── content_loc: (79,9)-(80,3) = "\\\nbar" │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── unescaped: "\nbar" │ │ │ └── closing_loc: ∅ - │ │ ├── @ StringNode (location: (77,0)-(77,3)) + │ │ ├── @ StringNode (location: (81,0)-(81,3)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (77,0)-(77,3) = "baz" + │ │ │ ├── content_loc: (81,0)-(81,3) = "baz" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "baz" - │ │ └── @ InterpolatedStringNode (location: (77,4)-(77,10)) + │ │ └── @ InterpolatedStringNode (location: (81,4)-(81,10)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ │ │ ├── parts: (length: 1) - │ │ │ └── @ EmbeddedStatementsNode (location: (77,4)-(77,10)) + │ │ │ └── @ EmbeddedStatementsNode (location: (81,4)-(81,10)) │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (77,4)-(77,6) = "\#{" + │ │ │ ├── opening_loc: (81,4)-(81,6) = "\#{" │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (77,6)-(77,9)) + │ │ │ │ @ StatementsNode (location: (81,6)-(81,9)) │ │ │ │ ├── flags: ∅ │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (77,6)-(77,9)) + │ │ │ │ └── @ CallNode (location: (81,6)-(81,9)) │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ ├── receiver: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── name: :bat - │ │ │ │ ├── message_loc: (77,6)-(77,9) = "bat" + │ │ │ │ ├── message_loc: (81,6)-(81,9) = "bat" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (77,9)-(77,10) = "}" + │ │ │ └── closing_loc: (81,9)-(81,10) = "}" │ │ └── closing_loc: ∅ - │ ├── opening_loc: (75,0)-(75,3) = "%W[" - │ └── closing_loc: (78,0)-(78,1) = "]" - ├── @ ArrayNode (location: (80,0)-(80,9)) + │ ├── 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: (80,3)-(80,8)) + │ │ └── @ StringNode (location: (84,3)-(84,8)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (80,3)-(80,8) = "foo\\n" + │ │ ├── content_loc: (84,3)-(84,8) = "foo\\n" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "foo\\n" - │ ├── opening_loc: (80,0)-(80,3) = "%w(" - │ └── closing_loc: (80,8)-(80,9) = ")" - ├── @ ArrayNode (location: (82,0)-(83,1)) + │ ├── 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: (82,3)-(83,0)) + │ │ └── @ StringNode (location: (86,3)-(87,0)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (82,3)-(83,0) = "foo\\\n" + │ │ ├── content_loc: (86,3)-(87,0) = "foo\\\n" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "foo\n" - │ ├── opening_loc: (82,0)-(82,3) = "%w(" - │ └── closing_loc: (83,0)-(83,1) = ")" - ├── @ ArrayNode (location: (85,0)-(85,10)) + │ ├── 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: (85,3)-(85,6)) + │ │ ├── @ StringNode (location: (89,3)-(89,6)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (85,3)-(85,6) = "foo" + │ │ │ ├── content_loc: (89,3)-(89,6) = "foo" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "foo" - │ │ └── @ StringNode (location: (85,7)-(85,9)) + │ │ └── @ StringNode (location: (89,7)-(89,9)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (85,7)-(85,9) = "\\n" + │ │ ├── content_loc: (89,7)-(89,9) = "\\n" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "\\n" - │ ├── opening_loc: (85,0)-(85,3) = "%w(" - │ └── closing_loc: (85,9)-(85,10) = ")" - ├── @ ArrayNode (location: (87,0)-(88,4)) + │ ├── 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: (87,3)-(88,3)) + │ │ └── @ StringNode (location: (91,3)-(92,3)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (87,3)-(88,3) = "foo\\\nbar" + │ │ ├── content_loc: (91,3)-(92,3) = "foo\\\nbar" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "foo\nbar" - │ ├── opening_loc: (87,0)-(87,3) = "%W(" - │ └── closing_loc: (88,3)-(88,4) = ")" - ├── @ ArrayNode (location: (90,0)-(90,15)) + │ ├── 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: (90,3)-(90,6)) + │ │ ├── @ StringNode (location: (94,3)-(94,6)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (90,3)-(90,6) = "foo" + │ │ │ ├── content_loc: (94,3)-(94,6) = "foo" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "foo" - │ │ └── @ StringNode (location: (90,11)-(90,14)) + │ │ └── @ StringNode (location: (94,11)-(94,14)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (90,11)-(90,14) = "bar" + │ │ ├── content_loc: (94,11)-(94,14) = "bar" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "bar" - │ ├── opening_loc: (90,0)-(90,3) = "%w[" - │ └── closing_loc: (90,14)-(90,15) = "]" - ├── @ ArrayNode (location: (92,0)-(96,1)) + │ ├── 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: (93,2)-(93,3)) + │ │ ├── @ StringNode (location: (97,2)-(97,3)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (93,2)-(93,3) = "a" + │ │ │ ├── content_loc: (97,2)-(97,3) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" - │ │ ├── @ StringNode (location: (94,2)-(94,3)) + │ │ ├── @ StringNode (location: (98,2)-(98,3)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (94,2)-(94,3) = "b" + │ │ │ ├── content_loc: (98,2)-(98,3) = "b" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "b" - │ │ ├── @ StringNode (location: (94,6)-(94,7)) + │ │ ├── @ StringNode (location: (98,6)-(98,7)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (94,6)-(94,7) = "c" + │ │ │ ├── content_loc: (98,6)-(98,7) = "c" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "c" - │ │ └── @ StringNode (location: (95,1)-(95,2)) + │ │ └── @ StringNode (location: (99,1)-(99,2)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (95,1)-(95,2) = "d" + │ │ ├── content_loc: (99,1)-(99,2) = "d" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "d" - │ ├── opening_loc: (92,0)-(92,3) = "%w[" - │ └── closing_loc: (96,0)-(96,1) = "]" - ├── @ ArrayNode (location: (98,0)-(98,18)) + │ ├── 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: (98,3)-(98,17)) + │ │ └── @ StringNode (location: (102,3)-(102,17)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (98,3)-(98,17) = "f\\u{006f 006f}" + │ │ ├── content_loc: (102,3)-(102,17) = "f\\u{006f 006f}" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "foo" - │ ├── opening_loc: (98,0)-(98,3) = "%W[" - │ └── closing_loc: (98,17)-(98,18) = "]" - ├── @ ArrayNode (location: (100,0)-(100,14)) + │ ├── 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: (100,3)-(100,4)) + │ │ ├── @ StringNode (location: (104,3)-(104,4)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (100,3)-(100,4) = "a" + │ │ │ ├── content_loc: (104,3)-(104,4) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" - │ │ ├── @ InterpolatedStringNode (location: (100,5)-(100,11)) + │ │ ├── @ InterpolatedStringNode (location: (104,5)-(104,11)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ │ │ │ ├── parts: (length: 3) - │ │ │ │ ├── @ StringNode (location: (100,5)-(100,6)) + │ │ │ │ ├── @ StringNode (location: (104,5)-(104,6)) │ │ │ │ │ ├── flags: static_literal, frozen │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (100,5)-(100,6) = "b" + │ │ │ │ │ ├── content_loc: (104,5)-(104,6) = "b" │ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── @ EmbeddedStatementsNode (location: (100,6)-(100,10)) + │ │ │ │ ├── @ EmbeddedStatementsNode (location: (104,6)-(104,10)) │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (100,6)-(100,8) = "\#{" + │ │ │ │ │ ├── opening_loc: (104,6)-(104,8) = "\#{" │ │ │ │ │ ├── statements: - │ │ │ │ │ │ @ StatementsNode (location: (100,8)-(100,9)) + │ │ │ │ │ │ @ StatementsNode (location: (104,8)-(104,9)) │ │ │ │ │ │ ├── flags: ∅ │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ CallNode (location: (100,8)-(100,9)) + │ │ │ │ │ │ └── @ CallNode (location: (104,8)-(104,9)) │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ │ │ ├── receiver: ∅ │ │ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ │ │ ├── name: :c - │ │ │ │ │ │ ├── message_loc: (100,8)-(100,9) = "c" + │ │ │ │ │ │ ├── message_loc: (104,8)-(104,9) = "c" │ │ │ │ │ │ ├── opening_loc: ∅ │ │ │ │ │ │ ├── arguments: ∅ │ │ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ └── closing_loc: (100,9)-(100,10) = "}" - │ │ │ │ └── @ StringNode (location: (100,10)-(100,11)) + │ │ │ │ │ └── closing_loc: (104,9)-(104,10) = "}" + │ │ │ │ └── @ StringNode (location: (104,10)-(104,11)) │ │ │ │ ├── flags: static_literal, frozen │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (100,10)-(100,11) = "d" + │ │ │ │ ├── content_loc: (104,10)-(104,11) = "d" │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── unescaped: "d" │ │ │ └── closing_loc: ∅ - │ │ └── @ StringNode (location: (100,12)-(100,13)) + │ │ └── @ StringNode (location: (104,12)-(104,13)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (100,12)-(100,13) = "e" + │ │ ├── content_loc: (104,12)-(104,13) = "e" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "e" - │ ├── opening_loc: (100,0)-(100,3) = "%W[" - │ └── closing_loc: (100,13)-(100,14) = "]" - ├── @ ArrayNode (location: (102,0)-(102,9)) + │ ├── 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: (102,3)-(102,4)) + │ │ ├── @ StringNode (location: (106,3)-(106,4)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (102,3)-(102,4) = "a" + │ │ │ ├── content_loc: (106,3)-(106,4) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" - │ │ ├── @ StringNode (location: (102,5)-(102,6)) + │ │ ├── @ StringNode (location: (106,5)-(106,6)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (102,5)-(102,6) = "b" + │ │ │ ├── content_loc: (106,5)-(106,6) = "b" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "b" - │ │ └── @ StringNode (location: (102,7)-(102,8)) + │ │ └── @ StringNode (location: (106,7)-(106,8)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (102,7)-(102,8) = "c" + │ │ ├── content_loc: (106,7)-(106,8) = "c" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "c" - │ ├── opening_loc: (102,0)-(102,3) = "%W[" - │ └── closing_loc: (102,8)-(102,9) = "]" - ├── @ ArrayNode (location: (104,0)-(108,1)) + │ ├── 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: (105,2)-(105,3)) + │ │ ├── @ StringNode (location: (109,2)-(109,3)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (105,2)-(105,3) = "a" + │ │ │ ├── content_loc: (109,2)-(109,3) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" - │ │ ├── @ StringNode (location: (106,2)-(106,3)) + │ │ ├── @ StringNode (location: (110,2)-(110,3)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (106,2)-(106,3) = "b" + │ │ │ ├── content_loc: (110,2)-(110,3) = "b" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "b" - │ │ └── @ StringNode (location: (107,2)-(107,3)) + │ │ └── @ StringNode (location: (111,2)-(111,3)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (107,2)-(107,3) = "c" + │ │ ├── content_loc: (111,2)-(111,3) = "c" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "c" - │ ├── opening_loc: (104,0)-(104,3) = "%w[" - │ └── closing_loc: (108,0)-(108,1) = "]" - ├── @ StringNode (location: (110,0)-(110,15)) + │ ├── opening_loc: (108,0)-(108,3) = "%w[" + │ └── closing_loc: (112,0)-(112,1) = "]" + ├── @ StringNode (location: (114,0)-(114,15)) │ ├── flags: newline - │ ├── opening_loc: (110,0)-(110,1) = "'" - │ ├── content_loc: (110,1)-(110,14) = "\\' foo \\' bar" - │ ├── closing_loc: (110,14)-(110,15) = "'" + │ ├── 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: (112,0)-(112,15)) + ├── @ StringNode (location: (116,0)-(116,15)) │ ├── flags: newline - │ ├── opening_loc: (112,0)-(112,1) = "'" - │ ├── content_loc: (112,1)-(112,14) = "\\\\ foo \\\\ bar" - │ ├── closing_loc: (112,14)-(112,15) = "'" + │ ├── 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: (114,0)-(117,1)) + ├── @ StringNode (location: (118,0)-(121,1)) │ ├── flags: newline - │ ├── opening_loc: (114,0)-(114,1) = "'" - │ ├── content_loc: (114,1)-(117,0) = "foo\\\nbar\\\\\nbaz\n" - │ ├── closing_loc: (117,0)-(117,1) = "'" + │ ├── 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: (119,0)-(119,7)) + ├── @ InterpolatedStringNode (location: (123,0)-(123,7)) │ ├── flags: newline - │ ├── opening_loc: (119,0)-(119,1) = "\"" + │ ├── opening_loc: (123,0)-(123,1) = "\"" │ ├── parts: (length: 1) - │ │ └── @ EmbeddedVariableNode (location: (119,1)-(119,6)) + │ │ └── @ EmbeddedVariableNode (location: (123,1)-(123,6)) │ │ ├── flags: ∅ - │ │ ├── operator_loc: (119,1)-(119,2) = "#" + │ │ ├── operator_loc: (123,1)-(123,2) = "#" │ │ └── variable: - │ │ @ GlobalVariableReadNode (location: (119,2)-(119,6)) + │ │ @ GlobalVariableReadNode (location: (123,2)-(123,6)) │ │ ├── flags: ∅ │ │ └── name: :$foo - │ └── closing_loc: (119,6)-(119,7) = "\"" - ├── @ InterpolatedStringNode (location: (121,0)-(121,7)) + │ └── closing_loc: (123,6)-(123,7) = "\"" + ├── @ InterpolatedStringNode (location: (125,0)-(125,7)) │ ├── flags: newline - │ ├── opening_loc: (121,0)-(121,1) = "\"" + │ ├── opening_loc: (125,0)-(125,1) = "\"" │ ├── parts: (length: 1) - │ │ └── @ EmbeddedVariableNode (location: (121,1)-(121,6)) + │ │ └── @ EmbeddedVariableNode (location: (125,1)-(125,6)) │ │ ├── flags: ∅ - │ │ ├── operator_loc: (121,1)-(121,2) = "#" + │ │ ├── operator_loc: (125,1)-(125,2) = "#" │ │ └── variable: - │ │ @ InstanceVariableReadNode (location: (121,2)-(121,6)) + │ │ @ InstanceVariableReadNode (location: (125,2)-(125,6)) │ │ ├── flags: ∅ │ │ └── name: :@foo - │ └── closing_loc: (121,6)-(121,7) = "\"" - ├── @ StringNode (location: (123,0)-(123,15)) + │ └── closing_loc: (125,6)-(125,7) = "\"" + ├── @ StringNode (location: (127,0)-(127,15)) │ ├── flags: newline - │ ├── opening_loc: (123,0)-(123,1) = "\"" - │ ├── content_loc: (123,1)-(123,14) = "\\x7 \\x23 \\x61" - │ ├── closing_loc: (123,14)-(123,15) = "\"" + │ ├── 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: (125,0)-(125,13)) + ├── @ StringNode (location: (129,0)-(129,13)) │ ├── flags: newline - │ ├── opening_loc: (125,0)-(125,1) = "\"" - │ ├── content_loc: (125,1)-(125,12) = "\\7 \\43 \\141" - │ ├── closing_loc: (125,12)-(125,13) = "\"" + │ ├── 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: (127,0)-(127,17)) + ├── @ StringNode (location: (131,0)-(131,17)) │ ├── flags: newline, forced_utf8_encoding - │ ├── opening_loc: (127,0)-(127,1) = "\"" - │ ├── content_loc: (127,1)-(127,16) = "ち\\xE3\\x81\\xFF" - │ ├── closing_loc: (127,16)-(127,17) = "\"" + │ ├── 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: (129,0)-(129,6)) + ├── @ StringNode (location: (133,0)-(133,6)) │ ├── flags: newline, forced_utf8_encoding - │ ├── opening_loc: (129,0)-(129,1) = "\"" - │ ├── content_loc: (129,1)-(129,5) = "\\777" - │ ├── closing_loc: (129,5)-(129,6) = "\"" + │ ├── opening_loc: (133,0)-(133,1) = "\"" + │ ├── content_loc: (133,1)-(133,5) = "\\777" + │ ├── closing_loc: (133,5)-(133,6) = "\"" │ └── unescaped: "\xFF" - ├── @ StringNode (location: (131,0)-(131,6)) - │ ├── flags: newline - │ ├── opening_loc: (131,0)-(131,2) = "%[" - │ ├── content_loc: (131,2)-(131,5) = "abc" - │ ├── closing_loc: (131,5)-(131,6) = "]" - │ └── unescaped: "abc" - ├── @ StringNode (location: (133,0)-(133,6)) - │ ├── flags: newline - │ ├── opening_loc: (133,0)-(133,2) = "%(" - │ ├── content_loc: (133,2)-(133,5) = "abc" - │ ├── closing_loc: (133,5)-(133,6) = ")" - │ └── unescaped: "abc" ├── @ StringNode (location: (135,0)-(135,6)) │ ├── flags: newline - │ ├── opening_loc: (135,0)-(135,2) = "%@" + │ ├── opening_loc: (135,0)-(135,2) = "%[" │ ├── content_loc: (135,2)-(135,5) = "abc" - │ ├── closing_loc: (135,5)-(135,6) = "@" + │ ├── closing_loc: (135,5)-(135,6) = "]" │ └── unescaped: "abc" ├── @ StringNode (location: (137,0)-(137,6)) │ ├── flags: newline - │ ├── opening_loc: (137,0)-(137,2) = "%$" + │ ├── opening_loc: (137,0)-(137,2) = "%(" │ ├── content_loc: (137,2)-(137,5) = "abc" - │ ├── closing_loc: (137,5)-(137,6) = "$" + │ ├── 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: (139,0)-(139,2)) + ├── @ StringNode (location: (143,0)-(143,2)) │ ├── flags: newline - │ ├── opening_loc: (139,0)-(139,1) = "?" - │ ├── content_loc: (139,1)-(139,2) = "a" + │ ├── opening_loc: (143,0)-(143,1) = "?" + │ ├── content_loc: (143,1)-(143,2) = "a" │ ├── closing_loc: ∅ │ └── unescaped: "a" - ├── @ InterpolatedStringNode (location: (141,0)-(141,6)) + ├── @ InterpolatedStringNode (location: (145,0)-(145,6)) │ ├── flags: newline, static_literal │ ├── opening_loc: ∅ │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (141,0)-(141,2)) + │ │ ├── @ StringNode (location: (145,0)-(145,2)) │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (141,0)-(141,1) = "?" - │ │ │ ├── content_loc: (141,1)-(141,2) = "a" + │ │ │ ├── opening_loc: (145,0)-(145,1) = "?" + │ │ │ ├── content_loc: (145,1)-(145,2) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" - │ │ └── @ StringNode (location: (141,3)-(141,6)) + │ │ └── @ StringNode (location: (145,3)-(145,6)) │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (141,3)-(141,4) = "\"" - │ │ ├── content_loc: (141,4)-(141,5) = "a" - │ │ ├── closing_loc: (141,5)-(141,6) = "\"" + │ │ ├── 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: (143,0)-(143,7)) + ├── @ StringNode (location: (147,0)-(147,7)) │ ├── flags: newline - │ ├── opening_loc: (143,0)-(143,3) = "%Q{" - │ ├── content_loc: (143,3)-(143,6) = "abc" - │ ├── closing_loc: (143,6)-(143,7) = "}" + │ ├── opening_loc: (147,0)-(147,3) = "%Q{" + │ ├── content_loc: (147,3)-(147,6) = "abc" + │ ├── closing_loc: (147,6)-(147,7) = "}" │ └── unescaped: "abc" - ├── @ StringNode (location: (145,0)-(145,5)) + ├── @ StringNode (location: (149,0)-(149,5)) │ ├── flags: newline - │ ├── opening_loc: (145,0)-(145,2) = "%^" - │ ├── content_loc: (145,2)-(145,4) = "\#$" - │ ├── closing_loc: (145,4)-(145,5) = "^" + │ ├── opening_loc: (149,0)-(149,2) = "%^" + │ ├── content_loc: (149,2)-(149,4) = "\#$" + │ ├── closing_loc: (149,4)-(149,5) = "^" │ └── unescaped: "\#$" - ├── @ StringNode (location: (147,0)-(147,4)) + ├── @ StringNode (location: (151,0)-(151,4)) │ ├── flags: newline - │ ├── opening_loc: (147,0)-(147,2) = "%@" - │ ├── content_loc: (147,2)-(147,3) = "#" - │ ├── closing_loc: (147,3)-(147,4) = "@" + │ ├── opening_loc: (151,0)-(151,2) = "%@" + │ ├── content_loc: (151,2)-(151,3) = "#" + │ ├── closing_loc: (151,3)-(151,4) = "@" │ └── unescaped: "#" - └── @ InterpolatedStringNode (location: (149,0)-(149,15)) + └── @ InterpolatedStringNode (location: (153,0)-(153,15)) ├── flags: newline - ├── opening_loc: (149,0)-(149,1) = "\"" + ├── opening_loc: (153,0)-(153,1) = "\"" ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (149,1)-(149,12)) + │ ├── @ EmbeddedStatementsNode (location: (153,1)-(153,12)) │ │ ├── flags: ∅ - │ │ ├── opening_loc: (149,1)-(149,3) = "\#{" + │ │ ├── opening_loc: (153,1)-(153,3) = "\#{" │ │ ├── statements: - │ │ │ @ StatementsNode (location: (149,3)-(149,11)) + │ │ │ @ StatementsNode (location: (153,3)-(153,11)) │ │ │ ├── flags: ∅ │ │ │ └── body: (length: 1) - │ │ │ └── @ InterpolatedStringNode (location: (149,3)-(149,11)) + │ │ │ └── @ InterpolatedStringNode (location: (153,3)-(153,11)) │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (149,3)-(149,4) = "\"" + │ │ │ ├── opening_loc: (153,3)-(153,4) = "\"" │ │ │ ├── parts: (length: 2) - │ │ │ │ ├── @ EmbeddedStatementsNode (location: (149,4)-(149,8)) + │ │ │ │ ├── @ EmbeddedStatementsNode (location: (153,4)-(153,8)) │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (149,4)-(149,6) = "\#{" + │ │ │ │ │ ├── opening_loc: (153,4)-(153,6) = "\#{" │ │ │ │ │ ├── statements: - │ │ │ │ │ │ @ StatementsNode (location: (149,6)-(149,7)) + │ │ │ │ │ │ @ StatementsNode (location: (153,6)-(153,7)) │ │ │ │ │ │ ├── flags: ∅ │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ ConstantReadNode (location: (149,6)-(149,7)) + │ │ │ │ │ │ └── @ ConstantReadNode (location: (153,6)-(153,7)) │ │ │ │ │ │ ├── flags: ∅ │ │ │ │ │ │ └── name: :B - │ │ │ │ │ └── closing_loc: (149,7)-(149,8) = "}" - │ │ │ │ └── @ StringNode (location: (149,8)-(149,10)) + │ │ │ │ │ └── closing_loc: (153,7)-(153,8) = "}" + │ │ │ │ └── @ StringNode (location: (153,8)-(153,10)) │ │ │ │ ├── flags: static_literal, frozen │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (149,8)-(149,10) = " C" + │ │ │ │ ├── content_loc: (153,8)-(153,10) = " C" │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── unescaped: " C" - │ │ │ └── closing_loc: (149,10)-(149,11) = "\"" - │ │ └── closing_loc: (149,11)-(149,12) = "}" - │ └── @ StringNode (location: (149,12)-(149,14)) + │ │ │ └── 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: (149,12)-(149,14) = " D" + │ ├── content_loc: (153,12)-(153,14) = " D" │ ├── closing_loc: ∅ │ └── unescaped: " D" - └── closing_loc: (149,14)-(149,15) = "\"" + └── closing_loc: (153,14)-(153,15) = "\""