pointers
This commit is contained in:
34
src/sema.zig
34
src/sema.zig
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user