From b9d7b8736062509f1f7a5c02943398975ea7ee53 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Tue, 21 Jul 2026 16:56:39 +0800 Subject: feat(lint): add non_mingling_naming_style lint with auto-fix suggestions Support file-level lint checks via `check_file` in lint registry template. --- mingling_cli/tmpls/lints.tmpl | 45 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'mingling_cli/tmpls') 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 { use crate::linter::mlint_attr::{get_mlint_override, MlintLevelOverride}; - let mut reports = vec![]; + + // File-level lints (check types, modules, etc.) + let mut reports: Vec = 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, "<<>>") == Some(MlintLevelOverride::Allow); - if !skip { - let mut rs = <<>>::linter(f.clone(), source); - if get_mlint_override(&f.attrs, "<<>>") == 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 { #[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(<<>>::check_file(file, source)); +@@@ <<< + +@@@ >>> file_lints +pub use <<>>::check_file as <<>>_file; +@@@ <<< + @@@ >>> impls mod <<>>; pub use <<>>::linter as <<>>; @@@ <<< + +@@@ >>> calls + let skip = get_mlint_override(&f.attrs, "<<>>") == Some(MlintLevelOverride::Allow); + if !skip { + let mut rs = <<>>::linter(f.clone(), source); + if get_mlint_override(&f.attrs, "<<>>") == Some(MlintLevelOverride::Deny) { + for r in &mut rs { r.level = MlintLevel::Error; } + } + reports.extend(rs); + } +@@@ <<< -- cgit