aboutsummaryrefslogtreecommitdiff
path: root/mingling_cli/src/lints
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-21 15:38:00 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-21 15:38:00 +0800
commit0056e1095e75b34f39cde7de87ce6be2cd301ff1 (patch)
tree5a79e51a8a42a7d1f40e8eab388c7b71f279b1a2 /mingling_cli/src/lints
parenta4780f04172b3ef9fb11af5f7bc8abd7139cbe54 (diff)
feat(mlint): support RenderResult::default and ::from detection
Extend the `unnecessary_render_result_creation` lint to also flag uses of `RenderResult::default()` and `RenderResult::from(...)`, and add `#[derive(Default)]` to `MlintReport` and `MlintLevel` to simplify struct instantiation
Diffstat (limited to 'mingling_cli/src/lints')
-rw-r--r--mingling_cli/src/lints/unnecessary_render_result_creation.rs51
1 files changed, 34 insertions, 17 deletions
diff --git a/mingling_cli/src/lints/unnecessary_render_result_creation.rs b/mingling_cli/src/lints/unnecessary_render_result_creation.rs
index fa6809b..aa0f4a6 100644
--- a/mingling_cli/src/lints/unnecessary_render_result_creation.rs
+++ b/mingling_cli/src/lints/unnecessary_render_result_creation.rs
@@ -45,7 +45,6 @@ pub fn linter(ast: syn::ItemFn, source: &str) -> Vec<MlintReport> {
if only_print_and_return && print_count > 0 {
let span = MlintReport::span_from_syn(&ast.sig, source);
vec![MlintReport {
- file_name: String::new(),
source_code: source.to_string(),
level: MlintLevel::Warning,
lint_code: "unnecessary_render_result_creation".into(),
@@ -55,22 +54,14 @@ pub fn linter(ast: syn::ItemFn, source: &str) -> Vec<MlintReport> {
),
spans: vec![span],
attached_reports: vec![MlintReport {
- file_name: String::new(),
- source_code: String::new(),
level: MlintLevel::Help,
- lint_code: String::new(),
- message: "change to `#[renderer(buffer)]` and use `r_println!(...)` without the `r` parameter".into(),
- spans: vec![],
- attached_reports: vec![],
- package_id: None,
- target_name: None,
- target_kind: None,
- target_src_path: None,
+ message: format!(
+ "change to `#[renderer(buffer)]` and use `r_println!(...)` without the `{}` parameter",
+ r_name,
+ ),
+ ..Default::default()
}],
- package_id: None,
- target_name: None,
- target_kind: None,
- target_src_path: None,
+ ..Default::default()
}]
} else {
vec![]
@@ -103,11 +94,37 @@ fn find_render_result_new(stmts: &[syn::Stmt]) -> Option<(proc_macro2::Ident, us
{
let segs = &expr_path.path.segments;
let matches = match segs.len() {
- 2 => segs[0].ident == "RenderResult" && segs[1].ident == "new",
+ 2 => {
+ segs[0].ident == "RenderResult"
+ && (segs[1].ident == "new" || segs[1].ident == "default")
+ }
+ 3 => {
+ segs[0].ident == "mingling"
+ && segs[1].ident == "RenderResult"
+ && (segs[2].ident == "new" || segs[2].ident == "default")
+ }
+ _ => false,
+ };
+ if matches {
+ return Some((pat_id.ident.clone(), i));
+ }
+ }
+
+ // Also handle `RenderResult::from(...)` and `mingling::RenderResult::from(...)`
+ if let syn::Stmt::Local(local) = stmt
+ && let Some(init) = &local.init
+ && let syn::Pat::Ident(pat_id) = &local.pat
+ && pat_id.mutability.is_some()
+ && let syn::Expr::Call(call) = &*init.expr
+ && let syn::Expr::Path(expr_path) = call.func.as_ref()
+ {
+ let segs = &expr_path.path.segments;
+ let matches = match segs.len() {
+ 2 => segs[0].ident == "RenderResult" && segs[1].ident == "from",
3 => {
segs[0].ident == "mingling"
&& segs[1].ident == "RenderResult"
- && segs[2].ident == "new"
+ && segs[2].ident == "from"
}
_ => false,
};