Skip to content

Commit e43fcc5

Browse files
xdBronchTechatrix
authored andcommitted
add semantic tokens for field access on builtin types
1 parent 0221b42 commit e43fcc5

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

src/analysis.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,7 @@ pub fn resolveBracketAccessTypeFromBinding(analyser: *Analyser, lhs_binding: Bin
12771277
};
12781278
}
12791279

1280-
fn resolvePropertyType(analyser: *Analyser, ty: Type, name: []const u8) error{OutOfMemory}!?Type {
1280+
pub fn resolvePropertyType(analyser: *Analyser, ty: Type, name: []const u8) error{OutOfMemory}!?Type {
12811281
if (ty.is_type_val)
12821282
return null;
12831283

src/features/semantic_tokens.zig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,9 @@ fn writeFieldAccess(builder: *Builder, node: Ast.Node.Index) error{OutOfMemory}!
12021202
},
12031203
);
12041204
return;
1205+
} else if (try builder.analyser.resolvePropertyType(lhs_type, symbol_name)) |_| {
1206+
try writeTokenMod(builder, field_name_token, .property, .{});
1207+
return;
12051208
}
12061209

12071210
try writeTokenMod(

tests/lsp_features/semantic_tokens.zig

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,53 @@ test "field access" {
438438
.{ "S", .namespace, .{} },
439439
.{ "foo", .variable, .{ .mutable = true, .static = true } },
440440
});
441+
try testSemanticTokens(
442+
\\comptime {
443+
\\ const slice: []const u8 = undefined;
444+
\\ _ = slice.ptr;
445+
\\ _ = slice.len;
446+
\\ const array: [4]u8 = undefined;
447+
\\ _ = array.len;
448+
\\ const tuple: struct { u8, u8 } = undefined;
449+
\\ _ = tuple.len;
450+
\\}
451+
, &.{
452+
.{ "comptime", .keyword, .{} },
453+
454+
.{ "const", .keyword, .{} },
455+
.{ "slice", .variable, .{ .declaration = true } },
456+
.{ "const", .keyword, .{} },
457+
.{ "u8", .type, .{} },
458+
.{ "=", .operator, .{} },
459+
.{ "undefined", .keywordLiteral, .{} },
460+
.{ "=", .operator, .{} },
461+
.{ "slice", .variable, .{} },
462+
.{ "ptr", .property, .{} },
463+
.{ "=", .operator, .{} },
464+
.{ "slice", .variable, .{} },
465+
.{ "len", .property, .{} },
466+
467+
.{ "const", .keyword, .{} },
468+
.{ "array", .variable, .{ .declaration = true } },
469+
.{ "4", .number, .{} },
470+
.{ "u8", .type, .{} },
471+
.{ "=", .operator, .{} },
472+
.{ "undefined", .keywordLiteral, .{} },
473+
.{ "=", .operator, .{} },
474+
.{ "array", .variable, .{} },
475+
.{ "len", .property, .{} },
476+
477+
.{ "const", .keyword, .{} },
478+
.{ "tuple", .variable, .{ .declaration = true } },
479+
.{ "struct", .keyword, .{} },
480+
.{ "u8", .type, .{} },
481+
.{ "u8", .type, .{} },
482+
.{ "=", .operator, .{} },
483+
.{ "undefined", .keywordLiteral, .{} },
484+
.{ "=", .operator, .{} },
485+
.{ "tuple", .variable, .{} },
486+
.{ "len", .property, .{} },
487+
});
441488
}
442489

443490
test "field access on unknown" {

0 commit comments

Comments
 (0)