Skip to content

Commit 7434203

Browse files
committed
fix and test assign destructure with non var-decls
1 parent b2557fa commit 7434203

File tree

6 files changed

+86
-10
lines changed

6 files changed

+86
-10
lines changed

src/features/semantic_tokens.zig

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -812,9 +812,27 @@ fn writeNodeTokens(builder: *Builder, node: Ast.Node.Index) error{OutOfMemory}!v
812812
const resolved_type = try builder.analyser.resolveTypeOfNode(.{ .node = init_expr, .handle = handle });
813813

814814
for (lhs_exprs, 0..) |lhs_node, index| {
815-
const var_decl = tree.fullVarDecl(lhs_node).?;
816-
const field_type = if (resolved_type) |ty| try builder.analyser.resolveTupleFieldType(ty, index) else null;
817-
try writeVarDecl(builder, var_decl, field_type);
815+
switch (node_tags[lhs_node]) {
816+
.global_var_decl,
817+
.local_var_decl,
818+
.aligned_var_decl,
819+
.simple_var_decl,
820+
=> {
821+
const var_decl = tree.fullVarDecl(lhs_node).?;
822+
const field_type = if (resolved_type) |ty| try builder.analyser.resolveTupleFieldType(ty, index) else null;
823+
try writeVarDecl(builder, var_decl, field_type);
824+
},
825+
.identifier => {
826+
const name_token = main_tokens[lhs_node];
827+
const maybe_type = if (resolved_type) |ty| try builder.analyser.resolveTupleFieldType(ty, index) else null;
828+
const ty = maybe_type orelse {
829+
try writeIdentifier(builder, name_token);
830+
continue;
831+
};
832+
try colorIdentifierBasedOnType(builder, ty, name_token, false, .{});
833+
},
834+
else => {},
835+
}
818836
}
819837

820838
try writeToken(builder, main_token, .operator);

tests/lsp_features/completion.zig

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ test "symbol lookup on identifier named after primitive" {
181181
});
182182
}
183183

184-
test "var decl destructuring" {
184+
test "assign destructure" {
185185
try testCompletion(
186186
\\test {
187187
\\ const foo, var bar: u32 = .{42, 7};
@@ -211,11 +211,12 @@ test "var decl destructuring" {
211211
});
212212
try testCompletion(
213213
\\test {
214-
\\ const foo, const bar: u64, var baz = [_]u32{1, 2, 3};
214+
\\ var foo: u32 = undefined;
215+
\\ foo, const bar: u64, var baz = [_]u32{1, 2, 3};
215216
\\ <cursor>
216217
\\}
217218
, &.{
218-
.{ .label = "foo", .kind = .Constant, .detail = "u32" },
219+
.{ .label = "foo", .kind = .Variable, .detail = "u32" },
219220
.{ .label = "bar", .kind = .Constant, .detail = "u64" },
220221
.{ .label = "baz", .kind = .Variable, .detail = "u32" },
221222
});

tests/lsp_features/definition.zig

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,20 @@ test "local variable" {
6666

6767
test "assign destructure" {
6868
try testDefinition(
69-
\\comptime {
69+
\\test {
7070
\\ const foo, const <def><decl>bar</decl></def>: <tdef>u32</tdef> = .{ 1, 2 };
7171
\\ _ = foo;
7272
\\ _ = <>bar;
7373
\\}
7474
);
75+
try testDefinition(
76+
\\test {
77+
\\ var <def><decl>foo</decl></def>: <tdef>u32</tdef> = undefined;
78+
\\ foo, const bar: u32 = .{ 1, 2 };
79+
\\ _ = <>foo;
80+
\\ _ = bar;
81+
\\}
82+
);
7583
}
7684

7785
test "function parameter" {

tests/lsp_features/hover.zig

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,7 @@ test "var decl alias" {
11111111
);
11121112
}
11131113

1114-
test "var decl destructuring" {
1114+
test "assign destructure" {
11151115
try testHover(
11161116
\\test {
11171117
\\ const f<cursor>oo, const bar = .{ @as(u8, 1), @as(u16, 2), @as(u24, 3) };
@@ -1175,6 +1175,20 @@ test "var decl destructuring" {
11751175
\\(usize)
11761176
\\```
11771177
);
1178+
try testHover(
1179+
\\test {
1180+
\\ var foo: u32 = undefined;
1181+
\\ var bar: u64 = undefined;
1182+
\\ foo, bar<cursor> = .{ 3, 4 };
1183+
\\};
1184+
,
1185+
\\```zig
1186+
\\var bar: u64 = undefined
1187+
\\```
1188+
\\```zig
1189+
\\(u64)
1190+
\\```
1191+
);
11781192
}
11791193

11801194
test "escaped identifier" {

tests/lsp_features/inlay_hints.zig

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ test "var decl" {
267267
, .{ .kind = .Type });
268268
}
269269

270-
test "var decl destructuring" {
270+
test "assign destructure" {
271271
try testInlayHints(
272272
\\test {
273273
\\ const foo<u32>, const bar<comptime_int> = .{@as(u32, 1), 2};
@@ -283,6 +283,13 @@ test "var decl destructuring" {
283283
\\ const foo<u32>, const bar: u64, var baz<u32> = [_]u32{1, 2, 3};
284284
\\}
285285
, .{ .kind = .Type });
286+
try testInlayHints(
287+
\\test {
288+
\\ var foo: u32 = undefined;
289+
\\ var bar: u64 = undefined;
290+
\\ foo, bar = .{ 3, 4 };
291+
\\}
292+
, .{ .kind = .Type });
286293
}
287294

288295
test "function alias" {

tests/lsp_features/semantic_tokens.zig

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ test "var decl" {
183183
});
184184
}
185185

186-
test "var decl destructure" {
186+
test "assign destructure" {
187187
try testSemanticTokens(
188188
\\test {
189189
\\ var alpha: bool, var beta = .{ 1, 2 };
@@ -220,6 +220,34 @@ test "var decl destructure" {
220220
.{ "struct", .keyword, .{} },
221221
.{ "enum", .keyword, .{} },
222222
});
223+
try testSemanticTokens(
224+
\\test {
225+
\\ var foo: u32 = undefined;
226+
\\ var bar: u64 = undefined;
227+
\\ foo, bar = .{ 3, 4 };
228+
\\};
229+
, &.{
230+
.{ "test", .keyword, .{} },
231+
232+
.{ "var", .keyword, .{} },
233+
.{ "foo", .variable, .{ .declaration = true } },
234+
.{ "u32", .type, .{} },
235+
.{ "=", .operator, .{} },
236+
.{ "undefined", .keywordLiteral, .{} },
237+
238+
.{ "var", .keyword, .{} },
239+
.{ "bar", .variable, .{ .declaration = true } },
240+
.{ "u64", .type, .{} },
241+
.{ "=", .operator, .{} },
242+
.{ "undefined", .keywordLiteral, .{} },
243+
244+
.{ "foo", .variable, .{} },
245+
.{ "bar", .variable, .{} },
246+
.{ "=", .operator, .{} },
247+
248+
.{ "3", .number, .{} },
249+
.{ "4", .number, .{} },
250+
});
223251
}
224252

225253
test "local var decl" {

0 commit comments

Comments
 (0)