From d11cafeb6fc08509dc574b1ab88c0f55ea148ff6 Mon Sep 17 00:00:00 2001 From: Der Teufel Date: Fri, 13 Jan 2023 11:40:06 +0100 Subject: [PATCH 1/2] autodoc: Better handling of variable decls --- lib/docs/main.js | 54 +++++++++++++++++++++++++++++++++++++++++------- src/Autodoc.zig | 42 ++++++++++++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 12 deletions(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index f35a20f57f84..253b7c02b4f7 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -2250,12 +2250,49 @@ var zigAnalysis; } function renderVar(decl) { - let declTypeRef = typeOfDecl(decl); - domFnProtoCode.innerHTML = - 'var ' + - escapeHtml(decl.name) + - ": " + - typeValueName(declTypeRef, true, true); + let resolvedVar = resolveValue(decl.value); + + if (resolvedVar.expr.fieldRef) { + const declRef = decl.value.expr.refPath[0].declRef; + const type = getDecl(declRef); + domFnProtoCode.innerHTML = + 'var ' + + escapeHtml(decl.name) + + ": " + + type.name + + " = " + + exprName(decl.value.expr, { wantHtml: true, wantLink: true }) + + ";"; + } else if ( + resolvedVar.expr.string !== undefined || + resolvedVar.expr.call !== undefined || + resolvedVar.expr.comptimeExpr + ) { + domFnProtoCode.innerHTML = + 'var ' + + escapeHtml(decl.name) + + ": " + + exprName(resolvedVar.expr, { wantHtml: true, wantLink: true }) + + " = " + + exprName(decl.value.expr, { wantHtml: true, wantLink: true }) + + ";"; + } else if (resolvedVar.expr.compileError) { + domFnProtoCode.innerHTML = + 'var ' + + escapeHtml(decl.name) + + " = " + + exprName(decl.value.expr, { wantHtml: true, wantLink: true }) + + ";"; + } else { + domFnProtoCode.innerHTML = + 'var ' + + escapeHtml(decl.name) + + ": " + + exprName(resolvedVar.typeRef, { wantHtml: true, wantLink: true }) + + " = " + + exprName(decl.value.expr, { wantHtml: true, wantLink: true }) + + ";"; + } let docs = getAstNode(decl.src).docs; if (docs != null) { @@ -2546,7 +2583,10 @@ var zigAnalysis; tdNameA.setAttribute("href", navLinkDecl(decl.name)); tdNameA.textContent = decl.name; - tdType.innerHTML = typeValueName(typeOfDecl(decl), true, true); + tdType.innerHTML = exprName(walkResultTypeRef(decl.value), { + wantHtml: true, + wantLink: true, + }); let docs = getAstNode(decl.src).docs; if (docs != null) { diff --git a/src/Autodoc.zig b/src/Autodoc.zig index fa0b64a9291f..04413126a1cb 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -2506,15 +2506,27 @@ fn walkInstruction( }; }, .variable => { + const extra = file.zir.extraData(Zir.Inst.ExtendedVar, extended.operand); + const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small); - var extra_index: usize = extended.operand; + var extra_index: usize = extra.end; if (small.has_lib_name) extra_index += 1; if (small.has_align) extra_index += 1; - const value: DocData.WalkResult = if (small.has_init) .{ - .expr = .{ .void = .{} }, + var var_init: ?DocData.WalkResult = null; + if (small.has_init) { + const var_init_ref = @intToEnum(Ref, file.zir.extra[extra_index]); + var_init = try self.walkRef(file, parent_scope, parent_src, var_init_ref, need_type); + } + + const var_type = try self.walkRef(file, parent_scope, parent_src, extra.data.var_type, need_type); + + const value: DocData.WalkResult = if (var_init) |vi| .{ + .typeRef = var_type.expr, + .expr = vi.expr, } else .{ - .expr = .{ .void = .{} }, + .typeRef = var_type.expr, + .expr = .{ .undefined = .{} }, }; return value; @@ -3213,13 +3225,15 @@ fn walkDecls( // .declRef => |d| .{ .declRef = d }, // }; + const kind: []const u8 = if (try self.declIsVar(file, value_pl_node.src_node, parent_src)) "var" else "const"; + self.decls.items[decls_slot_index] = .{ ._analyzed = true, .name = name, .src = ast_node_index, //.typeRef = decl_type_ref, .value = walk_result, - .kind = "const", // find where this information can be found + .kind = kind, }; // Unblock any pending decl path that was waiting for this decl. @@ -4383,3 +4397,21 @@ fn srcLocInfo( .src_node = sn, }; } + +fn declIsVar( + self: Autodoc, + file: *File, + src_node: i32, + parent_src: SrcLocInfo, +) !bool { + const sn = @intCast(u32, @intCast(i32, parent_src.src_node) + src_node); + const tree = try file.getTree(self.module.gpa); + const node_idx = @bitCast(Ast.Node.Index, sn); + const tokens = tree.nodes.items(.main_token); + const tags = tree.tokens.items(.tag); + + const tok_idx = tokens[node_idx]; + + // tags[tok_idx] is the token called 'mut token' in AstGen + return (tags[tok_idx] == .keyword_var); +} From e24f123ff9b2e91bc91f29a456914a8f2b438371 Mon Sep 17 00:00:00 2001 From: Der Teufel Date: Mon, 16 Jan 2023 17:21:58 +0100 Subject: [PATCH 2/2] Simplify variable init handling --- src/Autodoc.zig | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Autodoc.zig b/src/Autodoc.zig index 04413126a1cb..b368626847b0 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -2513,21 +2513,18 @@ fn walkInstruction( if (small.has_lib_name) extra_index += 1; if (small.has_align) extra_index += 1; - var var_init: ?DocData.WalkResult = null; - if (small.has_init) { - const var_init_ref = @intToEnum(Ref, file.zir.extra[extra_index]); - var_init = try self.walkRef(file, parent_scope, parent_src, var_init_ref, need_type); - } - const var_type = try self.walkRef(file, parent_scope, parent_src, extra.data.var_type, need_type); - - const value: DocData.WalkResult = if (var_init) |vi| .{ - .typeRef = var_type.expr, - .expr = vi.expr, - } else .{ + + var value: DocData.WalkResult = .{ .typeRef = var_type.expr, .expr = .{ .undefined = .{} }, }; + + if (small.has_init) { + const var_init_ref = @intToEnum(Ref, file.zir.extra[extra_index]); + const var_init = try self.walkRef(file, parent_scope, parent_src, var_init_ref, need_type); + value.expr = var_init.expr; + } return value; },