diff --git a/lib/std/special/docs/index.html b/lib/std/special/docs/index.html
index 290acdb96..23cdcc265 100644
--- a/lib/std/special/docs/index.html
+++ b/lib/std/special/docs/index.html
@@ -145,6 +145,34 @@
#listSearchResults li.selected {
background-color: #93e196;
}
+ .tok-kw {
+ color: #333;
+ font-weight: bold;
+ }
+ .tok-str {
+ color: #d14;
+ }
+ .tok-builtin {
+ color: #0086b3;
+ }
+ .tok-comment {
+ color: #777;
+ font-style: italic;
+ }
+ .tok-fn {
+ color: #900;
+ font-weight: bold;
+ }
+ .tok-null {
+ color: #008080;
+ }
+ .tok-number {
+ color: #008080;
+ }
+ .tok-type {
+ color: #458;
+ font-weight: bold;
+ }
@media (prefers-color-scheme: dark) {
body{
@@ -183,6 +211,30 @@
#listSearchResults li.selected a {
color: #fff;
}
+ .tok-kw {
+ color: #eee;
+ }
+ .tok-str {
+ color: #2e5;
+ }
+ .tok-builtin {
+ color: #ff894c;
+ }
+ .tok-comment {
+ color: #aa7;
+ }
+ .tok-fn {
+ color: #e33;
+ }
+ .tok-null {
+ color: #ff8080;
+ }
+ .tok-number {
+ color: #ff8080;
+ }
+ .tok-type {
+ color: #68f;
+ }
}
diff --git a/lib/std/special/docs/main.js b/lib/std/special/docs/main.js
index cd15040a1..af790d342 100644
--- a/lib/std/special/docs/main.js
+++ b/lib/std/special/docs/main.js
@@ -29,11 +29,17 @@
var typeKindTypeId;
var typeKindFnId;
+ var typeKindPtrId;
+ var typeKindFloatId;
+ var typeKindIntId;
findTypeKinds();
// for each package, is an array with packages to get to this one
var canonPkgPaths = computeCanonicalPackagePaths();
+ // for each decl, is an array with {declNames, pkgNames} to get to this one
var canonDeclPaths = null; // lazy; use getCanonDeclPath
+ // for each type, is an array with {declNames, pkgNames} to get to this one
+ var canonTypeDecls = null; // lazy; use getCanonTypeDecl
var curNav = {
// each element is a package name, e.g. @import("a") then within there @import("b")
@@ -158,7 +164,29 @@
function renderFn(fnDecl) {
var typeObj = zigAnalysis.types[fnDecl.type];
- domFnProtoCode.textContent = "fn " + fnDecl.name + typeObj.name.substring(2);
+ var protoHtml = 'fn '
+ + escapeHtml(fnDecl.name) + '(';
+ if (typeObj.args != null) {
+ for (var i = 0; i < typeObj.args.length; i += 1) {
+ if (i != 0) {
+ protoHtml += ', ';
+ }
+ var argTypeIndex = typeObj.args[i];
+ if (argTypeIndex != null) {
+ protoHtml += typeIndexName(argTypeIndex, true, true);
+ } else {
+ protoHtml += 'var';
+ }
+ }
+ }
+
+ protoHtml += ') ';
+ if (typeObj.ret != null) {
+ protoHtml += typeIndexName(typeObj.ret, true, true);
+ } else {
+ protoHtml += 'var';
+ }
+ domFnProtoCode.innerHTML = protoHtml;
var docsSource = null;
var srcNode = zigAnalysis.astNodes[fnDecl.src];
@@ -306,9 +334,107 @@
}
}
+ function typeIndexName(typeIndex, wantHtml, wantLink) {
+ var typeObj = zigAnalysis.types[typeIndex];
+ if (wantLink) {
+ var declIndex = getCanonTypeDecl(typeIndex);
+ var declPath = getCanonDeclPath(declIndex);
+ var haveLink = declPath != null;
+ var typeNameHtml = typeName(typeObj, true, !haveLink);
+ if (haveLink) {
+ return '' + typeNameHtml + '';
+ } else {
+ return typeNameHtml;
+ }
+ } else {
+ return typeName(typeObj, wantHtml);
+ }
+ }
+
+ function typeName(typeObj, wantHtml, wantSubLink) {
+ switch (typeObj.kind) {
+ case typeKindPtrId:
+ var name = "";
+ switch (typeObj.len) {
+ case 0:
+ default:
+ name += "*";
+ break;
+ case 1:
+ name += "[*]";
+ break;
+ case 2:
+ name += "[]";
+ break;
+ case 3:
+ name += "[*c]";
+ break;
+ }
+ if (typeObj['const']) {
+ if (wantHtml) {
+ name += 'const ';
+ } else {
+ name += "const ";
+ }
+ }
+ if (typeObj['volatile']) {
+ if (wantHtml) {
+ name += 'volatile ';
+ } else {
+ name += "volatile ";
+ }
+ }
+ if (typeObj.align != null) {
+ if (wantHtml) {
+ name += 'align(';
+ } else {
+ name += "align(";
+ }
+ if (wantHtml) {
+ name += '' + typeObj.align + '';
+ } else {
+ name += typeObj.align;
+ }
+ if (typeObj.hostIntBytes != null) {
+ name += ":" + typeObj.bitOffsetInHost + ":" + typeObj.hostIntBytes;
+ }
+ name += ") ";
+ }
+ name += typeIndexName(typeObj.elem, wantHtml, wantSubLink);
+ return name;
+ case typeKindFloatId:
+ if (wantHtml) {
+ return 'f' + typeObj.bits + '';
+ } else {
+ return "f" + typeObj.bits;
+ }
+ case typeKindIntId:
+ var signed = (typeObj.i != null) ? 'i' : 'u';
+ var bits = typeObj[signed];
+ if (wantHtml) {
+ return '' + signed + bits + '';
+ } else {
+ return signed + bits;
+ }
+ case typeKindTypeId:
+ if (wantHtml) {
+ return 'type';
+ } else {
+ return "type";
+ }
+ default:
+ if (wantHtml) {
+ return escapeHtml(typeObj.name);
+ } else {
+ return typeObj.name;
+ }
+ }
+ }
+
function renderType(typeObj) {
- if (typeObj.name != null && typeObj.name != "") {
- domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + typeObj.name;
+ var name = typeName(typeObj);
+ if (name != null && name != "") {
+ domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + name;
domHdrName.classList.remove("hidden");
}
}
@@ -402,6 +528,12 @@
typeKindTypeId = i;
} else if (zigAnalysis.typeKinds[i] === "Fn") {
typeKindFnId = i;
+ } else if (zigAnalysis.typeKinds[i] === "Pointer") {
+ typeKindPtrId = i;
+ } else if (zigAnalysis.typeKinds[i] === "Float") {
+ typeKindFloatId = i;
+ } else if (zigAnalysis.typeKinds[i] === "Int") {
+ typeKindIntId = i;
}
}
if (typeKindTypeId == null) {
@@ -410,6 +542,15 @@
if (typeKindFnId == null) {
throw new Error("No type kind 'Fn' found");
}
+ if (typeKindPtrId == null) {
+ throw new Error("No type kind 'Pointer' found");
+ }
+ if (typeKindFloatId == null) {
+ throw new Error("No type kind 'Float' found");
+ }
+ if (typeKindIntId == null) {
+ throw new Error("No type kind 'Int' found");
+ }
}
function findTypeTypeId() {
@@ -500,6 +641,7 @@
function computeCanonDeclPaths() {
var list = new Array(zigAnalysis.decls.length);
+ canonTypeDecls = new Array(zigAnalysis.types.length);
for (var pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) {
if (pkgI === zigAnalysis.rootPkg && rootIsStd) continue;
@@ -518,6 +660,9 @@
if (list[mainDeclIndex] != null) continue;
var decl = zigAnalysis.decls[mainDeclIndex];
+ if (decl.type === typeTypeId) {
+ canonTypeDecls[decl.value] = mainDeclIndex;
+ }
var declNames = item.declNames.concat([decl.name]);
list[mainDeclIndex] = {
pkgNames: pkgNames,
@@ -544,12 +689,22 @@
return canonDeclPaths[index];
}
- function markdown(mdText) {
- return mdText.replace(/[&"<>]/g, function (m) {
+ function getCanonTypeDecl(index) {
+ getCanonDeclPath(0);
+ return canonTypeDecls[index];
+ }
+
+ function escapeHtml(text) {
+ return text.replace(/[&"<>]/g, function (m) {
return escapeHtmlReplacements[m];
});
}
+ function markdown(mdText) {
+ // TODO implement more
+ return escapeHtml(mdText);
+ }
+
function onSearchKeyDown(ev) {
switch (ev.which) {
case 13:
diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp
index ddd356483..30d91b4d3 100644
--- a/src/dump_analysis.cpp
+++ b/src/dump_analysis.cpp
@@ -683,24 +683,57 @@ static void anal_dump_value(AnalDumpCtx *ctx, AstNode *source_node, ZigType *ty,
zig_unreachable();
}
+static void anal_dump_pointer_attrs(AnalDumpCtx *ctx, ZigType *ty) {
+ JsonWriter *jw = &ctx->jw;
+ if (ty->data.pointer.explicit_alignment != 0) {
+ jw_object_field(jw, "align");
+ jw_int(jw, ty->data.pointer.explicit_alignment);
+ }
+ if (ty->data.pointer.is_const) {
+ jw_object_field(jw, "const");
+ jw_bool(jw, true);
+ }
+ if (ty->data.pointer.is_volatile) {
+ jw_object_field(jw, "volatile");
+ jw_bool(jw, true);
+ }
+ if (ty->data.pointer.allow_zero) {
+ jw_object_field(jw, "allowZero");
+ jw_bool(jw, true);
+ }
+ if (ty->data.pointer.host_int_bytes != 0) {
+ jw_object_field(jw, "hostIntBytes");
+ jw_int(jw, ty->data.pointer.host_int_bytes);
+
+ jw_object_field(jw, "bitOffsetInHost");
+ jw_int(jw, ty->data.pointer.bit_offset_in_host);
+ }
+
+ jw_object_field(jw, "elem");
+ anal_dump_type_ref(ctx, ty->data.pointer.child_type);
+}
+
static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
JsonWriter *jw = &ctx->jw;
jw_array_elem(jw);
jw_begin_object(jw);
- jw_object_field(jw, "name");
- jw_string(jw, buf_ptr(&ty->name));
-
jw_object_field(jw, "kind");
jw_int(jw, type_id_index(ty));
switch (ty->id) {
+ case ZigTypeIdMetaType:
+ break;
case ZigTypeIdStruct: {
if (ty->data.structure.is_slice) {
- // TODO
+ jw_object_field(jw, "len");
+ jw_int(jw, 2);
+ anal_dump_pointer_attrs(ctx, ty->data.structure.fields[slice_ptr_index].type_entry);
break;
}
+ jw_object_field(jw, "name");
+ jw_string(jw, buf_ptr(&ty->name));
{
jw_object_field(jw, "pubDecls");
jw_begin_array(jw);
@@ -755,13 +788,61 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
jw_int(jw, ty->data.floating.bit_count);
break;
}
+ case ZigTypeIdInt: {
+ if (ty->data.integral.is_signed) {
+ jw_object_field(jw, "i");
+ } else {
+ jw_object_field(jw, "u");
+ }
+ jw_int(jw, ty->data.integral.bit_count);
+ break;
+ }
case ZigTypeIdFn: {
+ jw_object_field(jw, "name");
+ jw_string(jw, buf_ptr(&ty->name));
+
jw_object_field(jw, "generic");
jw_bool(jw, ty->data.fn.is_generic);
+
+ if (ty->data.fn.fn_type_id.return_type != nullptr) {
+ jw_object_field(jw, "ret");
+ anal_dump_type_ref(ctx, ty->data.fn.fn_type_id.return_type);
+ }
+
+ if (ty->data.fn.fn_type_id.param_count != 0) {
+ jw_object_field(jw, "args");
+ jw_begin_array(jw);
+ for (size_t i = 0; i < ty->data.fn.fn_type_id.param_count; i += 1) {
+ jw_array_elem(jw);
+ if (ty->data.fn.fn_type_id.param_info[i].type != nullptr) {
+ anal_dump_type_ref(ctx, ty->data.fn.fn_type_id.param_info[i].type);
+ } else {
+ jw_null(jw);
+ }
+ }
+ jw_end_array(jw);
+ }
+ break;
+ }
+ case ZigTypeIdPointer: {
+ switch (ty->data.pointer.ptr_len) {
+ case PtrLenSingle:
+ break;
+ case PtrLenUnknown:
+ jw_object_field(jw, "len");
+ jw_int(jw, 1);
+ break;
+ case PtrLenC:
+ jw_object_field(jw, "len");
+ jw_int(jw, 3);
+ break;
+ }
+ anal_dump_pointer_attrs(ctx, ty);
break;
}
default:
- // TODO
+ jw_object_field(jw, "name");
+ jw_string(jw, buf_ptr(&ty->name));
break;
}
jw_end_object(jw);