diff --git a/lib/docs/main.js b/lib/docs/main.js index f878c6c2b7..caeeb4d66d 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -1218,10 +1218,11 @@ var kind = value.kind; if (kind === typeKinds.Fn) { //if (allCompTimeFnCallsHaveTypeResult(decl.type, declTypeId)) { - // typesList.push(decl); - //} else { - fnsList.push(decl); - // } + if (resolveTypeRefToTypeId(value.ret) == typeTypeId) { + typesList.push(decl); + } else { + fnsList.push(decl); + } } else if (typeIsErrSet(declValue.type)) { errSetsList.push(decl); diff --git a/src/Autodoc.zig b/src/Autodoc.zig index 0fa01751cd..7f2a1acd59 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -328,6 +328,7 @@ const DocData = struct { name: ?[]const u8 = null, docs: ?[]const u8 = null, fields: ?[]usize = null, // index into astNodes + @"comptime": bool = false, }; const Type = union(DocTypeKinds) { @@ -709,7 +710,7 @@ fn walkInstruction( path[0] = decls_slot_index; return DocData.WalkResult{ .declPath = path }; }, - .field_val => { + .field_val, .field_call_bind, .field_ptr => { const pl_node = data[inst_index].pl_node; const extra = file.zir.extraData(Zir.Inst.Field, pl_node.payload_index); @@ -719,7 +720,10 @@ fn walkInstruction( try path.append(self.arena, extra.data.field_name_start); // Put inside path the starting index of each decl name // that we encounter as we navigate through all the field_vals - while (tags[lhs] == .field_val) { + while (tags[lhs] == .field_val or + tags[lhs] == .field_call_bind or + tags[lhs] == .field_ptr) + { const lhs_extra = file.zir.extraData( Zir.Inst.Field, data[lhs].pl_node.payload_index, @@ -729,8 +733,11 @@ fn walkInstruction( lhs = @enumToInt(lhs_extra.data.lhs) - Ref.typed_value_map.len; // underflow = need to handle Refs } - if (tags[lhs] != .decl_val) { - @panic("TODO: handle non-decl_val endings in walkInstruction.field_val"); + if (tags[lhs] != .decl_val and tags[lhs] != .decl_ref) { + std.debug.panic( + "TODO: handle `{s}` endings in walkInstruction.field_val", + .{@tagName(tags[lhs])}, + ); } const str_tok = data[lhs].str_tok; const decls_slot_index = parent_scope.resolveDeclName(str_tok.start); @@ -770,7 +777,6 @@ fn walkInstruction( const pl_node = data[inst_index].pl_node; const extra = file.zir.extraData(Zir.Inst.Call, pl_node.payload_index); - // TODO: handle the way scoping works with fn args const callee = DocData.TypeRef.fromWalkResult( try self.walkRef(file, parent_scope, extra.data.callee), ); @@ -794,9 +800,7 @@ fn walkInstruction( .func => { const fn_info = file.zir.getFnInfo(@intCast(u32, inst_index)); - // TODO: change this to a resize and change the appends accordingly try self.ast_nodes.ensureUnusedCapacity(self.arena, fn_info.total_params_len); - try self.types.ensureUnusedCapacity(self.arena, fn_info.total_params_len); var param_type_refs = try std.ArrayListUnmanaged(DocData.TypeRef).initCapacity( self.arena, fn_info.total_params_len, @@ -805,28 +809,39 @@ fn walkInstruction( self.arena, fn_info.total_params_len, ); + // TODO: handle scope rules for fn parameters for (fn_info.param_body[0..fn_info.total_params_len]) |param_index| { - if (tags[param_index] != .param) unreachable; // TODO: handle more param types - const pl_tok = data[param_index].pl_tok; - const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index); - const doc_comment = if (extra.data.doc_comment != 0) - file.zir.nullTerminatedString(extra.data.doc_comment) - else - ""; + switch (tags[param_index]) { + else => { + std.debug.panic( + "TODO: handle `{s}` in walkInstruction.func\n", + .{@tagName(tags[param_index])}, + ); + }, + .param, .param_comptime => { + const pl_tok = data[param_index].pl_tok; + const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index); + const doc_comment = if (extra.data.doc_comment != 0) + file.zir.nullTerminatedString(extra.data.doc_comment) + else + ""; - param_ast_indexes.appendAssumeCapacity(self.ast_nodes.items.len); - try self.ast_nodes.append(self.arena, .{ - .name = file.zir.nullTerminatedString(extra.data.name), - .docs = doc_comment, - }); + param_ast_indexes.appendAssumeCapacity(self.ast_nodes.items.len); + self.ast_nodes.appendAssumeCapacity(.{ + .name = file.zir.nullTerminatedString(extra.data.name), + .docs = doc_comment, + .@"comptime" = tags[param_index] == .param_comptime, + }); - const break_index = file.zir.extra[extra.end..][extra.data.body_len - 1]; - const break_operand = data[break_index].@"break".operand; - const param_type_ref = try self.walkRef(file, parent_scope, break_operand); + const break_index = file.zir.extra[extra.end..][extra.data.body_len - 1]; + const break_operand = data[break_index].@"break".operand; + const param_type_ref = try self.walkRef(file, parent_scope, break_operand); - param_type_refs.appendAssumeCapacity( - DocData.TypeRef.fromWalkResult(param_type_ref), - ); + param_type_refs.appendAssumeCapacity( + DocData.TypeRef.fromWalkResult(param_type_ref), + ); + }, + } } // ret