@@ -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 ;
@@ -598,7 +599,7 @@ fn initializeHandler(server: *Server, arena: std.mem.Allocator, request: types.I
598599 .documentRangeFormattingProvider = .{ .bool = false },
599600 .foldingRangeProvider = .{ .bool = true },
600601 .selectionRangeProvider = .{ .bool = true },
601- .workspaceSymbolProvider = .{ .bool = false },
602+ .workspaceSymbolProvider = .{ .bool = true },
602603 .workspace = .{
603604 .workspaceFolders = .{
604605 .supported = true ,
@@ -1549,6 +1550,7 @@ fn openDocumentHandler(server: *Server, _: std.mem.Allocator, notification: type
15491550 return error .InternalError ;
15501551 }
15511552
1553+ try server .document_store .trigramIndexUri (notification .textDocument .uri , server .offset_encoding );
15521554 try server .document_store .openDocument (notification .textDocument .uri , notification .textDocument .text );
15531555
15541556 if (server .client_capabilities .supports_publish_diagnostics ) {
@@ -1927,6 +1929,111 @@ fn selectionRangeHandler(server: *Server, arena: std.mem.Allocator, request: typ
19271929 return try selection_range .generateSelectionRanges (arena , handle , request .positions , server .offset_encoding );
19281930}
19291931
1932+ fn workspaceSymbolHandler (server : * Server , arena : std.mem.Allocator , request : types.WorkspaceSymbolParams ) Error ! lsp. ResultType ("workspace/symbol" ) {
1933+ if (request .query .len < 3 ) return null ;
1934+
1935+ // for (server.client_capabilities.workspace_folders) |workspace_folder| {
1936+ // const path = URI.parse(arena, workspace_folder) catch return error.InternalError;
1937+ // var dir = std.fs.cwd().openDir(path, .{ .iterate = true }) catch return error.InternalError;
1938+ // defer dir.close();
1939+
1940+ // var walker = try dir.walk(arena);
1941+ // defer walker.deinit();
1942+
1943+ // while (walker.next() catch return error.InternalError) |entry| {
1944+ // if (std.mem.eql(u8, std.fs.path.extension(entry.basename), ".zig")) {
1945+ // const uri = URI.pathRelative(arena, workspace_folder, entry.path) catch return error.InternalError;
1946+ // _ = try server.document_store.getOrConstructTrigramStore(uri);
1947+ // }
1948+ // }
1949+ // }
1950+
1951+ var symbols : std .ArrayListUnmanaged (types .WorkspaceSymbol ) = .empty ;
1952+ var declaration_buffer : std .ArrayListUnmanaged (TrigramStore .Declaration .Index ) = .empty ;
1953+
1954+ for (
1955+ server .document_store .trigram_stores .keys (),
1956+ server .document_store .trigram_stores .values (),
1957+ ) | uri , trigram_store | {
1958+ try trigram_store .declarationsForQuery (arena , request .query , & declaration_buffer );
1959+
1960+ const slice = trigram_store .declarations .slice ();
1961+ const names = slice .items (.name );
1962+ const ranges = slice .items (.range );
1963+
1964+ for (declaration_buffer .items ) | declaration | {
1965+ const name = names [@intFromEnum (declaration )];
1966+ const range = ranges [@intFromEnum (declaration )];
1967+ try symbols .append (arena , .{
1968+ .name = trigram_store .names .items [name .start .. name .end ],
1969+ .kind = .Variable ,
1970+ .location = .{
1971+ .Location = .{
1972+ .uri = uri ,
1973+ .range = range ,
1974+ },
1975+ },
1976+ });
1977+ }
1978+ }
1979+
1980+ // var symbols = std.ArrayListUnmanaged(types.WorkspaceSymbol){};
1981+ // var candidate_decls_buffer = std.ArrayListUnmanaged(Analyser.Declaration.Index){};
1982+
1983+ // doc_loop: for (server.document_store.trigram_stores.keys(), server.document_store.trigram_stores.values()) |uri, trigram_store| {
1984+ // const handle = server.document_store.getOrLoadHandle(uri) orelse continue;
1985+
1986+ // const tree = handle.tree;
1987+ // const doc_scope = try handle.getDocumentScope();
1988+
1989+ // for (trigrams.items) |trigram| {
1990+ // if (!trigram_store.filter.contain(@bitCast(trigram))) continue :doc_loop;
1991+ // }
1992+
1993+ // candidate_decls_buffer.clearRetainingCapacity();
1994+
1995+ // const first = trigram_store.getDeclarationsForTrigram(trigrams.items[0]) orelse continue;
1996+
1997+ // try candidate_decls_buffer.resize(arena, first.len * 2);
1998+
1999+ // var len = first.len;
2000+
2001+ // @memcpy(candidate_decls_buffer.items[0..len], first);
2002+ // @memcpy(candidate_decls_buffer.items[len..], first);
2003+
2004+ // for (trigrams.items[1..]) |trigram| {
2005+ // len = workspace_symbols.mergeIntersection(
2006+ // trigram_store.getDeclarationsForTrigram(trigram) orelse continue :doc_loop,
2007+ // candidate_decls_buffer.items[len..],
2008+ // candidate_decls_buffer.items[0..len],
2009+ // );
2010+ // candidate_decls_buffer.items.len = len * 2;
2011+ // @memcpy(candidate_decls_buffer.items[len..], candidate_decls_buffer.items[0..len]);
2012+ // }
2013+
2014+ // candidate_decls_buffer.items.len = len;
2015+
2016+ // for (candidate_decls_buffer.items) |decl_idx| {
2017+ // const decl = doc_scope.declarations.get(@intFromEnum(decl_idx));
2018+ // const name_token = decl.nameToken(tree);
2019+
2020+ // // TODO: integrate with document_symbol.zig for right kind info
2021+ // try symbols.append(arena, .{
2022+ // .name = tree.tokenSlice(name_token),
2023+ // .kind = .Variable,
2024+ // .location = .{
2025+ // .Location = .{
2026+ // .uri = handle.uri,
2027+ // .range = offsets.tokenToRange(tree, name_token, server.offset_encoding),
2028+ // },
2029+ // },
2030+ // });
2031+ // }
2032+ // }
2033+
2034+ return .{ .array_of_WorkspaceSymbol = symbols .items };
2035+ }
2036+
19302037const HandledRequestParams = union (enum ) {
19312038 initialize : types.InitializeParams ,
19322039 shutdown ,
@@ -1950,6 +2057,7 @@ const HandledRequestParams = union(enum) {
19502057 @"textDocument/codeAction" : types.CodeActionParams ,
19512058 @"textDocument/foldingRange" : types.FoldingRangeParams ,
19522059 @"textDocument/selectionRange" : types.SelectionRangeParams ,
2060+ @"workspace/symbol" : types.WorkspaceSymbolParams ,
19532061 other : lsp.MethodWithParams ,
19542062};
19552063
@@ -1994,6 +2102,7 @@ fn isBlockingMessage(msg: Message) bool {
19942102 .@"textDocument/codeAction" ,
19952103 .@"textDocument/foldingRange" ,
19962104 .@"textDocument/selectionRange" ,
2105+ .@"workspace/symbol" ,
19972106 = > return false ,
19982107 .other = > return false ,
19992108 },
@@ -2168,6 +2277,7 @@ pub fn sendRequestSync(server: *Server, arena: std.mem.Allocator, comptime metho
21682277 .@"textDocument/codeAction" = > try server .codeActionHandler (arena , params ),
21692278 .@"textDocument/foldingRange" = > try server .foldingRangeHandler (arena , params ),
21702279 .@"textDocument/selectionRange" = > try server .selectionRangeHandler (arena , params ),
2280+ .@"workspace/symbol" = > try server .workspaceSymbolHandler (arena , params ),
21712281 .other = > return null ,
21722282 };
21732283}
0 commit comments