Detect self arguments and skip it when generating snippets
This commit is contained in:
parent
5a8e062118
commit
73b58abe51
@ -76,7 +76,7 @@ pub fn getFunctionSignature(tree: *ast.Tree, func: *ast.Node.FnProto) []const u8
|
||||
}
|
||||
|
||||
/// Gets a function snippet insert text
|
||||
pub fn getFunctionSnippet(allocator: *std.mem.Allocator, tree: *ast.Tree, func: *ast.Node.FnProto) ![]const u8 {
|
||||
pub fn getFunctionSnippet(allocator: *std.mem.Allocator, tree: *ast.Tree, func: *ast.Node.FnProto, skip_self_param: bool) ![]const u8 {
|
||||
const name_tok = func.name_token orelse unreachable;
|
||||
|
||||
var buffer = std.ArrayList(u8).init(allocator);
|
||||
@ -88,6 +88,7 @@ pub fn getFunctionSnippet(allocator: *std.mem.Allocator, tree: *ast.Tree, func:
|
||||
var buf_stream = buffer.outStream();
|
||||
|
||||
for (func.paramsConst()) |param, param_num| {
|
||||
if (skip_self_param and param_num == 0) continue;
|
||||
if (param_num != 0) try buffer.appendSlice(", ${") else try buffer.appendSlice("${");
|
||||
|
||||
try buf_stream.print("{}:", .{param_num + 1});
|
||||
|
19
src/main.zig
19
src/main.zig
@ -247,9 +247,24 @@ fn nodeToCompletion(
|
||||
const func = node.cast(std.zig.ast.Node.FnProto).?;
|
||||
if (func.name_token) |name_token| {
|
||||
const use_snippets = config.enable_snippets and client_capabilities.supports_snippets;
|
||||
const insert_text = if (use_snippets)
|
||||
try analysis.getFunctionSnippet(list.allocator, analysis_ctx.tree(), func)
|
||||
|
||||
const insert_text = if (use_snippets) blk: {
|
||||
const skip_self_param = if (func.params_len > 0) param_check: {
|
||||
var child_analysis_ctx = try analysis_ctx.clone();
|
||||
break :param_check switch (func.paramsConst()[0].param_type) {
|
||||
.type_expr => |type_node| if (analysis_ctx.in_container == analysis.resolveTypeOfNode(&child_analysis_ctx, type_node))
|
||||
true
|
||||
else if (type_node.cast(std.zig.ast.Node.PrefixOp)) |prefix_op|
|
||||
prefix_op.op == .PtrType and analysis_ctx.in_container == analysis.resolveTypeOfNode(&child_analysis_ctx, prefix_op.rhs)
|
||||
else
|
||||
false,
|
||||
else => false,
|
||||
};
|
||||
} else
|
||||
false;
|
||||
|
||||
break :blk try analysis.getFunctionSnippet(list.allocator, analysis_ctx.tree(), func, skip_self_param);
|
||||
} else
|
||||
null;
|
||||
|
||||
const is_type_function = analysis.isTypeFunction(analysis_ctx.tree(), func);
|
||||
|
Loading…
Reference in New Issue
Block a user