add self-hosted parsing and rendering to main tests
This commit is contained in:
parent
4b1d120f58
commit
f210f17d30
@ -53,6 +53,10 @@ pub fn build(b: &Builder) {
|
|||||||
"std/special/compiler_rt/index.zig", "compiler-rt", "Run the compiler_rt tests",
|
"std/special/compiler_rt/index.zig", "compiler-rt", "Run the compiler_rt tests",
|
||||||
with_lldb));
|
with_lldb));
|
||||||
|
|
||||||
|
test_step.dependOn(tests.addPkgTests(b, test_filter,
|
||||||
|
"src-self-hosted/main.zig", "fmt", "Run the fmt tests",
|
||||||
|
with_lldb));
|
||||||
|
|
||||||
test_step.dependOn(tests.addCompareOutputTests(b, test_filter));
|
test_step.dependOn(tests.addCompareOutputTests(b, test_filter));
|
||||||
test_step.dependOn(tests.addBuildExampleTests(b, test_filter));
|
test_step.dependOn(tests.addBuildExampleTests(b, test_filter));
|
||||||
test_step.dependOn(tests.addCompileErrorTests(b, test_filter));
|
test_step.dependOn(tests.addCompileErrorTests(b, test_filter));
|
||||||
|
@ -1387,6 +1387,7 @@ const Parser = struct {
|
|||||||
|
|
||||||
%return stream.print("(");
|
%return stream.print("(");
|
||||||
|
|
||||||
|
%return stack.append(RenderState { .Text = "\n" });
|
||||||
if (fn_proto.fn_def_node == null) {
|
if (fn_proto.fn_def_node == null) {
|
||||||
%return stack.append(RenderState { .Text = ";" });
|
%return stack.append(RenderState { .Text = ";" });
|
||||||
}
|
}
|
||||||
@ -1536,3 +1537,37 @@ fn removeNullCast(x: var) -> {const InnerPtr = @typeOf(x).Child.Child; &InnerPtr
|
|||||||
const InnerPtr = @typeOf(x).Child.Child;
|
const InnerPtr = @typeOf(x).Child.Child;
|
||||||
return @ptrCast(&InnerPtr, x);
|
return @ptrCast(&InnerPtr, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fn testCanonical(source: []const u8) {
|
||||||
|
const allocator = std.debug.global_allocator;
|
||||||
|
std.debug.global_allocator_index = 0;
|
||||||
|
|
||||||
|
var tokenizer = Tokenizer.init(source);
|
||||||
|
var parser = Parser.init(&tokenizer, allocator, "(memory buffer)");
|
||||||
|
defer parser.deinit();
|
||||||
|
|
||||||
|
const root_node = parser.parse() %% unreachable;
|
||||||
|
defer parser.freeAst(root_node);
|
||||||
|
|
||||||
|
var buffer = std.Buffer.initSize(allocator, 0) %% unreachable;
|
||||||
|
var buffer_out_stream = io.BufferOutStream.init(&buffer);
|
||||||
|
parser.renderSource(&buffer_out_stream.stream, root_node) %% unreachable;
|
||||||
|
|
||||||
|
if (!mem.eql(u8, buffer.toSliceConst(), source)) {
|
||||||
|
warn("\n====== expected this output: =========\n");
|
||||||
|
warn("{}", source);
|
||||||
|
warn("\n======== instead found this: =========\n");
|
||||||
|
warn("{}", buffer.toSliceConst());
|
||||||
|
warn("\n======================================\n");
|
||||||
|
@panic("test failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test "zig fmt" {
|
||||||
|
testCanonical(
|
||||||
|
\\extern fn puts(s: &const u8) -> c_int;
|
||||||
|
\\
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -98,14 +98,17 @@ pub const Buffer = struct {
|
|||||||
mem.copy(u8, self.list.toSlice()[old_len..], m);
|
mem.copy(u8, self.list.toSlice()[old_len..], m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove, use OutStream for this
|
||||||
pub fn appendFormat(self: &Buffer, comptime format: []const u8, args: ...) -> %void {
|
pub fn appendFormat(self: &Buffer, comptime format: []const u8, args: ...) -> %void {
|
||||||
return fmt.format(self, append, format, args);
|
return fmt.format(self, append, format, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove, use OutStream for this
|
||||||
pub fn appendByte(self: &Buffer, byte: u8) -> %void {
|
pub fn appendByte(self: &Buffer, byte: u8) -> %void {
|
||||||
return self.appendByteNTimes(byte, 1);
|
return self.appendByteNTimes(byte, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove, use OutStream for this
|
||||||
pub fn appendByteNTimes(self: &Buffer, byte: u8, count: usize) -> %void {
|
pub fn appendByteNTimes(self: &Buffer, byte: u8, count: usize) -> %void {
|
||||||
var prev_size: usize = self.len();
|
var prev_size: usize = self.len();
|
||||||
%return self.resize(prev_size + count);
|
%return self.resize(prev_size + count);
|
||||||
|
@ -966,28 +966,29 @@ fn readILeb128(in_stream: &io.InStream) -> %i64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub const global_allocator = &global_allocator_state;
|
pub const global_allocator = &global_allocator_state;
|
||||||
|
|
||||||
var global_allocator_state = mem.Allocator {
|
var global_allocator_state = mem.Allocator {
|
||||||
.allocFn = globalAlloc,
|
.allocFn = globalAlloc,
|
||||||
.reallocFn = globalRealloc,
|
.reallocFn = globalRealloc,
|
||||||
.freeFn = globalFree,
|
.freeFn = globalFree,
|
||||||
};
|
};
|
||||||
|
|
||||||
var some_mem: [100 * 1024]u8 = undefined;
|
pub var global_allocator_mem: [100 * 1024]u8 = undefined;
|
||||||
var some_mem_index: usize = 0;
|
pub var global_allocator_index: usize = 0;
|
||||||
|
|
||||||
error OutOfMemory;
|
error OutOfMemory;
|
||||||
|
|
||||||
fn globalAlloc(self: &mem.Allocator, n: usize, alignment: u29) -> %[]u8 {
|
fn globalAlloc(self: &mem.Allocator, n: usize, alignment: u29) -> %[]u8 {
|
||||||
const addr = @ptrToInt(&some_mem[some_mem_index]);
|
const addr = @ptrToInt(&global_allocator_mem[global_allocator_index]);
|
||||||
const rem = @rem(addr, alignment);
|
const rem = @rem(addr, alignment);
|
||||||
const march_forward_bytes = if (rem == 0) 0 else (alignment - rem);
|
const march_forward_bytes = if (rem == 0) 0 else (alignment - rem);
|
||||||
const adjusted_index = some_mem_index + march_forward_bytes;
|
const adjusted_index = global_allocator_index + march_forward_bytes;
|
||||||
const end_index = adjusted_index + n;
|
const end_index = adjusted_index + n;
|
||||||
if (end_index > some_mem.len) {
|
if (end_index > global_allocator_mem.len) {
|
||||||
return error.OutOfMemory;
|
return error.OutOfMemory;
|
||||||
}
|
}
|
||||||
const result = some_mem[adjusted_index .. end_index];
|
const result = global_allocator_mem[adjusted_index .. end_index];
|
||||||
some_mem_index = end_index;
|
global_allocator_index = end_index;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ pub const AlignedArrayList = @import("array_list.zig").AlignedArrayList;
|
|||||||
pub const BufMap = @import("buf_map.zig").BufMap;
|
pub const BufMap = @import("buf_map.zig").BufMap;
|
||||||
pub const BufSet = @import("buf_set.zig").BufSet;
|
pub const BufSet = @import("buf_set.zig").BufSet;
|
||||||
pub const Buffer = @import("buffer.zig").Buffer;
|
pub const Buffer = @import("buffer.zig").Buffer;
|
||||||
|
pub const BufferOutStream = @import("buffer.zig").BufferOutStream;
|
||||||
pub const HashMap = @import("hash_map.zig").HashMap;
|
pub const HashMap = @import("hash_map.zig").HashMap;
|
||||||
pub const LinkedList = @import("linked_list.zig").LinkedList;
|
pub const LinkedList = @import("linked_list.zig").LinkedList;
|
||||||
|
|
||||||
|
21
std/io.zig
21
std/io.zig
@ -633,3 +633,24 @@ pub fn BufferedOutStreamCustom(comptime buffer_size: usize) -> type {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Implementation of OutStream trait for Buffer
|
||||||
|
pub const BufferOutStream = struct {
|
||||||
|
buffer: &Buffer,
|
||||||
|
stream: OutStream,
|
||||||
|
|
||||||
|
pub fn init(buffer: &Buffer) -> BufferOutStream {
|
||||||
|
return BufferOutStream {
|
||||||
|
.buffer = buffer,
|
||||||
|
.stream = OutStream {
|
||||||
|
.writeFn = writeFn,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn writeFn(out_stream: &OutStream, bytes: []const u8) -> %void {
|
||||||
|
const self = @fieldParentPtr(BufferOutStream, "stream", out_stream);
|
||||||
|
return self.buffer.append(bytes);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user