Commit b296f5ac02

Loris Cro <kappaloris@gmail.com>
2022-02-08 20:56:12
autodocs: added basic support for functions
1 parent 5a31126
Changed files (2)
lib
docs
src
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];
 
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 };