add: handling typeof_peer

This commit is contained in:
Vallahor 2022-05-26 22:18:55 -03:00 committed by Andrew Kelley
parent 1792842808
commit 4bd359a849
2 changed files with 72 additions and 4 deletions

View File

@ -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,

View File

@ -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);