resolve type of @typeInfo (#915)

This commit is contained in:
Techatrix 2023-01-16 19:46:33 +01:00 committed by GitHub
parent 61fa98065f
commit 8d53a5382d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,6 +3,7 @@ const DocumentStore = @import("DocumentStore.zig");
const Ast = std.zig.Ast; const Ast = std.zig.Ast;
const types = @import("lsp.zig"); const types = @import("lsp.zig");
const offsets = @import("offsets.zig"); const offsets = @import("offsets.zig");
const URI = @import("uri.zig");
const log = std.log.scoped(.analysis); const log = std.log.scoped(.analysis);
const ast = @import("ast.zig"); const ast = @import("ast.zig");
const ComptimeInterpreter = @import("ComptimeInterpreter.zig"); const ComptimeInterpreter = @import("ComptimeInterpreter.zig");
@ -965,6 +966,30 @@ pub fn resolveTypeOfNodeInternal(store: *DocumentStore, arena: *std.heap.ArenaAl
return resolved_type; return resolved_type;
} }
if (std.mem.eql(u8, call_name, "@typeInfo")) {
const zig_lib_path = try URI.fromPath(arena.allocator(), store.config.zig_lib_path orelse return null);
const builtin_uri = URI.pathRelative(arena.allocator(), zig_lib_path, "/std/builtin.zig") catch |err| switch (err) {
error.OutOfMemory => |e| return e,
else => return null,
};
const new_handle = store.getOrLoadHandle(builtin_uri) orelse return null;
const root_scope = new_handle.document_scope.scopes.items[0];
const decl = root_scope.decls.get("Type") orelse return null;
if (decl != .ast_node) return null;
const var_decl = ast.varDecl(new_handle.tree, decl.ast_node) orelse return null;
return TypeWithHandle{
.type = .{
.data = .{ .other = var_decl.ast.init_node },
.is_type_val = false,
},
.handle = new_handle,
};
}
if (std.mem.eql(u8, call_name, "@import")) { if (std.mem.eql(u8, call_name, "@import")) {
if (params.len == 0) return null; if (params.len == 0) return null;
const import_param = params[0]; const import_param = params[0];