This commit is contained in:
agra
2026-02-10 22:47:43 +02:00
parent ef14144d49
commit 70435d3c85
11 changed files with 443 additions and 5 deletions

View File

@@ -231,6 +231,20 @@ pub const Analyzer = struct {
const elem_name = elem_type.displayName(self.allocator) catch return .void_type;
return .{ .slice_type = .{ .element_name = elem_name } };
}
// Pointer type: *T
if (tn.data == .pointer_type_expr) {
const pte = tn.data.pointer_type_expr;
const pointee_type = self.resolveTypeNode(pte.pointee_type);
const pointee_name = pointee_type.displayName(self.allocator) catch return .void_type;
return .{ .pointer_type = .{ .pointee_name = pointee_name } };
}
// Many-pointer type: [*]T
if (tn.data == .many_pointer_type_expr) {
const mpte = tn.data.many_pointer_type_expr;
const elem_type = self.resolveTypeNode(mpte.element_type);
const elem_name = elem_type.displayName(self.allocator) catch return .void_type;
return .{ .many_pointer_type = .{ .element_name = elem_name } };
}
// Parameterized type: Vector(N, T) or generic struct
if (tn.data == .parameterized_type_expr) {
// For now, skip generic instantiation — just return void_type
@@ -375,6 +389,12 @@ pub const Analyzer = struct {
}
return .void_type;
},
.deref_expr => |de| {
const ptr_ty = self.inferExprType(de.operand);
if (ptr_ty.isPointer()) return ptr_ty.pointerPointeeType() orelse .void_type;
return .void_type;
},
.null_literal => .void_type,
.array_literal => .void_type,
.type_expr => |te| .{ .meta_type = .{ .name = te.name } },
else => .void_type,
@@ -645,11 +665,17 @@ pub const Analyzer = struct {
.import_decl,
.array_type_expr,
.slice_type_expr,
.pointer_type_expr,
.many_pointer_type_expr,
.null_literal,
.array_literal,
.parameterized_type_expr,
.index_expr,
.slice_expr,
=> {},
.deref_expr => |de| {
try self.analyzeNode(de.operand);
},
.namespace_decl => |ns| {
for (ns.decls) |d| {
try self.analyzeNode(d);
@@ -682,6 +708,8 @@ pub const Analyzer = struct {
.array_literal,
.index_expr,
.slice_expr,
.deref_expr,
.null_literal,
.type_expr,
.insert_expr,
.while_expr,
@@ -894,11 +922,17 @@ pub fn findNodeAtOffset(node: *Node, offset: u32) ?*Node {
.import_decl,
.array_type_expr,
.slice_type_expr,
.pointer_type_expr,
.many_pointer_type_expr,
.null_literal,
.array_literal,
.parameterized_type_expr,
.index_expr,
.slice_expr,
=> {},
.deref_expr => |de| {
if (findNodeAtOffset(de.operand, offset)) |found| return found;
},
.namespace_decl => |ns| {
for (ns.decls) |d| {
if (findNodeAtOffset(d, offset)) |found| return found;