Add region to block SExpr node

This commit is contained in:
Anthony Bullard 2025-05-18 08:52:39 -05:00
parent 7fb647faa2
commit c9795890b5
No known key found for this signature in database
12 changed files with 264 additions and 236 deletions

View file

@ -2214,15 +2214,19 @@ pub const NodeStore = struct {
pub fn toSExpr(self: @This(), env: *base.ModuleEnv, ir: *IR, line_starts: std.ArrayList(u32)) sexpr.Expr { pub fn toSExpr(self: @This(), env: *base.ModuleEnv, ir: *IR, line_starts: std.ArrayList(u32)) sexpr.Expr {
var block_node = sexpr.Expr.init(env.gpa, "block"); var block_node = sexpr.Expr.init(env.gpa, "block");
block_node.appendRegionChild(env.gpa, ir.regionInfo(self.region, line_starts));
var statements_node = sexpr.Expr.init(env.gpa, "statements");
for (ir.store.statementSlice(self.statements)) |stmt_idx| { for (ir.store.statementSlice(self.statements)) |stmt_idx| {
const stmt = ir.store.getStatement(stmt_idx); const stmt = ir.store.getStatement(stmt_idx);
var stmt_node = stmt.toSExpr(env, ir, line_starts); var stmt_node = stmt.toSExpr(env, ir, line_starts);
block_node.appendNodeChild(env.gpa, &stmt_node); statements_node.appendNodeChild(env.gpa, &stmt_node);
} }
block_node.appendNodeChild(env.gpa, &statements_node);
return block_node; return block_node;
} }
}; };

View file

@ -8,5 +8,7 @@ PARSER: missing_header
~~~TOKENS ~~~TOKENS
Int(1:1-1:2),OpenCurly(1:2-1:3),EndOfFile(1:3-1:3), Int(1:1-1:2),OpenCurly(1:2-1:3),EndOfFile(1:3-1:3),
~~~PARSE ~~~PARSE
(file (malformed_header (1:1-1:2) "missing_header") (block)) (file
(malformed_header (1:1-1:2) "missing_header")
(block (1:2-1:3) (statements)))
~~~END ~~~END

View file

@ -45,13 +45,14 @@ CloseCurly(12:1-12:2),EndOfFile(12:2-12:2),
(ident (8:1-8:6) "main!") (ident (8:1-8:6) "main!")
(lambda (8:9-12:2) (lambda (8:9-12:2)
(args (underscore)) (args (underscore))
(block (block (8:13-12:2)
(decl (9:2-9:17) (statements
(ident (9:2-9:7) "world") (decl (9:2-9:17)
(string (9:10-9:17) (string_part (9:11-9:16) "World"))) (ident (9:2-9:7) "world")
(apply (11:2-11:31) (string (9:10-9:17) (string_part (9:11-9:16) "World")))
(ident (11:2-11:14) "Stdout" ".line!") (apply (11:2-11:31)
(string (11:15-11:30) (string_part (11:16-11:29) "Hello, world!"))))))) (ident (11:2-11:14) "Stdout" ".line!")
(string (11:15-11:30) (string_part (11:16-11:29) "Hello, world!"))))))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END

View file

@ -28,7 +28,8 @@ CloseCurly(7:5-7:6),EndOfFile(7:6-7:6),
(if_then_else (3:7-7:6) (if_then_else (3:7-7:6)
(ident (3:10-3:14) "" "true") (ident (3:10-3:14) "" "true")
(tag (3:15-3:16) "A") (tag (3:15-3:16) "A")
(block (tag (6:5-6:6) "B"))))) (block (5:10-7:6)
(statements (tag (6:5-6:6) "B"))))))
~~~FORMATTED ~~~FORMATTED
module [foo] module [foo]

View file

