enum, union

This commit is contained in:
agra
2026-02-14 13:17:22 +02:00
parent 4ff828fd1a
commit 025b790411
14 changed files with 537 additions and 245 deletions

View File

@@ -179,8 +179,14 @@ pub const Analyzer = struct {
try self.addSymbol(vd.name, .variable, ty, node.span);
},
.enum_decl => |ed| {
try self.addSymbol(ed.name, .enum_type, .{ .enum_type = ed.name }, node.span);
try self.enum_types.put(ed.name, ed.variants);
if (ed.variant_types.len > 0) {
// Tagged enum with payloads
try self.addSymbol(ed.name, .enum_type, .{ .union_type = ed.name }, node.span);
} else {
// Payload-less enum
try self.addSymbol(ed.name, .enum_type, .{ .enum_type = ed.name }, node.span);
try self.enum_types.put(ed.name, ed.variant_names);
}
},
.struct_decl => |sd| {
try self.addSymbol(sd.name, .struct_type, .{ .struct_type = sd.name }, node.span);
@@ -392,10 +398,6 @@ pub const Analyzer = struct {
.break_expr => .void_type,
.continue_expr => .void_type,
.enum_literal => .{ .enum_type = "" },
.union_literal => |ul| {
if (ul.union_name) |name| return .{ .union_type = name };
return .void_type;
},
.struct_literal => |sl| {
if (sl.struct_name) |name| {
if (self.struct_types.contains(name)) return .{ .struct_type = name };
@@ -592,7 +594,11 @@ pub const Analyzer = struct {
try self.addSymbol(vd.name, .variable, ty, node.span);
},
.enum_decl => |ed| {
try self.addSymbol(ed.name, .enum_type, .{ .enum_type = ed.name }, node.span);
if (ed.variant_types.len > 0) {
try self.addSymbol(ed.name, .enum_type, .{ .union_type = ed.name }, node.span);
} else {
try self.addSymbol(ed.name, .enum_type, .{ .enum_type = ed.name }, node.span);
}
},
.struct_decl => |sd| {
try self.addSymbol(sd.name, .struct_type, .{ .struct_type = sd.name }, node.span);
@@ -680,8 +686,8 @@ pub const Analyzer = struct {
.union_decl => |ud| {
try self.addSymbol(ud.name, .enum_type, .{ .union_type = ud.name }, node.span);
},
.union_literal => |ul| {
if (ul.payload) |p| {
.enum_literal => |el| {
if (el.payload) |p| {
try self.analyzeNode(p);
}
},
@@ -690,7 +696,6 @@ pub const Analyzer = struct {
.float_literal,
.bool_literal,
.string_literal,
.enum_literal,
.type_expr,
.param,
.match_arm,
@@ -741,7 +746,6 @@ pub const Analyzer = struct {
.comptime_expr,
.enum_literal,
.struct_literal,
.union_literal,
.array_literal,
.index_expr,
.slice_expr,
@@ -936,8 +940,8 @@ pub fn findNodeAtOffset(node: *Node, offset: u32) ?*Node {
if (findNodeAtOffset(fi.value, offset)) |found| return found;
}
},
.union_literal => |ul| {
if (ul.payload) |p| {
.enum_literal => |el| {
if (el.payload) |p| {
if (findNodeAtOffset(p, offset)) |found| return found;
}
},
@@ -947,7 +951,6 @@ pub fn findNodeAtOffset(node: *Node, offset: u32) ?*Node {
.float_literal,
.bool_literal,
.string_literal,
.enum_literal,
.type_expr,
.param,
.match_arm,