chore: added test cases for parsing simple stitches
This commit is contained in:
parent
6f54e6fbcd
commit
37ab29947a
4 changed files with 50 additions and 38 deletions
|
|
@ -184,7 +184,7 @@ pub const Module = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Stitch = struct {
|
pub const Stitch = struct {
|
||||||
knot_index: Knot.Index,
|
knot_index: ?Knot.Index,
|
||||||
code_index: CodeChunk.Index,
|
code_index: CodeChunk.Index,
|
||||||
name_index: InternPool.Constant.Index,
|
name_index: InternPool.Constant.Index,
|
||||||
|
|
||||||
|
|
@ -252,6 +252,7 @@ pub const Module = struct {
|
||||||
}
|
}
|
||||||
while (mod.work_queue.pop()) |work_unit| {
|
while (mod.work_queue.pop()) |work_unit| {
|
||||||
const chunk_index = mod.intern_pool.code_chunks.items.len;
|
const chunk_index = mod.intern_pool.code_chunks.items.len;
|
||||||
|
var knot_index: ?Knot.Index = null;
|
||||||
var chunk: Sema.Chunk = .{
|
var chunk: Sema.Chunk = .{
|
||||||
.sema = &sema,
|
.sema = &sema,
|
||||||
.code = try mod.createCodeChunk(),
|
.code = try mod.createCodeChunk(),
|
||||||
|
|
@ -266,6 +267,7 @@ pub const Module = struct {
|
||||||
try sema.analyzeKnot(&chunk, work_unit.inst_index);
|
try sema.analyzeKnot(&chunk, work_unit.inst_index);
|
||||||
try chunk.finalize();
|
try chunk.finalize();
|
||||||
|
|
||||||
|
knot_index = @enumFromInt(mod.knots.items.len);
|
||||||
try mod.intern_pool.code_chunks.append(gpa, chunk.code);
|
try mod.intern_pool.code_chunks.append(gpa, chunk.code);
|
||||||
try mod.knots.append(gpa, .{
|
try mod.knots.append(gpa, .{
|
||||||
.name_index = work_unit.decl_name,
|
.name_index = work_unit.decl_name,
|
||||||
|
|
@ -273,13 +275,12 @@ pub const Module = struct {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
.stitch => {
|
.stitch => {
|
||||||
const knot_index = mod.knots.items.len - 1;
|
|
||||||
try sema.analyzeStitch(&chunk, work_unit.inst_index);
|
try sema.analyzeStitch(&chunk, work_unit.inst_index);
|
||||||
try chunk.finalize();
|
try chunk.finalize();
|
||||||
|
|
||||||
try mod.intern_pool.code_chunks.append(gpa, chunk.code);
|
try mod.intern_pool.code_chunks.append(gpa, chunk.code);
|
||||||
try mod.stitches.append(gpa, .{
|
try mod.stitches.append(gpa, .{
|
||||||
.knot_index = @enumFromInt(knot_index),
|
.knot_index = knot_index,
|
||||||
.name_index = work_unit.decl_name,
|
.name_index = work_unit.decl_name,
|
||||||
.code_index = @enumFromInt(chunk_index),
|
.code_index = @enumFromInt(chunk_index),
|
||||||
});
|
});
|
||||||
|
|
@ -406,12 +407,13 @@ pub const Module = struct {
|
||||||
.code_bytes = try code_chunk.bytecode.toOwnedSlice(gpa),
|
.code_bytes = try code_chunk.bytecode.toOwnedSlice(gpa),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
if (stitch.knot_index) |index| {
|
||||||
const parent_knot = mod.knots.items[@intFromEnum(stitch.knot_index)];
|
const parent_knot = mod.knots.items[@intFromEnum(index)];
|
||||||
const parent_knot_name = mod.intern_pool.getStrBytes(mod.ir, parent_knot.name_index);
|
const parent_knot_name = mod.intern_pool.getStrBytes(mod.ir, parent_knot.name_index);
|
||||||
const parent_knot_obj: *Object.Knot = @ptrCast(story.globals.get(parent_knot_name).?);
|
const parent_knot_obj: *Object.Knot = @ptrCast(story.globals.get(parent_knot_name).?);
|
||||||
try parent_knot_obj.members.put(story.allocator, name_bytes, &stitch_obj.base);
|
try parent_knot_obj.members.put(story.allocator, name_bytes, &stitch_obj.base);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
story.string_bytes = mod.ir.string_bytes;
|
story.string_bytes = mod.ir.string_bytes;
|
||||||
mod.ir.string_bytes = &.{};
|
mod.ir.string_bytes = &.{};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -225,6 +225,46 @@ test "parser: empty knot declarations" {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "parser: stitch declarations, inside knot" {
|
||||||
|
try testEqual(
|
||||||
|
\\=== knot ===
|
||||||
|
\\= stitch
|
||||||
|
\\Hello, world!
|
||||||
|
,
|
||||||
|
\\File "<STDIN>"
|
||||||
|
\\`--KnotDecl <line:1, line:3>
|
||||||
|
\\ |--KnotProto <col:1, col:13>
|
||||||
|
\\ | `--Identifier `knot` <col:5, col:9>
|
||||||
|
\\ `--StitchDecl <line:2, line:3>
|
||||||
|
\\ |--StitchProto <col:1, col:9>
|
||||||
|
\\ | `--Identifier `stitch` <col:3, col:9>
|
||||||
|
\\ `--BlockStmt <line:3, line:3>
|
||||||
|
\\ `--ContentStmt <line:3, col:1:14>
|
||||||
|
\\ `--Content <col:1, col:14>
|
||||||
|
\\ `--StringLiteral `Hello, world!` <col:1, col:14>
|
||||||
|
\\
|
||||||
|
,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "parser: stitch declarations, simple" {
|
||||||
|
try testEqual(
|
||||||
|
\\= stitch
|
||||||
|
\\Hello, world!
|
||||||
|
,
|
||||||
|
\\File "<STDIN>"
|
||||||
|
\\`--StitchDecl <line:1, line:2>
|
||||||
|
\\ |--StitchProto <col:1, col:9>
|
||||||
|
\\ | `--Identifier `stitch` <col:3, col:9>
|
||||||
|
\\ `--BlockStmt <line:2, line:2>
|
||||||
|
\\ `--ContentStmt <line:2, col:1:14>
|
||||||
|
\\ `--Content <col:1, col:14>
|
||||||
|
\\ `--StringLiteral `Hello, world!` <col:1, col:14>
|
||||||
|
\\
|
||||||
|
,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
fn testEqual(source_bytes: [:0]const u8, expected_ast: []const u8) !void {
|
fn testEqual(source_bytes: [:0]const u8, expected_ast: []const u8) !void {
|
||||||
const gpa = std.testing.allocator;
|
const gpa = std.testing.allocator;
|
||||||
var arena_allocator = std.heap.ArenaAllocator.init(gpa);
|
var arena_allocator = std.heap.ArenaAllocator.init(gpa);
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
// RUN: %ink-compiler --stdin --compile-only --dump-ast < %s | FileCheck %s
|
|
||||||
|
|
||||||
// CHECK: File "<STDIN>"
|
|
||||||
// CHECK-NEXT: `--KnotDecl <line:15, line:17>
|
|
||||||
// CHECK-NEXT: |--KnotProto <col:1, col:13>
|
|
||||||
// CHECK-NEXT: | `--Identifier `knot` <col:5, col:9>
|
|
||||||
// CHECK-NEXT: `--StitchDecl <line:16, line:17>
|
|
||||||
// CHECK-NEXT: |--StitchProto <col:1, col:9>
|
|
||||||
// CHECK-NEXT: | `--Identifier `stitch` <col:3, col:9>
|
|
||||||
// CHECK-NEXT: `--BlockStmt <line:17, line:17>
|
|
||||||
// CHECK-NEXT: `--ContentStmt <line:17, col:1:14>
|
|
||||||
// CHECK-NEXT: `--Content <col:1, col:14>
|
|
||||||
// CHECK-NEXT: `--StringLiteral `Hello, world!` <col:1, col:14>
|
|
||||||
|
|
||||||
=== knot ===
|
|
||||||
= stitch
|
|
||||||
Hello, world!
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
// RUN: %ink-compiler --stdin --compile-only --dump-ast < %s | FileCheck %s
|
|
||||||
|
|
||||||
// CHECK: File "<STDIN>"
|
|
||||||
// CHECK-NEXT: `--StitchDecl <line:12, line:13>
|
|
||||||
// CHECK-NEXT: |--StitchProto <col:1, col:9>
|
|
||||||
// CHECK-NEXT: | `--Identifier `stitch` <col:3, col:9>
|
|
||||||
// CHECK-NEXT: `--BlockStmt <line:13, line:13>
|
|
||||||
// CHECK-NEXT: `--ContentStmt <line:13, col:1:14>
|
|
||||||
// CHECK-NEXT: `--Content <col:1, col:14>
|
|
||||||
// CHECK-NEXT: `--StringLiteral `Hello, world!` <col:1, col:14>
|
|
||||||
|
|
||||||
= stitch
|
|
||||||
Hello, world!
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue