authorgravatar for der.teufel.mail@gmail.comKrzysztof Wolicki <der.teufel.mail@gmail.com> 2023-01-16 17:28:07+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-01-16 17:28:07+01:00
logae69dfe6e739b1b2d4ae76923d04bc69c23b07fa
tree147f9c10092ccd193fe2e8e0de72e2fccda2f0c8
parent31a2b8c3642f1240a70d78203d568051d4dbcd3f
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

autodoc: Better handling of variable decls (#14301)


2 files changed, 82 insertions(+), 13 deletions(-)

lib/docs/main.js+47-7
......@@ -2250,12 +2250,49 @@ var zigAnalysis;
22502250 }
22512251
22522252 function renderVar(decl) {
2253 let declTypeRef = typeOfDecl(decl);
2254 domFnProtoCode.innerHTML =
2255 '<span class="tok-kw">var</span> ' +
2256 escapeHtml(decl.name) +
2257 ": " +
2258 typeValueName(declTypeRef, true, true);
2253 let resolvedVar = resolveValue(decl.value);
2254
2255 if (resolvedVar.expr.fieldRef) {
2256 const declRef = decl.value.expr.refPath[0].declRef;
2257 const type = getDecl(declRef);
2258 domFnProtoCode.innerHTML =
2259 '<span class="tok-kw">var</span> ' +
2260 escapeHtml(decl.name) +
2261 ": " +
2262 type.name +
2263 " = " +
2264 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
2265 ";";
2266 } else if (
2267 resolvedVar.expr.string !== undefined ||
2268 resolvedVar.expr.call !== undefined ||
2269 resolvedVar.expr.comptimeExpr
2270 ) {
2271 domFnProtoCode.innerHTML =
2272 '<span class="tok-kw">var</span> ' +
2273 escapeHtml(decl.name) +
2274 ": " +
2275 exprName(resolvedVar.expr, { wantHtml: true, wantLink: true }) +
2276 " = " +
2277 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
2278 ";";
2279 } else if (resolvedVar.expr.compileError) {
2280 domFnProtoCode.innerHTML =
2281 '<span class="tok-kw">var</span> ' +
2282 escapeHtml(decl.name) +
2283 " = " +
2284 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
2285 ";";
2286 } else {
2287 domFnProtoCode.innerHTML =
2288 '<span class="tok-kw">var</span> ' +
2289 escapeHtml(decl.name) +
2290 ": " +
2291 exprName(resolvedVar.typeRef, { wantHtml: true, wantLink: true }) +
2292 " = " +
2293 exprName(decl.value.expr, { wantHtml: true, wantLink: true }) +
2294 ";";
2295 }
22592296
22602297 let docs = getAstNode(decl.src).docs;
22612298 if (docs != null) {
......@@ -2546,7 +2583,10 @@ var zigAnalysis;
25462583 tdNameA.setAttribute("href", navLinkDecl(decl.name));
25472584 tdNameA.textContent = decl.name;
25482585
2549 tdType.innerHTML = typeValueName(typeOfDecl(decl), true, true);
2586 tdType.innerHTML = exprName(walkResultTypeRef(decl.value), {
2587 wantHtml: true,
2588 wantLink: true,
2589 });
25502590
25512591 let docs = getAstNode(decl.src).docs;
25522592 if (docs != null) {
src/Autodoc.zig+35-6
......@@ -2506,16 +2506,25 @@ fn walkInstruction(
25062506 };
25072507 },
25082508 .variable => {
2509 const extra = file.zir.extraData(Zir.Inst.ExtendedVar, extended.operand);
2510
25092511 const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small);
2510 var extra_index: usize = extended.operand;
2512 var extra_index: usize = extra.end;
25112513 if (small.has_lib_name) extra_index += 1;
25122514 if (small.has_align) extra_index += 1;
25132515
2514 const value: DocData.WalkResult = if (small.has_init) .{
2515 .expr = .{ .void = .{} },
2516 } else .{
2517 .expr = .{ .void = .{} },
2516 const var_type = try self.walkRef(file, parent_scope, parent_src, extra.data.var_type, need_type);
2517
2518 var value: DocData.WalkResult = .{
2519 .typeRef = var_type.expr,
2520 .expr = .{ .undefined = .{} },
25182521 };
2522
2523 if (small.has_init) {
2524 const var_init_ref = @intToEnum(Ref, file.zir.extra[extra_index]);
2525 const var_init = try self.walkRef(file, parent_scope, parent_src, var_init_ref, need_type);
2526 value.expr = var_init.expr;
2527 }
25192528
25202529 return value;
25212530 },
......@@ -3213,13 +3222,15 @@ fn walkDecls(
32133222 // .declRef => |d| .{ .declRef = d },
32143223 // };
32153224
3225 const kind: []const u8 = if (try self.declIsVar(file, value_pl_node.src_node, parent_src)) "var" else "const";
3226
32163227 self.decls.items[decls_slot_index] = .{
32173228 ._analyzed = true,
32183229 .name = name,
32193230 .src = ast_node_index,
32203231 //.typeRef = decl_type_ref,
32213232 .value = walk_result,
3222 .kind = "const", // find where this information can be found
3233 .kind = kind,
32233234 };
32243235
32253236 // Unblock any pending decl path that was waiting for this decl.
......@@ -4383,3 +4394,21 @@ fn srcLocInfo(
43834394 .src_node = sn,
43844395 };
43854396}
4397
4398fn declIsVar(
4399 self: Autodoc,
4400 file: *File,
4401 src_node: i32,
4402 parent_src: SrcLocInfo,
4403) !bool {
4404 const sn = @intCast(u32, @intCast(i32, parent_src.src_node) + src_node);
4405 const tree = try file.getTree(self.module.gpa);
4406 const node_idx = @bitCast(Ast.Node.Index, sn);
4407 const tokens = tree.nodes.items(.main_token);
4408 const tags = tree.tokens.items(.tag);
4409
4410 const tok_idx = tokens[node_idx];
4411
4412 // tags[tok_idx] is the token called 'mut token' in AstGen
4413 return (tags[tok_idx] == .keyword_var);
4414}