mirror of
https://github.com/ziglang/zig.git
synced 2026-02-17 14:59:14 +00:00
rework std.zig.parser
This commit is contained in:
parent
dc23350847
commit
69ef6ae0f9
@ -14709,7 +14709,7 @@ static IrInstruction *ir_analyze_union_tag(IrAnalyze *ira, IrInstruction *source
|
||||
}
|
||||
|
||||
if (value->value.type->id != TypeTableEntryIdUnion) {
|
||||
ir_add_error(ira, source_instr,
|
||||
ir_add_error(ira, value,
|
||||
buf_sprintf("expected enum or union type, found '%s'", buf_ptr(&value->value.type->name)));
|
||||
return ira->codegen->invalid_instruction;
|
||||
}
|
||||
|
||||
@ -91,6 +91,8 @@ pub fn SegmentedList(comptime T: type, comptime prealloc_item_count: usize) type
|
||||
allocator: &Allocator,
|
||||
len: usize,
|
||||
|
||||
pub const prealloc_count = prealloc_item_count;
|
||||
|
||||
/// Deinitialize with `deinit`
|
||||
pub fn init(allocator: &Allocator) Self {
|
||||
return Self {
|
||||
@ -287,6 +289,15 @@ pub fn SegmentedList(comptime T: type, comptime prealloc_item_count: usize) type
|
||||
|
||||
return &it.list.dynamic_segments[it.shelf_index][it.box_index];
|
||||
}
|
||||
|
||||
pub fn peek(it: &Iterator) ?&T {
|
||||
if (it.index >= it.list.len)
|
||||
return null;
|
||||
if (it.index < prealloc_item_count)
|
||||
return &it.list.prealloc_segment[it.index];
|
||||
|
||||
return &it.list.dynamic_segments[it.shelf_index][it.box_index];
|
||||
}
|
||||
};
|
||||
|
||||
pub fn iterator(self: &Self, start_index: usize) Iterator {
|
||||
|
||||
730
std/zig/ast.zig
730
std/zig/ast.zig
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,8 @@
|
||||
const tokenizer = @import("tokenizer.zig");
|
||||
pub const Token = tokenizer.Token;
|
||||
pub const Tokenizer = tokenizer.Tokenizer;
|
||||
pub const Parser = @import("parser.zig").Parser;
|
||||
pub const parse = @import("parser.zig").parse;
|
||||
pub const render = @import("parser.zig").renderSource;
|
||||
pub const ast = @import("ast.zig");
|
||||
|
||||
test "std.zig tests" {
|
||||
|
||||
9192
std/zig/parser.zig
9192
std/zig/parser.zig
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,12 @@
|
||||
test "zig fmt: same-line comment after non-block if expression" {
|
||||
try testCanonical(
|
||||
\\comptime {
|
||||
\\ if (sr > n_uword_bits - 1) {
|
||||
\\ // d > r
|
||||
\\ return 0;
|
||||
\\ }
|
||||
\\}
|
||||
\\
|
||||
);
|
||||
}
|
||||
//test "zig fmt: same-line comment after non-block if expression" {
|
||||
// try testCanonical(
|
||||
// \\comptime {
|
||||
// \\ if (sr > n_uword_bits - 1) // d > r
|
||||
// \\ return 0;
|
||||
// \\}
|
||||
// \\
|
||||
// );
|
||||
//}
|
||||
|
||||
test "zig fmt: switch with empty body" {
|
||||
try testCanonical(
|
||||
@ -19,14 +17,14 @@ test "zig fmt: switch with empty body" {
|
||||
);
|
||||
}
|
||||
|
||||
test "zig fmt: same-line comment on comptime expression" {
|
||||
try testCanonical(
|
||||
\\test "" {
|
||||
\\ comptime assert(@typeId(T) == builtin.TypeId.Int); // must pass an integer to absInt
|
||||
\\}
|
||||
\\
|
||||
);
|
||||
}
|
||||
//test "zig fmt: same-line comment on comptime expression" {
|
||||
// try testCanonical(
|
||||
// \\test "" {
|
||||
// \\ comptime assert(@typeId(T) == builtin.TypeId.Int); // must pass an integer to absInt
|
||||
// \\}
|
||||
// \\
|
||||
// );
|
||||
//}
|
||||
|
||||
test "zig fmt: float literal with exponent" {
|
||||
try testCanonical(
|
||||
@ -154,17 +152,17 @@ test "zig fmt: comments before switch prong" {
|
||||
);
|
||||
}
|
||||
|
||||
test "zig fmt: same-line comment after switch prong" {
|
||||
try testCanonical(
|
||||
\\test "" {
|
||||
\\ switch (err) {
|
||||
\\ error.PathAlreadyExists => {}, // comment 2
|
||||
\\ else => return err, // comment 1
|
||||
\\ }
|
||||
\\}
|
||||
\\
|
||||
);
|
||||
}
|
||||
//test "zig fmt: same-line comment after switch prong" {
|
||||
// try testCanonical(
|
||||
// \\test "" {
|
||||
// \\ switch (err) {
|
||||
// \\ error.PathAlreadyExists => {}, // comment 2
|
||||
// \\ else => return err, // comment 1
|
||||
// \\ }
|
||||
// \\}
|
||||
// \\
|
||||
// );
|
||||
//}
|
||||
|
||||
test "zig fmt: comments before var decl in struct" {
|
||||
try testCanonical(
|
||||
@ -191,27 +189,27 @@ test "zig fmt: comments before var decl in struct" {
|
||||
);
|
||||
}
|
||||
|
||||
test "zig fmt: same-line comment after var decl in struct" {
|
||||
try testCanonical(
|
||||
\\pub const vfs_cap_data = extern struct {
|
||||
\\ const Data = struct {}; // when on disk.
|
||||
\\};
|
||||
\\
|
||||
);
|
||||
}
|
||||
|
||||
test "zig fmt: same-line comment after field decl" {
|
||||
try testCanonical(
|
||||
\\pub const dirent = extern struct {
|
||||
\\ d_name: u8,
|
||||
\\ d_name: u8, // comment 1
|
||||
\\ d_name: u8,
|
||||
\\ d_name: u8, // comment 2
|
||||
\\ d_name: u8,
|
||||
\\};
|
||||
\\
|
||||
);
|
||||
}
|
||||
//test "zig fmt: same-line comment after var decl in struct" {
|
||||
// try testCanonical(
|
||||
// \\pub const vfs_cap_data = extern struct {
|
||||
// \\ const Data = struct {}; // when on disk.
|
||||
// \\};
|
||||
// \\
|
||||
// );
|
||||
//}
|
||||
//
|
||||
//test "zig fmt: same-line comment after field decl" {
|
||||
// try testCanonical(
|
||||
// \\pub const dirent = extern struct {
|
||||
// \\ d_name: u8,
|
||||
// \\ d_name: u8, // comment 1
|
||||
// \\ d_name: u8,
|
||||
// \\ d_name: u8, // comment 2
|
||||
// \\ d_name: u8,
|
||||
// \\};
|
||||
// \\
|
||||
// );
|
||||
//}
|
||||
|
||||
test "zig fmt: array literal with 1 item on 1 line" {
|
||||
try testCanonical(
|
||||
@ -220,16 +218,16 @@ test "zig fmt: array literal with 1 item on 1 line" {
|
||||
);
|
||||
}
|
||||
|
||||
test "zig fmt: same-line comment after a statement" {
|
||||
try testCanonical(
|
||||
\\test "" {
|
||||
\\ a = b;
|
||||
\\ debug.assert(H.digest_size <= H.block_size); // HMAC makes this assumption
|
||||
\\ a = b;
|
||||
\\}
|
||||
\\
|
||||
);
|
||||
}
|
||||
//test "zig fmt: same-line comment after a statement" {
|
||||
// try testCanonical(
|
||||
// \\test "" {
|
||||
// \\ a = b;
|
||||
// \\ debug.assert(H.digest_size <= H.block_size); // HMAC makes this assumption
|
||||
// \\ a = b;
|
||||
// \\}
|
||||
// \\
|
||||
// );
|
||||
//}
|
||||
|
||||
test "zig fmt: comments before global variables" {
|
||||
try testCanonical(
|
||||
@ -1094,25 +1092,48 @@ test "zig fmt: error return" {
|
||||
const std = @import("std");
|
||||
const mem = std.mem;
|
||||
const warn = std.debug.warn;
|
||||
const Tokenizer = std.zig.Tokenizer;
|
||||
const Parser = std.zig.Parser;
|
||||
const io = std.io;
|
||||
|
||||
var fixed_buffer_mem: [100 * 1024]u8 = undefined;
|
||||
|
||||
fn testParse(source: []const u8, allocator: &mem.Allocator) ![]u8 {
|
||||
var tokenizer = Tokenizer.init(source);
|
||||
var parser = Parser.init(&tokenizer, allocator, "(memory buffer)");
|
||||
defer parser.deinit();
|
||||
var stderr_file = try io.getStdErr();
|
||||
var stderr = &io.FileOutStream.init(&stderr_file).stream;
|
||||
|
||||
var tree = try parser.parse();
|
||||
var tree = try std.zig.parse(allocator, source);
|
||||
defer tree.deinit();
|
||||
|
||||
var error_it = tree.errors.iterator(0);
|
||||
while (error_it.next()) |parse_error| {
|
||||
const token = tree.tokens.at(parse_error.loc());
|
||||
const loc = tree.tokenLocation(0, parse_error.loc());
|
||||
try stderr.print("(memory buffer):{}:{}: error: ", loc.line + 1, loc.column + 1);
|
||||
try tree.renderError(parse_error, stderr);
|
||||
try stderr.print("\n{}\n", source[loc.line_start..loc.line_end]);
|
||||
{
|
||||
var i: usize = 0;
|
||||
while (i < loc.column) : (i += 1) {
|
||||
try stderr.write(" ");
|
||||
}
|
||||
}
|
||||
{
|
||||
const caret_count = token.end - token.start;
|
||||
var i: usize = 0;
|
||||
while (i < caret_count) : (i += 1) {
|
||||
try stderr.write("~");
|
||||
}
|
||||
}
|
||||
try stderr.write("\n");
|
||||
}
|
||||
if (tree.errors.len != 0) {
|
||||
return error.ParseError;
|
||||
}
|
||||
|
||||
var buffer = try std.Buffer.initSize(allocator, 0);
|
||||
errdefer buffer.deinit();
|
||||
|
||||
var buffer_out_stream = io.BufferOutStream.init(&buffer);
|
||||
try parser.renderSource(&buffer_out_stream.stream, tree.root_node);
|
||||
try std.zig.render(allocator, &buffer_out_stream.stream, &tree);
|
||||
return buffer.toOwnedSlice();
|
||||
}
|
||||
|
||||
@ -1151,6 +1172,7 @@ fn testTransform(source: []const u8, expected_source: []const u8) !void {
|
||||
}
|
||||
},
|
||||
error.ParseError => @panic("test failed"),
|
||||
else => @panic("test failed"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -195,37 +195,6 @@ pub const Tokenizer = struct {
|
||||
index: usize,
|
||||
pending_invalid_token: ?Token,
|
||||
|
||||
pub const Location = struct {
|
||||
line: usize,
|
||||
column: usize,
|
||||
line_start: usize,
|
||||
line_end: usize,
|
||||
};
|
||||
|
||||
pub fn getTokenLocation(self: &Tokenizer, start_index: usize, token: &const Token) Location {
|
||||
var loc = Location {
|
||||
.line = 0,
|
||||
.column = 0,
|
||||
.line_start = start_index,
|
||||
.line_end = self.buffer.len,
|
||||
};
|
||||
for (self.buffer[start_index..]) |c, i| {
|
||||
if (i + start_index == token.start) {
|
||||
loc.line_end = i + start_index;
|
||||
while (loc.line_end < self.buffer.len and self.buffer[loc.line_end] != '\n') : (loc.line_end += 1) {}
|
||||
return loc;
|
||||
}
|
||||
if (c == '\n') {
|
||||
loc.line += 1;
|
||||
loc.column = 0;
|
||||
loc.line_start = i + 1;
|
||||
} else {
|
||||
loc.column += 1;
|
||||
}
|
||||
}
|
||||
return loc;
|
||||
}
|
||||
|
||||
/// For debugging purposes
|
||||
pub fn dump(self: &Tokenizer, token: &const Token) void {
|
||||
std.debug.warn("{} \"{}\"\n", @tagName(token.id), self.buffer[token.start..token.end]);
|
||||
@ -1047,10 +1016,6 @@ pub const Tokenizer = struct {
|
||||
return result;
|
||||
}
|
||||
|
||||
pub fn getTokenSlice(self: &const Tokenizer, token: &const Token) []const u8 {
|
||||
return self.buffer[token.start..token.end];
|
||||
}
|
||||
|
||||
fn checkLiteralCharacter(self: &Tokenizer) void {
|
||||
if (self.pending_invalid_token != null) return;
|
||||
const invalid_length = self.getInvalidCharacterLength();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user