Skip to content

Commit a19cec6

Browse files
committed
reduce size of TrigramStore.Declaration
1 parent 985620a commit a19cec6

File tree

2 files changed

+40
-46
lines changed

2 files changed

+40
-46
lines changed

src/Server.zig

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,43 +1537,54 @@ fn workspaceSymbolHandler(server: *Server, arena: std.mem.Allocator, request: ty
15371537

15381538
var symbols: std.ArrayListUnmanaged(types.WorkspaceSymbol) = .empty;
15391539
var declaration_buffer: std.ArrayListUnmanaged(TrigramStore.Declaration.Index) = .empty;
1540-
var loc_buffer: std.ArrayListUnmanaged(offsets.Loc) = .empty;
1541-
var range_buffer: std.ArrayListUnmanaged(offsets.Range) = .empty;
15421540

15431541
for (handles) |handle| {
15441542
const trigram_store = handle.getTrigramStoreCached();
15451543

15461544
declaration_buffer.clearRetainingCapacity();
15471545
try trigram_store.declarationsForQuery(arena, request.query, &declaration_buffer);
15481546

1547+
const SortContext = struct {
1548+
names: []const std.zig.Ast.TokenIndex,
1549+
fn lessThan(ctx: @This(), lhs: TrigramStore.Declaration.Index, rhs: TrigramStore.Declaration.Index) bool {
1550+
return ctx.names[@intFromEnum(lhs)] < ctx.names[@intFromEnum(rhs)];
1551+
}
1552+
};
1553+
1554+
std.mem.sortUnstable(
1555+
TrigramStore.Declaration.Index,
1556+
declaration_buffer.items,
1557+
SortContext{ .names = trigram_store.declarations.items(.name) },
1558+
SortContext.lessThan,
1559+
);
1560+
15491561
const slice = trigram_store.declarations.slice();
15501562
const names = slice.items(.name);
1551-
const locs = slice.items(.loc);
15521563

1553-
{
1554-
// Convert `offsets.Loc` to `offsets.Range`
1564+
var last_index: usize = 0;
1565+
var last_position: offsets.Position = .{ .line = 0, .character = 0 };
15551566

1556-
try loc_buffer.resize(arena, declaration_buffer.items.len);
1557-
try range_buffer.resize(arena, declaration_buffer.items.len);
1567+
try symbols.ensureUnusedCapacity(arena, declaration_buffer.items.len);
1568+
for (declaration_buffer.items) |declaration| {
1569+
const name_token = names[@intFromEnum(declaration)];
1570+
const loc = offsets.identifierTokenToNameLoc(handle.tree, name_token);
1571+
const name = offsets.identifierTokenToNameSlice(handle.tree, name_token);
15581572

1559-
for (declaration_buffer.items, loc_buffer.items) |declaration, *loc| {
1560-
const small_loc = locs[@intFromEnum(declaration)];
1561-
loc.* = .{ .start = small_loc.start, .end = small_loc.end };
1562-
}
1573+
const start_position = offsets.advancePosition(handle.tree.source, last_position, last_index, loc.start, server.offset_encoding);
1574+
const end_position = offsets.advancePosition(handle.tree.source, start_position, loc.start, loc.end, server.offset_encoding);
1575+
last_index = loc.end;
1576+
last_position = end_position;
15631577

1564-
try offsets.multiple.locToRange(arena, handle.tree.source, loc_buffer.items, range_buffer.items, server.offset_encoding);
1565-
}
1566-
1567-
try symbols.ensureUnusedCapacity(arena, declaration_buffer.items.len);
1568-
for (declaration_buffer.items, range_buffer.items) |declaration, range| {
1569-
const name = names[@intFromEnum(declaration)];
15701578
symbols.appendAssumeCapacity(.{
1571-
.name = trigram_store.names.items[name.start..name.end],
1579+
.name = name,
15721580
.kind = .Variable,
15731581
.location = .{
15741582
.Location = .{
15751583
.uri = handle.uri,
1576-
.range = range,
1584+
.range = .{
1585+
.start = start_position,
1586+
.end = end_position,
1587+
},
15771588
},
15781589
},
15791590
});

src/TrigramStore.zig

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ pub const TrigramStore = @This();
1010

1111
pub const Trigram = [3]u8;
1212

13-
pub const NameSlice = struct { start: u32, end: u32 };
14-
pub const Loc = struct { start: u32, end: u32 };
15-
1613
pub const Declaration = struct {
1714
pub const Index = enum(u32) { _ };
1815

19-
name: NameSlice,
20-
loc: Loc,
16+
name: Ast.TokenIndex,
2117
};
2218

2319
has_filter: bool,
@@ -55,7 +51,6 @@ pub fn init(
5551
.fn_proto_multi,
5652
.fn_proto_one,
5753
.fn_proto_simple,
58-
.fn_decl,
5954
=> |tag| skip: {
6055
context.in_function = tag == .fn_decl;
6156

@@ -90,15 +85,11 @@ pub fn init(
9085
else => {},
9186
}
9287

93-
if (name_token_maybe) |name_token| skip: {
94-
const loc = offsets.tokenToLoc(cb_tree, name_token);
95-
const name = offsets.locToSlice(cb_tree.source, loc);
96-
if (name.len < 3) break :skip;
97-
88+
if (name_token_maybe) |name_token| {
9889
try context.store.appendDeclaration(
9990
context.allocator,
100-
name,
101-
.{ .start = @intCast(loc.start), .end = @intCast(loc.end) },
91+
cb_tree,
92+
name_token,
10293
);
10394
}
10495

@@ -166,23 +157,15 @@ pub fn deinit(store: *TrigramStore, allocator: std.mem.Allocator) void {
166157
fn appendDeclaration(
167158
store: *TrigramStore,
168159
allocator: std.mem.Allocator,
169-
name: []const u8,
170-
loc: Loc,
160+
tree: Ast,
161+
name_token: Ast.TokenIndex,
171162
) error{OutOfMemory}!void {
172-
assert(name.len >= 3);
173-
174-
const name_slice: NameSlice = blk: {
175-
const start = store.names.items.len;
176-
try store.names.appendSlice(allocator, name);
177-
break :blk .{
178-
.start = @intCast(start),
179-
.end = @intCast(store.names.items.len),
180-
};
181-
};
163+
const loc = offsets.identifierTokenToNameLoc(tree, name_token);
164+
const name = offsets.locToSlice(tree.source, loc);
165+
if (name.len < 3) return;
182166

183167
try store.declarations.append(allocator, .{
184-
.name = name_slice,
185-
.loc = loc,
168+
.name = name_token,
186169
});
187170

188171
for (0..name.len - 2) |index| {

0 commit comments

Comments
 (0)