fn parseExprInner(
self: *@This(),
T: type,
node: Zoir.Node.Index,
) ParseExprInnerError!T {
if (T == Zoir.Node.Index) {
return node;
}
switch (@typeInfo(T)) {
.optional => |optional| if (node.get(self.zoir) == .null) {
return null;
} else {
return try self.parseExprInner(optional.child, node);
},
.bool => return self.parseBool(node),
.int => return self.parseInt(T, node),
.float => return self.parseFloat(T, node),
.@"enum" => return self.parseEnumLiteral(T, node),
.pointer => |pointer| switch (pointer.size) {
.one => {
const result = try self.gpa.create(pointer.child);
errdefer self.gpa.destroy(result);
result.* = try self.parseExprInner(pointer.child, node);
return result;
},
.slice => return self.parseSlicePointer(T, node),
else => comptime unreachable,
},
.array => return self.parseArray(T, node),
.vector => |vector| {
const A = [vector.len]vector.child;
return try self.parseArray(A, node);
},
.@"struct" => |@"struct"| if (@"struct".is_tuple)
return self.parseTuple(T, node)
else
return self.parseStruct(T, node),
.@"union" => return self.parseUnion(T, node),
else => comptime unreachable,
}
}