Fix container function param completion

Closes #521
This commit is contained in:
Auguste Rame 2022-07-14 14:44:22 +02:00
parent 2e379336b9
commit c640903c98
No known key found for this signature in database
GPG Key ID: 3A5E3F90DF2AAEFE

View File

@ -94,6 +94,31 @@ pub fn getFunctionSignature(tree: Ast, func: Ast.full.FnProto) []const u8 {
return tree.source[start.start..end.end]; 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. /// 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 { 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.?; 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| { 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(": "); try buffer.appendSlice(": ");
} }
@ -144,7 +169,7 @@ pub fn getFunctionSnippet(allocator: std.mem.Allocator, tree: Ast, func: Ast.ful
const is_comma = tag == .comma; const is_comma = tag == .comma;
if (curr_token == end_token and is_comma) continue; 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(' '); if (is_comma or tag == .keyword_const) try buffer.append(' ');
} }
} else unreachable; } else unreachable;