autodoc: Better comptimeExpr code for blocks

This commit is contained in:
Krzysztof Wolicki 2023-05-05 01:46:19 +02:00
parent 012f9a97eb
commit e363ffad90
2 changed files with 70 additions and 48 deletions

View File

@ -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 =
'<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 }) +
";";
@ -4850,4 +4850,11 @@ function RadixTree() {
// BUT!
// We want to be able to search "Hash", for example!
// 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;
}
}

View File

@ -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);