Skip to content

Commit

Permalink
fix looking up len on a single pointer to array
Browse files Browse the repository at this point in the history
  • Loading branch information
Techatrix committed Nov 22, 2023
1 parent d7882ba commit 46cc5be
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 56 deletions.
83 changes: 45 additions & 38 deletions src/ComptimeInterpreter.zig
Original file line number Diff line number Diff line change
Expand Up @@ -505,45 +505,52 @@ pub fn interpret(
else => {},
},
.pointer_type => |pointer_info| {
if (pointer_info.size == .Slice) {
if (std.mem.eql(u8, field_name, "ptr")) {
var many_ptr_info = InternPool.Key{ .pointer_type = pointer_info };
many_ptr_info.pointer_type.size = .Many;
return InterpretResult{
.value = Value{
.interpreter = interpreter,
.node_idx = data[node_idx].rhs,
// TODO resolve ptr of Slice
.index = try interpreter.ip.get(interpreter.allocator, .{
.unknown_value = .{ .ty = try interpreter.ip.get(interpreter.allocator, many_ptr_info) },
}),
switch (pointer_info.size) {
.Many, .C => {},
.One => {
switch (interpreter.ip.indexToKey(pointer_info.elem_type)) {
.array_type => |array_info| {
if (std.mem.eql(u8, field_name, "len")) {
return InterpretResult{
.value = Value{
.interpreter = interpreter,
.node_idx = data[node_idx].rhs,
.index = try interpreter.ip.get(interpreter.allocator, .{ .int_u64_value = .{
.ty = .usize_type,
.int = array_info.len,
} }),
},
};
}
},
};
} else if (std.mem.eql(u8, field_name, "len")) {
return InterpretResult{
.value = Value{
.interpreter = interpreter,
.node_idx = data[node_idx].rhs,
// TODO resolve length of Slice
.index = try interpreter.ip.get(interpreter.allocator, .{
.unknown_value = .{ .ty = Index.usize_type },
}),
},
};
}
} else if (interpreter.ip.indexToKey(pointer_info.elem_type) == .array_type) {
if (std.mem.eql(u8, field_name, "len")) {
return InterpretResult{
.value = Value{
.interpreter = interpreter,
.node_idx = data[node_idx].rhs,
// TODO resolve length of Slice
.index = try interpreter.ip.get(interpreter.allocator, .{
.unknown_value = .{ .ty = Index.usize_type },
}),
},
};
}
else => {},
}
},
.Slice => {
if (std.mem.eql(u8, field_name, "ptr")) {
var many_ptr_info = InternPool.Key{ .pointer_type = pointer_info };
many_ptr_info.pointer_type.size = .Many;
return InterpretResult{
.value = Value{
.interpreter = interpreter,
.node_idx = data[node_idx].rhs,
// TODO resolve ptr of Slice
.index = try interpreter.ip.get(interpreter.allocator, .{
.unknown_value = .{ .ty = try interpreter.ip.get(interpreter.allocator, many_ptr_info) },
}),
},
};
} else if (std.mem.eql(u8, field_name, "len")) {
return InterpretResult{
.value = Value{
.interpreter = interpreter,
.node_idx = data[node_idx].rhs,
// TODO resolve length of Slice
.index = try interpreter.ip.getUnknown(interpreter.allocator, .usize_type),
},
};
}
},
}
},
.array_type => |array_info| {
Expand Down
45 changes: 27 additions & 18 deletions src/analyser/completions.zig
Original file line number Diff line number Diff line change
Expand Up @@ -61,24 +61,33 @@ pub fn dotCompletions(
else => {},
},
.pointer_type => |pointer_info| {
if (pointer_info.size == .Slice) {
try completions.append(arena, .{
.label = "ptr",
.kind = .Field,
// TODO this discards pointer attributes
.detail = try std.fmt.allocPrint(arena, "ptr: [*]{}", .{pointer_info.elem_type.fmt(ip)}),
});
try completions.append(arena, .{
.label = "len",
.kind = .Field,
.detail = "len: usize",
});
} else if (ip.indexToKey(pointer_info.elem_type) == .array_type) {
try completions.append(arena, .{
.label = "len",
.kind = .Field,
.detail = "len: usize",
});
switch (pointer_info.size) {
.Many, .C => {},
.One => {
switch (ip.indexToKey(pointer_info.elem_type)) {
.array_type => |array_info| {
try completions.append(arena, .{
.label = "len",
.kind = .Field,
.detail = try std.fmt.allocPrint(arena, "const len: usize ({d})", .{array_info.len}), // TODO how should this be displayed
});
},
else => {},
}
},
.Slice => {
try completions.append(arena, .{
.label = "ptr",
.kind = .Field,
// TODO this discards pointer attributes
.detail = try std.fmt.allocPrint(arena, "ptr: [*]{}", .{pointer_info.elem_type.fmt(ip)}),
});
try completions.append(arena, .{
.label = "len",
.kind = .Field,
.detail = "len: usize",
});
},
}
},
.array_type => |array_info| {
Expand Down

0 comments on commit 46cc5be

Please sign in to comment.