diff --git a/tests/utility/ast.zig b/tests/utility/ast.zig index 611708e..b01bd0d 100644 --- a/tests/utility/ast.zig +++ b/tests/utility/ast.zig @@ -12,6 +12,12 @@ const ast = zls.ast; const allocator = std.testing.allocator; test "nodesAtLoc" { + try testNodesAtLoc( + \\ + ); + try testNodesAtLoc( + \\var alpha = 1; + ); try testNodesAtLoc( \\const foo = 5; ); @@ -26,6 +32,104 @@ test "nodesAtLoc" { \\fn foo(alpha: u32) void {} \\const _ = foo(5); ); + try testNodesAtLoc( + \\var alpha = 1; + \\var beta = alpha + alpha; + \\var gamma = beta * alpha; + \\var delta = gamma - 2; + \\var epsilon = delta - beta; + \\var zeta = epsilon * epsilon; + ); + try testNodesAtLoc( + \\var alpha = 1; + \\var beta = alpha + alpha; + \\var gamma = beta * alpha; + \\var epsilon = delta - beta; + ); + try testNodesAtLoc( + \\fn foo() void { + \\ + \\} + \\fn bar() void { + \\ + \\} + \\fn baz() void { + \\ + \\} + ); + try testNodesAtLoc( + \\var alpha = 1; + \\var beta = alpha + alpha; + \\// some comment + \\// because it is + \\// not a node + \\var gamma = beta * alpha; + \\var epsilon = delta - beta; + ); +} + +test "smallestEnclosingSubrange" { + const children = &[_]offsets.Loc{ + .{ .start = 0, .end = 5 }, + .{ .start = 5, .end = 10 }, + .{ .start = 12, .end = 18 }, + .{ .start = 18, .end = 22 }, + .{ .start = 25, .end = 28 }, + }; + + try std.testing.expect(ast.smallestEnclosingSubrange(&.{}, undefined) == null); + + // children <--> + // loc <---> + // result null + try std.testing.expect( + ast.smallestEnclosingSubrange(&.{.{ .start = 0, .end = 4 }}, .{ .start = 0, .end = 5 }) == null, + ); + + // children <---><---> <----><--> <-> + // loc <----------------------------> + // result null + try std.testing.expect(ast.smallestEnclosingSubrange(children, .{ .start = 0, .end = 30 }) == null); + + // children <---><---> <----><--> <-> + // loc <---------> + // result <---> <----> + const result1 = ast.smallestEnclosingSubrange(children, .{ .start = 6, .end = 17 }).?; + try std.testing.expectEqualSlices( + offsets.Loc, + children[1..3], + children[result1.start .. result1.start + result1.len], + ); + + // children <---><---> <----><--> <-> + // loc <-------------> + // result <---> <----><--> + const result2 = ast.smallestEnclosingSubrange(children, .{ .start = 6, .end = 20 }).?; + try std.testing.expectEqualSlices( + offsets.Loc, + children[1..4], + children[result2.start .. result2.start + result2.len], + ); + + // children <---><---> <----><--> <-> + // loc <-----------> + // result <---> <----><--> <-> + const result3 = ast.smallestEnclosingSubrange(children, .{ .start = 10, .end = 23 }).?; + try std.testing.expectEqualSlices( + offsets.Loc, + children[1..5], + children[result3.start .. result3.start + result3.len], + ); + + // children <---><---> <----><--> <-> + // loc <> + // result <---> <----> + const result4 = ast.smallestEnclosingSubrange(children, .{ .start = 10, .end = 12 }).?; + try std.testing.expectEqualSlices( + offsets.Loc, + children[1..3], + children[result4.start .. result4.start + result4.len], + ); } fn testNodesAtLoc(source: []const u8) !void {