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
|
/// 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;
|
const name_tok = func.name_token orelse unreachable;
|
||||||
|
|
||||||
var buffer = std.ArrayList(u8).init(allocator);
|
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();
|
var buf_stream = buffer.outStream();
|
||||||
|
|
||||||
for (func.paramsConst()) |param, param_num| {
|
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("${");
|
if (param_num != 0) try buffer.appendSlice(", ${") else try buffer.appendSlice("${");
|
||||||
|
|
||||||
try buf_stream.print("{}:", .{param_num + 1});
|
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).?;
|
const func = node.cast(std.zig.ast.Node.FnProto).?;
|
||||||
if (func.name_token) |name_token| {
|
if (func.name_token) |name_token| {
|
||||||
const use_snippets = config.enable_snippets and client_capabilities.supports_snippets;
|
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
|
else
|
||||||
|
false,
|
||||||
|
else => false,
|
||||||
|
};
|
||||||
|
} else
|
||||||
|
false;
|
||||||
|
|
||||||
|
break :blk try analysis.getFunctionSnippet(list.allocator, analysis_ctx.tree(), func, skip_self_param);
|
||||||
|
} else
|
||||||
null;
|
null;
|
||||||
|
|
||||||
const is_type_function = analysis.isTypeFunction(analysis_ctx.tree(), func);
|
const is_type_function = analysis.isTypeFunction(analysis_ctx.tree(), func);
|
||||||
|
Loading…
Reference in New Issue
Block a user