From 2e379336b9d08fd9b44d9e24d4fb30548b8d5bf2 Mon Sep 17 00:00:00 2001 From: Auguste Rame Date: Thu, 14 Jul 2022 12:43:10 +0200 Subject: [PATCH 1/2] (Hopefully) fix configuration uri/memory bugs Closes #533 --- src/main.zig | 5 ++--- src/types.zig | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main.zig b/src/main.zig index 98a5763..92b0ebc 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1787,7 +1787,6 @@ fn requestConfiguration(arena: *std.heap.ArenaAllocator) !void { var comp_confi: [std.meta.fields(Config).len]types.ConfigurationParams.ConfigurationItem = undefined; inline for (std.meta.fields(Config)) |field, index| { comp_confi[index] = .{ - .scopeUri = "zls", .section = "zls." ++ field.name, }; } @@ -2189,7 +2188,7 @@ fn didChangeConfigurationHandler(arena: *std.heap.ArenaAllocator, id: types.Requ inline for (std.meta.fields(Config)) |field| { if (@field(req.params.settings, field.name)) |value| { logger.debug("setting configuration option '{s}' to '{any}'", .{ field.name, value }); - @field(config, field.name) = value; + @field(config, field.name) = if (@TypeOf(value) == []const u8) try gpa_state.allocator().dupe(u8, value) else value; } } } else if (client_capabilities.supports_configuration) @@ -2262,7 +2261,7 @@ fn processJsonRpc(arena: *std.heap.ArenaAllocator, parser: *std.json.Parser, jso if (value != .Null) { const new_value: field.field_type = switch (ft) { []const u8 => switch (value) { - .String => |s| s, + .String => |s| try gpa_state.allocator().dupe(u8, s), // TODO: Allocation model? (same with didChangeConfiguration); imo this isn't *that* bad but still else => @panic("Invalid configuration value"), // TODO: Handle this }, else => switch (ti) { diff --git a/src/types.zig b/src/types.zig index f8ba92e..c426267 100644 --- a/src/types.zig +++ b/src/types.zig @@ -398,7 +398,6 @@ pub const ConfigurationParams = struct { items: []const ConfigurationItem, pub const ConfigurationItem = struct { - scopeUri: ?[]const u8, section: ?[]const u8, }; }; From c640903c986badd806faf3290b274c4430c2635d Mon Sep 17 00:00:00 2001 From: Auguste Rame Date: Thu, 14 Jul 2022 14:44:22 +0200 Subject: [PATCH 2/2] Fix container function param completion Closes #521 --- src/analysis.zig | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/analysis.zig b/src/analysis.zig index 559a923..cbf2147 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -94,6 +94,31 @@ pub fn getFunctionSignature(tree: Ast, func: Ast.full.FnProto) []const u8 { return tree.source[start.start..end.end]; } +fn formatSnippetPlaceholder( + data: []const u8, + comptime fmt: []const u8, + options: std.fmt.FormatOptions, + writer: anytype, +) !void { + _ = fmt; + _ = options; + + var splitit = std.mem.split(u8, data, "}"); + while (splitit.next()) |segment| { + try writer.writeAll(segment); + if (splitit.index) |index| + if (data[index - 1] == '}') { + try writer.writeAll("\\}"); + }; + } +} + +const SnippetPlaceholderFormatter = std.fmt.Formatter(formatSnippetPlaceholder); + +fn fmtSnippetPlaceholder(bytes: []const u8) SnippetPlaceholderFormatter { + return .{ .data = bytes }; +} + /// Creates snippet insert text for a function. Caller owns returned memory. pub fn getFunctionSnippet(allocator: std.mem.Allocator, tree: Ast, func: Ast.full.FnProto, skip_self_param: bool) ![]const u8 { const name_index = func.name_token.?; @@ -127,7 +152,7 @@ pub fn getFunctionSnippet(allocator: std.mem.Allocator, tree: Ast, func: Ast.ful } if (param.name_token) |name_token| { - try buffer.appendSlice(tree.tokenSlice(name_token)); + try buf_stream.print("{}", .{fmtSnippetPlaceholder(tree.tokenSlice(name_token))}); try buffer.appendSlice(": "); } @@ -144,7 +169,7 @@ pub fn getFunctionSnippet(allocator: std.mem.Allocator, tree: Ast, func: Ast.ful const is_comma = tag == .comma; if (curr_token == end_token and is_comma) continue; - try buffer.appendSlice(tree.tokenSlice(curr_token)); + try buf_stream.print("{}", .{fmtSnippetPlaceholder(tree.tokenSlice(curr_token))}); if (is_comma or tag == .keyword_const) try buffer.append(' '); } } else unreachable;