From e363ffad903b0f66283fe25de98f3e181d371fc7 Mon Sep 17 00:00:00 2001 From: Krzysztof Wolicki Date: Fri, 5 May 2023 01:46:19 +0200 Subject: [PATCH 1/4] autodoc: Better comptimeExpr code for blocks --- lib/docs/main.js | 29 ++++++++++------ src/Autodoc.zig | 89 ++++++++++++++++++++++++++++-------------------- 2 files changed, 70 insertions(+), 48 deletions(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index 14bcf0f544..1e25d0c944 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -649,16 +649,16 @@ const NAV_MODES = { let lines = code.split("\n"); let result = ""; let indent_level = 0; - for(let i = 0; i < lines.length; i += 1) { + for (let i = 0; i < lines.length; i += 1) { let line = lines[i].trim(); - if(line[0] == "}") indent_level -= 1; - for(let j = 0; j < indent_level; j += 1) { + if (line[0] == "}") indent_level -= 1; + for (let j = 0; j < indent_level; j += 1) { result += " "; } if (line.startsWith("\\\\")) result += " " result += line; - result += "\n"; - if(line[line.length - 1] == "{") indent_level += 1; + if (i != lines.length - 1) result += "\n"; + if (line[line.length - 1] == "{") indent_level += 1; } return result; } @@ -1730,7 +1730,7 @@ const NAV_MODES = { return payloadHtml + "}"; } case "comptimeExpr": { - return zigAnalysis.comptimeExprs[expr.comptimeExpr].code; + return renderZigSource(zigAnalysis.comptimeExprs[expr.comptimeExpr].code); } case "call": { let call = zigAnalysis.calls[expr.call]; @@ -2571,13 +2571,13 @@ const NAV_MODES = { } else if ( resolvedValue.expr.string !== undefined || resolvedValue.expr.call !== undefined || - resolvedValue.expr.comptimeExpr + (resolvedValue.expr.comptimeExpr !== undefined && resolvedValue.typeRef !== null) ) { domFnProtoCode.innerHTML = 'const ' + escapeHtml(decl.name) + ": " + - exprName(resolvedValue.expr, { wantHtml: true, wantLink: true }) + + exprName(resolvedValue.typeRef !== null ? resolvedValue.typeRef : resolvedValue.expr, { wantHtml: true, wantLink: true }) + " = " + exprName(decl.value.expr, { wantHtml: true, wantLink: true }) + ";"; @@ -2628,13 +2628,13 @@ const NAV_MODES = { } else if ( resolvedVar.expr.string !== undefined || resolvedVar.expr.call !== undefined || - resolvedVar.expr.comptimeExpr + resolvedVar.expr.comptimeExpr !== undefined ) { domFnProtoCode.innerHTML = 'var ' + escapeHtml(decl.name) + ": " + - exprName(resolvedVar.expr, { wantHtml: true, wantLink: true }) + + exprName(resolvedVar.typeRef !== null ? resolvedVar.typeRef : resolvedVar.expr, { wantHtml: true, wantLink: true }) + " = " + exprName(decl.value.expr, { wantHtml: true, wantLink: true }) + ";"; @@ -4850,4 +4850,11 @@ function RadixTree() { // BUT! -// We want to be able to search "Hash", for example! \ No newline at end of file +// We want to be able to search "Hash", for example! + +function findDeclByName(name) { + for (let i = 0; i < zigAnalysis.decls.length; i += 1) { + let decl = zigAnalysis.decls[i]; + if(decl[0] == name) return decl; + } +} \ No newline at end of file diff --git a/src/Autodoc.zig b/src/Autodoc.zig index f73e718a4d..20f2c6a23e 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -2153,11 +2153,13 @@ 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 block_expr = try self.getBlockSource(file, parent_src, inst_index); try self.comptime_exprs.append(self.arena, .{ - .code = "if (...) { ... }", + .code = block_expr, }); return res; }, @@ -2167,11 +2169,13 @@ 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 block_inline_expr = try self.getBlockSource(file, parent_src, inst_index); try self.comptime_exprs.append(self.arena, .{ - .code = "if (...) { ... }", + .code = block_inline_expr, }); return res; }, @@ -3201,29 +3205,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 @@ -3360,15 +3342,11 @@ fn analyzeDecltest( const decl_name_index = file.zir.extra[d.sub_index + 7]; // This is known to work because decl values are always block_inlines + const test_source_code = try self.getBlockSource(file, parent_src, value_index); + 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 decl_name: ?[]const u8 = if (decl_name_index != 0) file.zir.nullTerminatedString(decl_name_index) else @@ -4814,6 +4792,43 @@ fn declIsVar( return (tags[tok_idx] == .keyword_var); } +fn getBlockSource( + self: Autodoc, + file: *File, + parent_src: SrcLocInfo, + value_index: usize, +) AutodocErrors![]const u8 { + const data = file.zir.instructions.items(.data); + const tags = file.zir.instructions.items(.tag); + const tree = try file.getTree(self.comp_module.gpa); + + // This is known to work because decl values are always block_inlines + const block_pl_node = data[value_index].pl_node; + const block_src = try self.srcLocInfo(file, block_pl_node.src_node, parent_src); + + const blk_index = idx: { + const pl_node = data[value_index].pl_node; + const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index); + const end_index = file.zir.extra[extra.end..][extra.data.body_len - 1]; + + if (tags[end_index] == .break_inline) { + break :idx @as(usize, Zir.refToIndex(data[end_index].@"break".operand).?); + } else { + break :idx null; + } + }; + + const blk_source = src: { + if (blk_index) |idx| { + const pl_node = data[idx].pl_node; + break :src try self.srcLocInfo(file, pl_node.src_node, block_src); + } else { + break :src block_src; + } + }; + return tree.getNodeSource(blk_source.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); From c63338712e0267678d400e58b61853954d0e40e4 Mon Sep 17 00:00:00 2001 From: Krzysztof Wolicki Date: Fri, 5 May 2023 02:41:23 +0200 Subject: [PATCH 2/4] autodoc: Save switches as comptimeExpr with the code instead of analyzing it deeply; simplified getBlockSource; --- src/Autodoc.zig | 71 +++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/src/Autodoc.zig b/src/Autodoc.zig index 20f2c6a23e..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 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; - _ = try self.walkRef(file, parent_scope, parent_src, extra.data.operand, false); - - 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) }, @@ -2157,7 +2165,8 @@ fn walkInstruction( .typeRef = .{ .type = @enumToInt(Ref.type_type) }, .expr = .{ .comptimeExpr = self.comptime_exprs.items.len }, }; - const block_expr = try self.getBlockSource(file, parent_src, inst_index); + 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 = block_expr, }); @@ -2173,7 +2182,8 @@ fn walkInstruction( .typeRef = .{ .type = @enumToInt(Ref.type_type) }, .expr = .{ .comptimeExpr = self.comptime_exprs.items.len }, }; - const block_inline_expr = try self.getBlockSource(file, parent_src, inst_index); + 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 = block_inline_expr, }); @@ -3341,12 +3351,11 @@ 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 test_source_code = try self.getBlockSource(file, parent_src, value_index); - const value_pl_node = data[value_index].pl_node; const decl_src = try self.srcLocInfo(file, value_pl_node.src_node, parent_src); + 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) else @@ -4796,37 +4805,11 @@ fn getBlockSource( self: Autodoc, file: *File, parent_src: SrcLocInfo, - value_index: usize, + block_src_node: i32, ) AutodocErrors![]const u8 { - const data = file.zir.instructions.items(.data); - const tags = file.zir.instructions.items(.tag); const tree = try file.getTree(self.comp_module.gpa); - - // This is known to work because decl values are always block_inlines - const block_pl_node = data[value_index].pl_node; - const block_src = try self.srcLocInfo(file, block_pl_node.src_node, parent_src); - - const blk_index = idx: { - const pl_node = data[value_index].pl_node; - const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index); - const end_index = file.zir.extra[extra.end..][extra.data.body_len - 1]; - - if (tags[end_index] == .break_inline) { - break :idx @as(usize, Zir.refToIndex(data[end_index].@"break".operand).?); - } else { - break :idx null; - } - }; - - const blk_source = src: { - if (blk_index) |idx| { - const pl_node = data[idx].pl_node; - break :src try self.srcLocInfo(file, pl_node.src_node, block_src); - } else { - break :src block_src; - } - }; - return tree.getNodeSource(blk_source.src_node); + 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 { From e0c65ce3f2eb9f6f689ec937564471477a02f018 Mon Sep 17 00:00:00 2001 From: Krzysztof Wolicki Date: Fri, 5 May 2023 02:46:04 +0200 Subject: [PATCH 3/4] autodoc: main.js exprName cleanup --- lib/docs/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index 1e25d0c944..ceffd2abe7 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -2571,7 +2571,7 @@ const NAV_MODES = { } else if ( resolvedValue.expr.string !== undefined || resolvedValue.expr.call !== undefined || - (resolvedValue.expr.comptimeExpr !== undefined && resolvedValue.typeRef !== null) + resolvedValue.expr.comptimeExpr !== undefined ) { domFnProtoCode.innerHTML = 'const ' + From 538c8258c724d31efd631b670d4a7d781009a1e1 Mon Sep 17 00:00:00 2001 From: Krzysztof Wolicki Date: Fri, 5 May 2023 12:01:00 +0200 Subject: [PATCH 4/4] autodoc: Remove debug code --- lib/docs/main.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index ceffd2abe7..9b650643e9 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -4850,11 +4850,4 @@ function RadixTree() { // BUT! -// We want to be able to search "Hash", for example! - -function findDeclByName(name) { - for (let i = 0; i < zigAnalysis.decls.length; i += 1) { - let decl = zigAnalysis.decls[i]; - if(decl[0] == name) return decl; - } -} \ No newline at end of file +// We want to be able to search "Hash", for example! \ No newline at end of file