Skip to content

Commit d94b8e8

Browse files
FnControlOptionTechatrix
authored andcommitted
Omit completion braces for zero-bit field of tagged union
1 parent 4b56f74 commit d94b8e8

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

src/features/completions.zig

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,7 @@ fn collectContainerFields(
13821382
const decl = document_scope.declarations.get(@intFromEnum(decl_index));
13831383
if (decl != .ast_node) continue;
13841384
const decl_handle: Analyser.DeclWithHandle = .{ .decl = decl, .handle = scope_handle.handle, .container_type = container };
1385+
const maybe_resolved_ty = try decl_handle.resolveType(builder.analyser);
13851386
const tree = scope_handle.handle.tree;
13861387

13871388
const name = offsets.tokenToSlice(tree, decl.nameToken(tree));
@@ -1396,6 +1397,14 @@ fn collectContainerFields(
13961397

13971398
const insert_text = insert_text: {
13981399
if (likely != .struct_field and likely != .enum_comparison and likely != .switch_case and !field.ast.tuple_like) {
1400+
if (container.isTaggedUnion() and
1401+
maybe_resolved_ty != null and
1402+
maybe_resolved_ty.?.data == .ip_index and
1403+
maybe_resolved_ty.?.data.ip_index.type != .unknown_type and
1404+
builder.analyser.ip.onePossibleValue(maybe_resolved_ty.?.data.ip_index.type) != .none)
1405+
{
1406+
break :insert_text name;
1407+
}
13991408
if (use_snippets)
14001409
break :insert_text try std.fmt.allocPrint(builder.arena, "{{ .{s} = $1 }}$0", .{name})
14011410
else
@@ -1419,7 +1428,7 @@ fn collectContainerFields(
14191428
break :insert_text try std.fmt.allocPrint(builder.arena, "{s} = ", .{name});
14201429
};
14211430

1422-
const detail = if (try decl_handle.resolveType(builder.analyser)) |ty| detail: {
1431+
const detail = if (maybe_resolved_ty) |ty| detail: {
14231432
const type_str = try ty.stringifyTypeOf(builder.analyser, .{ .truncate_container_decls = false });
14241433
if (field.ast.value_expr.unwrap()) |value_expr| {
14251434
const value_str = offsets.nodeToSlice(tree, value_expr);
@@ -1447,7 +1456,7 @@ fn collectContainerFields(
14471456
if (container.data != .container) continue;
14481457
if (!likely.allowsDeclLiterals()) continue;
14491458
// decl literal
1450-
var expected_ty = try decl_handle.resolveType(builder.analyser) orelse continue;
1459+
var expected_ty = maybe_resolved_ty orelse continue;
14511460
expected_ty = try expected_ty.typeOf(builder.analyser);
14521461
expected_ty = expected_ty.resolveDeclLiteralResultType();
14531462
if (expected_ty.data != .container) continue;
@@ -1464,7 +1473,7 @@ fn collectContainerFields(
14641473
if (container.data != .container) continue;
14651474
if (!likely.allowsDeclLiterals()) continue;
14661475
// decl literal
1467-
const resolved_ty = try decl_handle.resolveType(builder.analyser) orelse continue;
1476+
const resolved_ty = maybe_resolved_ty orelse continue;
14681477
var expected_ty = try builder.analyser.resolveReturnType(resolved_ty) orelse continue;
14691478
expected_ty = expected_ty.resolveDeclLiteralResultType();
14701479
if (expected_ty.data != .container) continue;

tests/lsp_features/completion.zig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4136,6 +4136,27 @@ test "insert replace behaviour - tagged union" {
41364136
});
41374137
}
41384138

4139+
test "insert replace behaviour - tagged union - zero-bit field" {
4140+
try testCompletionTextEdit(.{
4141+
.source =
4142+
\\const U = union(enum) { alpha: void };
4143+
\\const foo: U = .<cursor>
4144+
,
4145+
.label = "alpha",
4146+
.expected_insert_line = "const foo: U = .alpha",
4147+
.expected_replace_line = "const foo: U = .alpha",
4148+
});
4149+
try testCompletionTextEdit(.{
4150+
.source =
4151+
\\const U = union(enum) { alpha: u0 };
4152+
\\const foo: U = .<cursor>
4153+
,
4154+
.label = "alpha",
4155+
.expected_insert_line = "const foo: U = .alpha",
4156+
.expected_replace_line = "const foo: U = .alpha",
4157+
});
4158+
}
4159+
41394160
test "insert replace behaviour - doc test name" {
41404161
if (true) return error.SkipZigTest; // TODO
41414162
try testCompletionTextEdit(.{

0 commit comments

Comments
 (0)