mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
add: handling typeof_peer
This commit is contained in:
parent
1792842808
commit
4bd359a849
@ -1083,9 +1083,23 @@ var zigAnalysis;
|
||||
struct_body += "}";
|
||||
return struct_body;
|
||||
}
|
||||
case "typeOf_peer": {
|
||||
console.log(expr)
|
||||
let payloadHtml = "@TypeOf("
|
||||
for (let i = 0; i < expr.typeOf_peer.length; i++) {
|
||||
payloadHtml += exprName(expr.typeOf_peer[i], {wantHtml: true, wantLink:true});
|
||||
if (i !== expr.typeOf_peer.length - 1) {
|
||||
payloadHtml += ", ";
|
||||
}
|
||||
}
|
||||
payloadHtml += ")";
|
||||
console.log(payloadHtml)
|
||||
return payloadHtml;
|
||||
|
||||
}
|
||||
case "typeOf": {
|
||||
const typeRefArg = zigAnalysis.exprs[expr.typeOf];
|
||||
let payloadHtml = "@TypeOf(" + exprName(typeRefArg) + ")";
|
||||
let payloadHtml = "@TypeOf(" + exprName(typeRefArg, {wantHtml: true, wantLink:true}) + ")";
|
||||
return payloadHtml;
|
||||
}
|
||||
case "null": {
|
||||
@ -1432,6 +1446,30 @@ var zigAnalysis;
|
||||
if (isVarArgs && i === fnObj.params.length - 1) {
|
||||
payloadHtml += '...';
|
||||
}
|
||||
else if ("typeOf" in value) {
|
||||
if (opts.wantHtml) {
|
||||
payloadHtml += '<a href="">';
|
||||
payloadHtml +=
|
||||
'<span class="tok-kw" style="color:lightblue;">'
|
||||
+ exprName(value, opts) + '</span>';
|
||||
payloadHtml += '</a>';
|
||||
} else {
|
||||
payloadHtml += exprName(value, opts);
|
||||
}
|
||||
|
||||
}
|
||||
else if ("typeOf_peer" in value) {
|
||||
if (opts.wantHtml) {
|
||||
payloadHtml += '<a href="">';
|
||||
payloadHtml +=
|
||||
'<span class="tok-kw" style="color:lightblue;">'
|
||||
+ exprName(value, opts) + '</span>';
|
||||
payloadHtml += '</a>';
|
||||
} else {
|
||||
payloadHtml += exprName(value, opts);
|
||||
}
|
||||
|
||||
}
|
||||
else if ("declRef" in value) {
|
||||
if (opts.wantHtml) {
|
||||
payloadHtml += '<a href="">';
|
||||
@ -1454,7 +1492,6 @@ var zigAnalysis;
|
||||
} else {
|
||||
payloadHtml += exprName(value, opts);
|
||||
}
|
||||
|
||||
}
|
||||
else if ("refPath" in value) {
|
||||
if (opts.wantHtml) {
|
||||
@ -1466,7 +1503,6 @@ var zigAnalysis;
|
||||
} else {
|
||||
payloadHtml += exprName(value, opts);
|
||||
}
|
||||
|
||||
} else if ("type" in value) {
|
||||
let name = exprName(value, {
|
||||
wantHtml: false,
|
||||
|
||||
@ -575,6 +575,7 @@ const DocData = struct {
|
||||
call: usize, // index in `calls`
|
||||
enumLiteral: []const u8, // direct value
|
||||
typeOf: usize, // index in `exprs`
|
||||
typeOf_peer: []Expr,
|
||||
as: As,
|
||||
sizeOf: usize, // index in `exprs`
|
||||
compileError: []const u8,
|
||||
@ -641,6 +642,14 @@ const DocData = struct {
|
||||
options,
|
||||
w,
|
||||
),
|
||||
.typeOf_peer => |v| {
|
||||
try w.print("{{ \"typeOf_peer\": [", .{});
|
||||
for (v) |c, i| {
|
||||
const comma = if (i == v.len - 1) "]}" else ",\n";
|
||||
try c.jsonStringify(options, w);
|
||||
try w.print("{s}", .{comma});
|
||||
}
|
||||
},
|
||||
.refPath => |v| {
|
||||
try w.print("{{ \"refPath\": [", .{});
|
||||
for (v) |c, i| {
|
||||
@ -1509,7 +1518,8 @@ fn walkInstruction(
|
||||
.expr = .{ .type = type_slot_index },
|
||||
};
|
||||
},
|
||||
.param_anytype => {
|
||||
.param_anytype, .param_anytype_comptime => {
|
||||
// @check if .param_anytype_comptime can be here
|
||||
// Analysis of anytype function params happens in `.func`.
|
||||
// This switch case handles the case where an expression depends
|
||||
// on an anytype field. E.g.: `fn foo(bar: anytype) @TypeOf(bar)`.
|
||||
@ -1527,6 +1537,13 @@ fn walkInstruction(
|
||||
const pl_tok = data[inst_index].pl_tok;
|
||||
const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index);
|
||||
const name = file.zir.nullTerminatedString(extra.data.name);
|
||||
|
||||
std.debug.print("param\n", .{});
|
||||
std.debug.print("pl_tok = {any}\n", .{pl_tok});
|
||||
std.debug.print("extra = {any}\n", .{extra});
|
||||
std.debug.print("name = {any}\n", .{name});
|
||||
std.debug.print("param\n", .{});
|
||||
|
||||
const cte_slot_index = self.comptime_exprs.items.len;
|
||||
try self.comptime_exprs.append(self.arena, .{
|
||||
.code = name,
|
||||
@ -1595,7 +1612,22 @@ fn walkInstruction(
|
||||
);
|
||||
return self.cteTodo(@tagName(extended.opcode));
|
||||
},
|
||||
.typeof_peer => {
|
||||
// Zir says it's a NodeMultiOp but in this case it's TypeOfPeer
|
||||
const extra = file.zir.extraData(Zir.Inst.TypeOfPeer, extended.operand);
|
||||
const args = file.zir.refSlice(extra.end, extended.small);
|
||||
const operand_index = self.exprs.items.len;
|
||||
for (args) |arg, idx| {
|
||||
const wr = try self.walkRef(file, parent_scope, arg, idx == 0);
|
||||
|
||||
try self.exprs.append(self.arena, wr.expr);
|
||||
}
|
||||
|
||||
return DocData.WalkResult{
|
||||
.typeRef = .{ .type = @enumToInt(Ref.void_type) },
|
||||
.expr = .{ .typeOf_peer = self.exprs.items[operand_index..] },
|
||||
};
|
||||
},
|
||||
.opaque_decl => return self.cteTodo("opaque {...}"),
|
||||
.variable => {
|
||||
const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user