diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-21 15:10:38 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-21 15:12:52 +0800 |
| commit | 9976b31a56bcc3ed37ac878b351bd8d097dc67cc (patch) | |
| tree | e7b092aee5e82f5d4c1f50332a17f1d2176ae51b /mingling_cli/src/linter/mlint_attr.rs | |
| parent | ee01756279ef17487d19659adedc0639547bbd25 (diff) | |
feat(mling): add linter framework with async support and registry
generation
Diffstat (limited to 'mingling_cli/src/linter/mlint_attr.rs')
| -rw-r--r-- | mingling_cli/src/linter/mlint_attr.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/mingling_cli/src/linter/mlint_attr.rs b/mingling_cli/src/linter/mlint_attr.rs new file mode 100644 index 0000000..24528d4 --- /dev/null +++ b/mingling_cli/src/linter/mlint_attr.rs @@ -0,0 +1,39 @@ +/// Result of checking `mlint(allow/warn/deny(...))` attributes. +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum MlintLevelOverride { + Allow, + Warn, + Deny, +} + +/// Parse `mlint(allow/warn/deny(lint_name))` from attributes. +/// Returns `None` if the lint is not mentioned in any mlint attribute. +pub fn get_mlint_override(attrs: &[syn::Attribute], lint_name: &str) -> Option<MlintLevelOverride> { + for attr in attrs { + if !attr.path().is_ident("mlint") { + continue; + } + let list = match attr.meta.require_list() { + Ok(l) => l, + Err(_) => continue, + }; + // TokenStream::to_string() adds spaces between tokens, + // e.g. `allow(xxx)` → `allow ( xxx )`. Remove all spaces to compare. + let flat: String = list + .tokens + .to_string() + .chars() + .filter(|c| !c.is_whitespace()) + .collect(); + for (keyword, variant) in [ + ("allow", MlintLevelOverride::Allow), + ("warn", MlintLevelOverride::Warn), + ("deny", MlintLevelOverride::Deny), + ] { + if flat.contains(&format!("{keyword}({lint_name})")) { + return Some(variant); + } + } + } + None +} |
