| ... | ... | @@ -491,7 +491,10 @@ pub const Payload = struct { |
| 491 | 491 | |
| 492 | 492 | pub const Enum = struct { |
| 493 | 493 | base: Payload, |
| 494 | | data: []Field, |
| 494 | data: struct { |
| 495 | int_type: Node, |
| 496 | fields: []Field, |
| 497 | }, |
| 495 | 498 | |
| 496 | 499 | pub const Field = struct { |
| 497 | 500 | name: []const u8, |
| ... | ... | @@ -825,11 +828,6 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 825 | 828 | .main_token = try c.addToken(.identifier, "void"), |
| 826 | 829 | .data = undefined, |
| 827 | 830 | }), |
| 828 | | .@"anytype" => return c.addNode(.{ |
| 829 | | .tag = .@"anytype", |
| 830 | | .main_token = try c.addToken(.keyword_anytype, "anytype"), |
| 831 | | .data = undefined, |
| 832 | | }), |
| 833 | 831 | .noreturn_type => return c.addNode(.{ |
| 834 | 832 | .tag = .identifier, |
| 835 | 833 | .main_token = try c.addToken(.identifier, "noreturn"), |
| ... | ... | @@ -946,7 +944,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 946 | 944 | const payload = node.castTag(.char_literal).?.data; |
| 947 | 945 | return c.addNode(.{ |
| 948 | 946 | .tag = .identifier, |
| 949 | | .main_token = try c.addToken(.string_literal, payload), |
| 947 | .main_token = try c.addToken(.char_literal, payload), |
| 950 | 948 | .data = undefined, |
| 951 | 949 | }); |
| 952 | 950 | }, |
| ... | ... | @@ -1268,7 +1266,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1268 | 1266 | const lhs = try c.addNode(.{ |
| 1269 | 1267 | .tag = .identifier, |
| 1270 | 1268 | .main_token = try c.addToken(.identifier, "_"), |
| 1271 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 1269 | .data = undefined, |
| 1272 | 1270 | }); |
| 1273 | 1271 | return c.addNode(.{ |
| 1274 | 1272 | .tag = .assign, |
| ... | ... | @@ -1510,7 +1508,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1510 | 1508 | .rhs = try c.addNode(.{ |
| 1511 | 1509 | .tag = .integer_literal, |
| 1512 | 1510 | .main_token = try c.addTokenFmt(.integer_literal, "{d}", .{payload.count}), |
| 1513 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 1511 | .data = undefined, |
| 1514 | 1512 | }), |
| 1515 | 1513 | }, |
| 1516 | 1514 | }); |
| ... | ... | @@ -1519,7 +1517,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1519 | 1517 | const payload = node.castTag(.empty_array).?.data; |
| 1520 | 1518 | |
| 1521 | 1519 | const type_expr = try renderArrayType(c, 0, payload); |
| 1522 | | return renderArrayInit(c, 0, &.{}); |
| 1520 | return renderArrayInit(c, type_expr, &.{}); |
| 1523 | 1521 | }, |
| 1524 | 1522 | .array_init => { |
| 1525 | 1523 | const payload = node.castTag(.array_init).?.data; |
| ... | ... | @@ -1534,15 +1532,17 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1534 | 1532 | .@"struct", .@"union" => return renderRecord(c, node), |
| 1535 | 1533 | .@"enum" => { |
| 1536 | 1534 | const payload = node.castTag(.@"enum").?.data; |
| 1535 | _ = try c.addToken(.keyword_extern, "extern"); |
| 1537 | 1536 | const enum_tok = try c.addToken(.keyword_enum, "enum"); |
| 1538 | | |
| 1537 | _ = try c.addToken(.l_paren, "("); |
| 1538 | const arg_expr = try renderNode(c, payload.int_type); |
| 1539 | _ = try c.addToken(.r_paren, ")"); |
| 1539 | 1540 | _ = try c.addToken(.l_brace, "{"); |
| 1540 | | const members = try c.gpa.alloc(NodeIndex, std.math.max(payload.len + 1, 1)); |
| 1541 | const members = try c.gpa.alloc(NodeIndex, std.math.max(payload.fields.len + 1, 1)); |
| 1541 | 1542 | defer c.gpa.free(members); |
| 1542 | 1543 | members[0] = 0; |
| 1543 | | members[1] = 0; |
| 1544 | 1544 | |
| 1545 | | for (payload) |field, i| { |
| 1545 | for (payload.fields) |field, i| { |
| 1546 | 1546 | const name_tok = try c.addIdentifier(field.name); |
| 1547 | 1547 | const value_expr = if (field.value) |some| blk: { |
| 1548 | 1548 | _ = try c.addToken(.equal, "="); |
| ... | ... | @@ -1560,7 +1560,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1560 | 1560 | _ = try c.addToken(.comma, ","); |
| 1561 | 1561 | } |
| 1562 | 1562 | // make non-exhaustive |
| 1563 | | members[payload.len] = try c.addNode(.{ |
| 1563 | members[payload.fields.len] = try c.addNode(.{ |
| 1564 | 1564 | .tag = .container_field_init, |
| 1565 | 1565 | .main_token = try c.addIdentifier("_"), |
| 1566 | 1566 | .data = .{ |
| ... | ... | @@ -1571,26 +1571,18 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1571 | 1571 | _ = try c.addToken(.comma, ","); |
| 1572 | 1572 | _ = try c.addToken(.r_brace, "}"); |
| 1573 | 1573 | |
| 1574 | | if (members.len <= 2) { |
| 1575 | | return c.addNode(.{ |
| 1576 | | .tag = .container_decl_two_comma, |
| 1577 | | .main_token = enum_tok, |
| 1578 | | .data = .{ |
| 1579 | | .lhs = members[0], |
| 1580 | | .rhs = members[1], |
| 1581 | | }, |
| 1582 | | }); |
| 1583 | | } else { |
| 1584 | | const span = try c.listToSpan(members); |
| 1585 | | return c.addNode(.{ |
| 1586 | | .tag = .container_decl_comma, |
| 1587 | | .main_token = enum_tok, |
| 1588 | | .data = .{ |
| 1589 | | .lhs = span.start, |
| 1590 | | .rhs = span.end, |
| 1591 | | }, |
| 1592 | | }); |
| 1593 | | } |
| 1574 | const span = try c.listToSpan(members); |
| 1575 | return c.addNode(.{ |
| 1576 | .tag = .container_decl_arg_comma, |
| 1577 | .main_token = enum_tok, |
| 1578 | .data = .{ |
| 1579 | .lhs = arg_expr, |
| 1580 | .rhs = try c.addExtra(NodeSubRange{ |
| 1581 | .start = span.start, |
| 1582 | .end = span.end, |
| 1583 | }), |
| 1584 | }, |
| 1585 | }); |
| 1594 | 1586 | }, |
| 1595 | 1587 | .enum_redecl => { |
| 1596 | 1588 | const payload = node.castTag(.enum_redecl).?.data; |
| ... | ... | @@ -1701,12 +1693,16 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { |
| 1701 | 1693 | }); |
| 1702 | 1694 | } |
| 1703 | 1695 | }, |
| 1696 | .@"anytype" => unreachable, // Handled in renderParams |
| 1704 | 1697 | } |
| 1705 | 1698 | } |
| 1706 | 1699 | |
| 1707 | 1700 | fn renderRecord(c: *Context, node: Node) !NodeIndex { |
| 1708 | 1701 | const payload = @fieldParentPtr(Payload.Record, "base", node.ptr_otherwise).data; |
| 1709 | | if (payload.is_packed) _ = try c.addToken(.keyword_packed, "packed"); |
| 1702 | if (payload.is_packed) |
| 1703 | _ = try c.addToken(.keyword_packed, "packed") |
| 1704 | else |
| 1705 | _ = try c.addToken(.keyword_extern, "extern"); |
| 1710 | 1706 | const kind_tok = if (node.tag() == .@"struct") |
| 1711 | 1707 | try c.addToken(.keyword_struct, "struct") |
| 1712 | 1708 | else |
| ... | ... | @@ -1829,7 +1825,7 @@ fn renderArrayType(c: *Context, len: usize, elem_type: Node) !NodeIndex { |
| 1829 | 1825 | const len_expr = try c.addNode(.{ |
| 1830 | 1826 | .tag = .integer_literal, |
| 1831 | 1827 | .main_token = try c.addTokenFmt(.integer_literal, "{d}", .{len}), |
| 1832 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 1828 | .data = undefined, |
| 1833 | 1829 | }); |
| 1834 | 1830 | _ = try c.addToken(.r_bracket, "]"); |
| 1835 | 1831 | const elem_type_expr = try renderNode(c, elem_type); |
| ... | ... | @@ -1920,6 +1916,8 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { |
| 1920 | 1916 | .negate_wrap, |
| 1921 | 1917 | .bit_not, |
| 1922 | 1918 | .func, |
| 1919 | .call, |
| 1920 | .array_type, |
| 1923 | 1921 | => { |
| 1924 | 1922 | // no grouping needed |
| 1925 | 1923 | return renderNode(c, node); |
| ... | ... | @@ -1954,7 +1952,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { |
| 1954 | 1952 | .array_cat, |
| 1955 | 1953 | .array_filler, |
| 1956 | 1954 | .@"if", |
| 1957 | | .call, |
| 1958 | 1955 | .@"enum", |
| 1959 | 1956 | .@"struct", |
| 1960 | 1957 | .@"union", |
| ... | ... | @@ -1962,7 +1959,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { |
| 1962 | 1959 | .tuple, |
| 1963 | 1960 | .container_init, |
| 1964 | 1961 | .block, |
| 1965 | | .array_type, |
| 1966 | 1962 | => return c.addNode(.{ |
| 1967 | 1963 | .tag = .grouped_expression, |
| 1968 | 1964 | .main_token = try c.addToken(.l_paren, "("), |
| ... | ... | @@ -2161,7 +2157,7 @@ fn renderVar(c: *Context, node: Node) !NodeIndex { |
| 2161 | 2157 | const res = try c.addNode(.{ |
| 2162 | 2158 | .tag = .integer_literal, |
| 2163 | 2159 | .main_token = try c.addTokenFmt(.integer_literal, "{d}", .{some}), |
| 2164 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 2160 | .data = undefined, |
| 2165 | 2161 | }); |
| 2166 | 2162 | _ = try c.addToken(.r_paren, ")"); |
| 2167 | 2163 | break :blk res; |
| ... | ... | @@ -2173,7 +2169,7 @@ fn renderVar(c: *Context, node: Node) !NodeIndex { |
| 2173 | 2169 | const res = try c.addNode(.{ |
| 2174 | 2170 | .tag = .string_literal, |
| 2175 | 2171 | .main_token = try c.addTokenFmt(.string_literal, "\"{s}\"", .{std.zig.fmtEscapes(some)}), |
| 2176 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 2172 | .data = undefined, |
| 2177 | 2173 | }); |
| 2178 | 2174 | _ = try c.addToken(.r_paren, ")"); |
| 2179 | 2175 | break :blk res; |
| ... | ... | @@ -2232,39 +2228,10 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex { |
| 2232 | 2228 | const fn_token = try c.addToken(.keyword_fn, "fn"); |
| 2233 | 2229 | if (payload.name) |some| _ = try c.addIdentifier(some); |
| 2234 | 2230 | |
| 2235 | | _ = try c.addToken(.l_paren, "("); |
| 2236 | | const first = if (payload.params.len != 0) blk: { |
| 2237 | | const param = payload.params[0]; |
| 2238 | | if (param.is_noalias) _ = try c.addToken(.keyword_noalias, "noalias"); |
| 2239 | | if (param.name) |some| { |
| 2240 | | _ = try c.addIdentifier(some); |
| 2241 | | _ = try c.addToken(.colon, ":"); |
| 2242 | | } |
| 2243 | | break :blk try renderNode(c, param.type); |
| 2244 | | } else 0; |
| 2245 | | |
| 2231 | const params = try renderParams(c, payload.params, payload.is_var_args); |
| 2232 | defer params.deinit(); |
| 2246 | 2233 | var span: NodeSubRange = undefined; |
| 2247 | | if (payload.params.len > 1) { |
| 2248 | | var params = try c.gpa.alloc(NodeIndex, payload.params.len); |
| 2249 | | defer c.gpa.free(params); |
| 2250 | | |
| 2251 | | params[0] = first; |
| 2252 | | for (payload.params[1..]) |param, i| { |
| 2253 | | _ = try c.addToken(.comma, ","); |
| 2254 | | if (param.is_noalias) _ = try c.addToken(.keyword_noalias, "noalias"); |
| 2255 | | if (param.name) |some| { |
| 2256 | | _ = try c.addIdentifier(some); |
| 2257 | | _ = try c.addToken(.colon, ":"); |
| 2258 | | } |
| 2259 | | params[i + 1] = try renderNode(c, param.type); |
| 2260 | | } |
| 2261 | | span = try c.listToSpan(params); |
| 2262 | | } |
| 2263 | | if (payload.is_var_args) { |
| 2264 | | if (payload.params.len != 0) _ = try c.addToken(.comma, ","); |
| 2265 | | _ = try c.addToken(.ellipsis3, "..."); |
| 2266 | | } |
| 2267 | | _ = try c.addToken(.r_paren, ")"); |
| 2234 | if (params.items.len > 1) span = try c.listToSpan(params.items); |
| 2268 | 2235 | |
| 2269 | 2236 | const align_expr = if (payload.alignment) |some| blk: { |
| 2270 | 2237 | _ = try c.addToken(.keyword_align, "align"); |
| ... | ... | @@ -2272,7 +2239,7 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex { |
| 2272 | 2239 | const res = try c.addNode(.{ |
| 2273 | 2240 | .tag = .integer_literal, |
| 2274 | 2241 | .main_token = try c.addTokenFmt(.integer_literal, "{d}", .{some}), |
| 2275 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 2242 | .data = undefined, |
| 2276 | 2243 | }); |
| 2277 | 2244 | _ = try c.addToken(.r_paren, ")"); |
| 2278 | 2245 | break :blk res; |
| ... | ... | @@ -2284,7 +2251,7 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex { |
| 2284 | 2251 | const res = try c.addNode(.{ |
| 2285 | 2252 | .tag = .string_literal, |
| 2286 | 2253 | .main_token = try c.addTokenFmt(.string_literal, "\"{s}\"", .{std.zig.fmtEscapes(some)}), |
| 2287 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 2254 | .data = undefined, |
| 2288 | 2255 | }); |
| 2289 | 2256 | _ = try c.addToken(.r_paren, ")"); |
| 2290 | 2257 | break :blk res; |
| ... | ... | @@ -2296,8 +2263,8 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex { |
| 2296 | 2263 | _ = try c.addToken(.period, "."); |
| 2297 | 2264 | const res = try c.addNode(.{ |
| 2298 | 2265 | .tag = .enum_literal, |
| 2299 | | .main_token = try c.addTokenFmt(.identifier, "{}", .{some}), |
| 2300 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 2266 | .main_token = try c.addTokenFmt(.identifier, "{s}", .{@tagName(some)}), |
| 2267 | .data = undefined, |
| 2301 | 2268 | }); |
| 2302 | 2269 | _ = try c.addToken(.r_paren, ")"); |
| 2303 | 2270 | break :blk res; |
| ... | ... | @@ -2307,12 +2274,12 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex { |
| 2307 | 2274 | |
| 2308 | 2275 | const fn_proto = try blk: { |
| 2309 | 2276 | if (align_expr == 0 and section_expr == 0 and callconv_expr == 0) { |
| 2310 | | if (payload.params.len < 2) |
| 2277 | if (params.items.len < 2) |
| 2311 | 2278 | break :blk c.addNode(.{ |
| 2312 | 2279 | .tag = .fn_proto_simple, |
| 2313 | 2280 | .main_token = fn_token, |
| 2314 | 2281 | .data = .{ |
| 2315 | | .lhs = first, |
| 2282 | .lhs = params.items[0], |
| 2316 | 2283 | .rhs = return_type_expr, |
| 2317 | 2284 | }, |
| 2318 | 2285 | }) |
| ... | ... | @@ -2329,13 +2296,13 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex { |
| 2329 | 2296 | }, |
| 2330 | 2297 | }); |
| 2331 | 2298 | } |
| 2332 | | if (payload.params.len < 2) |
| 2299 | if (params.items.len < 2) |
| 2333 | 2300 | break :blk c.addNode(.{ |
| 2334 | 2301 | .tag = .fn_proto_one, |
| 2335 | 2302 | .main_token = fn_token, |
| 2336 | 2303 | .data = .{ |
| 2337 | 2304 | .lhs = try c.addExtra(std.zig.ast.Node.FnProtoOne{ |
| 2338 | | .param = first, |
| 2305 | .param = params.items[0], |
| 2339 | 2306 | .align_expr = align_expr, |
| 2340 | 2307 | .section_expr = section_expr, |
| 2341 | 2308 | .callconv_expr = callconv_expr, |
| ... | ... | @@ -2383,35 +2350,10 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex { |
| 2383 | 2350 | const fn_token = try c.addToken(.keyword_fn, "fn"); |
| 2384 | 2351 | _ = try c.addIdentifier(payload.name); |
| 2385 | 2352 | |
| 2386 | | _ = try c.addToken(.l_paren, "("); |
| 2387 | | const first = if (payload.params.len != 0) blk: { |
| 2388 | | const param = payload.params[0]; |
| 2389 | | if (param.is_noalias) _ = try c.addToken(.keyword_noalias, "noalias"); |
| 2390 | | if (param.name) |some| { |
| 2391 | | _ = try c.addIdentifier(some); |
| 2392 | | _ = try c.addToken(.colon, ":"); |
| 2393 | | } |
| 2394 | | break :blk try renderNode(c, param.type); |
| 2395 | | } else 0; |
| 2396 | | |
| 2353 | const params = try renderParams(c, payload.params, false); |
| 2354 | defer params.deinit(); |
| 2397 | 2355 | var span: NodeSubRange = undefined; |
| 2398 | | if (payload.params.len > 1) { |
| 2399 | | var params = try c.gpa.alloc(NodeIndex, payload.params.len); |
| 2400 | | defer c.gpa.free(params); |
| 2401 | | |
| 2402 | | params[0] = first; |
| 2403 | | for (payload.params[1..]) |param, i| { |
| 2404 | | _ = try c.addToken(.comma, ","); |
| 2405 | | if (param.is_noalias) _ = try c.addToken(.keyword_noalias, "noalias"); |
| 2406 | | if (param.name) |some| { |
| 2407 | | _ = try c.addIdentifier(some); |
| 2408 | | _ = try c.addToken(.colon, ":"); |
| 2409 | | } |
| 2410 | | params[i + 1] = try renderNode(c, param.type); |
| 2411 | | } |
| 2412 | | span = try c.listToSpan(params); |
| 2413 | | } |
| 2414 | | _ = try c.addToken(.r_paren, ")"); |
| 2356 | if (params.items.len > 1) span = try c.listToSpan(params.items); |
| 2415 | 2357 | |
| 2416 | 2358 | const callconv_expr = blk: { |
| 2417 | 2359 | _ = try c.addToken(.keyword_callconv, "callconv"); |
| ... | ... | @@ -2420,7 +2362,7 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex { |
| 2420 | 2362 | const res = try c.addNode(.{ |
| 2421 | 2363 | .tag = .enum_literal, |
| 2422 | 2364 | .main_token = try c.addToken(.identifier, "Inline"), |
| 2423 | | .data = .{ .lhs = undefined, .rhs = undefined }, |
| 2365 | .data = undefined, |
| 2424 | 2366 | }); |
| 2425 | 2367 | _ = try c.addToken(.r_paren, ")"); |
| 2426 | 2368 | break :blk res; |
| ... | ... | @@ -2428,13 +2370,13 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex { |
| 2428 | 2370 | const return_type_expr = try renderNode(c, payload.return_type); |
| 2429 | 2371 | |
| 2430 | 2372 | const fn_proto = try blk: { |
| 2431 | | if (payload.params.len < 2) |
| 2373 | if (params.items.len < 2) |
| 2432 | 2374 | break :blk c.addNode(.{ |
| 2433 | 2375 | .tag = .fn_proto_one, |
| 2434 | 2376 | .main_token = fn_token, |
| 2435 | 2377 | .data = .{ |
| 2436 | 2378 | .lhs = try c.addExtra(std.zig.ast.Node.FnProtoOne{ |
| 2437 | | .param = first, |
| 2379 | .param = params.items[0], |
| 2438 | 2380 | .align_expr = 0, |
| 2439 | 2381 | .section_expr = 0, |
| 2440 | 2382 | .callconv_expr = callconv_expr, |
| ... | ... | @@ -2467,3 +2409,32 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex { |
| 2467 | 2409 | }, |
| 2468 | 2410 | }); |
| 2469 | 2411 | } |
| 2412 | |
| 2413 | fn renderParams(c: *Context, params: []Payload.Param, is_var_args: bool) !std.ArrayList(NodeIndex) { |
| 2414 | _ = try c.addToken(.l_paren, "("); |
| 2415 | var rendered = std.ArrayList(NodeIndex).init(c.gpa); |
| 2416 | errdefer rendered.deinit(); |
| 2417 | try rendered.ensureCapacity(std.math.max(params.len, 1)); |
| 2418 | |
| 2419 | for (params) |param, i| { |
| 2420 | if (i != 0) _ = try c.addToken(.comma, ","); |
| 2421 | if (param.is_noalias) _ = try c.addToken(.keyword_noalias, "noalias"); |
| 2422 | if (param.name) |some| { |
| 2423 | _ = try c.addIdentifier(some); |
| 2424 | _ = try c.addToken(.colon, ":"); |
| 2425 | } |
| 2426 | if (param.type.tag() == .@"anytype") { |
| 2427 | _ = try c.addToken(.keyword_anytype, "anytype"); |
| 2428 | continue; |
| 2429 | } |
| 2430 | rendered.appendAssumeCapacity(try renderNode(c, param.type)); |
| 2431 | } |
| 2432 | if (is_var_args) { |
| 2433 | if (params.len != 0) _ = try c.addToken(.comma, ","); |
| 2434 | _ = try c.addToken(.ellipsis3, "..."); |
| 2435 | } |
| 2436 | _ = try c.addToken(.r_paren, ")"); |
| 2437 | |
| 2438 | if (rendered.items.len == 0) rendered.appendAssumeCapacity(0); |
| 2439 | return rendered; |
| 2440 | } |