arena
This commit is contained in:
55
src/sema.zig
55
src/sema.zig
@@ -197,16 +197,45 @@ pub const Analyzer = struct {
|
||||
},
|
||||
.struct_decl => |sd| {
|
||||
try self.addSymbol(sd.name, .struct_type, .{ .struct_type = sd.name }, node.span);
|
||||
// Populate struct_types registry
|
||||
var field_types = std.ArrayList(Type).empty;
|
||||
for (sd.field_types) |ft| {
|
||||
const resolved = Type.fromTypeExpr(ft) orelse Type.s(64);
|
||||
try field_types.append(self.allocator, resolved);
|
||||
// Populate struct_types registry, expanding #using entries
|
||||
if (sd.using_entries.len > 0) {
|
||||
var all_names = std.ArrayList([]const u8).empty;
|
||||
var all_types = std.ArrayList(Type).empty;
|
||||
var using_idx: usize = 0;
|
||||
for (0..sd.field_names.len + 1) |i| {
|
||||
while (using_idx < sd.using_entries.len and
|
||||
sd.using_entries[using_idx].insert_index == i)
|
||||
{
|
||||
const entry = sd.using_entries[using_idx];
|
||||
if (self.struct_types.get(entry.type_name)) |used| {
|
||||
for (used.field_names, 0..) |fname, fi| {
|
||||
try all_names.append(self.allocator, fname);
|
||||
try all_types.append(self.allocator, used.field_types[fi]);
|
||||
}
|
||||
}
|
||||
using_idx += 1;
|
||||
}
|
||||
if (i < sd.field_names.len) {
|
||||
try all_names.append(self.allocator, sd.field_names[i]);
|
||||
const resolved = Type.fromTypeExpr(sd.field_types[i]) orelse Type.s(64);
|
||||
try all_types.append(self.allocator, resolved);
|
||||
}
|
||||
}
|
||||
try self.struct_types.put(sd.name, .{
|
||||
.field_names = try all_names.toOwnedSlice(self.allocator),
|
||||
.field_types = try all_types.toOwnedSlice(self.allocator),
|
||||
});
|
||||
} else {
|
||||
var field_types = std.ArrayList(Type).empty;
|
||||
for (sd.field_types) |ft| {
|
||||
const resolved = Type.fromTypeExpr(ft) orelse Type.s(64);
|
||||
try field_types.append(self.allocator, resolved);
|
||||
}
|
||||
try self.struct_types.put(sd.name, .{
|
||||
.field_names = sd.field_names,
|
||||
.field_types = try field_types.toOwnedSlice(self.allocator),
|
||||
});
|
||||
}
|
||||
try self.struct_types.put(sd.name, .{
|
||||
.field_names = sd.field_names,
|
||||
.field_types = try field_types.toOwnedSlice(self.allocator),
|
||||
});
|
||||
},
|
||||
.union_decl => |ud| {
|
||||
try self.addSymbol(ud.name, .enum_type, .{ .union_type = ud.name }, node.span);
|
||||
@@ -701,6 +730,10 @@ pub const Analyzer = struct {
|
||||
.defer_stmt => |ds| {
|
||||
try self.analyzeNode(ds.expr);
|
||||
},
|
||||
.push_stmt => |ps| {
|
||||
try self.analyzeNode(ps.context_expr);
|
||||
try self.analyzeNode(ps.body);
|
||||
},
|
||||
.comptime_expr => |ct| {
|
||||
try self.analyzeNode(ct.expr);
|
||||
},
|
||||
@@ -979,6 +1012,10 @@ pub fn findNodeAtOffset(node: *Node, offset: u32) ?*Node {
|
||||
.defer_stmt => |ds| {
|
||||
if (findNodeAtOffset(ds.expr, offset)) |found| return found;
|
||||
},
|
||||
.push_stmt => |ps| {
|
||||
if (findNodeAtOffset(ps.context_expr, offset)) |found| return found;
|
||||
if (findNodeAtOffset(ps.body, offset)) |found| return found;
|
||||
},
|
||||
.comptime_expr => |ct| {
|
||||
if (findNodeAtOffset(ct.expr, offset)) |found| return found;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user