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