aboutsummaryrefslogtreecommitdiff
path: root/mingling_cli/tmpls/lints.tmpl
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-21 16:56:39 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-21 16:56:39 +0800
commitb9d7b8736062509f1f7a5c02943398975ea7ee53 (patch)
tree092c2e69af569522051056008f3b3079f14a0efb /mingling_cli/tmpls/lints.tmpl
parent05a06b59d2a27428d253308f067aa0e5a841eb5e (diff)
feat(lint): add non_mingling_naming_style lint with auto-fix suggestions
Support file-level lint checks via `check_file` in lint registry template.
Diffstat (limited to 'mingling_cli/tmpls/lints.tmpl')
-rw-r--r--mingling_cli/tmpls/lints.tmpl45
1 files changed, 29 insertions, 16 deletions
diff --git a/mingling_cli/tmpls/lints.tmpl b/mingling_cli/tmpls/lints.tmpl
index 3b20ed4..590828a 100644
--- a/mingling_cli/tmpls/lints.tmpl
+++ b/mingling_cli/tmpls/lints.tmpl
@@ -2,30 +2,26 @@
use crate::linter::mlint_report::{MlintLevel, MlintReport};
>>>>>>>>>> impls;
+>>>>>>>>>> file_lints;
/// Run all registered lints on a parsed file with its source text.
pub fn run_all_lints(file: &syn::File, source: &str) -> Vec<MlintReport> {
use crate::linter::mlint_attr::{get_mlint_override, MlintLevelOverride};
- let mut reports = vec![];
+
+ // File-level lints (check types, modules, etc.)
+ let mut reports: Vec<MlintReport> = vec![];
+>>>>>>>>>> file_calls;
+
+ // Item-level lints (check each function)
for item in &file.items {
if let syn::Item::Fn(f) = item {
>>>>>>>>>> calls;
-
-@@@ >>> calls
- let skip = get_mlint_override(&f.attrs, "<<<name>>>") == Some(MlintLevelOverride::Allow);
- if !skip {
- let mut rs = <<<name>>>::linter(f.clone(), source);
- if get_mlint_override(&f.attrs, "<<<name>>>") == Some(MlintLevelOverride::Deny) {
- for r in &mut rs { r.level = MlintLevel::Error; }
- }
- reports.extend(rs);
- }
-@@@ <<<
}
}
+
+ // Apply file-level #![mlint(allow/warn/deny(...))] overrides
for r in &mut reports {
- let name = &r.lint_code;
- if let Some(override_level) = get_mlint_override(&file.attrs, name) {
+ if let Some(override_level) = get_mlint_override(&file.attrs, &r.lint_code) {
match override_level {
MlintLevelOverride::Allow => r.level = MlintLevel::Help,
MlintLevelOverride::Deny => r.level = MlintLevel::Error,
@@ -42,8 +38,6 @@ pub fn run_all_lints(file: &syn::File, source: &str) -> Vec<MlintReport> {
#[macro_export]
macro_rules! assert_detected {
($linter:expr, $ast_type:ty => { $($code:tt)* }) => {
- // $($code:tt)* captures tokens INSIDE the braces, not including the braces
- // e.g. `fn foo() { ... }` — exactly what syn::ItemFn expects
let source = stringify!($($code)*);
let ast: $ast_type = syn::parse_str(&source).unwrap();
assert!(!$linter(ast, &source).is_empty());
@@ -59,7 +53,26 @@ macro_rules! assert_not_detected {
};
}
+@@@ >>> file_calls
+ reports.extend(<<<name>>>::check_file(file, source));
+@@@ <<<
+
+@@@ >>> file_lints
+pub use <<<name>>>::check_file as <<<name>>>_file;
+@@@ <<<
+
@@@ >>> impls
mod <<<mod_name>>>;
pub use <<<mod_name>>>::linter as <<<mod_name>>>;
@@@ <<<
+
+@@@ >>> calls
+ let skip = get_mlint_override(&f.attrs, "<<<name>>>") == Some(MlintLevelOverride::Allow);
+ if !skip {
+ let mut rs = <<<name>>>::linter(f.clone(), source);
+ if get_mlint_override(&f.attrs, "<<<name>>>") == Some(MlintLevelOverride::Deny) {
+ for r in &mut rs { r.level = MlintLevel::Error; }
+ }
+ reports.extend(rs);
+ }
+@@@ <<<