Skip to content

Commit 7321d23

Browse files
committed
reduce size of TrigramStore.Declaration
1 parent db2cc17 commit 7321d23

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
@@ -1524,43 +1524,54 @@ fn workspaceSymbolHandler(server: *Server, arena: std.mem.Allocator, request: ty
15241524

15251525
var symbols: std.ArrayListUnmanaged(types.WorkspaceSymbol) = .empty;
15261526
var declaration_buffer: std.ArrayListUnmanaged(TrigramStore.Declaration.Index) = .empty;
1527-
var loc_buffer: std.ArrayListUnmanaged(offsets.Loc) = .empty;
1528-
var range_buffer: std.ArrayListUnmanaged(offsets.Range) = .empty;
15291527

15301528
for (handles) |handle| {
15311529
const trigram_store = handle.getTrigramStoreCached();
15321530

15331531
declaration_buffer.clearRetainingCapacity();
15341532
try trigram_store.declarationsForQuery(arena, request.query, &declaration_buffer);
15351533

1534+
const SortContext = struct {
1535+
names: []const std.zig.Ast.TokenIndex,
1536+
fn lessThan(ctx: @This(), lhs: TrigramStore.Declaration.Index, rhs: TrigramStore.Declaration.Index) bool {
1537+
return ctx.names[@intFromEnum(lhs)] < ctx.names[@intFromEnum(rhs)];
1538+
}
1539+
};
1540+
1541+
std.mem.sortUnstable(
1542+
TrigramStore.Declaration.Index,
1543+
declaration_buffer.items,
1544+
SortContext{ .names = trigram_store.declarations.items(.name) },
1545+
SortContext.lessThan,
1546+
);
1547+
15361548
const slice = trigram_store.declarations.slice();
15371549
const names = slice.items(.name);
1538-
const locs = slice.items(.loc);
15391550

1540-
{
1541-
// Convert `offsets.Loc` to `offsets.Range`
1551+
var last_index: usize = 0;
1552+
var last_position: offsets.Position = .{ .line = 0, .character = 0 };
15421553

1543-
try loc_buffer.resize(arena, declaration_buffer.items.len);
1544-
try range_buffer.resize(arena, declaration_buffer.items.len);
1554+
try symbols.ensureUnusedCapacity(arena, declaration_buffer.items.len);
1555+
for (declaration_buffer.items) |declaration| {
1556+
const name_token = names[@intFromEnum(declaration)];
1557+
const loc = offsets.identifierTokenToNameLoc(handle.tree, name_token);
1558+
const name = offsets.identifierTokenToNameSlice(handle.tree, name_token);
15451559

1546-
for (declaration_buffer.items, loc_buffer.items) |declaration, *loc| {
1547-
const small_loc = locs[@intFromEnum(declaration)];
1548-
loc.* = .{ .start = small_loc.start, .end = small_loc.end };
1549-
}
1560+
const start_position = offsets.advancePosition(handle.tree.source, last_position, last_index, loc.start, server.offset_encoding);
1561+
const end_position = offsets.advancePosition(handle.tree.source, start_position, loc.start, loc.end, server.offset_encoding);
1562+
last_index = loc.end;
1563+
last_position = end_position;
15501564

1551-
try offsets.multiple.locToRange(arena, handle.tree.source, loc_buffer.items, range_buffer.items, server.offset_encoding);
1552-
}
1553-
1554-
try symbols.ensureUnusedCapacity(arena, declaration_buffer.items.len);
1555-
for (declaration_buffer.items, range_buffer.items) |declaration, range| {
1556-
const name = names[@intFromEnum(declaration)];
15571565
symbols.appendAssumeCapacity(.{
1558-
.name = trigram_store.names.items[name.start..name.end],
1566+
.name = name,
15591567
.kind = .Variable,
15601568
.location = .{
15611569
.Location = .{
15621570
.uri = handle.uri,
1563-
.range = range,
1571+
.range = .{
1572+
.start = start_position,
1573+
.end = end_position,
1574+
},
15641575
},
15651576
},
15661577
});

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)