mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 12:27:41 +00:00
stage2: handle opaque containers
This commit is contained in:
parent
c1e19f4c0a
commit
bace1181b2
@ -1515,7 +1515,6 @@ pub fn analyzeContainer(self: *Module, container_scope: *Scope.Container) !void
|
||||
// an incremental update. This code handles both cases.
|
||||
const tree = try self.getAstTree(container_scope);
|
||||
const decls = tree.root_node.decls();
|
||||
// const decls = container_scope.root_node.decls();
|
||||
|
||||
try self.comp.work_queue.ensureUnusedCapacity(decls.len);
|
||||
try container_scope.decls.ensureCapacity(self.gpa, decls.len);
|
||||
@ -2302,6 +2301,7 @@ pub fn createContainerDecl(
|
||||
}
|
||||
|
||||
fn getAnonTypeName(self: *Module, scope: *Scope, base_token: std.zig.ast.TokenIndex) ![]u8 {
|
||||
// TODO add namespaces, generic function signatrues
|
||||
const tree = scope.tree();
|
||||
const base_name = switch (tree.token_ids[base_token]) {
|
||||
.Keyword_struct => "struct",
|
||||
|
||||
@ -913,7 +913,19 @@ fn containerDecl(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node.Con
|
||||
};
|
||||
break :blk Type.initPayload(&union_type.base);
|
||||
},
|
||||
.Keyword_opaque => return mod.fail(scope, src, "TODO opaque containers", .{}),
|
||||
.Keyword_opaque => blk: {
|
||||
if (fields.items.len > 0) {
|
||||
return mod.fail(scope, fields.items[0].src, "opaque types cannot have fields", .{});
|
||||
}
|
||||
const opaque_type = try arena.create(Type.Payload.Opaque);
|
||||
opaque_type.* = .{
|
||||
.scope = .{
|
||||
.file_scope = scope.getFileScope(),
|
||||
.ty = Type.initPayload(&opaque_type.base),
|
||||
},
|
||||
};
|
||||
break :blk Type.initPayload(&opaque_type.base);
|
||||
},
|
||||
else => unreachable,
|
||||
};
|
||||
const type_payload = try arena.create(Value.Payload.Ty);
|
||||
|
||||
38
src/type.zig
38
src/type.zig
@ -49,7 +49,7 @@ pub const Type = extern union {
|
||||
.f128,
|
||||
=> return .Float,
|
||||
|
||||
.c_void => return .Opaque,
|
||||
.c_void, .@"opaque" => return .Opaque,
|
||||
.bool => return .Bool,
|
||||
.void => return .Void,
|
||||
.type => return .Type,
|
||||
@ -449,6 +449,7 @@ pub const Type = extern union {
|
||||
.@"enum" => return self,
|
||||
.@"struct" => return self,
|
||||
.@"union" => return self,
|
||||
.@"opaque" => return self,
|
||||
}
|
||||
}
|
||||
|
||||
@ -680,10 +681,11 @@ pub const Type = extern union {
|
||||
const payload = @fieldParentPtr(Payload.ErrorSetSingle, "base", ty.ptr_otherwise);
|
||||
return out_stream.print("error{{{}}}", .{payload.name});
|
||||
},
|
||||
// TODO improve
|
||||
// TODO use declaration name
|
||||
.@"enum" => return out_stream.writeAll("enum {}"),
|
||||
.@"struct" => return out_stream.writeAll("struct {}"),
|
||||
.@"union" => return out_stream.writeAll("union {}"),
|
||||
.@"opaque" => return out_stream.writeAll("opaque {}"),
|
||||
}
|
||||
unreachable;
|
||||
}
|
||||
@ -809,6 +811,7 @@ pub const Type = extern union {
|
||||
.@"undefined",
|
||||
.enum_literal,
|
||||
.empty_struct,
|
||||
.@"opaque",
|
||||
=> false,
|
||||
};
|
||||
}
|
||||
@ -937,6 +940,7 @@ pub const Type = extern union {
|
||||
.@"undefined",
|
||||
.enum_literal,
|
||||
.empty_struct,
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
};
|
||||
}
|
||||
@ -960,6 +964,7 @@ pub const Type = extern union {
|
||||
.enum_literal => unreachable,
|
||||
.single_const_pointer_to_comptime_int => unreachable,
|
||||
.empty_struct => unreachable,
|
||||
.@"opaque" => unreachable,
|
||||
|
||||
.u8,
|
||||
.i8,
|
||||
@ -1143,6 +1148,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.single_const_pointer,
|
||||
@ -1221,6 +1227,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.const_slice,
|
||||
@ -1296,6 +1303,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.single_const_pointer,
|
||||
@ -1380,6 +1388,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.pointer => {
|
||||
@ -1459,6 +1468,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.pointer => {
|
||||
@ -1580,6 +1590,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
|
||||
.array => self.cast(Payload.Array).?.elem_type,
|
||||
@ -1711,6 +1722,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
|
||||
.array => self.cast(Payload.Array).?.len,
|
||||
@ -1780,6 +1792,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
|
||||
.single_const_pointer,
|
||||
@ -1866,6 +1879,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.int_signed,
|
||||
@ -1944,6 +1958,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.int_unsigned,
|
||||
@ -2012,6 +2027,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
|
||||
.int_unsigned => .{ .signed = false, .bits = self.cast(Payload.IntUnsigned).?.bits },
|
||||
@ -2098,6 +2114,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
|
||||
.usize,
|
||||
@ -2213,6 +2230,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
};
|
||||
}
|
||||
@ -2294,6 +2312,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
}
|
||||
}
|
||||
@ -2374,6 +2393,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
}
|
||||
}
|
||||
@ -2454,6 +2474,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
};
|
||||
}
|
||||
@ -2531,6 +2552,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
};
|
||||
}
|
||||
@ -2608,6 +2630,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> unreachable,
|
||||
};
|
||||
}
|
||||
@ -2685,6 +2708,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> false,
|
||||
};
|
||||
}
|
||||
@ -2742,6 +2766,7 @@ pub const Type = extern union {
|
||||
.error_union,
|
||||
.error_set,
|
||||
.error_set_single,
|
||||
.@"opaque",
|
||||
=> return null,
|
||||
|
||||
.@"enum" => @panic("TODO onePossibleValue enum"),
|
||||
@ -2860,6 +2885,7 @@ pub const Type = extern union {
|
||||
.@"enum",
|
||||
.@"struct",
|
||||
.@"union",
|
||||
.@"opaque",
|
||||
=> return false,
|
||||
|
||||
.c_const_pointer,
|
||||
@ -2951,6 +2977,7 @@ pub const Type = extern union {
|
||||
.@"enum" => &self.cast(Type.Payload.Enum).?.scope,
|
||||
.@"struct" => &self.cast(Type.Payload.Struct).?.scope,
|
||||
.@"union" => &self.cast(Type.Payload.Union).?.scope,
|
||||
.@"opaque" => &self.cast(Type.Payload.Union).?.scope,
|
||||
};
|
||||
}
|
||||
|
||||
@ -3105,6 +3132,7 @@ pub const Type = extern union {
|
||||
@"enum",
|
||||
@"struct",
|
||||
@"union",
|
||||
@"opaque",
|
||||
|
||||
pub const last_no_payload_tag = Tag.const_slice_u8;
|
||||
pub const no_payload_count = @enumToInt(last_no_payload_tag) + 1;
|
||||
@ -3221,6 +3249,12 @@ pub const Type = extern union {
|
||||
scope: *Module.Scope.Container,
|
||||
};
|
||||
|
||||
pub const Opaque = struct {
|
||||
base: Payload = .{ .tag = .@"opaque" },
|
||||
|
||||
scope: Module.Scope.Container,
|
||||
};
|
||||
|
||||
pub const Enum = @import("type/Enum.zig");
|
||||
pub const Struct = @import("type/Struct.zig");
|
||||
pub const Union = @import("type/Union.zig");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user