generated docs: refactor how type kinds work

This commit is contained in:
Andrew Kelley 2019-10-09 16:52:29 -04:00
parent 42f2814d9a
commit 13ae7d47b7
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9

View File

@ -39,20 +39,8 @@
var searchTimer = null;
var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
var typeKindTypeId;
var typeKindFnId;
var typeKindPtrId;
var typeKindFloatId;
var typeKindIntId;
var typeKindBoolId;
var typeKindVoidId;
var typeKindNoReturnId;
var typeKindErrSetId;
var typeKindErrUnionId;
var typeKindStructId;
var typeKindUnionId;
var typeKindEnumId;
findTypeKinds();
var typeKinds = indexTypeKinds();
var typeTypeId = findTypeTypeId();
// for each package, is an array with packages to get to this one
var canonPkgPaths = computeCanonicalPackagePaths();
@ -77,7 +65,6 @@
var curSearchIndex = -1;
var rootIsStd = detectRootIsStd();
var typeTypeId = findTypeTypeId();
// map of decl index to list of non-generic fn indexes
var nodesToFnsMap = indexNodesToFns();
@ -173,7 +160,7 @@
}
if (lastDecl.type != null) {
var typeObj = zigAnalysis.types[lastDecl.type];
if (typeObj.kind === typeKindFnId) {
if (typeObj.kind === typeKinds.Fn) {
return renderFn(lastDecl);
}
throw new Error("docs for this decl which is not a container");
@ -188,19 +175,19 @@
function typeIsErrSet(typeIndex) {
var typeObj = zigAnalysis.types[typeIndex];
return typeObj.kind === typeKindErrSetId;
return typeObj.kind === typeKinds.ErrorSet;
}
function typeIsStructWithNoFields(typeIndex) {
var typeObj = zigAnalysis.types[typeIndex];
if (typeObj.kind !== typeKindStructId)
if (typeObj.kind !== typeKinds.Struct)
return false;
return typeObj.fields == null || typeObj.fields.length === 0;
}
function typeIsGenericFn(typeIndex) {
var typeObj = zigAnalysis.types[typeIndex];
if (typeObj.kind !== typeKindFnId) {
if (typeObj.kind !== typeKinds.Fn) {
return false;
}
return typeObj.generic;
@ -219,9 +206,9 @@
var errSetTypeIndex = null;
if (typeObj.ret != null) {
var retType = zigAnalysis.types[typeObj.ret];
if (retType.kind === typeKindErrSetId) {
if (retType.kind === typeKinds.ErrorSet) {
errSetTypeIndex = typeObj.ret;
} else if (retType.kind === typeKindErrUnionId) {
} else if (retType.kind === typeKinds.Union) {
errSetTypeIndex = retType.err;
}
}
@ -404,7 +391,7 @@
function typeName(typeObj, wantHtml, wantSubLink, fnDecl, skipFnName) {
switch (typeObj.kind) {
case typeKindPtrId:
case typeKinds.Pointer:
var name = "";
switch (typeObj.len) {
case 0:
@ -464,13 +451,13 @@
}
name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null);
return name;
case typeKindFloatId:
case typeKinds.Float:
if (wantHtml) {
return '<span class="tok-type">f' + typeObj.bits + '</span>';
} else {
return "f" + typeObj.bits;
}
case typeKindIntId:
case typeKinds.Int:
var signed = (typeObj.i != null) ? 'i' : 'u';
var bits = typeObj[signed];
if (wantHtml) {
@ -478,31 +465,43 @@
} else {
return signed + bits;
}
case typeKindTypeId:
case typeKinds.ComptimeInt:
if (wantHtml) {
return '<span class="tok-type">comptime_int</span>';
} else {
return "comptime_int";
}
case typeKinds.ComptimeFloat:
if (wantHtml) {
return '<span class="tok-type">comptime_float</span>';
} else {
return "comptime_float";
}
case typeKinds.Type:
if (wantHtml) {
return '<span class="tok-type">type</span>';
} else {
return "type";
}
case typeKindBoolId:
case typeKinds.Bool:
if (wantHtml) {
return '<span class="tok-type">bool</span>';
} else {
return "bool";
}
case typeKindVoidId:
case typeKinds.Void:
if (wantHtml) {
return '<span class="tok-type">void</span>';
} else {
return "void";
}
case typeKindNoReturnId:
case typeKinds.NoReturn:
if (wantHtml) {
return '<span class="tok-type">noreturn</span>';
} else {
return "noreturn";
}
case typeKindErrSetId:
case typeKinds.ErrorSet:
if (typeObj.errors == null) {
if (wantHtml) {
return '<span class="tok-type">anyerror</span>';
@ -516,7 +515,7 @@
return typeObj.name;
}
}
case typeKindErrUnionId:
case typeKinds.Union:
var errSetTypeObj = zigAnalysis.types[typeObj.err];
var payloadHtml = typeIndexName(typeObj.payload, wantHtml, wantSubLink, null);
if (fnDecl != null && errSetTypeObj.fn === fnDecl.value) {
@ -525,7 +524,7 @@
} else {
return typeIndexName(typeObj.err, wantHtml, wantSubLink, null) + "!" + payloadHtml;
}
case typeKindFnId:
case typeKinds.Fn:
var payloadHtml = "";
if (wantHtml) {
payloadHtml += '<span class="tok-kw">fn</span>';
@ -576,7 +575,7 @@
domHdrName.innerText = name + " (" + zigAnalysis.typeKinds[typeObj.kind] + ")";
domHdrName.classList.remove("hidden");
}
if (typeObj.kind == typeKindErrSetId) {
if (typeObj.kind == typeKinds.ErrorSet) {
renderErrorSet(typeObj);
}
}
@ -662,7 +661,7 @@
}
} else {
var typeKind = zigAnalysis.types[decl.type].kind;
if (typeKind === typeKindFnId) {
if (typeKind === typeKinds.Fn) {
if (allCompTimeFnCallsHaveTypeResult(decl.type, decl.value)) {
typesList.push(decl);
} else {
@ -817,80 +816,24 @@
return rootPkg.file === stdPkg.file;
}
function findTypeKinds() {
function indexTypeKinds() {
var map = {};
for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) {
if (zigAnalysis.typeKinds[i] === "Type") {
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;
} else if (zigAnalysis.typeKinds[i] === "Bool") {
typeKindBoolId = i;
} else if (zigAnalysis.typeKinds[i] === "Void") {
typeKindVoidId = i;
} else if (zigAnalysis.typeKinds[i] === "NoReturn") {
typeKindNoReturnId = i;
} else if (zigAnalysis.typeKinds[i] === "ErrorSet") {
typeKindErrSetId = i;
} else if (zigAnalysis.typeKinds[i] === "ErrorUnion") {
typeKindErrUnionId = i;
} else if (zigAnalysis.typeKinds[i] === "Struct") {
typeKindStructId = i;
} else if (zigAnalysis.typeKinds[i] === "Union") {
typeKindUnionId = i;
} else if (zigAnalysis.typeKinds[i] === "Enum") {
typeKindEnumId = i;
}
map[zigAnalysis.typeKinds[i]] = i;
}
if (typeKindTypeId == null) {
throw new Error("No type kind 'Type' found");
}
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");
}
if (typeKindBoolId == null) {
throw new Error("No type kind 'Bool' found");
}
if (typeKindVoidId == null) {
throw new Error("No type kind 'Void' found");
}
if (typeKindNoReturnId == null) {
throw new Error("No type kind 'Void' found");
}
if (typeKindErrSetId == null) {
throw new Error("No type kind 'ErrorSet' found");
}
if (typeKindErrUnionId == null) {
throw new Error("No type kind 'ErrorUnion' found");
}
if (typeKindStructId == null) {
throw new Error("No type kind 'Struct' found");
}
if (typeKindUnionId == null) {
throw new Error("No type kind 'Union' found");
}
if (typeKindEnumId == null) {
throw new Error("No type kind 'Enum' found");
// This is just for debugging purposes, not needed to function
var assertList = ["Type","Void","Bool","NoReturn","Int","Float","Pointer","Array","Struct",
"ComptimeFloat","ComptimeInt","Undefined","Null","Optional","ErrorUnion","ErrorSet","Enum",
"Union","Fn","BoundFn","ArgTuple","Opaque","Frame","AnyFrame","Vector","EnumLiteral"];
for (var i = 0; i < assertList.length; i += 1) {
if (map[assertList[i]] == null) throw new Error("No type kind '" + assertList[i] + "' found");
}
return map;
}
function findTypeTypeId() {
for (var i = 0; i < zigAnalysis.types.length; i += 1) {
if (zigAnalysis.types[i].kind == typeKindTypeId) {
if (zigAnalysis.types[i].kind == typeKinds.Type) {
return i;
}
}
@ -976,10 +919,10 @@
}
function declCanRepresentTypeKind(typeKind) {
return typeKind === typeKindErrSetId ||
typeKind === typeKindStructId ||
typeKind === typeKindUnionId ||
typeKind === typeKindEnumId;
return typeKind === typeKinds.ErrorSet ||
typeKind === typeKinds.Struct ||
typeKind === typeKinds.Union ||
typeKind === typeKinds.Enum;
}
function computeCanonDeclPaths() {