From 4b717065177bc34b73b2d8412b412685d65f3138 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 7 Aug 2026 12:08:08 +0800 Subject: feat(lint): add shell completion for linter checkers --- mingling_cli/src/linter/cmd_lint.rs | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'mingling_cli/src/linter') diff --git a/mingling_cli/src/linter/cmd_lint.rs b/mingling_cli/src/linter/cmd_lint.rs index 57a78ad..38f2973 100644 --- a/mingling_cli/src/linter/cmd_lint.rs +++ b/mingling_cli/src/linter/cmd_lint.rs @@ -1,14 +1,17 @@ use crate::linter::mlint_report::{MlintReport, StateLintReports}; use cargo_metadata::Metadata; -use mingling::LazyRes; use mingling::consts::REMAINS; -use mingling::macros::{arg, chain, dispatcher, metadata, pack}; +use mingling::macros::{arg, chain, completion, dispatcher, metadata, pack, suggest}; use mingling::metadata::Description; -use mingling::picker::EntryPicker; +use mingling::picker::parselib::ParserStyle; +use mingling::picker::{EntryPicker, PickerArg}; +use mingling::{LazyRes, ShellContext, Suggest}; use tokio::task::JoinSet; dispatcher!("lint", CMDLint => EntryLint); +const ARG_WITH_CHECKER: PickerArg> = arg![with_checker: Option]; + #[metadata(EntryLint)] pub fn desc_lint() -> Description { "Mingling Linter".to_string().into() @@ -79,9 +82,7 @@ pack!(StateBeginLinter = ()); #[chain] pub fn handle_lint(args: EntryLint) -> StateBeginLinter { let (with_checker, checker_args) = args - .pick_or(&arg![with_checker: Option], || { - Some("cargo,check".to_string()) - }) + .pick_or(&ARG_WITH_CHECKER, || Some("cargo,check".to_string())) .pick(&REMAINS) .unwrap(); @@ -136,3 +137,22 @@ pub async fn handle_state_begin_linter( let reports = linter_main(metadata).await; StateLintReports::new(reports) } + +#[completion(EntryLint)] +pub fn complete_lint(ctx: &ShellContext) -> Suggest { + if mingling::picker::parselib::build_possible_flags( + ParserStyle::global_style(), + &ARG_WITH_CHECKER.into_info(), + ) + .contains(&ctx.previous_word) + { + suggest! { + "cargo,check": "Also run `cargo check` for checking", + "cargo,clippy": "Also run `cargo clippy` for checking", + } + } else { + suggest! { + ARG_WITH_CHECKER: "Comma-separated Rust Analyzer-compatible checkers to also run, e.g. `cargo,check`" + } + } +} -- cgit