@@ -36,6 +36,7 @@ const goto = @import("features/goto.zig");
3636const hover_handler = @import ("features/hover.zig" );
3737const selection_range = @import ("features/selection_range.zig" );
3838const diagnostics_gen = @import ("features/diagnostics.zig" );
39+ const TrigramStore = @import ("TrigramStore.zig" );
3940
4041const BuildOnSave = diagnostics_gen .BuildOnSave ;
4142const BuildOnSaveSupport = build_runner_shared .BuildOnSaveSupport ;
@@ -599,7 +600,7 @@ fn initializeHandler(server: *Server, arena: std.mem.Allocator, request: types.I
599600 .documentRangeFormattingProvider = .{ .bool = false },
600601 .foldingRangeProvider = .{ .bool = true },
601602 .selectionRangeProvider = .{ .bool = true },
602- .workspaceSymbolProvider = .{ .bool = false },
603+ .workspaceSymbolProvider = .{ .bool = true },
603604 .workspace = .{
604605 .workspaceFolders = .{
605606 .supported = true ,
@@ -1545,6 +1546,7 @@ fn openDocumentHandler(server: *Server, _: std.mem.Allocator, notification: type
15451546 return error .InternalError ;
15461547 }
15471548
1549+ try server .document_store .trigramIndexUri (notification .textDocument .uri , server .offset_encoding );
15481550 try server .document_store .openDocument (notification .textDocument .uri , notification .textDocument .text );
15491551
15501552 if (server .client_capabilities .supports_publish_diagnostics ) {
@@ -1923,6 +1925,111 @@ fn selectionRangeHandler(server: *Server, arena: std.mem.Allocator, request: typ
19231925 return try selection_range .generateSelectionRanges (arena , handle , request .positions , server .offset_encoding );
19241926}
19251927
1928+ fn workspaceSymbolHandler (server : * Server , arena : std.mem.Allocator , request : types.WorkspaceSymbolParams ) Error ! lsp. ResultType ("workspace/symbol" ) {
1929+ if (request .query .len < 3 ) return null ;
1930+
1931+ // for (server.client_capabilities.workspace_folders) |workspace_folder| {
1932+ // const path = URI.parse(arena, workspace_folder) catch return error.InternalError;
1933+ // var dir = std.fs.cwd().openDir(path, .{ .iterate = true }) catch return error.InternalError;
1934+ // defer dir.close();
1935+
1936+ // var walker = try dir.walk(arena);
1937+ // defer walker.deinit();
1938+
1939+ // while (walker.next() catch return error.InternalError) |entry| {
1940+ // if (std.mem.eql(u8, std.fs.path.extension(entry.basename), ".zig")) {
1941+ // const uri = URI.pathRelative(arena, workspace_folder, entry.path) catch return error.InternalError;
1942+ // _ = try server.document_store.getOrConstructTrigramStore(uri);
1943+ // }
1944+ // }
1945+ // }
1946+
1947+ var symbols : std .ArrayListUnmanaged (types .WorkspaceSymbol ) = .empty ;
1948+ var declaration_buffer : std .ArrayListUnmanaged (TrigramStore .Declaration .Index ) = .empty ;
1949+
1950+ for (
1951+ server .document_store .trigram_stores .keys (),
1952+ server .document_store .trigram_stores .values (),
1953+ ) | uri , trigram_store | {
1954+ try trigram_store .declarationsForQuery (arena , request .query , & declaration_buffer );
1955+
1956+ const slice = trigram_store .declarations .slice ();
1957+ const names = slice .items (.name );
1958+ const ranges = slice .items (.range );
1959+
1960+ for (declaration_buffer .items ) | declaration | {
1961+ const name = names [@intFromEnum (declaration )];
1962+ const range = ranges [@intFromEnum (declaration )];
1963+ try symbols .append (arena , .{
1964+ .name = trigram_store .names .items [name .start .. name .end ],
1965+ .kind = .Variable ,
1966+ .location = .{
1967+ .Location = .{
1968+ .uri = uri ,
1969+ .range = range ,
1970+ },
1971+ },
1972+ });
1973+ }
1974+ }
1975+
1976+ // var symbols = std.ArrayListUnmanaged(types.WorkspaceSymbol){};
1977+ // var candidate_decls_buffer = std.ArrayListUnmanaged(Analyser.Declaration.Index){};
1978+
1979+ // doc_loop: for (server.document_store.trigram_stores.keys(), server.document_store.trigram_stores.values()) |uri, trigram_store| {
1980+ // const handle = server.document_store.getOrLoadHandle(uri) orelse continue;
1981+
1982+ // const tree = handle.tree;
1983+ // const doc_scope = try handle.getDocumentScope();
1984+
1985+ // for (trigrams.items) |trigram| {
1986+ // if (!trigram_store.filter.contain(@bitCast(trigram))) continue :doc_loop;
1987+ // }
1988+
1989+ // candidate_decls_buffer.clearRetainingCapacity();
1990+
1991+ // const first = trigram_store.getDeclarationsForTrigram(trigrams.items[0]) orelse continue;
1992+
1993+ // try candidate_decls_buffer.resize(arena, first.len * 2);
1994+
1995+ // var len = first.len;
1996+
1997+ // @memcpy(candidate_decls_buffer.items[0..len], first);
1998+ // @memcpy(candidate_decls_buffer.items[len..], first);
1999+
2000+ // for (trigrams.items[1..]) |trigram| {
2001+ // len = workspace_symbols.mergeIntersection(
2002+ // trigram_store.getDeclarationsForTrigram(trigram) orelse continue :doc_loop,
2003+ // candidate_decls_buffer.items[len..],
2004+ // candidate_decls_buffer.items[0..len],
2005+ // );
2006+ // candidate_decls_buffer.items.len = len * 2;
2007+ // @memcpy(candidate_decls_buffer.items[len..], candidate_decls_buffer.items[0..len]);
2008+ // }
2009+
2010+ // candidate_decls_buffer.items.len = len;
2011+
2012+ // for (candidate_decls_buffer.items) |decl_idx| {
2013+ // const decl = doc_scope.declarations.get(@intFromEnum(decl_idx));
2014+ // const name_token = decl.nameToken(tree);
2015+
2016+ // // TODO: integrate with document_symbol.zig for right kind info
2017+ // try symbols.append(arena, .{
2018+ // .name = tree.tokenSlice(name_token),
2019+ // .kind = .Variable,
2020+ // .location = .{
2021+ // .Location = .{
2022+ // .uri = handle.uri,
2023+ // .range = offsets.tokenToRange(tree, name_token, server.offset_encoding),
2024+ // },
2025+ // },
2026+ // });
2027+ // }
2028+ // }
2029+
2030+ return .{ .array_of_WorkspaceSymbol = symbols .items };
2031+ }
2032+
19262033const HandledRequestParams = union (enum ) {
19272034 initialize : types.InitializeParams ,
19282035 shutdown ,
@@ -1946,6 +2053,7 @@ const HandledRequestParams = union(enum) {
19462053 @"textDocument/codeAction" : types.CodeActionParams ,
19472054 @"textDocument/foldingRange" : types.FoldingRangeParams ,
19482055 @"textDocument/selectionRange" : types.SelectionRangeParams ,
2056+ @"workspace/symbol" : types.WorkspaceSymbolParams ,
19492057 other : lsp.MethodWithParams ,
19502058};
19512059
@@ -1990,6 +2098,7 @@ fn isBlockingMessage(msg: Message) bool {
19902098 .@"textDocument/codeAction" ,
19912099 .@"textDocument/foldingRange" ,
19922100 .@"textDocument/selectionRange" ,
2101+ .@"workspace/symbol" ,
19932102 = > return false ,
19942103 .other = > return false ,
19952104 },
@@ -2164,6 +2273,7 @@ pub fn sendRequestSync(server: *Server, arena: std.mem.Allocator, comptime metho
21642273 .@"textDocument/codeAction" = > try server .codeActionHandler (arena , params ),
21652274 .@"textDocument/foldingRange" = > try server .foldingRangeHandler (arena , params ),
21662275 .@"textDocument/selectionRange" = > try server .selectionRangeHandler (arena , params ),
2276+ .@"workspace/symbol" = > try server .workspaceSymbolHandler (arena , params ),
21672277 .other = > return null ,
21682278 };
21692279}
0 commit comments