@@ -54,21 +54,11 @@ pub fn regionIsMultiline(self: *IR, region: Region) bool {
54
54
pub fn regionInfo (self : * IR , region : Region , line_starts : std .ArrayList (u32 )) base.DiagnosticPosition {
55
55
const start = self .tokens .resolve (region .start );
56
56
const end = self .tokens .resolve (region .end );
57
+ const info = base .DiagnosticPosition .position (self .source , line_starts , start .start .offset , end .end .offset ) catch {
58
+ std .debug .panic ("failed to calculate position info for region {?}, start: {}, end: {}" , .{ region , start , end });
59
+ };
57
60
58
- if (end .isEmpty ()) {
59
- // use the range from start only
60
- const info = base .DiagnosticPosition .position (self .source , line_starts , start .start .offset , start .end .offset ) catch {
61
- std .debug .panic ("failed to calculate position info for region {?}, start: {}, end: {}" , .{ region , start , end });
62
- };
63
-
64
- return info ;
65
- } else {
66
- const info = base .DiagnosticPosition .position (self .source , line_starts , start .start .offset , end .end .offset ) catch {
67
- std .debug .panic ("failed to calculate position info for region {?}, start: {}, end: {}" , .{ region , start , end });
68
- };
69
-
70
- return info ;
71
- }
61
+ return info ;
72
62
}
73
63
74
64
pub fn deinit (self : * IR ) void {
@@ -1275,7 +1265,10 @@ pub const NodeStore = struct {
1275
1265
} };
1276
1266
},
1277
1267
.malformed = > {
1278
- return .{ .malformed = .{ .reason = @enumFromInt (node .data .lhs ) } };
1268
+ return .{ .malformed = .{
1269
+ .reason = @enumFromInt (node .data .lhs ),
1270
+ .region = node .region ,
1271
+ } };
1279
1272
},
1280
1273
else = > {
1281
1274
std .debug .panic ("Expected a valid header tag, got {s}" , .{@tagName (node .tag )});
@@ -1657,7 +1650,10 @@ pub const NodeStore = struct {
1657
1650
} };
1658
1651
},
1659
1652
.malformed = > {
1660
- return .{ .malformed = .{ .reason = @enumFromInt (node .data .lhs ) } };
1653
+ return .{ .malformed = .{
1654
+ .reason = @enumFromInt (node .data .lhs ),
1655
+ .region = node .region ,
1656
+ } };
1661
1657
},
1662
1658
else = > {
1663
1659
std .debug .panic ("Expected a valid expr tag, got {s}" , .{@tagName (node .tag )});
@@ -1782,7 +1778,10 @@ pub const NodeStore = struct {
1782
1778
} };
1783
1779
},
1784
1780
.malformed = > {
1785
- return .{ .malformed = .{ .reason = @enumFromInt (node .data .lhs ) } };
1781
+ return .{ .malformed = .{
1782
+ .reason = @enumFromInt (node .data .lhs ),
1783
+ .region = node .region ,
1784
+ } };
1786
1785
},
1787
1786
else = > {
1788
1787
std .debug .panic ("Expected a valid type annotation node, found {s}" , .{@tagName (node .tag )});
@@ -1874,6 +1873,7 @@ pub const NodeStore = struct {
1874
1873
},
1875
1874
malformed : struct {
1876
1875
reason : Diagnostic.Tag ,
1876
+ region : Region ,
1877
1877
},
1878
1878
1879
1879
const AppHeaderRhs = packed struct { num_packages : u10 , num_provides : u22 };
@@ -1882,55 +1882,41 @@ pub const NodeStore = struct {
1882
1882
switch (self ) {
1883
1883
.app = > | a | {
1884
1884
var node = sexpr .Expr .init (env .gpa , "app" );
1885
-
1886
1885
node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
1887
-
1888
1886
node .appendStringChild (env .gpa , "TODO implement toSExpr for app module header" );
1889
1887
return node ;
1890
1888
},
1891
1889
.module = > | module | {
1892
1890
var node = sexpr .Expr .init (env .gpa , "module" );
1893
-
1894
1891
node .appendRegionChild (env .gpa , ir .regionInfo (module .region , line_starts ));
1895
-
1896
1892
for (ir .store .exposedItemSlice (module .exposes )) | exposed | {
1897
1893
const item = ir .store .getExposedItem (exposed );
1898
1894
var item_node = item .toSExpr (env , ir , line_starts );
1899
1895
node .appendNodeChild (env .gpa , & item_node );
1900
1896
}
1901
-
1902
1897
return node ;
1903
1898
},
1904
1899
.package = > | a | {
1905
1900
var node = sexpr .Expr .init (env .gpa , "package" );
1906
-
1907
1901
node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
1908
-
1909
1902
node .appendStringChild (env .gpa , "TODO implement toSExpr for package module header" );
1910
1903
return node ;
1911
1904
},
1912
1905
.platform = > | a | {
1913
1906
var node = sexpr .Expr .init (env .gpa , "platform" );
1914
-
1915
1907
node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
1916
-
1917
1908
node .appendStringChild (env .gpa , "TODO implement toSExpr for platform module header" );
1918
1909
return node ;
1919
1910
},
1920
1911
.hosted = > | a | {
1921
1912
var node = sexpr .Expr .init (env .gpa , "hosted" );
1922
-
1923
1913
node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
1924
-
1925
1914
node .appendStringChild (env .gpa , "TODO implement toSExpr for hosted module header" );
1926
1915
return node ;
1927
1916
},
1928
1917
.malformed = > | a | {
1929
1918
var node = sexpr .Expr .init (env .gpa , "malformed_header" );
1930
-
1931
- // TODO add region to malformed header
1932
- // node.appendRegionChild(env.gpa, ir.regionInfo(a.region, line_starts));
1933
-
1919
+ node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
1934
1920
node .appendStringChild (env .gpa , @tagName (a .reason ));
1935
1921
return node ;
1936
1922
},
@@ -2029,6 +2015,7 @@ pub const NodeStore = struct {
2029
2015
},
2030
2016
malformed : struct {
2031
2017
reason : Diagnostic.Tag ,
2018
+ region : Region ,
2032
2019
},
2033
2020
2034
2021
pub const Import = struct {
@@ -2043,69 +2030,61 @@ pub const NodeStore = struct {
2043
2030
switch (self ) {
2044
2031
.decl = > | decl | {
2045
2032
var node = sexpr .Expr .init (env .gpa , "decl" );
2046
-
2047
2033
node .appendRegionChild (env .gpa , ir .regionInfo (decl .region , line_starts ));
2048
-
2049
- const pattern = ir .store .getPattern (decl .pattern );
2050
- const body = ir .store .getExpr (decl .body );
2051
-
2052
- var pattern_node = pattern .toSExpr (env , ir , line_starts );
2053
- var body_node = body .toSExpr (env , ir , line_starts );
2054
-
2055
- node .appendNodeChild (env .gpa , & pattern_node );
2056
- node .appendNodeChild (env .gpa , & body_node );
2057
-
2034
+ // pattern
2035
+ {
2036
+ const pattern = ir .store .getPattern (decl .pattern );
2037
+ var pattern_node = pattern .toSExpr (env , ir , line_starts );
2038
+ node .appendNodeChild (env .gpa , & pattern_node );
2039
+ }
2040
+ // body
2041
+ {
2042
+ const body = ir .store .getExpr (decl .body );
2043
+ var body_node = body .toSExpr (env , ir , line_starts );
2044
+ node .appendNodeChild (env .gpa , & body_node );
2045
+ }
2058
2046
return node ;
2059
2047
},
2060
2048
.expr = > | expr | {
2061
2049
return ir .store .getExpr (expr .expr ).toSExpr (env , ir , line_starts );
2062
2050
},
2063
2051
.import = > | import | {
2064
2052
var node = sexpr .Expr .init (env .gpa , "import" );
2065
-
2066
2053
node .appendRegionChild (env .gpa , ir .regionInfo (import .region , line_starts ));
2067
-
2068
- // Module Qualifier e.g. `pf` in `import pf.Stdout`
2069
- node .appendStringChild (
2070
- env .gpa ,
2071
- if (import .qualifier_tok ) | tok | ir .resolve (tok ) else "" ,
2072
- );
2073
-
2074
- // Module Name e.g. `Stdout` in `import pf.Stdout`
2075
- node .appendStringChild (
2076
- env .gpa ,
2077
- ir .resolve (import .module_name_tok ),
2078
- );
2079
-
2080
- // Module Alias e.g. `OUT` in `import pf.Stdout as OUT`
2081
- node .appendStringChild (
2082
- env .gpa ,
2083
- if (import .alias_tok ) | tok | ir .resolve (tok ) else "" ,
2084
- );
2085
-
2086
- // Each exposed identifier e.g. [foo, bar] in `import pf.Stdout exposing [foo, bar]`
2054
+ // name e.g. `Stdout` in `import pf.Stdout`
2055
+ node .appendStringChild (env .gpa , ir .resolve (import .module_name_tok ));
2056
+ // qualifier e.g. `pf` in `import pf.Stdout`
2057
+ if (import .qualifier_tok ) | tok | {
2058
+ const qualifier_str = ir .resolve (tok );
2059
+ var child = sexpr .Expr .init (env .gpa , "qualifier" );
2060
+ child .appendStringChild (env .gpa , qualifier_str );
2061
+ node .appendNodeChild (env .gpa , & child );
2062
+ }
2063
+ // alias e.g. `OUT` in `import pf.Stdout as OUT`
2064
+ if (import .alias_tok ) | tok | {
2065
+ const qualifier_str = ir .resolve (tok );
2066
+ var child = sexpr .Expr .init (env .gpa , "alias" );
2067
+ child .appendStringChild (env .gpa , qualifier_str );
2068
+ node .appendNodeChild (env .gpa , & child );
2069
+ }
2070
+ // exposed identifiers e.g. [foo, bar] in `import pf.Stdout exposing [foo, bar]`
2087
2071
const exposed_slice = ir .store .exposedItemSlice (import .exposes );
2088
2072
if (exposed_slice .len > 0 ) {
2089
2073
var exposed = sexpr .Expr .init (env .gpa , "exposing" );
2090
-
2091
2074
for (ir .store .exposedItemSlice (import .exposes )) | e | {
2092
2075
var exposed_item = & ir .store .getExposedItem (e );
2093
2076
var exposed_item_sexpr = exposed_item .toSExpr (env , ir , line_starts );
2094
2077
exposed .appendNodeChild (env .gpa , & exposed_item_sexpr );
2095
2078
}
2096
2079
node .appendNodeChild (env .gpa , & exposed );
2097
2080
}
2098
-
2099
2081
return node ;
2100
2082
},
2101
2083
// (type_decl (header <name> [<args>]) <annotation>)
2102
2084
.type_decl = > | a | {
2103
2085
var node = sexpr .Expr .init (env .gpa , "type_decl" );
2104
-
2105
2086
node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
2106
-
2107
2087
var header = sexpr .Expr .init (env .gpa , "header" );
2108
-
2109
2088
// pattern
2110
2089
{
2111
2090
const ty_header = ir .store .getTypeHeader (a .header );
@@ -2123,7 +2102,6 @@ pub const NodeStore = struct {
2123
2102
var annotation = ir .store .getTypeAnno (a .anno ).toSExpr (env , ir , line_starts );
2124
2103
node .appendNodeChild (env .gpa , & annotation );
2125
2104
}
2126
-
2127
2105
return node ;
2128
2106
},
2129
2107
// (crash <expr>)
@@ -2167,8 +2145,11 @@ pub const NodeStore = struct {
2167
2145
node .appendNodeChild (env .gpa , & child );
2168
2146
return node ;
2169
2147
},
2170
- else = > {
2171
- std .debug .panic ("implement toSExpr for Statement: {}" , .{self });
2148
+ .malformed = > | a | {
2149
+ var node = sexpr .Expr .init (env .gpa , "malformed_stmt" );
2150
+ node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
2151
+ node .appendStringChild (env .gpa , @tagName (a .reason ));
2152
+ return node ;
2172
2153
},
2173
2154
}
2174
2155
}
@@ -2217,6 +2198,7 @@ pub const NodeStore = struct {
2217
2198
},
2218
2199
malformed : struct {
2219
2200
reason : Diagnostic.Tag ,
2201
+ region : Region ,
2220
2202
},
2221
2203
2222
2204
const TagUnionRhs = packed struct { open : u1 , tags_len : u31 };
@@ -2306,10 +2288,7 @@ pub const NodeStore = struct {
2306
2288
},
2307
2289
.malformed = > | a | {
2308
2290
var node = sexpr .Expr .init (env .gpa , "malformed_expr" );
2309
-
2310
- // TODO add region to malformed type anno
2311
- // node.appendRegionChild(env.gpa, ir.regionInfo(a.region, line_starts));
2312
-
2291
+ node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
2313
2292
node .appendStringChild (env .gpa , @tagName (a .reason ));
2314
2293
return node ;
2315
2294
},
@@ -2368,6 +2347,7 @@ pub const NodeStore = struct {
2368
2347
},
2369
2348
malformed : struct {
2370
2349
reason : Diagnostic.Tag ,
2350
+ region : Region ,
2371
2351
},
2372
2352
2373
2353
pub fn toSExpr (self : @This (), env : * base .ModuleEnv , ir : * IR , line_starts : std .ArrayList (u32 )) sexpr.Expr {
@@ -2418,10 +2398,7 @@ pub const NodeStore = struct {
2418
2398
},
2419
2399
.malformed = > | a | {
2420
2400
var node = sexpr .Expr .init (env .gpa , "malformed_pattern" );
2421
-
2422
- // TODO add region to malformed pattern
2423
- // node.appendRegionChild(env.gpa, ir.regionInfo(a.region, line_starts));
2424
-
2401
+ node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
2425
2402
node .appendStringChild (env .gpa , @tagName (a .reason ));
2426
2403
return node ;
2427
2404
},
@@ -2513,6 +2490,7 @@ pub const NodeStore = struct {
2513
2490
block : Body ,
2514
2491
malformed : struct {
2515
2492
reason : Diagnostic.Tag ,
2493
+ region : Region ,
2516
2494
},
2517
2495
2518
2496
pub fn as_string_part_region (self : @This ()) ! Region {
@@ -2541,9 +2519,10 @@ pub const NodeStore = struct {
2541
2519
return node ;
2542
2520
},
2543
2521
.string_part = > | sp | {
2544
- const text = ir .resolve (sp .token );
2545
- const owned_str : []u8 = env .gpa .dupe (u8 , text ) catch | err | exitOnOom (err );
2546
- return sexpr.Expr { .string = owned_str };
2522
+ var node = sexpr .Expr .init (env .gpa , "string_part" );
2523
+ node .appendRegionChild (env .gpa , ir .regionInfo (sp .region , line_starts ));
2524
+ node .appendStringChild (env .gpa , ir .resolve (sp .token ));
2525
+ return node ;
2547
2526
},
2548
2527
// (tag <tag>)
2549
2528
.tag = > | tag | {
@@ -2597,10 +2576,7 @@ pub const NodeStore = struct {
2597
2576
// (malformed_expr <reason>)
2598
2577
.malformed = > | a | {
2599
2578
var node = sexpr .Expr .init (env .gpa , "malformed_expr" );
2600
-
2601
- // TODO add region to malformed expression
2602
- // node.appendRegionChild(env.gpa, ir.regionInfo(a.region, line_starts));
2603
-
2579
+ node .appendRegionChild (env .gpa , ir .regionInfo (a .region , line_starts ));
2604
2580
node .appendStringChild (env .gpa , @tagName (a .reason ));
2605
2581
return node ;
2606
2582
},
0 commit comments