@ -22,8 +22,10 @@ CloseCurly(7:3-7:4),EndOfFile(7:4-7:4),
~~~PARSE ~~~PARSE
(if_then_else (1:1-7:4) (if_then_else (1:1-7:4)
(ident (2:2-2:6) "" "bool") (ident (2:2-2:6) "" "bool")
(block (int (4:4-4:5) "1")) (block (3:3-5:4)
(block (int (6:4-6:5) "2"))) (statements (int (4:4-4:5) "1")))
(block (5:10-7:4)
(statements (int (6:4-6:5) "2"))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END

View file

@ -22,8 +22,10 @@ CloseCurly(7:3-7:4),EndOfFile(7:4-7:4),
~~~PARSE ~~~PARSE
(if_then_else (1:1-7:4) (if_then_else (1:1-7:4)
(ident (2:2-2:6) "" "bool") (ident (2:2-2:6) "" "bool")
(block (int (4:4-4:5) "1")) (block (3:3-5:4)
(block (int (6:4-6:5) "2"))) (statements (int (4:4-4:5) "1")))
(block (5:10-7:4)
(statements (int (6:4-6:5) "2"))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END

View file

@ -26,8 +26,10 @@ CloseCurly(9:5-9:6),EndOfFile(9:6-9:6),
~~~PARSE ~~~PARSE
(if_then_else (1:1-9:6) (if_then_else (1:1-9:6)
(ident (2:2-2:6) "" "bool") (ident (2:2-2:6) "" "bool")
(block (int (4:4-4:5) "1")) (block (3:3-5:4)
(block (int (8:6-8:7) "2"))) (statements (int (4:4-4:5) "1")))
(block (7:5-9:6)
(statements (int (8:6-8:7) "2"))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END

View file

@ -14,7 +14,8 @@ CloseCurly(3:1-3:2),KwElse(3:3-3:7),Int(3:8-3:9),EndOfFile(3:9-3:9),
~~~PARSE ~~~PARSE
(if_then_else (1:1-3:9) (if_then_else (1:1-3:9)
(ident (1:4-1:8) "" "bool") (ident (1:4-1:8) "" "bool")
(block (int (2:2-2:3) "1")) (block (1:9-3:2)
(statements (int (2:2-2:3) "1")))
(int (3:8-3:9) "2")) (int (3:8-3:9) "2"))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE

View file

@ -14,7 +14,8 @@ CloseCurly(3:1-3:2),KwElse(3:3-3:7),Int(3:8-3:9),EndOfFile(3:9-3:9),
~~~PARSE ~~~PARSE
(if_then_else (1:1-3:9) (if_then_else (1:1-3:9)
(ident (1:4-1:8) "" "bool") (ident (1:4-1:8) "" "bool")
(block (int (2:2-2:3) "1")) (block (1:9-3:2)
(statements (int (2:2-2:3) "1")))
(int (3:8-3:9) "2")) (int (3:8-3:9) "2"))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE

View file

@ -18,8 +18,10 @@ CloseCurly(5:1-5:2),EndOfFile(5:2-5:2),
~~~PARSE ~~~PARSE
(if_then_else (1:1-5:2) (if_then_else (1:1-5:2)
(ident (1:4-1:8) "" "bool") (ident (1:4-1:8) "" "bool")
(block (int (2:2-2:3) "1")) (block (1:9-3:2)
(block (int (4:2-4:3) "2"))) (statements (int (2:2-2:3) "1")))
(block (3:8-5:2)
(statements (int (4:2-4:3) "2"))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END

View file

@ -18,8 +18,10 @@ CloseCurly(5:1-5:2),EndOfFile(5:2-5:2),
~~~PARSE ~~~PARSE
(if_then_else (1:1-5:2) (if_then_else (1:1-5:2)
(ident (1:4-1:8) "" "bool") (ident (1:4-1:8) "" "bool")
(block (int (2:2-2:3) "1")) (block (1:9-3:2)
(block (int (4:2-4:3) "2"))) (statements (int (2:2-2:3) "1")))
(block (3:8-5:2)
(statements (int (4:2-4:3) "2"))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END

View file

@ -541,20 +541,23 @@ CloseCurly(202:1-202:2),EndOfFile(202:2-202:2),
(ident (68:1-68:8) "add_one") (ident (68:1-68:8) "add_one")
(lambda (68:11-78:2) (lambda (68:11-78:2)
(args (ident (68:12-68:15) "num")) (args (ident (68:12-68:15) "num"))
(block (block (68:17-78:2)
(decl (69:2-69:11) (statements
(ident (69:2-69:7) "other") (decl (69:2-69:11)
(int (69:10-69:11) "1")) (ident (69:2-69:7) "other")
(if_then_else (70:2-78:2) (int (69:10-69:11) "1"))
(ident (70:5-70:8) "" "num") (if_then_else (70:2-78:2)
(block (ident (70:5-70:8) "" "num")
(dbg (block (70:9-74:3)
(apply (72:4-72:15) (statements
(ident (72:4-72:13) "" "some_func"))) (dbg
(int (73:3-73:4) "0")) (apply (72:4-72:15)
(block (ident (72:4-72:13) "" "some_func")))
(dbg (int (75:7-75:10) "123")) (int (73:3-73:4) "0")))
(ident (76:3-76:8) "" "other")))))) (block (74:9-77:3)
(statements
(dbg (int (75:7-75:10) "123"))
(ident (76:3-76:8) "" "other"))))))))
(decl (80:1-140:7) (decl (80:1-140:7)
(ident (80:1-80:11) "match_time") (ident (80:1-80:11) "match_time")
(lambda (80:14-140:7) (lambda (80:14-140:7)
@ -569,21 +572,23 @@ CloseCurly(202:1-202:2),EndOfFile(202:2-202:2),
(tag (85:3-85:7) "Blue") (tag (85:3-85:7) "Blue")
(tag (85:10-85:15) "Green") (tag (85:10-85:15) "Green")
(tag (85:18-85:21) "Red")) (tag (85:18-85:21) "Red"))
(block (block (85:25-88:4)
(decl (86:4-86:10) (statements
(ident (86:4-86:5) "x") (decl (86:4-86:10)
(int (86:8-86:10) "12")) (ident (86:4-86:5) "x")
(ident (87:4-87:5) "" "x"))) (int (86:8-86:10) "12"))
(ident (87:4-87:5) "" "x"))))
(branch (89:3-97:8) (branch (89:3-97:8)
(alternatives (alternatives
(tag (89:3-89:7) "Blue") (tag (89:3-89:7) "Blue")
(tag (91:4-91:9) "Green") (tag (91:4-91:9) "Green")
(tag (92:5-92:8) "Red")) (tag (92:5-92:8) "Red"))
(block (block (93:7-96:5)
(decl (94:5-94:11) (statements
(ident (94:5-94:6) "x") (decl (94:5-94:11)
(int (94:9-94:11) "12")) (ident (94:5-94:6) "x")
(ident (95:5-95:6) "" "x"))) (int (94:9-94:11) "12"))
(ident (95:5-95:6) "" "x"))))
(branch (97:3-99:4) (branch (97:3-99:4)
(ident (97:3-97:8) "lower") (ident (97:3-97:8) "lower")
(int (98:7-98:8) "1")) (int (98:7-98:8) "1"))
@ -715,205 +720,208 @@ CloseCurly(202:1-202:2),EndOfFile(202:2-202:2),
(ident (144:1-144:6) "main!") (ident (144:1-144:6) "main!")
(lambda (144:9-196:2) (lambda (144:9-196:2)
(args (underscore)) (args (underscore))
(block (block (144:13-196:2)
(decl (145:2-145:17) (statements
(ident (145:2-145:7) "world") (decl (145:2-145:17)
(string (145:10-145:17) (string_part (145:11-145:16) "World"))) (ident (145:2-145:7) "world")
(var (146:2-147:8) (string (145:10-145:17) (string_part (145:11-145:16) "World")))
(name "number") (var (146:2-147:8)
(int (146:15-146:18) "123")) (name "number")
(expect (147:2-148:5) (int (146:15-146:18) "123"))
(binop (expect (147:2-148:5)
"==" (binop
(ident (147:9-147:13) "" "blah") "=="
(int (147:17-147:18) "1"))) (ident (147:9-147:13) "" "blah")
(decl (148:2-148:12) (int (147:17-147:18) "1")))
(ident (148:2-148:5) "tag") (decl (148:2-148:12)
(tag (148:8-148:12) "Blue")) (ident (148:2-148:5) "tag")
(return (149:2-154:5) (tag (148:8-148:12) "Blue"))
(ident (150:3-150:6) "" "tag")) (return (149:2-154:5)
(ellipsis) (ident (150:3-150:6) "" "tag"))
(apply (155:2-157:3) (ellipsis)
(ident (155:2-155:12) "" "match_time") (apply (155:2-157:3)
(ellipsis)) (ident (155:2-155:12) "" "match_time")
(apply (158:2-161:3) (ellipsis))
(ident (158:2-158:11) "" "some_func") (apply (158:2-161:3)
(dbg (int (160:4-160:6) "42"))) (ident (158:2-158:11) "" "some_func")
(crash (162:2-163:49) (dbg (int (160:4-160:6) "42")))
(string (163:3-163:17) (string_part (163:4-163:16) "Unreachable!"))) (crash (162:2-163:49)
(decl (164:2-164:31) (string (163:3-163:17) (string_part (163:4-163:16) "Unreachable!")))
(ident (164:2-164:18) "tag_with_payload") (decl (164:2-164:31)
(apply (164:21-164:31) (ident (164:2-164:18) "tag_with_payload")
(tag (164:21-164:23) "Ok") (apply (164:21-164:31)
(ident (164:24-164:30) "" "number"))) (tag (164:21-164:23) "Ok")
(decl (165:2-165:34) (ident (164:24-164:30) "" "number")))
(ident (165:2-165:14) "interpolated") (decl (165:2-165:34)
(string (165:17-165:34) (ident (165:2-165:14) "interpolated")
(string_part (165:18-165:25) "Hello, ") (string (165:17-165:34)
(ident (165:27-165:32) "" "world") (string_part (165:18-165:25) "Hello, ")
(string_part (165:33-165:33) ""))) (ident (165:27-165:32) "" "world")
(decl (166:2-173:3) (string_part (165:33-165:33) "")))
(ident (166:2-166:6) "list") (decl (166:2-173:3)
(list (166:9-173:3) (ident (166:2-166:6) "list")
(apply (167:3-170:4) (list (166:9-173:3)
(ident (167:3-167:10) "" "add_one") (apply (167:3-170:4)
(dbg (ident (169:5-169:11) "" "number"))) (ident (167:3-167:10) "" "add_one")
(int (171:3-171:6) "456") (dbg (ident (169:5-169:11) "" "number")))
(int (172:3-172:6) "789"))) (int (171:3-171:6) "456")
(for (int (172:3-172:6) "789")))
(ident (174:6-174:7) "n") (for
(ident (174:11-174:15) "" "list") (ident (174:6-174:7) "n")
(block (ident (174:11-174:15) "" "list")
(apply (175:3-175:43) (block (174:16-177:3)
(ident (175:3-175:15) "Stdout" ".line!") (statements
(string (175:16-175:42) (apply (175:3-175:43)
(string_part (175:17-175:24) "Adding ") (ident (175:3-175:15) "Stdout" ".line!")
(ident (175:26-175:27) "" "n") (string (175:16-175:42)
(string_part (175:28-175:32) " to ") (string_part (175:17-175:24) "Adding ")
(ident (175:34-175:40) "" "number") (ident (175:26-175:27) "" "n")
(string_part (175:41-175:41) ""))) (string_part (175:28-175:32) " to ")
(decl (176:3-177:3) (ident (175:34-175:40) "" "number")
(ident (176:3-176:9) "number") (string_part (175:41-175:41) "")))
(binop (decl (176:3-177:3)
"+" (ident (176:3-176:9) "number")
(ident (176:12-176:18) "" "number") (binop
(ident (176:21-176:22) "" "n"))))) "+"
(decl (178:2-178:71) (ident (176:12-176:18) "" "number")
(ident (178:2-178:8) "record") (ident (176:21-176:22) "" "n"))))))
(record (178:11-178:71) (decl (178:2-178:71)
(field "foo" (int (178:18-178:21) "123")) (ident (178:2-178:8) "record")
(field (record (178:11-178:71)
"bar" (field "foo" (int (178:18-178:21) "123"))
(string (178:28-178:35) (string_part (178:29-178:34) "Hello"))) (field
(field "bar"
"baz" (string (178:28-178:35) (string_part (178:29-178:34) "Hello")))
(ident (178:42-178:45) "" "tag")) (field
(field "baz"
"qux" (ident (178:42-178:45) "" "tag"))
(apply (178:52-178:61) (field
(tag (178:52-178:54) "Ok") "qux"
(ident (178:55-178:60) "" "world"))) (apply (178:52-178:61)
(field "punned"))) (tag (178:52-178:54) "Ok")
(decl (179:2-179:68) (ident (178:55-178:60) "" "world")))
(ident (179:2-179:7) "tuple") (field "punned")))
(tuple (179:10-179:68) (decl (179:2-179:68)
(int (179:11-179:14) "123") (ident (179:2-179:7) "tuple")
(string (179:16-179:23) (string_part (179:17-179:22) "World")) (tuple (179:10-179:68)
(ident (179:25-179:28) "" "tag") (int (179:11-179:14) "123")
(apply (179:30-179:39) (string (179:16-179:23) (string_part (179:17-179:22) "World"))
(tag (179:30-179:32) "Ok") (ident (179:25-179:28) "" "tag")
(ident (179:33-179:38) "" "world")) (apply (179:30-179:39)
(tuple (179:41-179:56) (tag (179:30-179:32) "Ok")
(ident (179:42-179:48) "" "nested") (ident (179:33-179:38) "" "world"))
(ident (179:50-179:55) "" "tuple")) (tuple (179:41-179:56)
(list (179:58-179:67) (ident (179:42-179:48) "" "nested")
(int (179:59-179:60) "1") (ident (179:50-179:55) "" "tuple"))
(int (179:62-179:63) "2") (list (179:58-179:67)
(int (179:65-179:66) "3")))) (int (179:59-179:60) "1")
(decl (180:2-187:3) (int (179:62-179:63) "2")
(ident (180:2-180:17) "multiline_tuple") (int (179:65-179:66) "3"))))
(tuple (180:20-187:3) (decl (180:2-187:3)
(int (181:3-181:6) "123") (ident (180:2-180:17) "multiline_tuple")
(string (182:3-182:10) (string_part (182:4-182:9) "World")) (tuple (180:20-187:3)
(ident (183:3-183:7) "" "tag1") (int (181:3-181:6) "123")
(apply (184:3-184:12) (string (182:3-182:10) (string_part (182:4-182:9) "World"))
(tag (184:3-184:5) "Ok") (ident (183:3-183:7) "" "tag1")
(ident (184:6-184:11) "" "world")) (apply (184:3-184:12)
(tuple (185:3-185:18) (tag (184:3-184:5) "Ok")
(ident (185:4-185:10) "" "nested") (ident (184:6-184:11) "" "world"))
(ident (185:12-185:17) "" "tuple")) (tuple (185:3-185:18)
(list (186:3-186:12) (ident (185:4-185:10) "" "nested")
(int (186:4-186:5) "1") (ident (185:12-185:17) "" "tuple"))
(int (186:7-186:8) "2") (list (186:3-186:12)
(int (186:10-186:11) "3")))) (int (186:4-186:5) "1")
(decl (188:2-189:23) (int (186:7-186:8) "2")
(ident (188:2-188:15) "bin_op_result") (int (186:10-186:11) "3"))))
(binop (decl (188:2-189:23)
"or" (ident (188:2-188:15) "bin_op_result")
(binop (binop
"or" "or"
(binop (binop
">" "or"
(binop (binop
"??" ">"
(apply (188:18-188:26)
(tag (188:18-188:21) "Err")
(ident (188:22-188:25) "" "foo"))
(int (188:30-188:32) "12"))
(binop
"*"
(int (188:35-188:36) "5")
(int (188:39-188:40) "5")))
(binop
"and"
(binop
"<"
(binop (binop
"+" "??"
(int (188:44-188:46) "13") (apply (188:18-188:26)
(int (188:49-188:50) "2")) (tag (188:18-188:21) "Err")
(int (188:53-188:54) "5")) (ident (188:22-188:25) "" "foo"))
(binop (int (188:30-188:32) "12"))
">="
(binop (binop
"-" "*"
(int (188:59-188:61) "10") (int (188:35-188:36) "5")
(int (188:64-188:65) "1")) (int (188:39-188:40) "5")))
(int (188:69-188:71) "16"))))
(binop
"<="
(int (188:75-188:77) "12")
(binop
"/"
(int (188:81-188:82) "3")
(int (188:85-188:86) "5")))))
(decl (189:2-190:8)
(ident (189:2-189:23) "static_dispatch_style")
(field_access (189:26-190:8)
(binop
" This is a module comment!"
(field_access (189:26-189:110)
(binop (binop
" This is a module comment!" "and"
(field_access (189:26-189:94) (binop
"<"
(binop (binop
" This is a module comment!" "+"
(suffix_single_question (189:26-189:40) (int (188:44-188:46) "13")
(apply (189:26-189:39) (int (188:49-188:50) "2"))
(ident (189:26-189:33) "" "some_fn") (int (188:53-188:54) "5"))
(ident (189:34-189:38) "" "arg1"))) (binop
(suffix_single_question (189:40-189:66) ">="
(apply (189:40-189:65) (binop
(ident (189:40-189:63) "" ".static_dispatch_method"))))) "-"
(suffix_single_question (189:66-189:97) (int (188:59-188:61) "10")
(apply (189:66-189:96) (int (188:64-188:65) "1"))
(ident (189:66-189:94) "" ".next_static_dispatch_method"))))) (int (188:69-188:71) "16"))))
(suffix_single_question (189:97-189:111) (binop
(ident (189:97-189:110) "" ".record_field"))))) "<="
(suffix_single_question (190:2-190:29) (int (188:75-188:77) "12")
(apply (190:2-190:28) (binop
(ident (190:2-190:14) "Stdout" ".line!") "/"
(ident (190:15-190:27) "" "interpolated"))) (int (188:81-188:82) "3")
(apply (191:2-195:3) (int (188:85-188:86) "5")))))
(ident (191:2-191:14) "Stdout" ".line!") (decl (189:2-190:8)
(string (192:3-194:18) (ident (189:2-189:23) "static_dispatch_style")
(string_part (192:4-192:14) "How about ") (field_access (189:26-190:8)
(apply (193:4-193:21) (binop
(ident (193:4-193:13) "Num" ".toStr") " This is a module comment!"
(ident (193:14-193:20) "" "number")) (field_access (189:26-189:110)
(string_part (194:4-194:17) " as a string?")))))) (binop
" This is a module comment!"
(field_access (189:26-189:94)
(binop
" This is a module comment!"
(suffix_single_question (189:26-189:40)
(apply (189:26-189:39)
(ident (189:26-189:33) "" "some_fn")
(ident (189:34-189:38) "" "arg1")))
(suffix_single_question (189:40-189:66)
(apply (189:40-189:65)
(ident (189:40-189:63) "" ".static_dispatch_method")))))
(suffix_single_question (189:66-189:97)
(apply (189:66-189:96)
(ident (189:66-189:94) "" ".next_static_dispatch_method")))))
(suffix_single_question (189:97-189:111)
(ident (189:97-189:110) "" ".record_field")))))
(suffix_single_question (190:2-190:29)
(apply (190:2-190:28)
(ident (190:2-190:14) "Stdout" ".line!")
(ident (190:15-190:27) "" "interpolated")))
(apply (191:2-195:3)
(ident (191:2-191:14) "Stdout" ".line!")
(string (192:3-194:18)
(string_part (192:4-192:14) "How about ")
(apply (193:4-193:21)
(ident (193:4-193:13) "Num" ".toStr")
(ident (193:14-193:20) "" "number"))
(string_part (194:4-194:17) " as a string?")))))))
(expect (198:1-202:2) (expect (198:1-202:2)
(block (block (198:8-202:2)
(decl (199:2-199:9) (statements
(ident (199:2-199:5) "foo") (decl (199:2-199:9)
(int (199:8-199:9) "1")) (ident (199:2-199:5) "foo")
(decl (200:2-200:10) (int (199:8-199:9) "1"))
(ident (200:2-200:6) "blah") (decl (200:2-200:10)
(int (200:9-200:10) "1")) (ident (200:2-200:6) "blah")
(binop (int (200:9-200:10) "1"))
"==" (binop
(ident (201:2-201:6) "" "blah") "=="
(ident (201:10-201:13) "" "foo"))))) (ident (201:2-201:6) "" "blah")
(ident (201:10-201:13) "" "foo"))))))
~~~FORMATTED ~~~FORMATTED
NO CHANGE NO CHANGE
~~~END ~~~END