commit 6c7814fabd5cc94dce13ed02e5313069be9af482 (tree)
parent b607b0c27af71a541811955d3012f5346c997b09
Author: Andrew Kelley <andrew@ziglang.org>
Date: Tue, 10 Feb 2026 01:43:12 +0100
Merge pull request 'Autodoc: display line numbers in source code display' (#31155) from nektro/fork-zig:nektro-patch-54643 into master
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31155
Reviewed-by: Andrew Kelley <andrew@ziglang.org>
Diffstat:
4 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/lib/docs/index.html b/lib/docs/index.html
@@ -40,6 +40,15 @@
code a {
color: #000000;
}
+ .source-code {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ align-items: start;
+ }
+ .source-line-numbers pre {
+ text-align: right;
+ color: #666;
+ }
#listFields > div, #listParams > div {
margin-bottom: 1em;
}
@@ -429,7 +438,14 @@
</div>
<div id="sectSource" class="hidden">
<h2>Source Code</h2>
- <pre><code id="sourceText"></code></pre>
+ <div class="source-code">
+ <div class="source-line-numbers">
+ <pre><code id="sourceLineNumbers"></code></pre>
+ </div>
+ <div class="source-text">
+ <pre><code id="sourceText"></code></pre>
+ </div>
+ </div>
</div>
</section>
<div id="helpDialog" class="hidden">
diff --git a/lib/docs/main.js b/lib/docs/main.js
@@ -50,6 +50,7 @@
const domSectTypes = document.getElementById("sectTypes");
const domSectValues = document.getElementById("sectValues");
const domSourceText = document.getElementById("sourceText");
+ const domSourceLineNumbers = document.getElementById("sourceLineNumbers");
const domStatus = document.getElementById("status");
const domTableFnErrors = document.getElementById("tableFnErrors");
const domTldDocs = document.getElementById("tldDocs");
@@ -238,6 +239,7 @@
href: location.hash,
}]);
+ domSourceLineNumbers.innerHTML = declLineNumbersHtml(decl_index);
domSourceText.innerHTML = declSourceHtml(decl_index);
domSectSource.classList.remove("hidden");
@@ -389,6 +391,7 @@
if (members.length !== 0 || fields.length !== 0) {
renderNamespace(decl_index, members, fields);
} else {
+ domSourceLineNumbers.innerHTML = declLineNumbersHtml(decl_index);
domSourceText.innerHTML = declSourceHtml(decl_index);
domSectSource.classList.remove("hidden");
}
@@ -419,6 +422,7 @@
renderErrorSet(base_decl, errorSetNodeList(decl_index, errorSetNode));
}
+ domSourceLineNumbers.innerHTML = declLineNumbersHtml(decl_index);
domSourceText.innerHTML = declSourceHtml(decl_index);
domSectSource.classList.remove("hidden");
}
@@ -433,6 +437,7 @@
domTldDocs.classList.remove("hidden");
}
+ domSourceLineNumbers.innerHTML = declLineNumbersHtml(decl_index);
domSourceText.innerHTML = declSourceHtml(decl_index);
domSectSource.classList.remove("hidden");
}
@@ -918,6 +923,10 @@
return unwrapString(wasm_exports.decl_source_html(decl_index));
}
+ function declLineNumbersHtml(decl_index) {
+ return unwrapString(wasm_exports.decl_line_numbers_html(decl_index));
+ }
+
function declDoctestHtml(decl_index) {
return unwrapString(wasm_exports.decl_doctest_html(decl_index));
}
diff --git a/lib/docs/wasm/html_render.zig b/lib/docs/wasm/html_render.zig
@@ -30,6 +30,19 @@ pub const Annotation = struct {
dom_id: u32,
};
+pub fn fileSourceLineNumbersHtml(
+ file_index: Walk.File.Index,
+ out: *std.ArrayListUnmanaged(u8),
+ root_node: Ast.Node.Index,
+) !void {
+ const ast = file_index.get_ast();
+ const first_token_line = ast.tokenLocation(0, ast.firstToken(root_node)).line;
+ const last_token_line = ast.tokenLocation(0, ast.lastToken(root_node)).line;
+ for (first_token_line..last_token_line + 1) |i| {
+ try out.print(gpa, "<span>{d}</span>\n", .{i + 1});
+ }
+}
+
pub fn fileSourceHtml(
file_index: Walk.File.Index,
out: *ArrayList(u8),
diff --git a/lib/docs/wasm/main.zig b/lib/docs/wasm/main.zig
@@ -9,6 +9,7 @@ const ArrayList = std.ArrayList;
const Writer = std.Io.Writer;
const fileSourceHtml = @import("html_render.zig").fileSourceHtml;
+const fileSourceLineNumbersHtml = @import("html_render.zig").fileSourceLineNumbersHtml;
const appendEscaped = @import("html_render.zig").appendEscaped;
const resolveDeclLink = @import("html_render.zig").resolveDeclLink;
const missing_feature_url_escape = @import("html_render.zig").missing_feature_url_escape;
@@ -543,6 +544,16 @@ export fn decl_fn_proto_html(decl_index: Decl.Index, linkify_fn_name: bool) Stri
return String.init(string_result.items);
}
+export fn decl_line_numbers_html(decl_index: Decl.Index) String {
+ const decl = decl_index.get();
+
+ string_result.clearRetainingCapacity();
+ fileSourceLineNumbersHtml(decl.file, &string_result, decl.ast_node) catch |err| {
+ std.debug.panic("unable to render source line numbers: {s}", .{@errorName(err)});
+ };
+ return String.init(string_result.items);
+}
+
export fn decl_source_html(decl_index: Decl.Index) String {
const decl = decl_index.get();