Basic variable type resolution on hover
This commit is contained in:
parent
0f3eb1df36
commit
0c0cb261b7
@ -494,7 +494,7 @@ fn resolveUnwrapErrorType(store: *DocumentStore, arena: *std.heap.ArenaAllocator
|
||||
.type = .{ .data = .{ .other = n }, .is_type_val = rhs.type.is_type_val },
|
||||
.handle = rhs.handle,
|
||||
},
|
||||
.primitive, .slice, .pointer => return null,
|
||||
.primitive, .slice, .pointer, .array_index => return null,
|
||||
};
|
||||
|
||||
if (rhs.handle.tree.nodes.items(.tag)[rhs_node] == .error_union) {
|
||||
@ -670,7 +670,7 @@ pub fn resolveTypeOfNodeInternal(store: *DocumentStore, arena: *std.heap.ArenaAl
|
||||
.identifier => {
|
||||
if (isTypeIdent(handle.tree, main_tokens[node])) {
|
||||
return TypeWithHandle{
|
||||
.type = .{ .data = .primitive, .is_type_val = true },
|
||||
.type = .{ .data = .{ .primitive = node }, .is_type_val = true },
|
||||
.handle = handle,
|
||||
};
|
||||
}
|
||||
@ -977,7 +977,8 @@ pub const Type = struct {
|
||||
slice: Ast.Node.Index,
|
||||
error_union: Ast.Node.Index,
|
||||
other: Ast.Node.Index,
|
||||
primitive,
|
||||
primitive: Ast.Node.Index,
|
||||
array_index,
|
||||
},
|
||||
/// If true, the type `type`, the attached data is the value of the type value.
|
||||
is_type_val: bool,
|
||||
@ -1941,7 +1942,7 @@ pub const DeclWithHandle = struct {
|
||||
bound_type_params,
|
||||
),
|
||||
.array_index => TypeWithHandle{
|
||||
.type = .{ .data = .primitive, .is_type_val = false },
|
||||
.type = .{ .data = .array_index, .is_type_val = false },
|
||||
.handle = self.handle,
|
||||
},
|
||||
.label_decl => return null,
|
||||
|
41
src/main.zig
41
src/main.zig
@ -404,7 +404,7 @@ fn typeToCompletion(
|
||||
null,
|
||||
config,
|
||||
),
|
||||
.primitive => {},
|
||||
.primitive, .array_index => {},
|
||||
}
|
||||
}
|
||||
|
||||
@ -736,19 +736,50 @@ fn hoverSymbol(id: types.RequestId, arena: *std.heap.ArenaAllocator, decl_handle
|
||||
.label_decl => |label_decl| tree.tokenSlice(label_decl),
|
||||
};
|
||||
|
||||
var bound_type_params = analysis.BoundTypeParams.init(arena.allocator());
|
||||
const resolved_type = try decl_handle.resolveType(&document_store, arena, &bound_type_params);
|
||||
|
||||
const resolved_type_str = if (resolved_type) |rt|
|
||||
if (rt.type.is_type_val) "type" else switch (rt.type.data) {
|
||||
.pointer,
|
||||
.slice,
|
||||
.error_union,
|
||||
.primitive,
|
||||
=> |p| tree.getNodeSource(p),
|
||||
.other => |p| switch (tree.nodes.items(.tag)[p]) {
|
||||
.container_decl,
|
||||
.container_decl_arg,
|
||||
.container_decl_arg_trailing,
|
||||
.container_decl_trailing,
|
||||
.container_decl_two,
|
||||
.container_decl_two_trailing,
|
||||
.tagged_union,
|
||||
.tagged_union_trailing,
|
||||
.tagged_union_two,
|
||||
.tagged_union_two_trailing,
|
||||
.tagged_union_enum_tag,
|
||||
.tagged_union_enum_tag_trailing,
|
||||
=> tree.tokenSlice(tree.nodes.items(.main_token)[p] - 2), // NOTE: This is a hacky nightmare but it works :P
|
||||
else => tree.getNodeSource(p),
|
||||
},
|
||||
else => "unknown",
|
||||
}
|
||||
else
|
||||
"unknown";
|
||||
|
||||
var hover_text: []const u8 = undefined;
|
||||
if (hover_kind == .Markdown) {
|
||||
hover_text =
|
||||
if (doc_str) |doc|
|
||||
try std.fmt.allocPrint(arena.allocator(), "```zig\n{s}\n```\n{s}", .{ def_str, doc })
|
||||
try std.fmt.allocPrint(arena.allocator(), "```zig\n{s}\n```\n```zig\n({s})\n```\n{s}", .{ def_str, resolved_type_str, doc })
|
||||
else
|
||||
try std.fmt.allocPrint(arena.allocator(), "```zig\n{s}\n```", .{def_str});
|
||||
try std.fmt.allocPrint(arena.allocator(), "```zig\n{s}\n```\n```zig\n({s})\n```", .{ def_str, resolved_type_str });
|
||||
} else {
|
||||
hover_text =
|
||||
if (doc_str) |doc|
|
||||
try std.fmt.allocPrint(arena.allocator(), "{s}\n{s}", .{ def_str, doc })
|
||||
try std.fmt.allocPrint(arena.allocator(), "{s} ({s})\n{s}", .{ def_str, resolved_type_str, doc })
|
||||
else
|
||||
def_str;
|
||||
try std.fmt.allocPrint(arena.allocator(), "{s} ({s})", .{ def_str, resolved_type_str });
|
||||
}
|
||||
|
||||
try send(arena, types.Response{
|
||||
|
Loading…
Reference in New Issue
Block a user