@@ -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 });
0 commit comments