Skip to content

Commit 6f3f034

Browse files
Resolve multiple layers of callsite references
1 parent 0bb4338 commit 6f3f034

2 files changed

Lines changed: 7 additions & 10 deletions

File tree

src/Server.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,7 +1276,7 @@ fn semanticTokensFullHandler(server: *Server, arena: std.mem.Allocator, request:
12761276
defer analyser.deinit();
12771277
// semantic tokens can be quite expensive to compute on large files
12781278
// and disabling callsite references can help with bringing the cost down.
1279-
analyser.collect_callsite_references = false;
1279+
analyser.max_callsite_depth = 0;
12801280

12811281
return try semantic_tokens.writeSemanticTokens(
12821282
arena,
@@ -1307,7 +1307,7 @@ fn semanticTokensRangeHandler(server: *Server, arena: std.mem.Allocator, request
13071307
defer analyser.deinit();
13081308
// semantic tokens can be quite expensive to compute on large files
13091309
// and disabling callsite references can help with bringing the cost down.
1310-
analyser.collect_callsite_references = false;
1310+
analyser.max_callsite_depth = 0;
13111311

13121312
return try semantic_tokens.writeSemanticTokens(
13131313
arena,

src/analysis.zig

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ store: *DocumentStore,
3434
ip: *InternPool,
3535
resolved_callsites: std.AutoHashMapUnmanaged(Declaration.Param, ?Type) = .empty,
3636
resolved_nodes: std.HashMapUnmanaged(NodeWithUri, ?Binding, NodeWithUri.Context, std.hash_map.default_max_load_percentage) = .empty,
37-
collect_callsite_references: bool,
37+
max_callsite_depth: usize = 4, // TODO: come up with a sensible default
3838
/// avoid unnecessarily parsing number literals
3939
resolve_number_literal_values: bool,
4040
/// handle of the doc where the request originated
@@ -57,7 +57,6 @@ pub fn init(
5757
.arena = arena,
5858
.store = store,
5959
.ip = ip,
60-
.collect_callsite_references = true,
6160
.resolve_number_literal_values = false,
6261
.root_handle = root_handle,
6362
};
@@ -1753,7 +1752,7 @@ fn resolveCallsiteReferences(analyser: *Analyser, decl_handle: DeclWithHandle) E
17531752
const tree = &decl_handle.handle.tree;
17541753
const is_cimport = std.mem.eql(u8, std.Io.Dir.path.basename(decl_handle.handle.uri.raw), "cimport.zig");
17551754

1756-
if (is_cimport or !analyser.collect_callsite_references) return null;
1755+
if (is_cimport or analyser.max_callsite_depth == 0) return null;
17571756

17581757
// protection against recursive callsite resolution
17591758
const gop_resolved = try analyser.resolved_callsites.getOrPut(analyser.gpa, pay);
@@ -1792,10 +1791,8 @@ fn resolveCallsiteReferences(analyser: *Analyser, decl_handle: DeclWithHandle) E
17921791
if (real_param_idx >= call.ast.params.len) continue;
17931792

17941793
var ty = resolve_ty: {
1795-
// don't resolve callsite references while resolving callsite references
1796-
const old_collect_callsite_references = analyser.collect_callsite_references;
1797-
defer analyser.collect_callsite_references = old_collect_callsite_references;
1798-
analyser.collect_callsite_references = false;
1794+
analyser.max_callsite_depth -= 1;
1795+
defer analyser.max_callsite_depth += 1;
17991796

18001797
break :resolve_ty try analyser.resolveTypeOfNode(.of(
18011798
// TODO?: this is a """heuristic based approach"""
@@ -1818,7 +1815,7 @@ fn resolveCallsiteReferences(analyser: *Analyser, decl_handle: DeclWithHandle) E
18181815
}
18191816

18201817
const maybe_type = try Type.fromEither(analyser, possible.items);
1821-
if (maybe_type) |ty| analyser.resolved_callsites.getPtr(pay).?.* = ty;
1818+
if (maybe_type) |ty| gop_resolved.value_ptr.* = ty;
18221819
return maybe_type;
18231820
}
18241821

0 commit comments

Comments
 (0)