From 178e823d77a099a099a64d3269ce9e913f86dac9 Mon Sep 17 00:00:00 2001 From: Yuri Pieters Date: Fri, 24 Jun 2022 01:40:07 +0100 Subject: [PATCH 1/9] Ease debugging package loading from build_runner --- src/DocumentStore.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/DocumentStore.zig b/src/DocumentStore.zig index bf4b662..eef7316 100644 --- a/src/DocumentStore.zig +++ b/src/DocumentStore.zig @@ -190,6 +190,8 @@ fn loadPackages(context: LoadPackagesContext) !void { }; } } + } else { + return error.RunFailed; } }, else => return error.RunFailed, @@ -268,7 +270,7 @@ fn newDocument(self: *DocumentStore, uri: []const u8, text: [:0]u8) anyerror!*Ha .cache_root = self.zig_cache_root, .global_cache_root = self.zig_global_cache_root, }) catch |err| { - log.debug("Failed to load packages of build file {s} (error: {})", .{ build_file.uri, err }); + log.warn("Failed to load packages of build file {s} (error: {})", .{ build_file.uri, err }); }; try self.build_files.append(self.allocator, build_file); @@ -537,7 +539,7 @@ pub fn applySave(self: *DocumentStore, handle: *Handle) !void { .cache_root = self.zig_cache_root, .global_cache_root = self.zig_global_cache_root, }) catch |err| { - log.debug("Failed to load packages of build file {s} (error: {})", .{ build_file.uri, err }); + log.warn("Failed to load packages of build file {s} (error: {})", .{ build_file.uri, err }); }; } } From e9e4a1522465ae21ea6568135e4c07378713489e Mon Sep 17 00:00:00 2001 From: Lee Cannon Date: Sun, 26 Jun 2022 01:15:20 +0100 Subject: [PATCH 2/9] fix memory leak --- src/main.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main.zig b/src/main.zig index 8429e6f..a55e22b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1874,6 +1874,8 @@ pub fn main() anyerror!void { if (!args_it.skip()) @panic("Could not find self argument"); var config_path: ?[]const u8 = null; + defer if (config_path) |path| allocator.free(path); + var next_arg_config_path = false; while (args_it.next()) |arg| { if (next_arg_config_path) { @@ -1913,13 +1915,14 @@ pub fn main() anyerror!void { config_read: { if (config_path) |path| { - defer allocator.free(path); if (loadConfigFile(path)) |conf| { config = conf; break :config_read; } std.debug.print("Could not open configuration file '{s}'\n", .{path}); std.debug.print("Falling back to a lookup in the local and global configuration folders\n", .{}); + allocator.free(path); + config_path = null; } if (try known_folders.getPath(allocator, .local_configuration)) |path| { config_path = path; From b625eb763eca0b4a73c323a21a5cc82f9eae8caa Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Wed, 22 Jun 2022 02:21:21 +0200 Subject: [PATCH 3/9] Sort completion items --- src/main.zig | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main.zig b/src/main.zig index a55e22b..b527c36 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1076,6 +1076,9 @@ fn completeLabel(arena: *std.heap.ArenaAllocator, id: types.RequestId, pos_index .orig_handle = handle, }; try analysis.iterateLabels(handle, pos_index, declToCompletion, context); + + + sortCompletionItems(completions.items, config); truncateCompletions(completions.items, config.max_detail_length); try send(arena, types.Response{ @@ -1148,6 +1151,8 @@ fn completeGlobal(arena: *std.heap.ArenaAllocator, id: types.RequestId, pos_inde .orig_handle = handle, }; try analysis.iterateSymbolsGlobal(&document_store, arena, handle, pos_index, declToCompletion, context); + + sortCompletionItems(completions.items, config); truncateCompletions(completions.items, config.max_detail_length); try send(arena, types.Response{ @@ -1175,6 +1180,8 @@ fn completeFieldAccess(arena: *std.heap.ArenaAllocator, id: types.RequestId, han if (try analysis.getFieldAccessType(&document_store, arena, handle, position.absolute_index, &tokenizer)) |result| { held_range.release(); try typeToCompletion(arena, &completions, result, handle, config); + + sortCompletionItems(completions.items, config); truncateCompletions(completions.items, config.max_detail_length); } @@ -1193,7 +1200,8 @@ fn completeError(arena: *std.heap.ArenaAllocator, id: types.RequestId, handle: * const tracy_zone = tracy.trace(@src()); defer tracy_zone.end(); - const completions = try document_store.errorCompletionItems(arena, handle); + var completions = try document_store.errorCompletionItems(arena, handle); + truncateCompletions(completions, config.max_detail_length); logger.debug("Completing error:", .{}); @@ -1208,11 +1216,39 @@ fn completeError(arena: *std.heap.ArenaAllocator, id: types.RequestId, handle: * }); } +fn kindToSortScore(kind: types.CompletionItem.Kind) [] const u8 { + return switch (kind) + { + .Variable => "2_", + .Field => "3_", + .Function => "4_", + + .Keyword, + .EnumMember => "5_", + + .Class, + .Interface, + .Struct, + // Union? + .TypeParameter => "6_", + + else => "9_" + }; +} + +fn sortCompletionItems(completions: []types.CompletionItem, config: *const Config) void { + // TODO: config for sorting rule? + for (completions) |*c| { + c.sortText = kindToSortScore(c.kind); + } +} + fn completeDot(arena: *std.heap.ArenaAllocator, id: types.RequestId, handle: *DocumentStore.Handle, config: *const Config) !void { const tracy_zone = tracy.trace(@src()); defer tracy_zone.end(); var completions = try document_store.enumCompletionItems(arena, handle); + sortCompletionItems(completions, config); truncateCompletions(completions, config.max_detail_length); try send(arena, types.Response{ From 64fe8a6b031a416eba8317686741c804fafa4e61 Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Wed, 22 Jun 2022 02:22:13 +0200 Subject: [PATCH 4/9] Add sortText to CompletionItem struct --- src/types.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types.zig b/src/types.zig index 805d895..b75dd62 100644 --- a/src/types.zig +++ b/src/types.zig @@ -248,6 +248,7 @@ pub const CompletionItem = struct { insertTextFormat: ?InsertTextFormat = .PlainText, detail: ?string = null, documentation: ?MarkupContent = null, + sortText: ?string = null, }; pub const DocumentSymbol = struct { From 1abf3289474f7819484e2218cc6d7995adcf4ce6 Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Wed, 22 Jun 2022 02:25:17 +0200 Subject: [PATCH 5/9] Cleanup --- src/main.zig | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.zig b/src/main.zig index b527c36..3ec5aae 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1076,8 +1076,6 @@ fn completeLabel(arena: *std.heap.ArenaAllocator, id: types.RequestId, pos_index .orig_handle = handle, }; try analysis.iterateLabels(handle, pos_index, declToCompletion, context); - - sortCompletionItems(completions.items, config); truncateCompletions(completions.items, config.max_detail_length); @@ -1236,7 +1234,7 @@ fn kindToSortScore(kind: types.CompletionItem.Kind) [] const u8 { }; } -fn sortCompletionItems(completions: []types.CompletionItem, config: *const Config) void { +fn sortCompletionItems(completions: []types.CompletionItem, _: *const Config) void { // TODO: config for sorting rule? for (completions) |*c| { c.sortText = kindToSortScore(c.kind); From 03f27ef1453ec7f0633f112a5878e00287065505 Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Thu, 23 Jun 2022 00:43:12 +0200 Subject: [PATCH 6/9] Make Kind public --- src/types.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types.zig b/src/types.zig index b75dd62..aaafcf4 100644 --- a/src/types.zig +++ b/src/types.zig @@ -208,7 +208,7 @@ pub const InsertTextFormat = enum(i64) { }; pub const CompletionItem = struct { - const Kind = enum(i64) { + pub const Kind = enum(i64) { Text = 1, Method = 2, Function = 3, From 2fdb05f78306b8597c47685b86ee60007d7e45ee Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Fri, 24 Jun 2022 11:20:06 +0200 Subject: [PATCH 7/9] Append the actual label so it can then be sorted a-z --- src/main.zig | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main.zig b/src/main.zig index 3ec5aae..a0e9cad 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1076,7 +1076,7 @@ fn completeLabel(arena: *std.heap.ArenaAllocator, id: types.RequestId, pos_index .orig_handle = handle, }; try analysis.iterateLabels(handle, pos_index, declToCompletion, context); - sortCompletionItems(completions.items, config); + sortCompletionItems(completions.items, config, arena.allocator()); truncateCompletions(completions.items, config.max_detail_length); try send(arena, types.Response{ @@ -1150,7 +1150,7 @@ fn completeGlobal(arena: *std.heap.ArenaAllocator, id: types.RequestId, pos_inde }; try analysis.iterateSymbolsGlobal(&document_store, arena, handle, pos_index, declToCompletion, context); - sortCompletionItems(completions.items, config); + sortCompletionItems(completions.items, config, arena.allocator()); truncateCompletions(completions.items, config.max_detail_length); try send(arena, types.Response{ @@ -1179,7 +1179,7 @@ fn completeFieldAccess(arena: *std.heap.ArenaAllocator, id: types.RequestId, han held_range.release(); try typeToCompletion(arena, &completions, result, handle, config); - sortCompletionItems(completions.items, config); + sortCompletionItems(completions.items, config, arena.allocator()); truncateCompletions(completions.items, config.max_detail_length); } @@ -1234,10 +1234,16 @@ fn kindToSortScore(kind: types.CompletionItem.Kind) [] const u8 { }; } -fn sortCompletionItems(completions: []types.CompletionItem, _: *const Config) void { +fn sortCompletionItems(completions: []types.CompletionItem, _: *const Config, alloc: std.mem.Allocator) void { // TODO: config for sorting rule? for (completions) |*c| { c.sortText = kindToSortScore(c.kind); + + if (alloc.alloc(u8, 2 + c.label.len)) |it| { + std.mem.copy(u8, it, c.sortText.?); + std.mem.copy(u8, it[2 .. ], c.label); + c.sortText = it; + } else |_| {} } } @@ -1246,7 +1252,7 @@ fn completeDot(arena: *std.heap.ArenaAllocator, id: types.RequestId, handle: *Do defer tracy_zone.end(); var completions = try document_store.enumCompletionItems(arena, handle); - sortCompletionItems(completions, config); + sortCompletionItems(completions, config, arena.allocator()); truncateCompletions(completions, config.max_detail_length); try send(arena, types.Response{ From 9101cc7c3ffef4cb16e54bd650d6b7a6bdd7bb33 Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Fri, 24 Jun 2022 11:26:57 +0200 Subject: [PATCH 8/9] Put constants/imports at the top --- src/main.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.zig b/src/main.zig index a0e9cad..3887f58 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1217,6 +1217,8 @@ fn completeError(arena: *std.heap.ArenaAllocator, id: types.RequestId, handle: * fn kindToSortScore(kind: types.CompletionItem.Kind) [] const u8 { return switch (kind) { + .Constant => "1_", + .Variable => "2_", .Field => "3_", .Function => "4_", From 7fa58ae1b86b2f8c522aba24eb3896d2117cf49d Mon Sep 17 00:00:00 2001 From: ryuukk <44361234+ryuukk@users.noreply.github.com> Date: Fri, 24 Jun 2022 11:27:53 +0200 Subject: [PATCH 9/9] Update test --- tests/sessions.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sessions.zig b/tests/sessions.zig index 9c5a350..5f4d84a 100644 --- a/tests/sessions.zig +++ b/tests/sessions.zig @@ -186,7 +186,7 @@ test "Request completion with no trailing whitespace" { try server.request("textDocument/completion", \\{"textDocument":{"uri":"file:///test.zig"}, "position":{"line":1,"character":1}} , - \\{"isIncomplete":false,"items":[{"label":"std","kind":21,"textEdit":null,"filterText":null,"insertText":"std","insertTextFormat":1,"detail":"const std = @import(\"std\")","documentation":null}]} + \\{"isIncomplete":false,"items":[{"label":"std","kind":21,"textEdit":null,"filterText":null,"insertText":"std","insertTextFormat":1,"detail":"const std = @import(\"std\")","documentation":null,"sortText":"1_std"}]} ); }