Skip to content

Commit f0bb3d2

Browse files
xdBronchTechatrix
andcommitted
fix inefficient semanticTokens/range at the end of files
Co-authored-by: Techatrix <techatrix@mailbox.org>
1 parent 5d97c95 commit f0bb3d2

2 files changed

Lines changed: 17 additions & 15 deletions

File tree

src/features/inlay_hints.zig

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -565,15 +565,13 @@ pub fn writeRangeInlayHint(
565565
.hover_kind = hover_kind,
566566
};
567567

568-
const nodes = try ast.nodesAtLoc(arena, &handle.tree, loc);
569-
570-
for (nodes) |child| {
571-
try writeNodeInlayHint(&builder, &handle.tree, child);
572-
573-
var walker: ast.Walker = try .init(arena, &handle.tree, child);
574-
defer walker.deinit(arena);
575-
while (try walker.nextIgnoreClose(arena, &handle.tree)) |node| {
568+
var walker: ast.Walker = try .init(arena, &handle.tree, .root);
569+
defer walker.deinit(arena);
570+
while (try walker.nextIgnoreClose(arena, &handle.tree)) |node| {
571+
if (offsets.locIntersect(loc, offsets.nodeToLoc(&handle.tree, node))) {
576572
try writeNodeInlayHint(&builder, &handle.tree, node);
573+
} else {
574+
walker.skip();
577575
}
578576
}
579577

src/features/semantic_tokens.zig

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ const Builder = struct {
8989
encoding: offsets.Encoding,
9090
limited: bool,
9191
overlappingTokenSupport: bool,
92+
/// Only emit tokens for the given source range.
93+
loc: ?offsets.Loc,
9294

9395
fn add(self: *Builder, token: Ast.TokenIndex, token_type: TokenType, token_modifiers: TokenModifiers) error{OutOfMemory}!void {
9496
const tree = &self.handle.tree;
@@ -285,6 +287,10 @@ fn writeNodeTokens(builder: *Builder, node: Ast.Node.Index) Analyser.Error!void
285287
const handle = builder.handle;
286288
const tree = &handle.tree;
287289

290+
if (builder.loc) |loc| {
291+
if (!offsets.locIntersect(loc, offsets.nodeToLoc(tree, node))) return;
292+
}
293+
288294
const main_token = tree.nodeMainToken(node);
289295

290296
switch (tree.nodeTag(node)) {
@@ -1164,22 +1170,20 @@ pub fn writeSemanticTokens(
11641170
limited: bool,
11651171
overlappingTokenSupport: bool,
11661172
) Analyser.Error!types.semantic_tokens.Result {
1167-
var builder = Builder{
1173+
const tree = &handle.tree;
1174+
1175+
var builder: Builder = .{
11681176
.arena = arena,
11691177
.analyser = analyser,
11701178
.handle = handle,
11711179
.encoding = encoding,
11721180
.limited = limited,
11731181
.overlappingTokenSupport = overlappingTokenSupport,
1182+
.loc = loc,
11741183
};
11751184

1176-
var nodes = if (loc) |l| try ast.nodesAtLoc(arena, &handle.tree, l) else handle.tree.rootDecls();
1177-
if (nodes.len == 1 and nodes[0] == .root) {
1178-
nodes = handle.tree.rootDecls();
1179-
}
1180-
11811185
// reverse the ast from the root declarations
1182-
for (nodes) |child| {
1186+
for (tree.rootDecls()) |child| {
11831187
try writeNodeTokens(&builder, child);
11841188
}
11851189

0 commit comments

Comments
 (0)