diff --git a/lib/docs/main.js b/lib/docs/main.js
index caeeb4d66d..ffa5a8b1ff 100644
--- a/lib/docs/main.js
+++ b/lib/docs/main.js
@@ -184,6 +184,10 @@
return resolveTypeRefToTypeId(decl.value.float.typeRef);
}
+ if ("array" in decl.value) {
+ return resolveTypeRefToTypeId(decl.value.array.typeRef);
+ }
+
if ("struct" in decl.value) {
return resolveTypeRefToTypeId(decl.value.struct.typeRef);
}
@@ -694,7 +698,7 @@
function shouldSkipParamName(typeIndex, paramName) {
var typeObj = zigAnalysis.types[typeIndex];
if (typeObj.kind === typeKinds.Pointer && getPtrSize(typeObj) === pointerSizeEnum.One) {
- typeIndex = typeObj.elem;
+ typeIndex = typeObj.child;
}
return typeIndexName(typeIndex, false, true).toLowerCase() === paramName;
}
@@ -747,7 +751,7 @@
name += typeObj.len;
}
name += "]";
- name += typeValueName(typeObj.elem, wantHtml, wantSubLink, null);
+ name += typeValueName(typeObj.child, wantHtml, wantSubLink, null);
return name;
case typeKinds.Optional:
@@ -810,7 +814,7 @@
}
name += ") ";
}
- name += typeValueName(typeObj.elem, wantHtml, wantSubLink, null);
+ name += typeValueName(typeObj.child, wantHtml, wantSubLink, null);
return name;
case typeKinds.Float:
if (wantHtml) {
@@ -1328,7 +1332,6 @@
html += '#FAILURE#';
} else if ("declPath" in field) {
for (var j = field.declPath.length - 1; j >= 0; j--) {
- console.log("hello");
var decl = zigAnalysis.decls[field.declPath[j]];
html += '';
diff --git a/src/Autodoc.zig b/src/Autodoc.zig
index 1e77f790bc..bd8a3c3388 100644
--- a/src/Autodoc.zig
+++ b/src/Autodoc.zig
@@ -86,7 +86,6 @@ pub fn generateZirData(self: *Autodoc) !void {
break :blk .{
.Array = .{
.len = 1,
- .name = tmpbuf.toOwnedSlice(),
.child = .{ .type = 0 },
},
};
@@ -352,7 +351,6 @@ const DocData = struct {
child: TypeRef,
},
Array: struct {
- name: []const u8,
len: usize,
child: TypeRef,
},
@@ -522,6 +520,7 @@ const DocData = struct {
value: f64, // direct value
negated: bool = false,
},
+ array: Array,
call: usize, // index in `calls`
const Struct = struct {
@@ -531,6 +530,11 @@ const DocData = struct {
val: WalkResult,
},
};
+ const Array = struct {
+ typeRef: TypeRef,
+ data: []WalkResult,
+ };
+
pub fn jsonStringify(
self: WalkResult,
options: std.json.StringifyOptions,
@@ -586,6 +590,24 @@ const DocData = struct {
try w.print("{d}{s}", .{ d, comma });
}
},
+ .array => |v| try std.json.stringify(
+ struct { @"array": Array }{ .@"array" = v },
+ options,
+ w,
+ ),
+
+ // try w.print("{ len: {},\n", .{v.len});
+
+ // if (options.whitespace) |ws| try ws.outputIndent(w);
+ // try w.print("typeRef: ", .{});
+ // try v.typeRef.jsonStringify(options, w);
+
+ // try w.print("{{ \"data\": [", .{});
+ // for (v.data) |d, i| {
+ // const comma = if (i == v.len - 1) "]}" else ",";
+ // try w.print("{d}{s}", .{ d, comma });
+ // }
+
}
}
};
@@ -615,6 +637,16 @@ fn walkInstruction(
const path = str_tok.get(file.zir);
// importFile cannot error out since all files
// are already loaded at this point
+ if (file.pkg.table.get(path) != null) {
+ const cte_slot_index = self.comptime_exprs.items.len;
+ try self.comptime_exprs.append(self.arena, .{
+ .code = path,
+ .typeRef = .{ .type = @enumToInt(DocData.DocTypeKinds.Type) },
+ });
+ return DocData.WalkResult{
+ .comptimeExpr = cte_slot_index,
+ };
+ }
const new_file = self.module.importFile(file, path) catch unreachable;
const result = try self.files.getOrPut(self.arena, new_file.file);
if (result.found_existing) {
@@ -644,6 +676,28 @@ fn walkInstruction(
},
};
},
+ .array_init => {
+ const pl_node = data[inst_index].pl_node;
+ const extra = file.zir.extraData(Zir.Inst.MultiOp, pl_node.payload_index);
+ const operands = file.zir.refSlice(extra.end, extra.data.operands_len);
+ const array_data = try self.arena.alloc(DocData.WalkResult, operands.len);
+ for (operands) |op, idx| {
+ array_data[idx] = try self.walkRef(file, parent_scope, op);
+ }
+
+ const type_slot_index = self.types.items.len;
+ try self.types.append(self.arena, .{
+ .Array = .{
+ .len = operands.len,
+ .child = typeOfWalkResult(array_data[0]),
+ },
+ });
+
+ return DocData.WalkResult{ .array = .{
+ .typeRef = .{ .type = type_slot_index },
+ .data = array_data,
+ } };
+ },
.float => {
const float = data[inst_index].float;
return DocData.WalkResult{
@@ -1555,7 +1609,8 @@ fn tryResolveDeclPath(
// with the final decl in `dp`.
// We then write the original value back as soon as we're done with the
// recoursive call. This will work out correctly even if the path
- // will not get fully resolved.
+ // will not get fully resolved (also in the case that final_decl is
+ // not resolved yet).
path[i] = final_decl_index;
try self.tryResolveDeclPath(file, path);
path[i] = decl_index;
@@ -1870,6 +1925,19 @@ fn walkResultToTypeRef(wr: DocData.WalkResult) DocData.TypeRef {
};
}
+fn typeOfWalkResult(wr: DocData.WalkResult) DocData.TypeRef {
+ return switch (wr) {
+ else => std.debug.panic(
+ "TODO: handle `{s}` in typeOfWalkResult\n",
+ .{@tagName(wr)},
+ ),
+ .type => .{ .type = @enumToInt(DocData.DocTypeKinds.Type) },
+ .int => |v| v.typeRef,
+ .float => |v| v.typeRef,
+ .array => |v| v.typeRef,
+ };
+}
+
//fn collectParamInfo(self: *Autodoc, file: *File, scope: *Scope, inst_idx: Zir.Index) void {
//}