use analyser/completions.zig
for completing comptime interpreter
This commit is contained in:
parent
4b7a434feb
commit
829f4aa9c4
@ -31,8 +31,7 @@ pub const Pointer = packed struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub const Array = packed struct {
|
pub const Array = packed struct {
|
||||||
// TODO change to Index
|
len: u64,
|
||||||
len: u32,
|
|
||||||
child: Index,
|
child: Index,
|
||||||
sentinel: Index = .none,
|
sentinel: Index = .none,
|
||||||
};
|
};
|
||||||
|
@ -20,6 +20,7 @@ const tracy = @import("tracy.zig");
|
|||||||
const uri_utils = @import("uri.zig");
|
const uri_utils = @import("uri.zig");
|
||||||
const diff = @import("diff.zig");
|
const diff = @import("diff.zig");
|
||||||
const ComptimeInterpreter = @import("ComptimeInterpreter.zig");
|
const ComptimeInterpreter = @import("ComptimeInterpreter.zig");
|
||||||
|
const analyser_completions = @import("analyser/completions.zig");
|
||||||
|
|
||||||
const data = @import("data/data.zig");
|
const data = @import("data/data.zig");
|
||||||
const snipped_data = @import("data/snippets.zig");
|
const snipped_data = @import("data/snippets.zig");
|
||||||
@ -595,24 +596,8 @@ fn typeToCompletion(
|
|||||||
),
|
),
|
||||||
.primitive, .array_index => {},
|
.primitive, .array_index => {},
|
||||||
.@"comptime" => |co| {
|
.@"comptime" => |co| {
|
||||||
const key = co.interpreter.ip.indexToKey(co.type.ty);
|
const items = try analyser_completions.dotCompletions(allocator, &co.interpreter.ip, co.value.ty, co.value.val, co.value.node_idx);
|
||||||
|
try list.appendSlice(allocator, items);
|
||||||
switch (key) {
|
|
||||||
.struct_type => |struct_info| {
|
|
||||||
for (struct_info.fields) |field| {
|
|
||||||
const field_name = co.interpreter.ip.indexToKey(field.name).bytes;
|
|
||||||
try list.append(allocator, .{
|
|
||||||
.label = field_name,
|
|
||||||
.kind = .Field,
|
|
||||||
.insertText = field_name,
|
|
||||||
.insertTextFormat = .PlainText,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO declaration completion
|
|
||||||
},
|
|
||||||
else => {},
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -934,7 +919,7 @@ fn hoverSymbol(server: *Server, decl_handle: analysis.DeclWithHandle) error{OutO
|
|||||||
|
|
||||||
const resolved_type_str = if (resolved_type) |rt|
|
const resolved_type_str = if (resolved_type) |rt|
|
||||||
if (rt.type.is_type_val) switch (rt.type.data) {
|
if (rt.type.is_type_val) switch (rt.type.data) {
|
||||||
.@"comptime" => |*co| try std.fmt.allocPrint(server.arena.allocator(), "{}", .{co.type.ty.fmtType(co.interpreter.ip)}),
|
.@"comptime" => |co| try std.fmt.allocPrint(server.arena.allocator(), "{}", .{co.value.ty.fmtType(co.interpreter.ip)}),
|
||||||
else => "type",
|
else => "type",
|
||||||
} else switch (rt.type.data) { // TODO: Investigate random weird numbers like 897 that cause index of bounds
|
} else switch (rt.type.data) { // TODO: Investigate random weird numbers like 897 that cause index of bounds
|
||||||
.pointer,
|
.pointer,
|
||||||
|
@ -4,6 +4,8 @@ const types = @import("../lsp.zig");
|
|||||||
|
|
||||||
const Ast = std.zig.Ast;
|
const Ast = std.zig.Ast;
|
||||||
|
|
||||||
|
|
||||||
|
/// TODO use std.ArrayListUnmanaged instead of returning a slice
|
||||||
pub fn dotCompletions(
|
pub fn dotCompletions(
|
||||||
arena: std.mem.Allocator,
|
arena: std.mem.Allocator,
|
||||||
ip: *InternPool,
|
ip: *InternPool,
|
||||||
@ -25,7 +27,8 @@ pub fn dotCompletions(
|
|||||||
.simple => |simple| switch (simple) {
|
.simple => |simple| switch (simple) {
|
||||||
.type => {
|
.type => {
|
||||||
const ty_key = ip.indexToKey(val);
|
const ty_key = ip.indexToKey(val);
|
||||||
if (ty_key.getNamespace()) {
|
const namespace = ty_key.getNamespace();
|
||||||
|
if (namespace != .none) {
|
||||||
// TODO lookup in namespace
|
// TODO lookup in namespace
|
||||||
}
|
}
|
||||||
switch (ty_key) {
|
switch (ty_key) {
|
||||||
@ -35,7 +38,7 @@ pub fn dotCompletions(
|
|||||||
try completions.append(arena, .{
|
try completions.append(arena, .{
|
||||||
.label = error_name,
|
.label = error_name,
|
||||||
.kind = .Constant,
|
.kind = .Constant,
|
||||||
.detail = std.fmt.allocPrint(arena, "error.{s}", .{std.zig.fmtId(error_name)}),
|
.detail = try std.fmt.allocPrint(arena, "error.{s}", .{std.zig.fmtId(error_name)}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -53,17 +56,17 @@ pub fn dotCompletions(
|
|||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => false,
|
else => {},
|
||||||
},
|
},
|
||||||
.pointer_type => |pointer_info| {
|
.pointer_type => |pointer_info| {
|
||||||
if (pointer_info == .Slice) {
|
if (pointer_info.size == .Slice) {
|
||||||
var many_ptr_info = InternPool.Key{ .pointer_type = pointer_info };
|
var many_ptr_info = InternPool.Key{ .pointer_type = pointer_info };
|
||||||
many_ptr_info.pointer_type.size = .Many;
|
many_ptr_info.pointer_type.size = .Many;
|
||||||
|
|
||||||
try completions.append(arena, .{
|
try completions.append(arena, .{
|
||||||
.label = "ptr",
|
.label = "ptr",
|
||||||
.kind = .Field,
|
.kind = .Field,
|
||||||
.detail = std.fmt.allocPrint(arena, "{}", .{many_ptr_info.fmtType(ip)}),
|
.detail = try std.fmt.allocPrint(arena, "{}", .{many_ptr_info.fmtType(ip.*)}),
|
||||||
});
|
});
|
||||||
try completions.append(arena, .{
|
try completions.append(arena, .{
|
||||||
.label = "len",
|
.label = "len",
|
||||||
@ -81,9 +84,8 @@ pub fn dotCompletions(
|
|||||||
.array_type => |array_info| {
|
.array_type => |array_info| {
|
||||||
try completions.append(arena, types.CompletionItem{
|
try completions.append(arena, types.CompletionItem{
|
||||||
.label = "len",
|
.label = "len",
|
||||||
.labelDetails = std.fmt.allocPrint(arena, "{d}", .{array_info.len}),
|
|
||||||
.kind = .Field,
|
.kind = .Field,
|
||||||
.detail = "usize",
|
.detail = try std.fmt.allocPrint(arena, "usize ({d})", .{array_info.len}), // TODO how should this be displayed
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
.struct_type => |struct_info| {
|
.struct_type => |struct_info| {
|
||||||
@ -93,7 +95,7 @@ pub fn dotCompletions(
|
|||||||
.label = field_name,
|
.label = field_name,
|
||||||
.kind = .Field,
|
.kind = .Field,
|
||||||
// TODO include alignment and comptime
|
// TODO include alignment and comptime
|
||||||
.detail = std.fmt.allocPrint(arena, "{}", .{field.ty.fmtType(ip)}),
|
.detail = try std.fmt.allocPrint(arena, "{}", .{field.ty.fmtType(ip.*)}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -101,7 +103,7 @@ pub fn dotCompletions(
|
|||||||
try completions.append(arena, .{
|
try completions.append(arena, .{
|
||||||
.label = "?",
|
.label = "?",
|
||||||
.kind = .Operator,
|
.kind = .Operator,
|
||||||
.detail = std.fmt.allocPrint(arena, "{}", .{optional_info.payload_type.fmtType(ip)}),
|
.detail = try std.fmt.allocPrint(arena, "{}", .{optional_info.payload_type.fmtType(ip.*)}),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
.enum_type => |enum_info| {
|
.enum_type => |enum_info| {
|
||||||
@ -110,7 +112,7 @@ pub fn dotCompletions(
|
|||||||
try completions.append(arena, .{
|
try completions.append(arena, .{
|
||||||
.label = field_name,
|
.label = field_name,
|
||||||
.kind = .Field,
|
.kind = .Field,
|
||||||
.detail = std.fmt.allocPrint(arena, "{}", .{field.ty.fmtType(ip)}),
|
.detail = try std.fmt.allocPrint(arena, "{}", .{field.val.fmtValue(enum_info.tag_type, ip.*)}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -121,22 +123,23 @@ pub fn dotCompletions(
|
|||||||
.label = field_name,
|
.label = field_name,
|
||||||
.kind = .Field,
|
.kind = .Field,
|
||||||
.detail = if (field.alignment != 0)
|
.detail = if (field.alignment != 0)
|
||||||
std.fmt.allocPrint(arena, "align({d}) {}", .{ field.alignment, field.ty.fmtType(ip) })
|
try std.fmt.allocPrint(arena, "align({d}) {}", .{ field.alignment, field.ty.fmtType(ip.*) })
|
||||||
else
|
else
|
||||||
std.fmt.allocPrint(arena, "{}", .{field.ty.fmtType(ip)}),
|
try std.fmt.allocPrint(arena, "{}", .{field.ty.fmtType(ip.*)}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.tuple_type => |tuple_info| {
|
.tuple_type => |tuple_info| {
|
||||||
for (tuple_info.types) |tuple_ty,i| {
|
for (tuple_info.types) |tuple_ty,i| {
|
||||||
try completions.append(arena, .{
|
try completions.append(arena, .{
|
||||||
.label = std.fmt.allocPrint(arena, "{d}", .{i}),
|
.label = try std.fmt.allocPrint(arena, "{d}", .{i}),
|
||||||
.kind = .Field,
|
.kind = .Field,
|
||||||
.detail = std.fmt.allocPrint(arena, "{}", .{tuple_ty.fmtType(ip)}),
|
.detail = try std.fmt.allocPrint(arena, "{}", .{tuple_ty.fmtType(ip.*)}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.int_type,
|
.int_type,
|
||||||
|
.error_set_type,
|
||||||
.error_union_type,
|
.error_union_type,
|
||||||
.function_type,
|
.function_type,
|
||||||
.vector_type,
|
.vector_type,
|
||||||
|
@ -787,7 +787,7 @@ pub fn resolveTypeOfNodeInternal(store: *DocumentStore, arena: *std.heap.ArenaAl
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
const val = result.getValue() catch |err| {
|
const value = result.getValue() catch |err| {
|
||||||
log.err("Interpreter error: {s}", .{@errorName(err)});
|
log.err("Interpreter error: {s}", .{@errorName(err)});
|
||||||
if (@errorReturnTrace()) |trace| {
|
if (@errorReturnTrace()) |trace| {
|
||||||
std.debug.dumpStackTrace(trace.*);
|
std.debug.dumpStackTrace(trace.*);
|
||||||
@ -795,23 +795,16 @@ pub fn resolveTypeOfNodeInternal(store: *DocumentStore, arena: *std.heap.ArenaAl
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
const type_type = try interpreter.ip.get(interpreter.allocator, ComptimeInterpreter.IPKey{ .simple = .type });
|
const type_type = try interpreter.ip.get(interpreter.allocator, ComptimeInterpreter.Key{ .simple = .type });
|
||||||
if (val.ty != type_type) {
|
const is_type_val = value.ty == type_type;
|
||||||
log.err("Not a type: {}", .{val.ty.fmtType(interpreter.ip)});
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TypeWithHandle{
|
return TypeWithHandle{
|
||||||
.type = .{
|
.type = .{
|
||||||
.data = .{ .@"comptime" = .{
|
.data = .{ .@"comptime" = .{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.type = ComptimeInterpreter.Type{
|
.value = value,
|
||||||
.interpreter = interpreter,
|
|
||||||
.node_idx = val.node_idx,
|
|
||||||
.ty = val.val,
|
|
||||||
},
|
|
||||||
} },
|
} },
|
||||||
.is_type_val = true,
|
.is_type_val = is_type_val,
|
||||||
},
|
},
|
||||||
.handle = node_handle.handle,
|
.handle = node_handle.handle,
|
||||||
};
|
};
|
||||||
@ -1064,7 +1057,7 @@ pub const Type = struct {
|
|||||||
array_index,
|
array_index,
|
||||||
@"comptime": struct {
|
@"comptime": struct {
|
||||||
interpreter: *ComptimeInterpreter,
|
interpreter: *ComptimeInterpreter,
|
||||||
type: ComptimeInterpreter.Type,
|
value: ComptimeInterpreter.Value,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
/// If true, the type `type`, the attached data is the value of the type value.
|
/// If true, the type `type`, the attached data is the value of the type value.
|
||||||
|
Loading…
Reference in New Issue
Block a user