mirror of
https://github.com/ziglang/zig.git
synced 2025-12-27 16:43:07 +00:00
Merge pull request #15578 from der-teufel-programming/autodoc-if-switch
Autodoc: Save and render source code for `if` and `switch`
This commit is contained in:
commit
9f3f9fb40f
@ -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
|
||||
) {
|
||||
domFnProtoCode.innerHTML =
|
||||
'<span class="tok-kw">const</span> ' +
|
||||
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 =
|
||||
'<span class="tok-kw">var</span> ' +
|
||||
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 }) +
|
||||
";";
|
||||
|
||||
@ -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) },
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user