aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mingling_cli/src/linter/mlint_report.rs12
-rw-r--r--mingling_cli/src/lints/unnecessary_render_result_creation.rs51
2 files changed, 39 insertions, 24 deletions
diff --git a/mingling_cli/src/linter/mlint_report.rs b/mingling_cli/src/linter/mlint_report.rs
index 3c52828..07fc5c1 100644
--- a/mingling_cli/src/linter/mlint_report.rs
+++ b/mingling_cli/src/linter/mlint_report.rs
@@ -14,6 +14,7 @@ use crate::Next;
use crate::metadata::setup::ResUsingJson;
/// Complete structure of a Lint report, containing inspection results and associated metadata.
+#[derive(Default)]
pub struct MlintReport {
/// Source file name
pub file_name: String,
@@ -50,11 +51,12 @@ pub struct MlintReport {
}
/// Report severity level, indicating the seriousness of the Lint result.
-#[derive(Clone, Copy, PartialEq, Eq)]
+#[derive(Default, Clone, Copy, PartialEq, Eq)]
pub enum MlintLevel {
+ #[default]
+ Note,
Error,
Warning,
- Note,
Help,
}
@@ -228,17 +230,13 @@ impl MlintReport {
group = group.element(msg);
}
- // 添加 note: `#[mlint(level([code]))]` on by default
if !self.lint_code.is_empty() {
let level_name = match self.level {
MlintLevel::Error => "deny",
MlintLevel::Warning => "warn",
MlintLevel::Note | MlintLevel::Help => "allow",
};
- let note_text = format!(
- "`#[mlint({level_name}([{}]))]` on by default",
- self.lint_code
- );
+ let note_text = format!("`#[mlint({level_name}({}))]` on by default", self.lint_code);
let note_msg = NOTE.clone().message(note_text);
group = group.element(note_msg);
}
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,
};