enum, union
This commit is contained in:
31
src/sema.zig
31
src/sema.zig
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user