commit f9a0127ec0fe3282cdf207309e4bc0686cc49de4
parent bd95922ce51c9eb723dde54821c792f7a40b9ad7
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date: Wed, 21 May 2025 22:33:20 +0800
Shrink code some more, remove more comptime
Diffstat:
| M | src/AstGen3.zig | | | 180 | ++++++++++++++++++++++++++++++++----------------------------------------------- |
1 file changed, 73 insertions(+), 107 deletions(-)
diff --git a/src/AstGen3.zig b/src/AstGen3.zig
@@ -291,59 +291,34 @@ fn parseInlineColumn(
parent_idx: Node.Idx,
) !void {
// TODO: Inline parsing
- next_paragraph: {
- if (self.scanner.peek() == null) return;
- const tracy_frame = tracy.trace(@src());
- defer tracy_frame.end();
- tracy_frame.setName(@tagName(.text));
- if (self.scanner.peek()) |peek| {
- const alignment, const line = peek;
- tracy_frame.addText(line.toUnpaddedSlice());
- try self.insertTextLine(.text, .text, parent_idx, line);
- if (alignment == .misaligned)
- try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr);
- self.scanner.advance();
- }
- while (self.scanner.peek()) |peek| {
- const alignment, const line = peek;
- if (line.len == line.indexOfNotSpaceOrTab())
- break :next_paragraph;
- try self.insertTextLine(.space_text, .text, parent_idx, line);
- if (alignment == .misaligned)
- try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr);
- self.scanner.advance();
- }
- return;
- }
- next_paragraph: while (true) {
- while (self.scanner.peek()) |peek| {
- _, const line = peek;
- if (line.len != line.indexOfNotSpaceOrTab()) break;
- self.scanner.advance();
- }
- if (self.scanner.peek() == null) return;
+ {
+ var peek_maybe = self.scanner.peek();
+ if (peek_maybe == null) return;
const tracy_frame = tracy.trace(@src());
defer tracy_frame.end();
- tracy_frame.setName(@tagName(.text));
- if (self.scanner.peek()) |peek| {
- const alignment, const line = peek;
- tracy_frame.addText(line.toUnpaddedSlice());
- try self.insertTextLine(.space_text, .text, parent_idx, line);
- try self.appendNodeError(.unexpected_block_in_inline_context, self.lastNodeIdx());
- if (alignment == .misaligned)
- try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr);
- self.scanner.advance();
- }
- while (self.scanner.peek()) |peek| {
+ tracy_frame.setName("inline");
+ tracy_frame.addText(peek_maybe.?.@"1".toUnpaddedSlice());
+ var text_tag: Node.Tag = .text;
+ var saw_empty_line = false;
+ while (peek_maybe) |peek| {
const alignment, const line = peek;
- if (line.len == line.indexOfNotSpaceOrTab())
- continue :next_paragraph;
- try self.insertTextLine(.space_text, .text, parent_idx, line);
+ if (line.len == 0 or line.len == line.indexOfNotSpaceOrTab()) {
+ saw_empty_line = true;
+ self.scanner.advance();
+ peek_maybe = self.scanner.peek();
+ continue;
+ }
if (alignment == .misaligned)
- try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr);
+ try self.appendPointError(.inconsistent_indentation, self.nextNodeIdx(), line.ptr);
+ if (saw_empty_line) {
+ try self.appendNodeError(.unexpected_block_in_inline_context, self.nextNodeIdx());
+ saw_empty_line = false;
+ }
+ try self.insertTextLine(text_tag, .text, parent_idx, line);
self.scanner.advance();
+ peek_maybe = self.scanner.peek();
+ text_tag = .space_text;
}
- break;
}
}
@@ -418,27 +393,22 @@ fn parseColumn(
tracy_frame.setName(@tagName(@as(Node.Tag, @enumFromInt(m))));
break :blk .{ base_marker_len, @enumFromInt(m) };
};
- switch (list_type) {
- inline .unordered_item, .ordered_item, .term_item, .task_item => |tag| {
- const list_node_idx = blk: {
- if (current_list) |cur| {
- const cur_tag, const cur_node_idx = cur;
- if (tag == cur_tag) break :blk cur_node_idx;
- }
- const list_node_idx = try self.appendContainerNode(parent_idx, .list, line.ptr);
- current_list = .{ tag, list_node_idx };
- break :blk list_node_idx;
- };
- const block_idx = try self.appendContainerNode(list_node_idx, tag, line.ptr);
- _ = try self.appendLeafNode(block_idx, .marker, line.ptr, try castStrLen(marker_len, error.MarkerTooLong));
- last_elaboratable_idx = .{ block_idx, base_marker_len };
- try self.scanner.indent(.{ .skip = line_start + marker_len });
- try self.parseInlineColumn(block_idx);
- self.scanner.dedent();
- break :block_idx block_idx;
- },
- else => unreachable,
- }
+ const list_node_idx = blk: {
+ if (current_list) |cur| {
+ const cur_tag, const cur_node_idx = cur;
+ if (list_type == cur_tag) break :blk cur_node_idx;
+ }
+ const list_node_idx = try self.appendContainerNode(parent_idx, .list, line.ptr);
+ current_list = .{ list_type, list_node_idx };
+ break :blk list_node_idx;
+ };
+ const block_idx = try self.appendContainerNode(list_node_idx, list_type, line.ptr);
+ _ = try self.appendLeafNode(block_idx, .marker, line.ptr, try castStrLen(marker_len, error.MarkerTooLong));
+ last_elaboratable_idx = .{ block_idx, base_marker_len };
+ try self.scanner.indent(.{ .skip = line_start + marker_len });
+ try self.parseInlineColumn(block_idx);
+ self.scanner.dedent();
+ break :block_idx block_idx;
},
// Elaborations
@@ -507,8 +477,39 @@ fn parseColumn(
last_elaboratable_idx = null;
try self.insertTextLine(.text, .text, paragraph_idx, line);
self.scanner.advance();
- // Split into separate function so parseRoot / parseColumn share the same branch predictors
- try self.parseRestParagraph(paragraph_idx);
+
+ while (self.scanner.peek()) |peek2| {
+ const alignment2, const line2 = peek2;
+ const line_load4: u32 = @bitCast(line2.ptr._ptr[0..4].*);
+ const line_load3: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\xff\x00\x00"[0..4].*));
+ const line_load2: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\x00\x00\x00"[0..4].*));
+
+ switch (line2.ptr._ptr[0]) {
+ // Special block chars / actually empty line
+ '\n', '-', '.', ':', '+', '>', '#', '@' => break,
+ // Empty line (only whitespace)
+ ' ', '\t' => if (line2.len == line2.indexOfNotSpaceOrTab()) break,
+ // string literals have extra chars so [0..4] doesn't give a sentinel ptr
+ // Thematic break
+ '*' => if (line_load3 ==
+ @as(u32, @bitCast("***\x00\x00"[0..4].*)) and
+ (line2.len == 3 or
+ line2.len == 3 + line2.sliceOpen(3).indexOfNotSpaceOrTab())) break,
+ // Verbatim block
+ '=' => if (line_load2 ==
+ @as(u32, @bitCast("==\x00\x00\x00"[0..4].*))) break,
+ // Math block
+ '$' => if (line_load3 ==
+ @as(u32, @bitCast("$==\x00\x00"[0..4].*))) break,
+ else => {},
+ }
+
+ if (alignment2 == .misaligned)
+ try self.appendPointError(.inconsistent_indentation, self.nextNodeIdx(), line2.ptr);
+ try self.insertTextLine(.space_text, .text, paragraph_idx, line2);
+ self.scanner.advance();
+ }
+
break :block_idx paragraph_idx;
}
};
@@ -519,45 +520,10 @@ fn parseColumn(
}
}
-fn parseRestParagraph(
- self: *AstGen,
- paragraph_idx: Node.Idx,
-) !void {
- while (self.scanner.peek()) |peek2| {
- _, const line2 = peek2;
- const line_load4: u32 = @bitCast(line2.ptr._ptr[0..4].*);
- const line_load3: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\xff\x00\x00"[0..4].*));
- const line_load2: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\x00\x00\x00"[0..4].*));
-
- switch (line2.ptr._ptr[0]) {
- // Special block chars / actually empty line
- '\n', '-', '.', ':', '+', '>', '#', '@' => break,
- // Empty line (only whitespace)
- ' ', '\t' => if (line2.len == line2.indexOfNotSpaceOrTab()) break,
- // string literals have extra chars so [0..4] doesn't give a sentinel ptr
- // Thematic break
- '*' => if (line_load3 ==
- @as(u32, @bitCast("***\x00\x00"[0..4].*)) and
- (line2.len == 3 or
- line2.len == 3 + line2.sliceOpen(3).indexOfNotSpaceOrTab())) break,
- // Verbatim block
- '=' => if (line_load2 ==
- @as(u32, @bitCast("==\x00\x00\x00"[0..4].*))) break,
- // Math block
- '$' => if (line_load3 ==
- @as(u32, @bitCast("$==\x00\x00"[0..4].*))) break,
- else => {},
- }
-
- try self.insertTextLine(.space_text, .text, paragraph_idx, line2);
- self.scanner.advance();
- }
-}
-
fn insertTextLine(
self: *AstGen,
- comptime first_text_tag: Node.Tag,
- comptime rest_text_tag: Node.Tag,
+ first_text_tag: Node.Tag,
+ rest_text_tag: Node.Tag,
parent_idx: Node.Idx,
line_: PaddedSlice,
) !void {