diff options
| author | Loris Cro <kappaloris@gmail.com> | 2023-05-05 18:24:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-05 18:24:55 +0200 |
| commit | 9f3f9fb40f605de2f2bdcd0ce7a396e06b8b8c0d (patch) | |
| tree | 0713d46e4ac8164884580413b0bb8075feeda07a /src | |
| parent | 012f9a97eb74c63921ce7f3a036c71816fb59a24 (diff) | |
| parent | 538c8258c724d31efd631b670d4a7d781009a1e1 (diff) | |
| download | zig-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.zig | 92 |
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); |
