From d7db53247d5ee56b4b076dee3fc6cfb933b004c3 Mon Sep 17 00:00:00 2001 From: nullptrdevs <16590917+nullptrdevs@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:08:07 -0800 Subject: [PATCH] make genfile step + microzig --- src/Server.zig | 20 ++++++++++---------- src/analysis.zig | 15 +++++++++++++-- src/build_runner/0.11.0.zig | 24 +++++++++++++++++++++++- src/build_runner/master.zig | 24 +++++++++++++++++++++++- 4 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/Server.zig b/src/Server.zig index d3519c9fb5..90b2e925d0 100644 --- a/src/Server.zig +++ b/src/Server.zig @@ -334,7 +334,7 @@ fn autofix(server: *Server, arena: std.mem.Allocator, handle: *DocumentStore.Han try diagnostics_gen.getAstCheckDiagnostics(server, arena, handle, &diagnostics); if (diagnostics.items.len == 0) return .{}; - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); var builder = code_actions.Builder{ @@ -1231,7 +1231,7 @@ fn semanticTokensFullHandler(server: *Server, arena: std.mem.Allocator, request: const handle = server.document_store.getHandle(request.textDocument.uri) orelse return null; - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); return try semantic_tokens.writeSemanticTokens( @@ -1250,7 +1250,7 @@ fn semanticTokensRangeHandler(server: *Server, arena: std.mem.Allocator, request const handle = server.document_store.getHandle(request.textDocument.uri) orelse return null; const loc = offsets.rangeToLoc(handle.tree.source, request.range, server.offset_encoding); - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); return try semantic_tokens.writeSemanticTokens( @@ -1268,7 +1268,7 @@ fn completionHandler(server: *Server, arena: std.mem.Allocator, request: types.C const source_index = offsets.positionToIndex(handle.tree.source, request.position, server.offset_encoding); - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); return .{ @@ -1283,7 +1283,7 @@ fn signatureHelpHandler(server: *Server, arena: std.mem.Allocator, request: type const source_index = offsets.positionToIndex(handle.tree.source, request.position, server.offset_encoding); - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); const signature_info = (try signature_help.getSignatureInfo( @@ -1322,7 +1322,7 @@ fn gotoHandler( const handle = server.document_store.getHandle(request.textDocument.uri) orelse return null; const source_index = offsets.positionToIndex(handle.tree.source, request.position, server.offset_encoding); - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); const response = try goto.goto(&analyser, &server.document_store, arena, handle, source_index, kind, server.offset_encoding) orelse return null; @@ -1389,7 +1389,7 @@ fn hoverHandler(server: *Server, arena: std.mem.Allocator, request: types.HoverP const markup_kind: types.MarkupKind = if (server.client_capabilities.hover_supports_md) .markdown else .plaintext; - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); const response = hover_handler.hover(&analyser, arena, handle, source_index, markup_kind, server.offset_encoding); @@ -1482,7 +1482,7 @@ fn generalReferencesHandler(server: *Server, arena: std.mem.Allocator, request: const name = offsets.locToSlice(handle.tree.source, name_loc); const pos_context = try Analyser.getPositionContext(server.allocator, handle.tree.source, source_index, true); - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); // TODO: Make this work with branching types @@ -1566,7 +1566,7 @@ fn inlayHintHandler(server: *Server, arena: std.mem.Allocator, request: types.In const hover_kind: types.MarkupKind = if (server.client_capabilities.hover_supports_md) .markdown else .plaintext; const loc = offsets.rangeToLoc(handle.tree.source, request.range, server.offset_encoding); - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); return try inlay_hints.writeRangeInlayHint( @@ -1583,7 +1583,7 @@ fn inlayHintHandler(server: *Server, arena: std.mem.Allocator, request: types.In fn codeActionHandler(server: *Server, arena: std.mem.Allocator, request: types.CodeActionParams) Error!ResultType("textDocument/codeAction") { const handle = server.document_store.getHandle(request.textDocument.uri) orelse return null; - var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip); + var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip, handle); defer analyser.deinit(); var builder = code_actions.Builder{ diff --git a/src/analysis.zig b/src/analysis.zig index efcfcec1a7..1f8c6cacfe 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -25,15 +25,18 @@ resolved_callsites: std.AutoHashMapUnmanaged(Declaration.Param, ?TypeWithHandle) resolved_nodes: std.HashMapUnmanaged(NodeWithUri, ?TypeWithHandle, NodeWithUri.Context, std.hash_map.default_max_load_percentage) = .{}, /// used to detect recursion use_trail: NodeSet = .{}, +/// handle of the doc where the request originated +root_handle: *DocumentStore.Handle = undefined, const NodeSet = std.HashMapUnmanaged(NodeWithUri, void, NodeWithUri.Context, std.hash_map.default_max_load_percentage); -pub fn init(gpa: std.mem.Allocator, store: *DocumentStore, ip: *InternPool) Analyser { +pub fn init(gpa: std.mem.Allocator, store: *DocumentStore, ip: *InternPool, root_handle: *DocumentStore.Handle) Analyser { return .{ .gpa = gpa, .arena = std.heap.ArenaAllocator.init(gpa), .store = store, .ip = ip, + .root_handle = root_handle, }; } @@ -1449,7 +1452,15 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, node_handle: NodeWithHandle) e if (node_tags[import_param] != .string_literal) return null; const import_str = tree.tokenSlice(main_tokens[import_param]); - const import_uri = (try analyser.store.uriFromImportStr(analyser.arena.allocator(), handle.*, import_str[1 .. import_str.len - 1])) orelse return null; + const import_uri = (try analyser.store.uriFromImportStr( + analyser.arena.allocator(), + handle.*, + import_str[1 .. import_str.len - 1], + )) orelse (try analyser.store.uriFromImportStr( + analyser.arena.allocator(), + analyser.root_handle.*, + import_str[1 .. import_str.len - 1], + )) orelse return null; const new_handle = analyser.store.getOrLoadHandle(import_uri) orelse return null; diff --git a/src/build_runner/0.11.0.zig b/src/build_runner/0.11.0.zig index 570af65fee..79ade03462 100644 --- a/src/build_runner/0.11.0.zig +++ b/src/build_runner/0.11.0.zig @@ -315,6 +315,18 @@ fn getPkgConfigIncludes( } else |err| return err; } +fn reify(step: *Build.Step) anyerror!void { + var progress: std.Progress = .{}; + const main_progress_node = progress.start("", 0); + defer main_progress_node.end(); + + for (step.dependencies.items) |unknown_step| { + try reify(unknown_step); + } + + try step.make(main_progress_node); +} + // TODO: Having a copy of this is not very nice const copied_from_zig = struct { /// Copied from `std.Build.LazyPath.getPath2` and massaged a bit. @@ -322,7 +334,17 @@ const copied_from_zig = struct { switch (path) { .path => |p| return builder.pathFromRoot(p), .cwd_relative => |p| return pathFromCwd(builder, p), - .generated => |gen| return builder.pathFromRoot(gen.path orelse return null), + .generated => |gen| { + if (gen.path) |gen_path| + return builder.pathFromRoot(gen_path) + else { + reify(gen.step) catch return null; + if (gen.path) |gen_path| + return builder.pathFromRoot(gen_path) + else + return null; + } + }, } } diff --git a/src/build_runner/master.zig b/src/build_runner/master.zig index e7e5cb8cfd..c199b5c341 100644 --- a/src/build_runner/master.zig +++ b/src/build_runner/master.zig @@ -354,6 +354,18 @@ fn getPkgConfigIncludes( } else |err| return err; } +fn reify(step: *Build.Step) anyerror!void { + var progress: std.Progress = .{}; + const main_progress_node = progress.start("", 0); + defer main_progress_node.end(); + + for (step.dependencies.items) |unknown_step| { + try reify(unknown_step); + } + + try step.make(main_progress_node); +} + // TODO: Having a copy of this is not very nice const copied_from_zig = struct { /// Copied from `std.Build.LazyPath.getPath2` and massaged a bit. @@ -361,7 +373,17 @@ const copied_from_zig = struct { switch (path) { .path => |p| return builder.pathFromRoot(p), .cwd_relative => |p| return pathFromCwd(builder, p), - .generated => |gen| return builder.pathFromRoot(gen.path orelse return null), + .generated => |gen| { + if (gen.path) |gen_path| + return builder.pathFromRoot(gen_path) + else { + reify(gen.step) catch return null; + if (gen.path) |gen_path| + return builder.pathFromRoot(gen_path) + else + return null; + } + }, .dependency => |dep| return dep.dependency.builder.pathJoin(&[_][]const u8{ dep.dependency.builder.build_root.path.?, dep.sub_path,