From 46cc5be3cce64b8a7f2d46f060b64c33c72316fd Mon Sep 17 00:00:00 2001 From: Techatrix <19954306+Techatrix@users.noreply.github.com> Date: Wed, 22 Nov 2023 21:12:49 +0100 Subject: [PATCH] fix looking up `len` on a single pointer to array --- src/ComptimeInterpreter.zig | 83 +++++++++++++++++++----------------- src/analyser/completions.zig | 45 +++++++++++-------- 2 files changed, 72 insertions(+), 56 deletions(-) diff --git a/src/ComptimeInterpreter.zig b/src/ComptimeInterpreter.zig index e1342635d6..8ccc8e84fa 100644 --- a/src/ComptimeInterpreter.zig +++ b/src/ComptimeInterpreter.zig @@ -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| { diff --git a/src/analyser/completions.zig b/src/analyser/completions.zig index eff170d731..54e917f23d 100644 --- a/src/analyser/completions.zig +++ b/src/analyser/completions.zig @@ -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| {