motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit b296f5ac023517a4cbf31abdab52cabcc2d3c1e7 (tree)
parent 5a31126d897e58b87fea1c709696b44959cf1021
Author: Loris Cro <kappaloris@gmail.com>
Date:   Tue,  8 Feb 2022 20:56:12 +0100

autodocs: added basic support for functions

Diffstat:
Mlib/docs/main.js | 87++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/Autodoc.zig | 29++++++++++++++++++++++++-----
2 files changed, 68 insertions(+), 48 deletions(-)

diff --git a/lib/docs/main.js b/lib/docs/main.js @@ -130,17 +130,17 @@ return typeKind === typeKinds.ErrorSet || typeKindIsContainer(typeKind); } - function resolveDeclValue(decl) { + function resolveValue(value) { var i = 0; while(i < 1000) { i += 1; - if ("declRef" in decl.value) { - decl = zigAnalysis.decls[decl.value.declRef]; + if ("declRef" in value) { + value = zigAnalysis.decls[value.declRef].value; continue; } - return decl.value; + return value; } console.assert(false); @@ -249,8 +249,9 @@ return render404(); } - var childDeclValue = resolveDeclValue(childDecl); - if ("type" in childDeclValue){ + var childDeclValue = resolveValue(childDecl.value); + if ("type" in childDeclValue && + zigAnalysis.types[childDeclValue.type].kind !== typeKinds.Fn){ if (i + 1 === curNav.declNames.length) { curNav.declObjs.push(zigAnalysis.types[childDeclValue.type]); break; @@ -277,7 +278,7 @@ } else if (lastIsDecl && last.kind === 'var') { return renderVar(last); } else if (lastIsDecl && last.kind === 'const' && !(declContainsType(last))) { - var typeObj = zigAnalysis.types[resolveDeclValueTypeId(last)]; + var typeObj = zigAnalysis.types[resolveValue(last.value).type]; if (typeObj.kind === typeKinds.Fn) { return renderFn(last); } else { @@ -321,7 +322,11 @@ } function renderFn(fnDecl) { - domFnProtoCode.innerHTML = typeIndexName(fnDecl.type, true, true, fnDecl); + var value = resolveValue(fnDecl.value); + console.assert("type" in value); + var typeObj = zigAnalysis.types[value.type]; + + domFnProtoCode.innerHTML = typeIndexName(value.type, true, true, fnDecl); var docsSource = null; var srcNode = zigAnalysis.astNodes[fnDecl.src]; @@ -329,26 +334,23 @@ docsSource = srcNode.docs; } - var typeObj = zigAnalysis.types[fnDecl.type]; + var retIndex = resolveValue(typeObj.ret).type; renderFnParamDocs(fnDecl, typeObj); var errSetTypeIndex = null; - if (typeObj.ret != null) { - var retType = zigAnalysis.types[typeObj.ret]; - if (retType.kind === typeKinds.ErrorSet) { - errSetTypeIndex = typeObj.ret; - } else if (retType.kind === typeKinds.ErrorUnion) { - errSetTypeIndex = retType.err; - } + var retType = zigAnalysis.types[retIndex]; + if (retType.kind === typeKinds.ErrorSet) { + errSetTypeIndex = retIndex; + } else if (retType.kind === typeKinds.ErrorUnion) { + errSetTypeIndex = retType.err; } if (errSetTypeIndex != null) { var errSetType = zigAnalysis.types[errSetTypeIndex]; renderErrorSet(errSetType); } - var fnObj = zigAnalysis.fns[fnDecl.value]; - var protoSrcIndex = fnObj.src; - if (typeIsGenericFn(fnDecl.type)) { + var protoSrcIndex = fnDecl.src; + if (typeIsGenericFn(value.type)) { var instantiations = nodesToFnsMap[protoSrcIndex]; var calls = nodesToCallsMap[protoSrcIndex]; if (instantiations == null && calls == null) { @@ -388,8 +390,7 @@ function renderFnParamDocs(fnDecl, typeObj) { var docCount = 0; - var fnObj = zigAnalysis.fns[fnDecl.value]; - var fnNode = zigAnalysis.astNodes[fnObj.src]; + var fnNode = zigAnalysis.astNodes[fnDecl.src]; var fields = fnNode.fields; var isVarArgs = fnNode.varArgs; @@ -415,10 +416,11 @@ } var divDom = domListParams.children[domIndex]; domIndex += 1; - var argTypeIndex = typeObj.args[i]; - + var value = resolveValue(typeObj.params[i]); + console.assert("type" in value); + var argTypeIndex = value.type; var html = '<pre>' + escapeHtml(fieldNode.name) + ": "; - if (isVarArgs && i === typeObj.args.length - 1) { + if (isVarArgs && i === typeObj.params.length - 1) { html += '...'; } else if (argTypeIndex != null) { html += typeIndexName(argTypeIndex, true, true); @@ -741,11 +743,7 @@ return "f" + typeObj.bits; } case typeKinds.Int: - var signed = (typeObj.i != null) ? 'i' : 'u'; - var bits = typeObj[signed] || typeObj.name; - - var name = typeObj.name ? typeObj.name : signed + bits; - + var name = typeObj.name; if (wantHtml) { return '<span class="tok-type">' + name + '</span>'; } else { @@ -834,22 +832,21 @@ payloadHtml += 'fn' } payloadHtml += '('; - if (typeObj.args != null) { + if (typeObj.params) { var fields = null; var isVarArgs = false; - if (fnDecl != null) { - var fnObj = zigAnalysis.fns[fnDecl.value]; - var fnNode = zigAnalysis.astNodes[fnObj.src]; - fields = fnNode.fields; - isVarArgs = fnNode.varArgs; - } + var fnNode = zigAnalysis.astNodes[fnDecl.src]; + fields = fnNode.fields; + isVarArgs = fnNode.varArgs; - for (var i = 0; i < typeObj.args.length; i += 1) { + for (var i = 0; i < typeObj.params.length; i += 1) { if (i != 0) { payloadHtml += ', '; } - var argTypeIndex = typeObj.args[i]; + var paramValue = resolveValue(typeObj.params[i]); + console.assert("type" in paramValue); + var argTypeIndex = paramValue.type; if (fields != null) { var paramNode = zigAnalysis.astNodes[fields[i]]; @@ -896,13 +893,17 @@ } } + var retValue = resolveValue(typeObj.ret); + console.assert("type" in retValue); + var retTypeIndex = retValue.type; + payloadHtml += ') '; - if (typeObj.ret != null) { - payloadHtml += typeIndexName(typeObj.ret, wantHtml, wantSubLink, fnDecl); + if (retTypeIndex != null) { + payloadHtml += typeIndexName(retTypeIndex, wantHtml, wantSubLink, fnDecl); } else if (wantHtml) { - payloadHtml += '<span class="tok-kw">var</span>'; + payloadHtml += '<span class="tok-kw">anytype</span>'; } else { - payloadHtml += 'var'; + payloadHtml += 'anytype'; } return payloadHtml; default: @@ -1233,7 +1234,7 @@ html += '<span class="tok-kw" style="color:red;">#FAILURE#</span>'; } else if ("declRef" in field) { var decl = zigAnalysis.decls[field.declRef]; - var val = resolveDeclValue(decl); + var val = resolveValue(decl.value); console.assert("type" in val); var valType = zigAnalysis.types[val.type]; diff --git a/src/Autodoc.zig b/src/Autodoc.zig @@ -560,6 +560,13 @@ fn walkInstruction( }); return DocData.WalkResult{ .type = self.types.items.len - 1 }; }, + //.block => { + //const pl_node = data[inst_index].pl_node; + //const extra = zir.extraData(Zir.Inst.Block, pl_node.payload_index); + //const last_instr_index = zir.extra[extra.end..][extra.data.body_len - 1]; + //const break_operand = data[break_index].@"break".operand; + //return self.walkRef(zir, parent_scope, break_operand); + //}, .block_inline => { const pl_node = data[inst_index].pl_node; const extra = zir.extraData(Zir.Inst.Block, pl_node.payload_index); @@ -585,29 +592,41 @@ fn walkInstruction( if (tags[param_index] != .param) unreachable; // TODO: handle more param types const pl_tok = data[param_index].pl_tok; const extra = zir.extraData(Zir.Inst.Param, pl_tok.payload_index); + const doc_comment = if (extra.data.doc_comment != 0) + zir.nullTerminatedString(extra.data.doc_comment) + else + ""; param_ast_indexes.appendAssumeCapacity(self.ast_nodes.items.len); try self.ast_nodes.append(self.arena, .{ - .name = zir.nullTerminatedString(zir.extra[extra.data.name]), - .docs = "", + .name = zir.nullTerminatedString(extra.data.name), + .docs = doc_comment, }); const break_index = zir.extra[extra.end..][extra.data.body_len - 1]; const break_operand = data[break_index].@"break".operand; - const walk_res = try self.walkRef(zir, parent_scope, break_operand); + const param_type_ref = try self.walkRef(zir, parent_scope, break_operand); param_type_refs.appendAssumeCapacity( - DocData.TypeRef.fromWalkResult(walk_res), + DocData.TypeRef.fromWalkResult(param_type_ref), ); } + // ret + const ret_type_ref = blk: { + const last_instr_index = fn_info.ret_ty_body[fn_info.ret_ty_body.len - 1]; + const break_operand = data[last_instr_index].@"break".operand; + const wr = try self.walkRef(zir, parent_scope, break_operand); + break :blk DocData.TypeRef.fromWalkResult(wr); + }; + self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items; try self.types.append(self.arena, .{ .Fn = .{ .name = "todo_name func", .src = self_ast_node_index, .params = param_type_refs.items, - .ret = .{ .type = @enumToInt(Ref.void_type) }, + .ret = ret_type_ref, }, }); return DocData.WalkResult{ .type = self.types.items.len - 1 };