diff --git a/src/analysis.zig b/src/analysis.zig index 87ef47b9a..69749e0c6 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -677,11 +677,8 @@ pub fn resolveOptionalChildType(analyser: *Analyser, optional_type: Type) error{ } pub fn resolveAddressOf(analyser: *Analyser, ty: Type) error{OutOfMemory}!?Type { - if (ty.is_type_val) return null; - const base_type_ptr = try analyser.arena.allocator().create(Type); - - base_type_ptr.* = Type{ .data = ty.data, .is_type_val = true }; + base_type_ptr.* = ty.typeOf(analyser); return Type{ .data = .{ .pointer = .{ .size = .One, .is_const = false, .elem_ty = base_type_ptr } }, .is_type_val = false }; } diff --git a/tests/lsp_features/completion.zig b/tests/lsp_features/completion.zig index d48fd06f7..94eded8d4 100644 --- a/tests/lsp_features/completion.zig +++ b/tests/lsp_features/completion.zig @@ -485,6 +485,27 @@ test "completion - pointer" { }); } +test "completion - address of" { + try testCompletion( + \\const value: u32 = undefined; + \\const value_ptr = &value; + \\const foo = value_ptr.; + , &.{ + // TODO detail should be 'u32' + .{ .label = "*", .kind = .Operator }, + }); + try testCompletion( + \\const S = struct { alpha: u32 }; + \\const value: S = undefined; + \\const value_ptr = &value; + \\const foo = value_ptr.; + , &.{ + // TODO detail should be 'S' + .{ .label = "*", .kind = .Operator }, + .{ .label = "alpha", .kind = .Field, .detail = "alpha: u32" }, + }); +} + test "completion - captures" { try testCompletion( \\const S = struct { alpha: u32 };