mirror of
https://github.com/rdmsr/zag.git
synced 2026-10-27 13:58:20 +00:00
build: update tidy script
This commit is contained in:
+46
-5
@@ -1,5 +1,6 @@
|
|||||||
//! Whines about bad code style.
|
//! Whines about bad code style.
|
||||||
//! Inspired by TigerBeetle's similar tool.
|
//! Inspired by TigerBeetle's similar tool.
|
||||||
|
//! (https://github.com/tigerbeetle/tigerbeetle/blob/main/src/tidy.zig)
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
@@ -14,7 +15,8 @@ const max_cols = 80;
|
|||||||
const max_function_length = 90;
|
const max_function_length = 90;
|
||||||
|
|
||||||
/// Error on files and functions not being documented.
|
/// Error on files and functions not being documented.
|
||||||
const error_not_documented = true;
|
const error_func_not_documented = false;
|
||||||
|
const error_file_not_documented = true;
|
||||||
|
|
||||||
test "tidy" {
|
test "tidy" {
|
||||||
const gpa = std.testing.allocator;
|
const gpa = std.testing.allocator;
|
||||||
@@ -121,7 +123,7 @@ const Errors = struct {
|
|||||||
line_num: usize,
|
line_num: usize,
|
||||||
) void {
|
) void {
|
||||||
errors.emit(
|
errors.emit(
|
||||||
"{s}:{d}: error: use '.?' instead of 'orelse unreachable'\n",
|
"{s}:{d}: error: use 'orelse unreachable' instead of .?\n",
|
||||||
.{ file.path, line_num },
|
.{ file.path, line_num },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -162,6 +164,19 @@ const Errors = struct {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_banned(
|
||||||
|
errors: *Errors,
|
||||||
|
file: SourceFile,
|
||||||
|
line_num: usize,
|
||||||
|
func: []const u8,
|
||||||
|
replacement: []const u8,
|
||||||
|
) void {
|
||||||
|
errors.emit(
|
||||||
|
"{s}:{d}: error: {s} is banned, use {s}\n",
|
||||||
|
.{ file.path, line_num, func, replacement },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
fn emit(errors: *Errors, comptime fmt: []const u8, args: anytype) void {
|
fn emit(errors: *Errors, comptime fmt: []const u8, args: anytype) void {
|
||||||
comptime assert(fmt[fmt.len - 1] == '\n');
|
comptime assert(fmt[fmt.len - 1] == '\n');
|
||||||
errors.count += 1;
|
errors.count += 1;
|
||||||
@@ -202,6 +217,11 @@ const SourceFile = struct {
|
|||||||
assert(extension[0] == '.');
|
assert(extension[0] == '.');
|
||||||
return std.mem.endsWith(u8, file.path, extension);
|
return std.mem.endsWith(u8, file.path, extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn line_number(file: SourceFile, offset: usize) usize {
|
||||||
|
assert(offset <= file.text.len);
|
||||||
|
return std.mem.count(u8, file.text[0..offset], "\n") + 1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fn tidy_file(gpa: Allocator, file: SourceFile, errors: *Errors) !void {
|
fn tidy_file(gpa: Allocator, file: SourceFile, errors: *Errors) !void {
|
||||||
@@ -215,13 +235,16 @@ fn tidy_file(gpa: Allocator, file: SourceFile, errors: *Errors) !void {
|
|||||||
tidy_line(file, line, line_index + 1, errors);
|
tidy_line(file, line, line_index + 1, errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tidy banned things.
|
||||||
|
tidy_banned(file, errors);
|
||||||
|
|
||||||
// Tidy the AST.
|
// Tidy the AST.
|
||||||
var tree = try std.zig.Ast.parse(gpa, file.text, .zig);
|
var tree = try std.zig.Ast.parse(gpa, file.text, .{ .mode = .zig });
|
||||||
defer tree.deinit(gpa);
|
defer tree.deinit(gpa);
|
||||||
|
|
||||||
const has_file_doc = tree.tokenTag(0) == .container_doc_comment;
|
const has_file_doc = tree.tokenTag(0) == .container_doc_comment;
|
||||||
|
|
||||||
if (!has_file_doc and error_not_documented) {
|
if (!has_file_doc and error_file_not_documented) {
|
||||||
errors.add_file_not_documented(file);
|
errors.add_file_not_documented(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +300,7 @@ fn tidy_function(
|
|||||||
const documented = first > 0 and
|
const documented = first > 0 and
|
||||||
tree.tokenTag(first - 1) == .doc_comment;
|
tree.tokenTag(first - 1) == .doc_comment;
|
||||||
|
|
||||||
if (!documented and error_not_documented) {
|
if (!documented and error_func_not_documented) {
|
||||||
errors.add_function_not_documented(name, file, lineno + 1);
|
errors.add_function_not_documented(name, file, lineno + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,6 +372,24 @@ fn tidy_optional_unwrap(file: SourceFile, tree: std.zig.Ast, errors: *Errors) vo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn tidy_banned(file: SourceFile, errors: *Errors) void {
|
||||||
|
const ban_list: []const struct { []const u8, []const u8 } = &.{
|
||||||
|
.{ "debug.assert(", "unqualified assert" },
|
||||||
|
.{ "Self = @This()", "proper type name" },
|
||||||
|
.{ "catch unreachable", "proper error handling or documentation" },
|
||||||
|
.{ "catch {}", "proper error handling or documentation" },
|
||||||
|
.{ "= .init", "full type name" },
|
||||||
|
};
|
||||||
|
|
||||||
|
for (ban_list) |ban_item| {
|
||||||
|
const banned, const replacement = ban_item;
|
||||||
|
if (std.mem.indexOf(u8, file.text, banned)) |offset| {
|
||||||
|
const lineno = file.line_number(offset);
|
||||||
|
errors.add_banned(file, lineno, banned, replacement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn tidy_defer(file: SourceFile, tree: std.zig.Ast, errors: *Errors) void {
|
fn tidy_defer(file: SourceFile, tree: std.zig.Ast, errors: *Errors) void {
|
||||||
for (0..tree.nodes.len) |index| {
|
for (0..tree.nodes.len) |index| {
|
||||||
const node: std.zig.Ast.Node.Index = @enumFromInt(index);
|
const node: std.zig.Ast.Node.Index = @enumFromInt(index);
|
||||||
|
|||||||
Reference in New Issue
Block a user