aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLoris Cro <kappaloris@gmail.com>2023-05-05 18:24:55 +0200
committerGitHub <noreply@github.com>2023-05-05 18:24:55 +0200
commit9f3f9fb40f605de2f2bdcd0ce7a396e06b8b8c0d (patch)
tree0713d46e4ac8164884580413b0bb8075feeda07a /src
parent012f9a97eb74c63921ce7f3a036c71816fb59a24 (diff)
parent538c8258c724d31efd631b670d4a7d781009a1e1 (diff)
downloadzig-9f3f9fb40f605de2f2bdcd0ce7a396e06b8b8c0d.tar.gz
zig-9f3f9fb40f605de2f2bdcd0ce7a396e06b8b8c0d.zip
Merge pull request #15578 from der-teufel-programming/autodoc-if-switch
Autodoc: Save and render source code for `if` and `switch`
Diffstat (limited to 'src')
-rw-r--r--src/Autodoc.zig92
1 files changed, 45 insertions, 47 deletions
diff --git a/src/Autodoc.zig b/src/Autodoc.zig
index f73e718a4d..42813f7614 100644
--- a/src/Autodoc.zig
+++ b/src/Autodoc.zig
@@ -1876,12 +1876,14 @@ fn walkInstruction(
// WIP
const pl_node = data[inst_index].pl_node;
const extra = file.zir.extraData(Zir.Inst.SwitchBlock, pl_node.payload_index);
- const cond_index = self.exprs.items.len;
- _ = try self.walkRef(file, parent_scope, parent_src, extra.data.operand, false);
+ const switch_cond = try self.walkRef(file, parent_scope, parent_src, extra.data.operand, false);
+ const cond_index = self.exprs.items.len;
+ try self.exprs.append(self.arena, switch_cond.expr);
+ _ = cond_index;
- const ast_index = self.ast_nodes.items.len;
- const type_index = self.types.items.len - 1;
+ // const ast_index = self.ast_nodes.items.len;
+ // const type_index = self.types.items.len - 1;
// const ast_line = self.ast_nodes.items[ast_index - 1];
@@ -1894,12 +1896,18 @@ fn walkInstruction(
// log.debug("{s}", .{sep});
const switch_index = self.exprs.items.len;
- try self.exprs.append(self.arena, .{ .switchOp = .{
- .cond_index = cond_index,
- .file_name = file.sub_file_path,
- .src = ast_index,
- .outer_decl = type_index,
- } });
+
+ // const src_loc = try self.srcLocInfo(file, pl_node.src_node, parent_src);
+
+ const switch_expr = try self.getBlockSource(file, parent_src, pl_node.src_node);
+ try self.exprs.append(self.arena, .{ .comptimeExpr = self.comptime_exprs.items.len });
+ try self.comptime_exprs.append(self.arena, .{ .code = switch_expr });
+ // try self.exprs.append(self.arena, .{ .switchOp = .{
+ // .cond_index = cond_index,
+ // .file_name = file.sub_file_path,
+ // .src = ast_index,
+ // .outer_decl = type_index,
+ // } });
return DocData.WalkResult{
.typeRef = .{ .type = @enumToInt(Ref.type_type) },
@@ -2153,11 +2161,14 @@ fn walkInstruction(
};
},
.block => {
- const res = DocData.WalkResult{ .expr = .{
- .comptimeExpr = self.comptime_exprs.items.len,
- } };
+ const res = DocData.WalkResult{
+ .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+ .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
+ };
+ const pl_node = data[inst_index].pl_node;
+ const block_expr = try self.getBlockSource(file, parent_src, pl_node.src_node);
try self.comptime_exprs.append(self.arena, .{
- .code = "if (...) { ... }",
+ .code = block_expr,
});
return res;
},
@@ -2167,11 +2178,14 @@ fn walkInstruction(
parent_scope,
parent_src,
getBlockInlineBreak(file.zir, inst_index) orelse {
- const res = DocData.WalkResult{ .expr = .{
- .comptimeExpr = self.comptime_exprs.items.len,
- } };
+ const res = DocData.WalkResult{
+ .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+ .expr = .{ .comptimeExpr = self.comptime_exprs.items.len },
+ };
+ const pl_node = data[inst_index].pl_node;
+ const block_inline_expr = try self.getBlockSource(file, parent_src, pl_node.src_node);
try self.comptime_exprs.append(self.arena, .{
- .code = "if (...) { ... }",
+ .code = block_inline_expr,
});
return res;
},
@@ -3201,29 +3215,7 @@ fn analyzeDecl(
const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
const name: []const u8 = switch (decl_name_index) {
- 0, 1 => unreachable, // comptime or usingnamespace decl
- 2 => {
- unreachable;
- // decl test
- // const decl_status = scope.resolveDeclName(doc_comment_index);
- // const decl_being_tested = decl_status.Analyzed;
- // const func_index = getBlockInlineBreak(file.zir, value_index).?;
-
- // const pl_node = data[Zir.refToIndex(func_index).?].pl_node;
- // const fn_src = try self.srcLocInfo(file, pl_node.src_node, decl_src);
- // const tree = try file.getTree(self.comp_module.gpa);
- // const test_source_code = tree.getNodeSource(fn_src.src_node);
-
- // const ast_node_index = self.ast_nodes.items.len;
- // try self.ast_nodes.append(self.arena, .{
- // .file = 0,
- // .line = 0,
- // .col = 0,
- // .code = test_source_code,
- // });
- // self.decls.items[decl_being_tested].decltest = ast_node_index;
- // continue;
- },
+ 0, 1, 2 => unreachable, // comptime or usingnamespace decl, decltest
else => blk: {
if (file.zir.string_bytes[decl_name_index] == 0) {
// test decl
@@ -3359,15 +3351,10 @@ fn analyzeDecltest(
const value_index = file.zir.extra[d.sub_index + 6];
const decl_name_index = file.zir.extra[d.sub_index + 7];
- // This is known to work because decl values are always block_inlines
const value_pl_node = data[value_index].pl_node;
const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src);
- const func_index = getBlockInlineBreak(file.zir, value_index).?;
- const pl_node = data[Zir.refToIndex(func_index).?].pl_node;
- const fn_src = try self.srcLocInfo(file, pl_node.src_node, decl_src);
- const tree = try file.getTree(self.comp_module.gpa);
- const test_source_code = tree.getNodeSource(fn_src.src_node);
+ const test_source_code = try self.getBlockSource(file, parent_src, value_pl_node.src_node);
const decl_name: ?[]const u8 = if (decl_name_index != 0)
file.zir.nullTerminatedString(decl_name_index)
@@ -4814,6 +4801,17 @@ fn declIsVar(
return (tags[tok_idx] == .keyword_var);
}
+fn getBlockSource(
+ self: Autodoc,
+ file: *File,
+ parent_src: SrcLocInfo,
+ block_src_node: i32,
+) AutodocErrors![]const u8 {
+ const tree = try file.getTree(self.comp_module.gpa);
+ const block_src = try self.srcLocInfo(file, block_src_node, parent_src);
+ return tree.getNodeSource(block_src.src_node);
+}
+
fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 {
const source = (try file.getSource(self.comp_module.gpa)).bytes;
var tokenizer = Tokenizer.init(source);