diff --git a/crates/emmylua_check/src/init.rs b/crates/emmylua_check/src/init.rs index a3ad53dea..c46eb2c26 100644 --- a/crates/emmylua_check/src/init.rs +++ b/crates/emmylua_check/src/init.rs @@ -3,11 +3,14 @@ use emmylua_code_analysis::{ }; use fern::Dispatch; use log::LevelFilter; -use std::{path::PathBuf, str::FromStr}; +use std::{ + path::{Path, PathBuf}, + str::FromStr, +}; -fn root_from_configs(config_paths: &Vec, fallback: &PathBuf) -> PathBuf { +fn root_from_configs(config_paths: &[PathBuf], fallback: &Path) -> PathBuf { if config_paths.len() != 1 { - fallback.clone() + fallback.to_path_buf() } else { let config_path = &config_paths[0]; // Need to convert to canonical path to ensure parent() is not an empty @@ -20,7 +23,7 @@ fn root_from_configs(config_paths: &Vec, fallback: &PathBuf) -> PathBuf config_path, err ); - fallback.clone() + fallback.to_path_buf() } } } diff --git a/crates/emmylua_code_style/src/bin/emmylua_format.rs b/crates/emmylua_code_style/src/bin/emmylua_format.rs index 1fbb50acf..0053cd665 100644 --- a/crates/emmylua_code_style/src/bin/emmylua_format.rs +++ b/crates/emmylua_code_style/src/bin/emmylua_format.rs @@ -134,11 +134,9 @@ fn main() { } } } else if args.write { - if changed { - if let Err(e) = fs::write(path, formatted) { - eprintln!("Failed to write {}: {e}", path.to_string_lossy()); - exit_code = 2; - } + if changed && let Err(e) = fs::write(path, formatted) { + eprintln!("Failed to write {}: {e}", path.to_string_lossy()); + exit_code = 2; } } else if let Some(out) = &args.output { if let Err(e) = fs::write(out, formatted) { diff --git a/crates/emmylua_code_style/src/test/mod.rs b/crates/emmylua_code_style/src/test/mod.rs index 52fce2c7c..2b2fd2a80 100644 --- a/crates/emmylua_code_style/src/test/mod.rs +++ b/crates/emmylua_code_style/src/test/mod.rs @@ -1,3 +1,4 @@ +#[allow(clippy::module_inception)] #[cfg(test)] mod test { use crate::{reformat_lua_code, styles::LuaCodeStyle}; diff --git a/crates/emmylua_doc_cli/src/init.rs b/crates/emmylua_doc_cli/src/init.rs index 9be0e921e..5dc5fb8aa 100644 --- a/crates/emmylua_doc_cli/src/init.rs +++ b/crates/emmylua_doc_cli/src/init.rs @@ -3,11 +3,15 @@ use emmylua_code_analysis::{ }; use fern::Dispatch; use log::LevelFilter; -use std::{path::PathBuf, str::FromStr, sync::Arc}; +use std::{ + path::{Path, PathBuf}, + str::FromStr, + sync::Arc, +}; -fn root_from_configs(config_paths: &Vec, fallback: &PathBuf) -> PathBuf { +fn root_from_configs(config_paths: &[PathBuf], fallback: &Path) -> PathBuf { if config_paths.len() != 1 { - fallback.clone() + fallback.to_path_buf() } else { let config_path = &config_paths[0]; // Need to convert to canonical path to ensure parent() is not an empty @@ -20,7 +24,7 @@ fn root_from_configs(config_paths: &Vec, fallback: &PathBuf) -> PathBuf config_path, err ); - fallback.clone() + fallback.to_path_buf() } } } diff --git a/crates/emmylua_doc_cli/src/markdown_generator/generator/index_gen.rs b/crates/emmylua_doc_cli/src/markdown_generator/generator/index_gen.rs index 50ddb6d38..d384abef0 100644 --- a/crates/emmylua_doc_cli/src/markdown_generator/generator/index_gen.rs +++ b/crates/emmylua_doc_cli/src/markdown_generator/generator/index_gen.rs @@ -2,11 +2,7 @@ use tera::Tera; use crate::markdown_generator::markdown_types::MkdocsIndex; -pub fn generate_index( - tl: &Tera, - mkdocs: &mut MkdocsIndex, - output: &std::path::PathBuf, -) -> Option<()> { +pub fn generate_index(tl: &Tera, mkdocs: &mut MkdocsIndex, output: &std::path::Path) -> Option<()> { let mut context = tera::Context::new(); mkdocs.types.sort_by(|a, b| a.name.cmp(&b.name)); mkdocs.modules.sort_by(|a, b| a.name.cmp(&b.name)); diff --git a/crates/emmylua_doc_cli/src/markdown_generator/generator/mod_gen.rs b/crates/emmylua_doc_cli/src/markdown_generator/generator/mod_gen.rs index adaf8ce03..b319e1c39 100644 --- a/crates/emmylua_doc_cli/src/markdown_generator/generator/mod_gen.rs +++ b/crates/emmylua_doc_cli/src/markdown_generator/generator/mod_gen.rs @@ -25,8 +25,10 @@ pub fn generate_module_markdown( check_filter(db, module.file_id)?; let mut context = tera::Context::new(); - let mut doc = Doc::default(); - doc.name = module.full_module_name.clone(); + let mut doc = Doc { + name: module.full_module_name.clone(), + ..Default::default() + }; let property_owner_id = module.semantic_id.clone(); if let Some(property_id) = property_owner_id { doc.property = collect_property(db, property_id); diff --git a/crates/emmylua_doc_cli/src/markdown_generator/generator/typ_gen.rs b/crates/emmylua_doc_cli/src/markdown_generator/generator/typ_gen.rs index bcdf9f949..b0851fa45 100644 --- a/crates/emmylua_doc_cli/src/markdown_generator/generator/typ_gen.rs +++ b/crates/emmylua_doc_cli/src/markdown_generator/generator/typ_gen.rs @@ -23,8 +23,10 @@ pub fn generate_type_markdown( check_filter(db, typ)?; let mut context = tera::Context::new(); let typ_name = typ.get_name(); - let mut doc = Doc::default(); - doc.name = typ_name.to_string(); + let mut doc = Doc { + name: typ_name.to_string(), + ..Default::default() + }; if typ.is_class() { generate_class_type_markdown(db, tl, typ, &mut doc, &mut context, output, mkdocs_index); diff --git a/crates/emmylua_ls/src/context/client_id.rs b/crates/emmylua_ls/src/context/client_id.rs index 3ac24702f..4c7211cd1 100644 --- a/crates/emmylua_ls/src/context/client_id.rs +++ b/crates/emmylua_ls/src/context/client_id.rs @@ -1,19 +1,14 @@ use lsp_types::ClientInfo; -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub enum ClientId { VSCode, Intellij, Neovim, + #[default] Other, } -impl Default for ClientId { - fn default() -> Self { - ClientId::Other - } -} - #[allow(unused)] impl ClientId { pub fn is_vscode(&self) -> bool { @@ -56,10 +51,7 @@ fn check_vscode(client_info: &ClientInfo) -> bool { return true; } - match name.as_str() { - "Cursor" | "Windsurf" | "Trae" | "Qoder" => true, - _ => false, - } + matches!(name.as_str(), "Cursor" | "Windsurf" | "Trae" | "Qoder") } fn check_lsp4ij(client_info: &ClientInfo) -> bool { diff --git a/crates/emmylua_ls/src/context/file_diagnostic.rs b/crates/emmylua_ls/src/context/file_diagnostic.rs index 2d93083cb..e5acf5ac8 100644 --- a/crates/emmylua_ls/src/context/file_diagnostic.rs +++ b/crates/emmylua_ls/src/context/file_diagnostic.rs @@ -40,13 +40,13 @@ impl FileDiagnostic { // create new token let cancel_token = CancellationToken::new(); - tokens.insert(file_id.clone(), cancel_token.clone()); + tokens.insert(file_id, cancel_token.clone()); drop(tokens); // free the lock let analysis = self.analysis.clone(); let client = self.client.clone(); let diagnostic_tokens = self.diagnostic_tokens.clone(); - let file_id_clone = file_id.clone(); + let file_id_clone = file_id; // Spawn a new task to perform diagnostic tokio::spawn(async move { @@ -177,7 +177,7 @@ async fn workspace_diagnostic( let mut count = 0; if valid_file_count != 0 { if silent { - while let Some(_) = rx.recv().await { + while (rx.recv().await).is_some() { count += 1; if count == valid_file_count { break; @@ -187,7 +187,7 @@ async fn workspace_diagnostic( let text = format!("diagnose {} files", valid_file_count); let _p = Profile::new(text.as_str()); let mut last_percentage = 0; - while let Some(_) = rx.recv().await { + while (rx.recv().await).is_some() { count += 1; let percentage_done = ((count as f32 / valid_file_count as f32) * 100.0) as u32; if last_percentage != percentage_done { diff --git a/crates/emmylua_ls/src/context/status_bar.rs b/crates/emmylua_ls/src/context/status_bar.rs index d2c138647..a89764530 100644 --- a/crates/emmylua_ls/src/context/status_bar.rs +++ b/crates/emmylua_ls/src/context/status_bar.rs @@ -4,7 +4,6 @@ use lsp_types::{ NumberOrString, ProgressParams, ProgressParamsValue, WorkDoneProgress, WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd, WorkDoneProgressReport, }; -use serde::{Deserialize, Serialize}; use crate::util::time_cancel_token; @@ -104,16 +103,3 @@ impl StatusBar { ) } } - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EmmyServerStatus { - health: String, - loading: bool, - message: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EmmyProgress { - text: String, - percent: f64, -} diff --git a/crates/emmylua_ls/src/context/workspace_manager.rs b/crates/emmylua_ls/src/context/workspace_manager.rs index a196e82a7..bdb301b98 100644 --- a/crates/emmylua_ls/src/context/workspace_manager.rs +++ b/crates/emmylua_ls/src/context/workspace_manager.rs @@ -5,7 +5,6 @@ use std::{path::PathBuf, sync::Arc, time::Duration}; use super::{ClientProxy, FileDiagnostic, StatusBar}; use crate::handlers::{ClientConfig, init_analysis}; -use dirs; use emmylua_code_analysis::{EmmyLuaAnalysis, Emmyrc, load_configs}; use emmylua_code_analysis::{update_code_style, uri_to_file_path}; use log::{debug, info}; @@ -114,10 +113,7 @@ impl WorkspaceManager { } pub async fn reload_workspace(&self) -> Option<()> { - let config_root: Option = match self.workspace_folders.first() { - Some(root) => Some(PathBuf::from(root)), - None => None, - }; + let config_root: Option = self.workspace_folders.first().map(PathBuf::from); let emmyrc = load_emmy_config(config_root, self.client_config.clone()); let analysis = self.analysis.clone(); @@ -183,7 +179,7 @@ impl WorkspaceManager { return true; } - let Some(file_path) = uri_to_file_path(&uri) else { + let Some(file_path) = uri_to_file_path(uri) else { return true; }; @@ -217,38 +213,32 @@ pub fn load_emmy_config(config_root: Option, client_config: ClientConfi let mut config_files = Vec::new(); let home_dir = dirs::home_dir(); - match home_dir { - Some(home_dir) => { - let global_luarc_path = home_dir.join(luarc_file); - if global_luarc_path.exists() { - info!("load config from: {:?}", global_luarc_path); - config_files.push(global_luarc_path); - } - let global_emmyrc_path = home_dir.join(emmyrc_file); - if global_emmyrc_path.exists() { - info!("load config from: {:?}", global_emmyrc_path); - config_files.push(global_emmyrc_path); - } + if let Some(home_dir) = home_dir { + let global_luarc_path = home_dir.join(luarc_file); + if global_luarc_path.exists() { + info!("load config from: {:?}", global_luarc_path); + config_files.push(global_luarc_path); + } + let global_emmyrc_path = home_dir.join(emmyrc_file); + if global_emmyrc_path.exists() { + info!("load config from: {:?}", global_emmyrc_path); + config_files.push(global_emmyrc_path); } - None => {} }; let emmylua_config_dir = "emmylua_ls"; let config_dir = dirs::config_dir().map(|path| path.join(emmylua_config_dir)); - match config_dir { - Some(config_dir) => { - let global_luarc_path = config_dir.join(luarc_file); - if global_luarc_path.exists() { - info!("load config from: {:?}", global_luarc_path); - config_files.push(global_luarc_path); - } - let global_emmyrc_path = config_dir.join(emmyrc_file); - if global_emmyrc_path.exists() { - info!("load config from: {:?}", global_emmyrc_path); - config_files.push(global_emmyrc_path); - } + if let Some(config_dir) = config_dir { + let global_luarc_path = config_dir.join(luarc_file); + if global_luarc_path.exists() { + info!("load config from: {:?}", global_luarc_path); + config_files.push(global_luarc_path); + } + let global_emmyrc_path = config_dir.join(emmyrc_file); + if global_emmyrc_path.exists() { + info!("load config from: {:?}", global_emmyrc_path); + config_files.push(global_emmyrc_path); } - None => {} }; std::env::var("EMMYLUALS_CONFIG") @@ -381,7 +371,7 @@ impl WorkspaceFileMatcher { log::error!("Invalid include pattern"); } - return true; + true } } diff --git a/crates/emmylua_ls/src/handlers/call_hierarchy/build_call_hierarchy.rs b/crates/emmylua_ls/src/handlers/call_hierarchy/build_call_hierarchy.rs index 2799bb1d5..892086c80 100644 --- a/crates/emmylua_ls/src/handlers/call_hierarchy/build_call_hierarchy.rs +++ b/crates/emmylua_ls/src/handlers/call_hierarchy/build_call_hierarchy.rs @@ -78,13 +78,13 @@ fn get_kind(db: &DbIndex, type_owner: LuaTypeOwner) -> SymbolKind { match type_cache { Some(typ) => { if typ.is_function() { - return SymbolKind::FUNCTION; + SymbolKind::FUNCTION } else if typ.is_ref() || typ.is_def() { - return SymbolKind::CLASS; + SymbolKind::CLASS } else if typ.is_const() { - return SymbolKind::CONSTANT; + SymbolKind::CONSTANT } else { - return SymbolKind::VARIABLE; + SymbolKind::VARIABLE } } None => SymbolKind::VARIABLE, diff --git a/crates/emmylua_ls/src/handlers/code_actions/actions/build_disable_code.rs b/crates/emmylua_ls/src/handlers/code_actions/actions/build_disable_code.rs index 43877bbaf..90dcbb940 100644 --- a/crates/emmylua_ls/src/handlers/code_actions/actions/build_disable_code.rs +++ b/crates/emmylua_ls/src/handlers/code_actions/actions/build_disable_code.rs @@ -22,7 +22,7 @@ impl DisableLineAst { DisableLineAst::Stat(stat) => stat.get_left_comment(), DisableLineAst::Expr(expr) => { if let Some(attached_comment) = find_expr_attached_comment(expr.syntax()) { - return Some(LuaComment::cast(attached_comment)?); + return LuaComment::cast(attached_comment); } None } @@ -79,7 +79,7 @@ pub fn build_disable_next_line_changes( return None; } - let token = match root.syntax().token_at_offset(offset.into()) { + let token = match root.syntax().token_at_offset(offset) { TokenAtOffset::Single(token) => token, TokenAtOffset::Between(_, token) => token, _ => return None, @@ -89,17 +89,17 @@ pub fn build_disable_next_line_changes( let mut ast = DisableLineAst::Stat(stat.clone()); let expr = token.parent_ancestors().find_map(LuaExpr::cast); // 如果 expr 是 stat 的子节点, 则认为是 expr - if let Some(expr) = expr { - if stat.get_range().contains(expr.get_range().start()) { - let stat_line = semantic_model - .get_document() - .get_line(stat.get_position())?; - let expr_line = semantic_model - .get_document() - .get_line(expr.get_position())?; - if expr_line != stat_line { - ast = DisableLineAst::Expr(expr); - } + if let Some(expr) = expr + && stat.get_range().contains(expr.get_range().start()) + { + let stat_line = semantic_model + .get_document() + .get_line(stat.get_position())?; + let expr_line = semantic_model + .get_document() + .get_line(expr.get_position())?; + if expr_line != stat_line { + ast = DisableLineAst::Expr(expr); } }; @@ -107,7 +107,7 @@ pub fn build_disable_next_line_changes( if let Some(comment) = ast.get_left_comment() { if let Some(diagnostic_tag) = - find_diagnostic_disable_tag(comment.clone(), DisableAction::DisableLine) + find_diagnostic_disable_tag(comment.clone(), DisableAction::Line) { let new_start = if let Some(actions_list) = diagnostic_tag.get_code_list() { actions_list.get_range().end() @@ -132,7 +132,7 @@ pub fn build_disable_next_line_changes( } else { text_edit = get_disable_next_line_text_edit( &document, - &emmyrc, + emmyrc, comment.syntax().clone(), comment.get_position(), code, @@ -143,13 +143,14 @@ pub fn build_disable_next_line_changes( if text_edit.is_none() { text_edit = get_disable_next_line_text_edit( &document, - &emmyrc, + emmyrc, ast.syntax().clone(), ast.get_position(), code, ); } + #[allow(clippy::mutable_key_type)] let mut changes = HashMap::new(); let uri = document.get_uri(); changes.insert(uri, vec![text_edit?]); @@ -216,7 +217,7 @@ pub fn build_disable_file_changes( }; let text_edit = if let LuaAst::LuaComment(comment) = first_child { if let Some(diagnostic_tag) = - find_diagnostic_disable_tag(comment.clone(), DisableAction::DisableFile) + find_diagnostic_disable_tag(comment.clone(), DisableAction::File) { let new_start = if let Some(actions_list) = diagnostic_tag.get_code_list() { actions_list.get_range().end() @@ -269,6 +270,7 @@ pub fn build_disable_file_changes( } }; + #[allow(clippy::mutable_key_type)] let mut changes = HashMap::new(); let uri = document.get_uri(); changes.insert(uri, vec![text_edit]); @@ -280,7 +282,7 @@ fn find_diagnostic_disable_tag( comment: LuaComment, action: DisableAction, ) -> Option { - let diagnostic_tags = comment.get_doc_tags().into_iter().filter_map(|tag| { + let diagnostic_tags = comment.get_doc_tags().filter_map(|tag| { if let LuaDocTag::Diagnostic(diagnostic) = tag { Some(diagnostic) } else { @@ -292,12 +294,12 @@ fn find_diagnostic_disable_tag( let action_token = diagnostic_tag.get_action_token()?; let action_token_text = action_token.get_name_text(); match action { - DisableAction::DisableLine => { + DisableAction::Line => { if action_token_text == "disable-next-line" { return Some(diagnostic_tag); } } - DisableAction::DisableFile | DisableAction::DisableProject => { + DisableAction::File | DisableAction::Project => { if action_token_text == "disable" { return Some(diagnostic_tag); } diff --git a/crates/emmylua_ls/src/handlers/code_actions/actions/build_fix_code.rs b/crates/emmylua_ls/src/handlers/code_actions/actions/build_fix_code.rs index 19ff59700..12028e9bb 100644 --- a/crates/emmylua_ls/src/handlers/code_actions/actions/build_fix_code.rs +++ b/crates/emmylua_ls/src/handlers/code_actions/actions/build_fix_code.rs @@ -15,41 +15,37 @@ pub fn build_need_check_nil( let document = semantic_model.get_document(); let offset = document.get_offset(range.end.line as usize, range.end.character as usize)?; let root = semantic_model.get_root(); - let token = match root.syntax().token_at_offset(offset.into()) { + let token = match root.syntax().token_at_offset(offset) { TokenAtOffset::Single(token) => token, TokenAtOffset::Between(_, token) => token, _ => return None, }; // 取上一个token的父节点 let node_or_token = token.prev_sibling_or_token()?; - match node_or_token { - NodeOrToken::Node(node) => match node { - expr_node if LuaExpr::can_cast(expr_node.kind().into()) => { - let expr = LuaExpr::cast(expr_node)?; - let range = expr.syntax().text_range(); - let mut lsp_range = document.to_lsp_range(range)?; - // 将范围缩小到最尾部的字符 - lsp_range.start.line = lsp_range.end.line; - lsp_range.start.character = lsp_range.end.character; + if let NodeOrToken::Node(expr_node) = node_or_token + && LuaExpr::can_cast(expr_node.kind().into()) + { + let expr = LuaExpr::cast(expr_node)?; + let range = expr.syntax().text_range(); + let mut lsp_range = document.to_lsp_range(range)?; + // 将范围缩小到最尾部的字符 + lsp_range.start.line = lsp_range.end.line; + lsp_range.start.character = lsp_range.end.character; - let text_edit = TextEdit { - range: lsp_range, - new_text: "--[[@cast -?]]".to_string(), - }; + let text_edit = TextEdit { + range: lsp_range, + new_text: "--[[@cast -?]]".to_string(), + }; - actions.push(CodeActionOrCommand::CodeAction(CodeAction { - title: t!("use cast to remove nil").to_string(), - kind: Some(CodeActionKind::QUICKFIX), - edit: Some(WorkspaceEdit { - changes: Some(HashMap::from([(document.get_uri(), vec![text_edit])])), - ..Default::default() - }), - ..Default::default() - })); - } - _ => {} - }, - _ => {} + actions.push(CodeActionOrCommand::CodeAction(CodeAction { + title: t!("use cast to remove nil").to_string(), + kind: Some(CodeActionKind::QUICKFIX), + edit: Some(WorkspaceEdit { + changes: Some(HashMap::from([(document.get_uri(), vec![text_edit])])), + ..Default::default() + }), + ..Default::default() + })); } Some(()) @@ -70,7 +66,7 @@ pub fn build_add_doc_tag( title: t!("Add @%{name} to the list of known tags", name = tag_name).to_string(), kind: Some(CodeActionKind::QUICKFIX), command: Some(make_auto_doc_tag_command( - &t!("Add @%{name} to the list of known tags", name = tag_name).to_string(), + t!("Add @%{name} to the list of known tags", name = tag_name).as_ref(), tag_name, )), diff --git a/crates/emmylua_ls/src/handlers/code_actions/build_actions.rs b/crates/emmylua_ls/src/handlers/code_actions/build_actions.rs index d461b30fa..e84304ae2 100644 --- a/crates/emmylua_ls/src/handlers/code_actions/build_actions.rs +++ b/crates/emmylua_ls/src/handlers/code_actions/build_actions.rs @@ -30,26 +30,25 @@ pub fn build_actions( continue; } - if let Some(code) = diagnostic.code { - if let NumberOrString::String(action_string) = code { - if let Some(diagnostic_code) = DiagnosticCode::from_str(&action_string).ok() { - add_fix_code_action( - &semantic_model, - &mut actions, - diagnostic_code, - file_id, - diagnostic.range, - &diagnostic.data, - ); - add_disable_code_action( - &semantic_model, - &mut actions, - diagnostic_code, - file_id, - diagnostic.range, - ); - } - } + if let Some(code) = diagnostic.code + && let NumberOrString::String(action_string) = code + && let Ok(diagnostic_code) = DiagnosticCode::from_str(&action_string) + { + add_fix_code_action( + semantic_model, + &mut actions, + diagnostic_code, + file_id, + diagnostic.range, + &diagnostic.data, + ); + add_disable_code_action( + semantic_model, + &mut actions, + diagnostic_code, + file_id, + diagnostic.range, + ); } } @@ -124,12 +123,12 @@ fn add_disable_code_action( .to_string(), kind: Some(CodeActionKind::QUICKFIX), command: Some(make_disable_code_command( - &t!( + t!( "Disable all diagnostics in current project (%{name})", name = diagnostic_code.get_name() ) - .to_string(), - DisableAction::DisableProject, + .as_ref(), + DisableAction::Project, diagnostic_code, file_id, range, diff --git a/crates/emmylua_ls/src/handlers/code_actions/mod.rs b/crates/emmylua_ls/src/handlers/code_actions/mod.rs index 18210239f..76600c09c 100644 --- a/crates/emmylua_ls/src/handlers/code_actions/mod.rs +++ b/crates/emmylua_ls/src/handlers/code_actions/mod.rs @@ -31,9 +31,9 @@ pub fn code_action( file_id: FileId, diagnostics: Vec, ) -> Option { - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; - build_actions(&mut semantic_model, diagnostics) + build_actions(&semantic_model, diagnostics) } pub struct CodeActionsCapabilities; diff --git a/crates/emmylua_ls/src/handlers/code_lens/mod.rs b/crates/emmylua_ls/src/handlers/code_lens/mod.rs index b58f0cfae..1daf174a6 100644 --- a/crates/emmylua_ls/src/handlers/code_lens/mod.rs +++ b/crates/emmylua_ls/src/handlers/code_lens/mod.rs @@ -22,13 +22,13 @@ pub async fn on_code_lens_handler( let uri = params.text_document.uri; let analysis = context.analysis().read().await; let file_id = analysis.get_file_id(&uri)?; - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; if !semantic_model.get_emmyrc().code_lens.enable { return None; } - build_code_lens(&mut semantic_model) + build_code_lens(&semantic_model) } pub async fn on_resolve_code_lens_handler( diff --git a/crates/emmylua_ls/src/handlers/code_lens/resolve_code_lens.rs b/crates/emmylua_ls/src/handlers/code_lens/resolve_code_lens.rs index 9d3b0ef76..0418e6d1b 100644 --- a/crates/emmylua_ls/src/handlers/code_lens/resolve_code_lens.rs +++ b/crates/emmylua_ls/src/handlers/code_lens/resolve_code_lens.rs @@ -24,13 +24,11 @@ pub fn resolve_code_lens( match data { CodeLensData::Member(member_id) => { let file_id = member_id.file_id; - let mut semantic_model = compilation.get_semantic_model(file_id)?; + let semantic_model = compilation.get_semantic_model(file_id)?; let mut results = Vec::new(); - search_member_references(&mut semantic_model, compilation, member_id, &mut results); + search_member_references(&semantic_model, compilation, member_id, &mut results); let mut ref_count = results.len(); - if ref_count > 0 { - ref_count -= 1; - } + ref_count = ref_count.saturating_sub(1); let uri = semantic_model.get_document().get_uri(); let command = make_usage_command(uri, code_lens.range, ref_count, client_id, results); @@ -42,9 +40,9 @@ pub fn resolve_code_lens( } CodeLensData::DeclId(decl_id) => { let file_id = decl_id.file_id; - let mut semantic_model = compilation.get_semantic_model(file_id)?; + let semantic_model = compilation.get_semantic_model(file_id)?; let mut results = Vec::new(); - search_decl_references(&mut semantic_model, compilation, decl_id, &mut results); + search_decl_references(&semantic_model, compilation, decl_id, &mut results); let ref_count = results.len(); let uri = semantic_model.get_document().get_uri(); let command = make_usage_command(uri, code_lens.range, ref_count, client_id, results); @@ -76,10 +74,11 @@ fn make_usage_command( ref_count, if ref_count == 1 { "" } else { "s" } ); - let mut args = Vec::new(); - args.push(serde_json::to_value(uri).unwrap()); - args.push(serde_json::to_value(range.start).unwrap()); - args.push(serde_json::to_value(refs).unwrap()); + let args = vec![ + serde_json::to_value(uri).unwrap(), + serde_json::to_value(range.start).unwrap(), + serde_json::to_value(refs).unwrap(), + ]; Command { title, diff --git a/crates/emmylua_ls/src/handlers/command/commands/emmy_add_doc_tag.rs b/crates/emmylua_ls/src/handlers/command/commands/emmy_add_doc_tag.rs index ee28a7bce..57508802a 100644 --- a/crates/emmylua_ls/src/handlers/command/commands/emmy_add_doc_tag.rs +++ b/crates/emmylua_ls/src/handlers/command/commands/emmy_add_doc_tag.rs @@ -15,7 +15,7 @@ impl CommandSpec for AddDocTagCommand { const COMMAND: &str = "emmy.add.doctag"; async fn handle(context: ServerContextSnapshot, args: Vec) -> Option<()> { - let tag_name: String = serde_json::from_value(args.get(0)?.clone()).ok()?; + let tag_name: String = serde_json::from_value(args.first()?.clone()).ok()?; add_doc_tag(context.workspace_manager(), tag_name).await; Some(()) } @@ -33,7 +33,7 @@ pub fn make_auto_doc_tag_command(title: &str, tag_name: &str) -> Command { async fn add_doc_tag(workspace_manager: &RwLock, tag_name: String) -> Option<()> { let workspace_manager = workspace_manager.read().await; - let main_workspace = workspace_manager.workspace_folders.get(0)?; + let main_workspace = workspace_manager.workspace_folders.first()?; let emmyrc_path = main_workspace.join(".emmyrc.json"); let mut emmyrc = load_configs_raw(vec![emmyrc_path.clone()], None); drop(workspace_manager); diff --git a/crates/emmylua_ls/src/handlers/command/commands/emmy_auto_require.rs b/crates/emmylua_ls/src/handlers/command/commands/emmy_auto_require.rs index 57589afb9..830e81fc4 100644 --- a/crates/emmylua_ls/src/handlers/command/commands/emmy_auto_require.rs +++ b/crates/emmylua_ls/src/handlers/command/commands/emmy_auto_require.rs @@ -18,7 +18,7 @@ impl CommandSpec for AutoRequireCommand { const COMMAND: &str = "emmy.auto.require"; async fn handle(context: ServerContextSnapshot, args: Vec) -> Option<()> { - let add_to: FileId = serde_json::from_value(args.get(0)?.clone()).ok()?; + let add_to: FileId = serde_json::from_value(args.first()?.clone()).ok()?; let need_require_file_id: FileId = serde_json::from_value(args.get(1)?.clone()).ok()?; let position: Position = serde_json::from_value(args.get(2)?.clone()).ok()?; let member_name: String = serde_json::from_value(args.get(3)?.clone()).ok()?; @@ -33,7 +33,7 @@ impl CommandSpec for AutoRequireCommand { let require_like_func = &emmyrc.runtime.require_like_function; let auto_require_func = emmyrc.completion.auto_require_function.clone(); let file_conversion = emmyrc.completion.auto_require_naming_convention; - let local_name = module_name_convert(&module_info, file_conversion); + let local_name = module_name_convert(module_info, file_conversion); let require_separator = emmyrc.completion.auto_require_separator.clone(); let full_module_path = match require_separator.as_str() { "." | "" => module_info.full_module_name.clone(), @@ -66,7 +66,7 @@ impl CommandSpec for AutoRequireCommand { break; } - if is_require_stat(stat.clone(), &require_like_func).unwrap_or(false) { + if is_require_stat(stat.clone(), require_like_func).unwrap_or(false) { last_require_stat = Some(stat); } } @@ -93,6 +93,7 @@ impl CommandSpec for AutoRequireCommand { }; let uri = document.get_uri(); + #[allow(clippy::mutable_key_type)] let mut changes = HashMap::new(); changes.insert(uri.clone(), vec![text_edit.clone()]); @@ -112,10 +113,10 @@ impl CommandSpec for AutoRequireCommand { .client() .apply_edit(apply_edit_params, cancel_token) .await; - if let Some(res) = res { - if !res.applied { - log::error!("Failed to apply edit: {:?}", res.failure_reason); - } + if let Some(res) = res + && !res.applied + { + log::error!("Failed to apply edit: {:?}", res.failure_reason); } }); @@ -123,7 +124,7 @@ impl CommandSpec for AutoRequireCommand { } } -fn is_require_stat(stat: LuaStat, require_like_func: &Vec) -> Option { +fn is_require_stat(stat: LuaStat, require_like_func: &[String]) -> Option { match stat { LuaStat::LocalStat(local_stat) => { let exprs = local_stat.get_value_exprs(); @@ -153,7 +154,7 @@ fn is_require_stat(stat: LuaStat, require_like_func: &Vec) -> Option) -> Option { +fn is_require_expr(expr: LuaExpr, require_like_func: &[String]) -> Option { if let LuaExpr::CallExpr(call_expr) = expr { let name = call_expr.get_prefix_expr()?; if let LuaExpr::NameExpr(name_expr) = name { diff --git a/crates/emmylua_ls/src/handlers/command/commands/emmy_disable_code.rs b/crates/emmylua_ls/src/handlers/command/commands/emmy_disable_code.rs index 5dd460b05..faa23fe8a 100644 --- a/crates/emmylua_ls/src/handlers/command/commands/emmy_disable_code.rs +++ b/crates/emmylua_ls/src/handlers/command/commands/emmy_disable_code.rs @@ -13,9 +13,9 @@ use super::CommandSpec; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum DisableAction { - DisableLine, - DisableFile, - DisableProject, + Line, + File, + Project, } pub struct DisableCodeCommand; @@ -24,14 +24,11 @@ impl CommandSpec for DisableCodeCommand { const COMMAND: &str = "emmy.disable.code"; async fn handle(context: ServerContextSnapshot, args: Vec) -> Option<()> { - let action: DisableAction = serde_json::from_value(args.get(0)?.clone()).ok()?; + let action: DisableAction = serde_json::from_value(args.first()?.clone()).ok()?; let code: DiagnosticCode = serde_json::from_value(args.get(3)?.clone()).ok()?; - match action { - DisableAction::DisableProject => { - add_disable_project(context.workspace_manager(), code).await; - } - _ => {} + if let DisableAction::Project = action { + add_disable_project(context.workspace_manager(), code).await; } Some(()) @@ -64,7 +61,7 @@ async fn add_disable_project( code: DiagnosticCode, ) -> Option<()> { let workspace_manager = workspace_manager.read().await; - let main_workspace = workspace_manager.workspace_folders.get(0)?; + let main_workspace = workspace_manager.workspace_folders.first()?; let emmyrc_path = main_workspace.join(".emmyrc.json"); let mut emmyrc = load_configs_raw(vec![emmyrc_path.clone()], None); drop(workspace_manager); diff --git a/crates/emmylua_ls/src/handlers/completion/add_completions/add_decl_completion.rs b/crates/emmylua_ls/src/handlers/completion/add_completions/add_decl_completion.rs index 46a5a1b37..391ba9d12 100644 --- a/crates/emmylua_ls/src/handlers/completion/add_completions/add_decl_completion.rs +++ b/crates/emmylua_ls/src/handlers/completion/add_completions/add_decl_completion.rs @@ -21,11 +21,11 @@ pub fn add_decl_completion( let overload_count = count_function_overloads(builder.semantic_model.get_db(), typ); let mut completion_item = CompletionItem { label: name.to_string(), - kind: Some(get_completion_kind(&typ)), + kind: Some(get_completion_kind(typ)), data: CompletionData::from_property_owner_id(builder, decl_id.into(), overload_count), label_details: Some(lsp_types::CompletionItemLabelDetails { - detail: get_detail(builder, &typ, CallDisplay::None), - description: get_description(builder, &typ), + detail: get_detail(builder, typ, CallDisplay::None), + description: get_description(builder, typ), }), ..Default::default() }; @@ -46,7 +46,7 @@ fn count_function_overloads(db: &DbIndex, typ: &LuaType) -> Option { } LuaType::Signature(id) => { count += 1; - if let Some(signature) = db.get_signature_index().get(&id) { + if let Some(signature) = db.get_signature_index().get(id) { count += signature.overloads.len(); } } diff --git a/crates/emmylua_ls/src/handlers/completion/add_completions/add_member_completion.rs b/crates/emmylua_ls/src/handlers/completion/add_completions/add_member_completion.rs index 8b031d9e7..aec80ea87 100644 --- a/crates/emmylua_ls/src/handlers/completion/add_completions/add_member_completion.rs +++ b/crates/emmylua_ls/src/handlers/completion/add_completions/add_member_completion.rs @@ -55,7 +55,7 @@ pub fn add_member_completion( _ => return None, }, CompletionTriggerStatus::LeftBracket => match member_key { - LuaMemberKey::Name(name) => format!("\"{}\"", name.to_string()), + LuaMemberKey::Name(name) => format!("\"{}\"", name), LuaMemberKey::Integer(index) => format!("{}", index), _ => return None, }, @@ -63,7 +63,7 @@ pub fn add_member_completion( let typ = &member_info.typ; let remove_nil_type = - get_function_remove_nil(&builder.semantic_model.get_db(), typ).unwrap_or(typ.clone()); + get_function_remove_nil(builder.semantic_model.get_db(), typ).unwrap_or(typ.clone()); if status == CompletionTriggerStatus::Colon && !remove_nil_type.is_function() { return None; } @@ -71,9 +71,9 @@ pub fn add_member_completion( // 附加数据, 用于在`resolve`时进一步处理 let completion_data = if let Some(id) = &property_owner { if let Some(index) = member_info.overload_index { - CompletionData::from_overload(builder, id.clone().into(), index, overload_count) + CompletionData::from_overload(builder, id.clone(), index, overload_count) } else { - CompletionData::from_property_owner_id(builder, id.clone().into(), overload_count) + CompletionData::from_property_owner_id(builder, id.clone(), overload_count) } } else { None @@ -86,11 +86,9 @@ pub fn add_member_completion( // 在`detail`更右侧, 且不紧靠着`detail`显示 let description = get_description(builder, &remove_nil_type); - let deprecated = if let Some(id) = &property_owner { - Some(is_deprecated(builder, id.clone())) - } else { - None - }; + let deprecated = property_owner + .as_ref() + .map(|id| is_deprecated(builder, id.clone())); let mut completion_item = CompletionItem { label: label.clone(), @@ -170,7 +168,7 @@ fn add_signature_overloads( .semantic_model .get_db() .get_signature_index() - .get(&signature_id)? + .get(signature_id)? .overloads .clone(); @@ -182,7 +180,7 @@ fn add_signature_overloads( let description = get_description(builder, &typ); let detail = get_detail(builder, &typ, call_display); let data = if let Some(id) = &property_owner { - CompletionData::from_overload(builder, id.clone().into(), index, overload_count) + CompletionData::from_overload(builder, id.clone(), index, overload_count) } else { None }; @@ -249,7 +247,7 @@ fn resolve_function_params( if completion_item.insert_text.is_some() || completion_item.text_edit.is_some() { return None; } - let new_text = get_resolve_function_params_str(&typ, call_display)?; + let new_text = get_resolve_function_params_str(typ, call_display)?; let index_expr = LuaIndexExpr::cast(builder.trigger_token.parent()?)?; let func_stat = index_expr.get_parent::()?; // 从 ast 解析 @@ -260,11 +258,11 @@ fn resolve_function_params( let assign_stat = LuaAssignStat::cast(next_sibling)?; let paren_expr = assign_stat.child::()?; // 如果 ast 中包含了参数, 则不补全 - if let Some(_) = paren_expr.get_expr() { + if paren_expr.get_expr().is_some() { return None; } let left_paren = paren_expr.token::()?; - if left_paren.get_token_kind() != LuaTokenKind::TkLeftParen.into() { + if left_paren.get_token_kind() != LuaTokenKind::TkLeftParen { return None; } // 可能不稳定! 因为 completion_item.label 先被应用, 然后再应用本项, 此时 range 发生了改变 @@ -280,7 +278,7 @@ fn resolve_function_params( completion_item.additional_text_edits = Some(vec![lsp_types::TextEdit { range: lsp_add_range, - new_text: new_text, + new_text, }]); Some(()) @@ -306,7 +304,7 @@ fn get_resolve_function_params_str(typ: &LuaType, display: CallDisplay) -> Optio } _ => {} } - Some(format!("{}", params_str.join(", "))) + Some(params_str.join(", ").to_string()) } _ => None, } diff --git a/crates/emmylua_ls/src/handlers/completion/add_completions/check_match_word.rs b/crates/emmylua_ls/src/handlers/completion/add_completions/check_match_word.rs index fe7154d00..db4e7f210 100644 --- a/crates/emmylua_ls/src/handlers/completion/add_completions/check_match_word.rs +++ b/crates/emmylua_ls/src/handlers/completion/add_completions/check_match_word.rs @@ -56,53 +56,53 @@ mod tests { #[test] fn test_match_keyword_english() { - assert_eq!(check_match_word("_", "_VERSION"), true); - assert_eq!(check_match_word("local", "local_aa"), true); - assert_eq!(check_match_word("i", "if"), true); - assert_eq!(check_match_word("i", "_if"), true); - assert_eq!(check_match_word("i", "notIf"), true); - assert_eq!(check_match_word("i", "this_if"), true); - assert_eq!(check_match_word("i", "this_not"), false); - assert_eq!(check_match_word("I", "If"), true); - assert_eq!(check_match_word("I", "if"), true); - assert_eq!(check_match_word("i", "IF"), true); - assert_eq!(check_match_word("n", "not"), true); - assert_eq!(check_match_word("t", "this"), true); - assert_eq!(check_match_word("f", "functionName"), true); - assert_eq!(check_match_word("n", "functionName"), true); - assert_eq!(check_match_word("g", "_G"), true); - assert_eq!(check_match_word("u", "___multiple___underscores___"), true); + assert!(check_match_word("_", "_VERSION")); + assert!(check_match_word("local", "local_aa")); + assert!(check_match_word("i", "if")); + assert!(check_match_word("i", "_if")); + assert!(check_match_word("i", "notIf")); + assert!(check_match_word("i", "this_if")); + assert!(!check_match_word("i", "this_not")); + assert!(check_match_word("I", "If")); + assert!(check_match_word("I", "if")); + assert!(check_match_word("i", "IF")); + assert!(check_match_word("n", "not")); + assert!(check_match_word("t", "this")); + assert!(check_match_word("f", "functionName")); + assert!(check_match_word("n", "functionName")); + assert!(check_match_word("g", "_G")); + assert!(check_match_word("u", "___multiple___underscores___")); } #[test] fn test_match_keyword_chinese() { - assert_eq!(check_match_word("如", "_如果"), true); - assert_eq!(check_match_word("如", "_______如果"), true); - assert_eq!(check_match_word("_", "_______如果"), true); - assert_eq!(check_match_word("如", "如果"), true); - assert_eq!(check_match_word("如", "Not如果"), true); - assert_eq!(check_match_word("n", "Not如果"), true); - assert_eq!(check_match_word("如", "This_如果"), true); - assert_eq!(check_match_word("R", "如果"), false); - assert_eq!(check_match_word("r", "如果"), false); - assert_eq!(check_match_word("如", "如果If"), true); - assert_eq!(check_match_word("果", "水果"), false); + assert!(check_match_word("如", "_如果")); + assert!(check_match_word("如", "_______如果")); + assert!(check_match_word("_", "_______如果")); + assert!(check_match_word("如", "如果")); + assert!(check_match_word("如", "Not如果")); + assert!(check_match_word("n", "Not如果")); + assert!(check_match_word("如", "This_如果")); + assert!(!check_match_word("R", "如果")); + assert!(!check_match_word("r", "如果")); + assert!(check_match_word("如", "如果If")); + assert!(!check_match_word("果", "水果")); } #[test] fn test_match_keyword_mixed() { - assert_eq!(check_match_word("i", "如果If"), true); - assert_eq!(check_match_word("r", "Not如果"), false); - assert_eq!(check_match_word("t", "This_如果"), true); - assert_eq!(check_match_word("n", "not如果"), true); - assert_eq!(check_match_word("f", "Function如果"), true); - assert_eq!(check_match_word("果", "Function如果"), false); + assert!(check_match_word("i", "如果If")); + assert!(!check_match_word("r", "Not如果")); + assert!(check_match_word("t", "This_如果")); + assert!(check_match_word("n", "not如果")); + assert!(check_match_word("f", "Function如果")); + assert!(!check_match_word("果", "Function如果")); } #[test] fn test_match_keyword_empty_input() { - assert_eq!(check_match_word("", "if"), true); - assert_eq!(check_match_word("i", ""), false); - assert_eq!(check_match_word("", ""), true); + assert!(check_match_word("", "if")); + assert!(!check_match_word("i", "")); + assert!(check_match_word("", "")); } } diff --git a/crates/emmylua_ls/src/handlers/completion/add_completions/mod.rs b/crates/emmylua_ls/src/handlers/completion/add_completions/mod.rs index 1af2729c4..f9ad12346 100644 --- a/crates/emmylua_ls/src/handlers/completion/add_completions/mod.rs +++ b/crates/emmylua_ls/src/handlers/completion/add_completions/mod.rs @@ -51,10 +51,10 @@ pub fn is_deprecated(builder: &CompletionBuilder, id: LuaSemanticDeclId) -> bool .get_property_index() .get_property(&id); - if let Some(property) = property { - if property.deprecated().is_some() { - return true; - } + if let Some(property) = property + && property.deprecated().is_some() + { + return true; } false @@ -78,7 +78,7 @@ pub fn get_detail( .semantic_model .get_db() .get_signature_index() - .get(&signature_id)?; + .get(signature_id)?; let mut params_str = signature .get_type_params() @@ -142,7 +142,7 @@ pub fn get_detail( _ => { let type_detail = humanize_type( builder.semantic_model.get_db(), - &ret_type, + ret_type, RenderLevel::Minimal, ); format!("-> {}", type_detail) diff --git a/crates/emmylua_ls/src/handlers/completion/mod.rs b/crates/emmylua_ls/src/handlers/completion/mod.rs index 577aed80a..71aa20486 100644 --- a/crates/emmylua_ls/src/handlers/completion/mod.rs +++ b/crates/emmylua_ls/src/handlers/completion/mod.rs @@ -141,8 +141,8 @@ impl RegisterCapabilities for CompletionCapabilities { server_capabilities.completion_provider = Some(CompletionOptions { resolve_provider: Some(true), trigger_characters: Some( - vec![".", ":", "(", "[", "\"", "\'", " ", "@", "\\", "/", "|"] - .iter() + ['.', ':', '(', '[', '"', '\'', ' ', '@', '\\', '/', '|'] + .into_iter() .map(|s| s.to_string()) .collect(), ), diff --git a/crates/emmylua_ls/src/handlers/completion/providers/auto_require_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/auto_require_provider.rs index 18cc1f015..32bd29d7f 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/auto_require_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/auto_require_provider.rs @@ -48,7 +48,7 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { add_module_completion_item( builder, &prefix, - &module_info, + module_info, file_conversion, lsp_position, &mut completions, @@ -71,7 +71,7 @@ fn add_module_completion_item( position: Position, completions: &mut Vec, ) -> Option<()> { - if !check_export_visibility(&builder.semantic_model, &module_info).unwrap_or(false) { + if !check_export_visibility(&builder.semantic_model, module_info).unwrap_or(false) { return None; } @@ -129,12 +129,7 @@ fn try_add_member_completion_items( completions: &mut Vec, ) -> Option<()> { // 模块必须要有 export 标记 - if module_info - .get_export(builder.semantic_model.get_db()) - .is_none() - { - return None; - }; + module_info.get_export(builder.semantic_model.get_db())?; if let Some(export_type) = &module_info.export_type { match export_type { diff --git a/crates/emmylua_ls/src/handlers/completion/providers/desc_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/desc_provider.rs index f20bcd070..f2c6ae390 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/desc_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/desc_provider.rs @@ -73,38 +73,35 @@ fn add_global_completions(builder: &mut CompletionBuilder) -> Option<()> { builder.semantic_model.get_db(), builder.semantic_model.get_file_id(), &builder.trigger_token, - ) { - if let Some(member_info_map) = builder - .semantic_model - .get_member_info_map(&LuaType::Ref(scope)) - { - seen_types.extend(member_info_map.iter().flat_map(|(_, members)| { - members.iter().filter_map(|member| match &member.typ { - LuaType::Def(type_id) => Some(type_id.clone()), - _ => None, - }) - })); - add_completions_for_members(builder, &member_info_map, CompletionTriggerStatus::Dot); - } + ) && let Some(member_info_map) = builder + .semantic_model + .get_member_info_map(&LuaType::Ref(scope)) + { + seen_types.extend(member_info_map.iter().flat_map(|(_, members)| { + members.iter().filter_map(|member| match &member.typ { + LuaType::Def(type_id) => Some(type_id.clone()), + _ => None, + }) + })); + add_completions_for_members(builder, &member_info_map, CompletionTriggerStatus::Dot); } // Types in namespaces. complete_types_by_prefix(builder, "", Some(&seen_types)); // Types in current module. - if let Some(module) = builder.semantic_model.get_module() { - if let Some(member_info_map) = builder + if let Some(module) = builder.semantic_model.get_module() + && let Some(member_info_map) = builder .semantic_model .get_member_info_map(module.export_type.as_ref().unwrap_or(&LuaType::Nil)) - { - seen_types.extend(member_info_map.iter().flat_map(|(_, members)| { - members.iter().filter_map(|member| match &member.typ { - LuaType::Def(type_id) => Some(type_id.clone()), - _ => None, - }) - })); - add_completions_for_members(builder, &member_info_map, CompletionTriggerStatus::Dot); - } + { + seen_types.extend(member_info_map.iter().flat_map(|(_, members)| { + members.iter().filter_map(|member| match &member.typ { + LuaType::Def(type_id) => Some(type_id.clone()), + _ => None, + }) + })); + add_completions_for_members(builder, &member_info_map, CompletionTriggerStatus::Dot); } // Globals. diff --git a/crates/emmylua_ls/src/handlers/completion/providers/doc_name_token_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/doc_name_token_provider.rs index ed0f8e2a6..023783342 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/doc_name_token_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/doc_name_token_provider.rs @@ -85,7 +85,7 @@ fn get_doc_completion_expected(trigger_token: &LuaSyntaxToken) -> Option { - let attr = LuaDocAttribute::cast(parent.clone().into())?; + let attr = LuaDocAttribute::cast(parent.clone())?; Some(DocCompletionExpected::ClassAttr(attr)) } _ => None, @@ -106,7 +106,7 @@ fn get_doc_completion_expected(trigger_token: &LuaSyntaxToken) -> Option Some(DocCompletionExpected::DiagnosticCode), LuaSyntaxKind::DocAttribute => { - let attr = LuaDocAttribute::cast(parent.clone().into())?; + let attr = LuaDocAttribute::cast(parent.clone())?; Some(DocCompletionExpected::ClassAttr(attr)) } _ => None, @@ -116,13 +116,13 @@ fn get_doc_completion_expected(trigger_token: &LuaSyntaxToken) -> Option { - let attr = LuaDocAttribute::cast(parent.clone().into())?; + let attr = LuaDocAttribute::cast(parent.clone())?; Some(DocCompletionExpected::ClassAttr(attr)) } _ => None, } } - _ => return None, + _ => None, } } @@ -180,7 +180,7 @@ fn add_tag_cast_name_completion(builder: &mut CompletionBuilder) -> Option<()> { .semantic_model .get_db() .get_decl_index() - .get_decl(&decl_id)?; + .get_decl(decl_id)?; decl.get_name().to_string() }; @@ -201,7 +201,7 @@ fn add_tag_cast_name_completion(builder: &mut CompletionBuilder) -> Option<()> { } fn add_tag_diagnostic_action_completion(builder: &mut CompletionBuilder) { - let actions = vec!["disable", "disable-next-line", "disable-line", "enable"]; + let actions = ["disable", "disable-next-line", "disable-line", "enable"]; for (sorted_index, action) in actions.iter().enumerate() { let completion_item = CompletionItem { label: action.to_string(), @@ -304,7 +304,7 @@ fn add_tag_using_completion(builder: &mut CompletionBuilder) { label: format!("using {}", namespace), kind: Some(lsp_types::CompletionItemKind::MODULE), sort_text: Some(format!("{:03}", sorted_index)), - insert_text: Some(format!("{}", namespace)), + insert_text: Some(namespace.to_string()), ..Default::default() }; builder.add_completion_item(completion_item); @@ -312,7 +312,7 @@ fn add_tag_using_completion(builder: &mut CompletionBuilder) { } fn add_tag_export_completion(builder: &mut CompletionBuilder) { - let key = vec!["namespace", "global"]; + let key = ["namespace", "global"]; for (sorted_index, key) in key.iter().enumerate() { let completion_item = CompletionItem { label: key.to_string(), diff --git a/crates/emmylua_ls/src/handlers/completion/providers/doc_type_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/doc_type_provider.rs index 02039d9d0..3b4d6c935 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/doc_type_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/doc_type_provider.rs @@ -15,7 +15,7 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { check_can_add_type_completion(builder)?; let prefix_content = builder.trigger_token.text().to_string(); - let prefix = if let Some(last_sep) = prefix_content.rfind(|c| c == '.') { + let prefix = if let Some(last_sep) = prefix_content.rfind('.') { let (path, _) = prefix_content.split_at(last_sep + 1); path } else { @@ -36,13 +36,12 @@ pub fn complete_types_by_prefix( let results = type_index.find_type_decls(file_id, prefix); for (name, type_decl) in results { - if let Some(filter) = filter { - if type_decl + if let Some(filter) = filter + && type_decl .as_ref() .is_some_and(|type_decl| filter.contains(type_decl)) - { - continue; - } + { + continue; } add_type_completion_item(builder, &name, type_decl); } diff --git a/crates/emmylua_ls/src/handlers/completion/providers/env_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/env_provider.rs index 0bef17508..470385a90 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/env_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/env_provider.rs @@ -48,12 +48,11 @@ fn check_can_add_completion(builder: &CompletionBuilder) -> Option<()> { if builder.trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER { let parent = builder.trigger_token.parent()?; - if trigger_text == "(" { - if LuaCallArgList::can_cast(parent.kind().into()) - || LuaParamList::can_cast(parent.kind().into()) - { - return None; - } + if trigger_text == "(" + && (LuaCallArgList::can_cast(parent.kind().into()) + || LuaParamList::can_cast(parent.kind().into())) + { + return None; } } else if builder.trigger_kind == CompletionTriggerKind::INVOKED { let parent = builder.trigger_token.parent()?; @@ -69,10 +68,8 @@ fn check_can_add_completion(builder: &CompletionBuilder) -> Option<()> { } // 即时是主动触发, 也不允许在函数定义的参数列表中添加 - if trigger_text == "(" { - if LuaParamList::can_cast(parent.kind().into()) { - return None; - } + if trigger_text == "(" && LuaParamList::can_cast(parent.kind().into()) { + return None; } } @@ -134,14 +131,14 @@ fn add_local_env( .semantic_model .get_db() .get_decl_index() - .get_decl(&decl_id)?; + .get_decl(decl_id)?; ( decl.get_name().to_string(), builder .semantic_model .get_db() .get_type_index() - .get_type_cache(&decl_id.clone().into()) + .get_type_cache(&(*decl_id).into()) .map(|cache| cache.as_type().clone()) .unwrap_or(LuaType::Unknown), ) @@ -177,7 +174,7 @@ fn add_local_env( // } duplicated_name.insert(name.clone()); - add_decl_completion(builder, decl_id.clone(), &name, &typ); + add_decl_completion(builder, *decl_id, &name, &typ); } Some(()) @@ -198,7 +195,7 @@ pub fn add_global_env( .semantic_model .get_db() .get_decl_index() - .get_decl(&decl_id)?; + .get_decl(decl_id)?; let (name, typ) = { ( decl.get_name().to_string(), @@ -206,7 +203,7 @@ pub fn add_global_env( .semantic_model .get_db() .get_type_index() - .get_type_cache(&decl_id.clone().into()) + .get_type_cache(&(*decl_id).into()) .map(|cache| cache.as_type().clone()) .unwrap_or(LuaType::Unknown), ) @@ -214,7 +211,7 @@ pub fn add_global_env( if duplicated_name.contains(&name) { continue; } - if !env_check_match_word(&trigger_text, name.as_str()) { + if !env_check_match_word(trigger_text, name.as_str()) { duplicated_name.insert(name.clone()); continue; } @@ -224,7 +221,7 @@ pub fn add_global_env( } duplicated_name.insert(name.clone()); - add_decl_completion(builder, decl_id.clone(), &name, &typ); + add_decl_completion(builder, *decl_id, &name, &typ); } Some(()) diff --git a/crates/emmylua_ls/src/handlers/completion/providers/equality_comparison_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/equality_comparison_provider.rs index 019c7acc1..6558ed14b 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/equality_comparison_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/equality_comparison_provider.rs @@ -18,7 +18,7 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { for typ in &types { dispatch_type(builder, typ.clone(), &mut InferGuard::new()); } - if types.len() > 0 && !builder.is_invoked() { + if !types.is_empty() && !builder.is_invoked() { builder.stop_here(); } Some(()) @@ -30,18 +30,18 @@ fn check_can_add_completion(builder: &CompletionBuilder) -> bool { return true; } - return true; + true } fn get_token_should_type(builder: &mut CompletionBuilder) -> Option> { let token = builder.trigger_token.clone(); let mut parent_node = token.parent()?; // 如果父节点是块, 则可能是输入未完全, 语法树缺失 - if let Some(_) = LuaBlock::cast(parent_node.clone()) { - if let Some(node) = token.prev_token()?.parent() { - if LuaBinaryExpr::can_cast(node.kind().into()) { - parent_node = node; - } + if LuaBlock::cast(parent_node.clone()).is_some() { + if let Some(node) = token.prev_token()?.parent() + && LuaBinaryExpr::can_cast(node.kind().into()) + { + parent_node = node; } } else { // 输入`""`时允许往上找 @@ -50,24 +50,18 @@ fn get_token_should_type(builder: &mut CompletionBuilder) -> Option } } - match parent_node.kind().into() { - LuaSyntaxKind::BinaryExpr => { - let binary_expr = LuaBinaryExpr::cast(parent_node)?; - let op_token = binary_expr.get_op_token()?; - let op = op_token.get_op(); - if op == BinaryOperator::OpEq || op == BinaryOperator::OpNe { - let left = binary_expr.get_left_expr()?; - let left_type = builder.semantic_model.infer_expr(left); + if Into::::into(parent_node.kind()) == LuaSyntaxKind::BinaryExpr { + let binary_expr = LuaBinaryExpr::cast(parent_node)?; + let op_token = binary_expr.get_op_token()?; + let op = op_token.get_op(); + if op == BinaryOperator::OpEq || op == BinaryOperator::OpNe { + let left = binary_expr.get_left_expr()?; + let left_type = builder.semantic_model.infer_expr(left); - match left_type { - Ok(typ) => { - return Some(vec![typ]); - } - Err(_) => {} - } + if let Ok(typ) = left_type { + return Some(vec![typ]); } } - _ => {} } None diff --git a/crates/emmylua_ls/src/handlers/completion/providers/file_path_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/file_path_provider.rs index 2c8ab0e02..826096b71 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/file_path_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/file_path_provider.rs @@ -15,11 +15,9 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { let string_token = LuaStringToken::cast(builder.trigger_token.clone())?; let maybe_file_path = string_token.get_value(); - if maybe_file_path.find(|c| c == '/' || c == '\\').is_none() { - return None; - } + maybe_file_path.find(['/', '\\'])?; - let prefix = if let Some(last_sep) = maybe_file_path.rfind(|c| c == '/' || c == '\\') { + let prefix = if let Some(last_sep) = maybe_file_path.rfind(['/', '\\']) { let (path, _) = maybe_file_path.split_at(last_sep + 1); path } else { @@ -34,13 +32,14 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { for resource in resources { let path = Path::new(&resource); let folder = path.join(suffix); - if folder.exists() && folder.is_dir() { - if let Ok(entries) = std::fs::read_dir(folder) { - for entry in entries.flatten() { - let path = entry.path(); - if let Some(name) = path.file_name().and_then(|n| n.to_str()) { - add_file_path_completion(builder, &path, name, prefix, text_edit_range); - } + if folder.exists() + && folder.is_dir() + && let Ok(entries) = std::fs::read_dir(folder) + { + for entry in entries.flatten() { + let path = entry.path(); + if let Some(name) = path.file_name().and_then(|n| n.to_str()) { + add_file_path_completion(builder, &path, name, prefix, text_edit_range); } } } @@ -64,20 +63,17 @@ fn add_file_path_completion( lsp_types::CompletionItemKind::FILE }; - let detail = match file_path_to_uri(path) { - Some(uri) => Some(uri.to_string()), - None => None, - }; + let detail = file_path_to_uri(path).map(|uri| uri.to_string()); let filter_text = format!("{}{}", prefix, name); let text_edit = TextEdit { - range: text_edit_range.clone(), + range: text_edit_range, new_text: filter_text.clone(), }; let completion_item = CompletionItem { label: name.to_string(), kind: Some(kind), - filter_text: Some(filter_text.clone()), + filter_text: Some(filter_text), text_edit: Some(lsp_types::CompletionTextEdit::Edit(text_edit)), detail, ..Default::default() diff --git a/crates/emmylua_ls/src/handlers/completion/providers/function_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/function_provider.rs index 146e7f8a9..e8abc7eb0 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/function_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/function_provider.rs @@ -72,10 +72,10 @@ fn get_token_should_type(builder: &mut CompletionBuilder) -> Option } let var = vars.first()?; let var_type = builder.semantic_model.infer_expr(var.clone().into()).ok()?; - let real_type = get_real_type(&builder.semantic_model.get_db(), &var_type)?; + let real_type = get_real_type(builder.semantic_model.get_db(), &var_type)?; return Some(vec![get_function_remove_nil( - &builder.semantic_model.get_db(), - &real_type, + builder.semantic_model.get_db(), + real_type, )?]); } _ => {} @@ -170,11 +170,7 @@ fn add_type_ref_completion( builder.add_completion_item(completion_item); } } else { - let locations = type_decl - .get_locations() - .iter() - .map(|it| it.clone()) - .collect::>(); + let locations = type_decl.get_locations().to_vec(); add_enum_members_completion(builder, &type_ref_id, locations); } @@ -250,10 +246,10 @@ fn infer_param_list( .collect::>(); // names 去掉 params 已有的 - names.retain(|name| !params.contains(&name)); + names.retain(|name| !params.contains(name)); if names.len() > 1 { builder.add_completion_item(CompletionItem { - label: format!("{}", names.iter().join(", ")), + label: names.iter().join(", ").to_string(), kind: Some(lsp_types::CompletionItemKind::INTERFACE), ..Default::default() }); @@ -430,10 +426,9 @@ fn push_function_overloads_param( for i in 0..param_idx { if let (Some(call_param), Some(overload_param)) = (call_params.get(i), overload_params.get(i)) + && call_param.1 != overload_param.1 { - if call_param.1 != overload_param.1 { - return false; - } + return false; } } @@ -458,20 +453,17 @@ fn add_multi_line_union_member_completion( } }; - let documentation = if let Some(description) = description { - Some(Documentation::String(description.clone())) - } else { - None - }; + let documentation = description + .as_ref() + .map(|description| Documentation::String(description.clone())); - let label_details = if let Some(description) = description { - Some(lsp_types::CompletionItemLabelDetails { - detail: None, - description: Some(description.clone()), - }) - } else { - None - }; + let label_details = + description + .as_ref() + .map(|description| lsp_types::CompletionItemLabelDetails { + detail: None, + description: Some(description.clone()), + }); let completion_item = CompletionItem { label: name, @@ -555,9 +547,7 @@ fn add_enum_members_completion( .parent() .and_then(LuaLiteralExpr::cast) .and_then(|literal_expr| literal_expr.get_literal()) - .map_or(false, |literal| { - matches!(literal, LuaLiteralToken::String(_)) - }); + .is_some_and(|literal| matches!(literal, LuaLiteralToken::String(_))); let file_id = builder.semantic_model.get_file_id(); let is_same_file = locations.iter().all(|it| it.file_id == file_id); @@ -577,15 +567,13 @@ fn add_enum_members_completion( } label } else if let Some(ref var_name) = variable_name { - let label = match key { + match key { LuaMemberKey::Name(str) => format!("{}.{}", var_name, str), LuaMemberKey::Integer(i) => format!("{}[{}]", var_name, i), _ => continue, // 跳过不支持的key类型 - }; - label + } } else { - let label = humanize_type(builder.semantic_model.get_db(), &typ, RenderLevel::Minimal); - label + humanize_type(builder.semantic_model.get_db(), &typ, RenderLevel::Minimal) }; let description = type_id.get_name().to_string(); @@ -764,24 +752,21 @@ fn add_special_call_completion( builder: &mut CompletionBuilder, alias_call: &LuaAliasCallType, ) -> Option<()> { - match alias_call.get_call_kind() { - LuaAliasCallKind::KeyOf => { - let trigger_status = if matches!( - builder.trigger_token.kind().into(), - LuaTokenKind::TkString | LuaTokenKind::TkLongString - ) { - CompletionTriggerStatus::Dot - } else { - CompletionTriggerStatus::LeftBracket - }; + if alias_call.get_call_kind() == LuaAliasCallKind::KeyOf { + let trigger_status = if matches!( + builder.trigger_token.kind().into(), + LuaTokenKind::TkString | LuaTokenKind::TkLongString + ) { + CompletionTriggerStatus::Dot + } else { + CompletionTriggerStatus::LeftBracket + }; - let keys_owner_type = alias_call.get_operands().first()?; - let member_info_map = builder - .semantic_model - .get_member_info_map(&keys_owner_type)?; - add_completions_for_members(builder, &member_info_map, trigger_status); - } - _ => {} + let keys_owner_type = alias_call.get_operands().first()?; + let member_info_map = builder + .semantic_model + .get_member_info_map(keys_owner_type)?; + add_completions_for_members(builder, &member_info_map, trigger_status); } Some(()) } @@ -847,9 +832,7 @@ pub fn get_function_remove_nil(db: &DbIndex, typ: &LuaType) -> Option { _ => Some(new_type), } } - _ if typ.is_function() => { - return Some(typ.clone()); - } + _ if typ.is_function() => Some(typ.clone()), _ => None, } } diff --git a/crates/emmylua_ls/src/handlers/completion/providers/keywords_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/keywords_provider.rs index 48e51f9b5..ca449688e 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/keywords_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/keywords_provider.rs @@ -25,11 +25,8 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { } LuaTokenKind::TkWhitespace => { let left_token = builder.trigger_token.prev_token()?; - match left_token.kind().into() { - LuaTokenKind::TkLocal => { - add_function_keyword_completions(builder); - } - _ => {} + if Into::::into(left_token.kind()) == LuaTokenKind::TkLocal { + add_function_keyword_completions(builder); } } _ => {} @@ -67,10 +64,10 @@ fn add_stat_keyword_completions( builder: &mut CompletionBuilder, name_expr: Option, ) -> Option<()> { - if let Some(name_expr) = name_expr { - if name_expr.syntax().parent()?.parent()?.kind() != LuaSyntaxKind::Block.into() { - return None; - } + if let Some(name_expr) = name_expr + && name_expr.syntax().parent()?.parent()?.kind() != LuaSyntaxKind::Block.into() + { + return None; } let trigger_text = builder.get_trigger_text(); for keyword_info in KEYWORD_COMPLETIONS { diff --git a/crates/emmylua_ls/src/handlers/completion/providers/member_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/member_provider.rs index c0bd97ef7..c05278c87 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/member_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/member_provider.rs @@ -36,7 +36,7 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> { LuaType::TplRef(tpl) => get_tpl_ref_extend_type( builder.semantic_model.get_db(), &mut builder.semantic_model.get_cache().borrow_mut(), - &LuaType::TplRef(tpl.clone().into()), + &LuaType::TplRef(tpl.clone()), prefix_expr.clone(), 0, )?, @@ -69,7 +69,7 @@ pub fn add_completions_for_members( sorted_entries.sort_unstable_by(|(name1, _), (name2, _)| name1.cmp(name2)); for (_, member_infos) in sorted_entries { - add_resolve_member_infos(builder, &member_infos, completion_status); + add_resolve_member_infos(builder, member_infos, completion_status); } Some(()) @@ -89,7 +89,7 @@ fn add_resolve_member_infos( .semantic_model .get_db() .get_signature_index() - .get(&id) + .get(id) { let count = signature.overloads.len(); if count == 0 { None } else { Some(count) } @@ -124,27 +124,27 @@ fn add_resolve_member_infos( ); } MemberResolveState::Meta => { - if let Some(feature) = member_info.feature { - if feature.is_meta_decl() { - add_member_completion( - builder, - member_info.clone(), - completion_status, - overload_count, - ); - } + if let Some(feature) = member_info.feature + && feature.is_meta_decl() + { + add_member_completion( + builder, + member_info.clone(), + completion_status, + overload_count, + ); } } MemberResolveState::FileDecl => { - if let Some(feature) = member_info.feature { - if feature.is_file_decl() { - add_member_completion( - builder, - member_info.clone(), - completion_status, - overload_count, - ); - } + if let Some(feature) = member_info.feature + && feature.is_file_decl() + { + add_member_completion( + builder, + member_info.clone(), + completion_status, + overload_count, + ); } } } @@ -174,12 +174,11 @@ fn filter_member_infos<'a>( member_with_owners.push((member_info, owner_id.clone())); // 寻找第一个 file_decl 作为参考,如果没有则使用第一个 - if file_decl_member.is_none() { - if let Some(feature) = member_info.feature { - if feature.is_file_decl() { - file_decl_member = Some(member_info); - } - } + if file_decl_member.is_none() + && let Some(feature) = member_info.feature + && feature.is_file_decl() + { + file_decl_member = Some(member_info); } // 检查是否全为 DocFunction,同时计算重载数量 @@ -190,7 +189,7 @@ fn filter_member_infos<'a>( LuaType::Signature(id) => { all_doc_function = false; overload_count += 1; - if let Some(signature) = semantic_model.get_db().get_signature_index().get(&id) { + if let Some(signature) = semantic_model.get_db().get_signature_index().get(id) { overload_count += signature.overloads.len(); } } @@ -218,8 +217,7 @@ fn filter_member_infos<'a>( // 没有找到 file_decl,使用第一个成员作为参考 member_with_owners .first() - .map(|(_, owner)| owner.clone()) - .flatten() + .and_then(|(_, owner)| owner.clone()) }; // 过滤出相同 owner_type_id 的成员 @@ -272,16 +270,13 @@ fn get_resolve_state(db: &DbIndex, member_infos: &Vec<&LuaMemberInfo>) -> Member let mut resolve_state = MemberResolveState::All; if db.get_emmyrc().strict.meta_override_file_define { for member_info in member_infos.iter() { - match member_info.feature { - Some(feature) => { - if feature.is_meta_decl() { - resolve_state = MemberResolveState::Meta; - break; - } else if feature.is_file_decl() { - resolve_state = MemberResolveState::FileDecl; - } + if let Some(feature) = member_info.feature { + if feature.is_meta_decl() { + resolve_state = MemberResolveState::Meta; + break; + } else if feature.is_file_decl() { + resolve_state = MemberResolveState::FileDecl; } - None => {} } } } diff --git a/crates/emmylua_ls/src/handlers/completion/providers/mod.rs b/crates/emmylua_ls/src/handlers/completion/providers/mod.rs index 4f87344ff..ed50687e9 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/mod.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/mod.rs @@ -53,7 +53,7 @@ fn get_text_edit_range_in_string( ) -> Option { let text = string_token.get_text(); let range = string_token.get_range(); - if text.len() == 0 { + if text.is_empty() { return None; } @@ -68,10 +68,9 @@ fn get_text_edit_range_in_string( } let new_text_range = TextRange::new(start_offset.into(), end_offset.into()); - let lsp_range = builder + + builder .semantic_model .get_document() - .to_lsp_range(new_text_range); - - lsp_range + .to_lsp_range(new_text_range) } diff --git a/crates/emmylua_ls/src/handlers/completion/providers/module_path_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/module_path_provider.rs index c30e96543..2be399671 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/module_path_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/module_path_provider.rs @@ -40,17 +40,14 @@ pub fn add_modules( .runtime .version .to_lua_version_number(); - let parts: Vec<&str> = prefix_content - .split(|c| c == '.' || c == '/' || c == '\\') - .collect(); + let parts: Vec<&str> = prefix_content.split(['.', '/', '\\']).collect(); let module_path = if parts.len() > 1 { parts[..parts.len() - 1].join(".") } else { "".to_string() }; - let prefix = if let Some(last_sep) = prefix_content.rfind(|c| c == '/' || c == '\\' || c == '.') - { + let prefix = if let Some(last_sep) = prefix_content.rfind(['/', '\\', '.']) { let (path, _) = prefix_content.split_at(last_sep + 1); path } else { @@ -65,7 +62,7 @@ pub fn add_modules( let filter_text = format!("{}{}", prefix, name); let text_edit = text_edit_range.map(|text_edit_range| { CompletionTextEdit::Edit(TextEdit { - range: text_edit_range.clone(), + range: text_edit_range, new_text: filter_text.clone(), }) }); @@ -82,7 +79,7 @@ pub fn add_modules( let completion_item = CompletionItem { label: name.clone(), kind: Some(lsp_types::CompletionItemKind::FILE), - filter_text: Some(filter_text.clone()), + filter_text: Some(filter_text), text_edit, detail: Some(uri.to_string()), data, @@ -94,7 +91,7 @@ pub fn add_modules( let completion_item = CompletionItem { label: name.clone(), kind: Some(lsp_types::CompletionItemKind::FOLDER), - filter_text: Some(filter_text.clone()), + filter_text: Some(filter_text), text_edit, ..Default::default() }; diff --git a/crates/emmylua_ls/src/handlers/completion/providers/postfix_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/postfix_provider.rs index eb4dde603..d8c5c3ee4 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/postfix_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/postfix_provider.rs @@ -155,12 +155,12 @@ fn is_postfix_trigger(trigger_kind: LuaTokenKind, emmyrc: &Emmyrc) -> bool { } let first_char = trigger_string.chars().next().unwrap(); - return match first_char { + match first_char { '.' => trigger_kind == LuaTokenKind::TkDot, '@' => trigger_kind == LuaTokenKind::TkAt, ':' => trigger_kind == LuaTokenKind::TkColon, _ => false, - }; + } } fn add_postfix_completion( diff --git a/crates/emmylua_ls/src/handlers/completion/providers/table_field_provider.rs b/crates/emmylua_ls/src/handlers/completion/providers/table_field_provider.rs index ddc74696f..5031f05f9 100644 --- a/crates/emmylua_ls/src/handlers/completion/providers/table_field_provider.rs +++ b/crates/emmylua_ls/src/handlers/completion/providers/table_field_provider.rs @@ -74,10 +74,10 @@ fn can_add_key_completion(builder: &mut CompletionBuilder) -> bool { return false; } - if let Some(NodeOrToken::Node(node)) = builder.trigger_token.prev_sibling_or_token() { - if let Some(LuaAst::LuaComment(_)) = LuaAst::cast(node) { - return false; - } + if let Some(NodeOrToken::Node(node)) = builder.trigger_token.prev_sibling_or_token() + && let Some(LuaAst::LuaComment(_)) = LuaAst::cast(node) + { + return false; } true } @@ -132,15 +132,13 @@ fn add_field_key_completion( } let data = if let Some(id) = &property_owner { - CompletionData::from_property_owner_id(builder, id.clone().into(), None) - } else { - None - }; - let deprecated = if let Some(id) = &property_owner { - Some(is_deprecated(builder, id.clone())) + CompletionData::from_property_owner_id(builder, id.clone(), None) } else { None }; + let deprecated = property_owner + .as_ref() + .map(|id| is_deprecated(builder, id.clone())); let completion_item = CompletionItem { label, @@ -186,7 +184,7 @@ fn in_env(builder: &mut CompletionBuilder, target_name: &str, target_type: &LuaT .semantic_model .get_db() .get_decl_index() - .get_decl(&decl_id)?; + .get_decl(decl_id)?; let (name, typ) = { ( decl.get_name().to_string(), @@ -194,18 +192,13 @@ fn in_env(builder: &mut CompletionBuilder, target_name: &str, target_type: &LuaT .semantic_model .get_db() .get_type_index() - .get_type_cache(&decl_id.clone().into()) + .get_type_cache(&(*decl_id).into()) .map(|cache| cache.as_type().clone()) .unwrap_or(LuaType::Unknown), ) }; // 必须要名称相同 + 类型兼容 - if name == target_name - && builder - .semantic_model - .type_check(&target_type, &typ) - .is_ok() - { + if name == target_name && builder.semantic_model.type_check(target_type, &typ).is_ok() { return Some(()); } } @@ -246,7 +239,7 @@ fn add_field_value_completion( builder: &mut CompletionBuilder, member_info: LuaMemberInfo, ) -> Option<()> { - let real_type = get_real_type(&builder.semantic_model.get_db(), &member_info.typ)?; + let real_type = get_real_type(builder.semantic_model.get_db(), &member_info.typ)?; if real_type.is_function() { let label_detail = get_function_detail(builder, real_type); let item = CompletionItem { @@ -280,7 +273,7 @@ fn get_function_detail(builder: &CompletionBuilder, typ: &LuaType) -> Option, ) { - if let Some(overload_count) = overload_count { - if overload_count > 0 { - if let Some(signature_overload) = &mut hover_builder.signature_overload { - for signature in signature_overload.iter_mut() { - if let MarkedString::LanguageString(s) = signature { - s.value = format!("{} (+{} overloads)", s.value, overload_count); - } + if let Some(overload_count) = overload_count + && overload_count > 0 + { + if let Some(signature_overload) = &mut hover_builder.signature_overload { + for signature in signature_overload.iter_mut() { + if let MarkedString::LanguageString(s) = signature { + s.value = format!("{} (+{} overloads)", s.value, overload_count); } } - if let MarkedString::LanguageString(s) = &mut hover_builder.type_description { - s.value = format!("{} (+{} overloads)", s.value, overload_count); - } + } + if let MarkedString::LanguageString(s) = &mut hover_builder.type_description { + s.value = format!("{} (+{} overloads)", s.value, overload_count); } } } @@ -148,13 +148,8 @@ fn build_other_completion_item( result.push_str(&format!("\n```{}\n{}\n```\n", s.language, s.value)); } } - if let Some(location_path) = hover_builder.location_path { - match location_path { - MarkedString::String(s) => { - result.push_str(&format!("\n{}\n", s)); - } - _ => {} - } + if let Some(MarkedString::String(s)) = hover_builder.location_path { + result.push_str(&format!("\n{}\n", s)); } for marked_string in hover_builder.annotation_description { match marked_string { diff --git a/crates/emmylua_ls/src/handlers/definition/goto_def_definition.rs b/crates/emmylua_ls/src/handlers/definition/goto_def_definition.rs index 59a92e05b..f75ba937f 100644 --- a/crates/emmylua_ls/src/handlers/definition/goto_def_definition.rs +++ b/crates/emmylua_ls/src/handlers/definition/goto_def_definition.rs @@ -27,12 +27,10 @@ pub fn goto_def_definition( .get_db() .get_property_index() .get_property(&semantic_id) + && let Some(source) = property.source() + && let Some(location) = goto_source_location(source) { - if let Some(source) = property.source() { - if let Some(location) = goto_source_location(source) { - return Some(GotoDefinitionResponse::Scalar(location)); - } - } + return Some(GotoDefinitionResponse::Scalar(location)); } // 根据不同的语义声明类型处理 @@ -64,13 +62,12 @@ fn handle_decl_definition( // 尝试查找函数调用的原始定义 if let Some(match_semantic_decl) = find_function_call_origin(semantic_model, compilation, trigger_token, property_owner) + && let LuaSemanticDeclId::LuaDecl(matched_decl_id) = match_semantic_decl { - if let LuaSemanticDeclId::LuaDecl(matched_decl_id) = match_semantic_decl { - return Some(GotoDefinitionResponse::Scalar(get_decl_location( - semantic_model, - &matched_decl_id, - )?)); - } + return Some(GotoDefinitionResponse::Scalar(get_decl_location( + semantic_model, + &matched_decl_id, + )?)); } // 返回声明的位置 @@ -104,10 +101,10 @@ fn handle_member_definition( // 添加原始成员的位置 for member in same_named_members { - if let LuaSemanticDeclId::Member(member_id) = member { - if let Some(location) = get_member_location(semantic_model, &member_id) { - locations.push(location); - } + if let LuaSemanticDeclId::Member(member_id) = member + && let Some(location) = get_member_location(semantic_model, &member_id) + { + locations.push(location); } } @@ -212,10 +209,9 @@ fn add_instance_table_member_locations( for table_field_info in table_field_infos { if let Some(LuaSemanticDeclId::Member(table_member_id)) = table_field_info.property_owner_id + && let Some(location) = get_member_location(semantic_model, &table_member_id) { - if let Some(location) = get_member_location(semantic_model, &table_member_id) { - locations.push(location); - } + locations.push(location); } } } @@ -257,15 +253,10 @@ pub fn goto_str_tpl_ref_definition( let arg_exprs = call_expr.get_args_list()?.get_args().collect::>(); let string_token_idx = arg_exprs.iter().position(|arg| { if let LuaExpr::LiteralExpr(literal_expr) = arg { - if literal_expr + literal_expr .syntax() .text_range() .contains(string_token.get_range().start()) - { - true - } else { - false - } } else { false } @@ -315,7 +306,7 @@ pub fn find_instance_table_member( let member_key = semantic_model .get_db() .get_member_index() - .get_member(&member_id)? + .get_member(member_id)? .get_key(); let parent = trigger_token.parent()?; @@ -384,7 +375,7 @@ fn should_trace_member(semantic_model: &SemanticModel, member_id: &LuaMemberId) if LuaReturnStat::can_cast(parent.kind().into()) { return Some(true); } else { - let typ = semantic_model.get_type(member_id.clone().into()); + let typ = semantic_model.get_type((*member_id).into()); if typ.is_signature() { return Some(true); } @@ -401,10 +392,7 @@ fn get_member_location( } fn get_decl_location(semantic_model: &SemanticModel, decl_id: &LuaDeclId) -> Option { - let decl = semantic_model - .get_db() - .get_decl_index() - .get_decl(&decl_id)?; + let decl = semantic_model.get_db().get_decl_index().get_decl(decl_id)?; let document = semantic_model.get_document_by_file_id(decl_id.file_id)?; let location = document.to_lsp_location(decl.get_range())?; Some(location) diff --git a/crates/emmylua_ls/src/handlers/definition/goto_doc_see.rs b/crates/emmylua_ls/src/handlers/definition/goto_doc_see.rs index c880d7ba8..74a1e6f95 100644 --- a/crates/emmylua_ls/src/handlers/definition/goto_doc_see.rs +++ b/crates/emmylua_ls/src/handlers/definition/goto_doc_see.rs @@ -22,7 +22,7 @@ pub fn goto_doc_see( 2 if !name_parts[1].is_empty() && !name_parts[1].starts_with([' ', '\t']) => { let type_name = &name_parts[0]; let member_name = &name_parts[1]; - return goto_type_member(semantic_model, &type_name, &member_name); + return goto_type_member(semantic_model, type_name, member_name); } _ => { let path = parse_ref_target( diff --git a/crates/emmylua_ls/src/handlers/definition/goto_function.rs b/crates/emmylua_ls/src/handlers/definition/goto_function.rs index 154f8c8a7..9537931d6 100644 --- a/crates/emmylua_ls/src/handlers/definition/goto_function.rs +++ b/crates/emmylua_ls/src/handlers/definition/goto_function.rs @@ -12,7 +12,7 @@ pub fn find_matching_function_definitions( semantic_model: &SemanticModel, compilation: &LuaCompilation, trigger_token: &LuaSyntaxToken, - semantic_decls: &Vec, + semantic_decls: &[LuaSemanticDeclId], ) -> Option> { let call_expr = LuaCallExpr::cast(trigger_token.parent()?.parent()?)?; let call_function = get_call_function(semantic_model, &call_expr)?; @@ -29,7 +29,7 @@ pub fn find_matching_function_definitions( let mut has_match = false; for (decl, member_id) in member_decls { - let typ = semantic_model.get_type(member_id.clone().into()); + let typ = semantic_model.get_type((*member_id).into()); match typ { LuaType::DocFunction(func) => { if compare_function_types(semantic_model, &call_function, &func, &call_expr) @@ -106,13 +106,13 @@ fn match_function_with_call( call_expr: &LuaCallExpr, decl_id: &LuaDeclId, ) -> Option { - let typ = semantic_model.get_type(decl_id.clone().into()); + let typ = semantic_model.get_type((*decl_id).into()); match typ { LuaType::DocFunction(func) => { if compare_function_types(semantic_model, call_function, &func, call_expr) .unwrap_or(false) { - Some(decl_id.clone().into()) + Some((*decl_id).into()) } else { None } @@ -160,10 +160,9 @@ pub fn extract_semantic_decl_from_signature( let token = match root.syntax().token_at_offset(signature_id.get_position()) { TokenAtOffset::Single(token) => Some(token), TokenAtOffset::Between(left, right) => { - if left.kind() == LuaTokenKind::TkName.into() { - Some(left) - } else if left.kind() == LuaTokenKind::TkLeftBracket.into() - && right.kind() == LuaTokenKind::TkInt.into() + if left.kind() == LuaTokenKind::TkName.into() + || (left.kind() == LuaTokenKind::TkLeftBracket.into() + && right.kind() == LuaTokenKind::TkInt.into()) { Some(left) } else { @@ -181,10 +180,10 @@ fn get_call_function( call_expr: &LuaCallExpr, ) -> Option> { let func = semantic_model.infer_call_expr_func(call_expr.clone(), None); - if let Some(func) = func { - if check_params_count_is_match(semantic_model, &func, call_expr.clone()).unwrap_or(false) { - return Some(func); - } + if let Some(func) = func + && check_params_count_is_match(semantic_model, &func, call_expr.clone()).unwrap_or(false) + { + return Some(func); } None } @@ -211,27 +210,26 @@ fn check_params_count_is_match( if call_args_count < fake_params.len() { // 调用参数包含 `...` for arg in call_args.iter() { - if let LuaExpr::LiteralExpr(literal_expr) = arg { - if let Some(literal_token) = literal_expr.get_literal() { - if let LuaLiteralToken::Dots(_) = literal_token { - return Some(true); - } - } + if let LuaExpr::LiteralExpr(literal_expr) = arg + && let Some(literal_token) = literal_expr.get_literal() + && let LuaLiteralToken::Dots(_) = literal_token + { + return Some(true); } } // 对调用参数的最后一个参数进行特殊处理 - if let Some(last_arg) = call_args.last() { - if let Ok(LuaType::Variadic(variadic)) = semantic_model.infer_expr(last_arg.clone()) { - let len = match variadic.get_max_len() { - Some(len) => len, - None => { - return Some(true); - } - }; - call_args_count = call_args_count + len as usize - 1; - if call_args_count >= fake_params.len() { + if let Some(last_arg) = call_args.last() + && let Ok(LuaType::Variadic(variadic)) = semantic_model.infer_expr(last_arg.clone()) + { + let len = match variadic.get_max_len() { + Some(len) => len, + None => { return Some(true); } + }; + call_args_count = call_args_count + len - 1; + if call_args_count >= fake_params.len() { + return Some(true); } } @@ -242,15 +240,15 @@ fn check_params_count_is_match( } let typ = param_info.1.clone(); - if let Some(typ) = typ { - if !typ.is_optional() { - return Some(false); - } + if let Some(typ) = typ + && !typ.is_optional() + { + return Some(false); } } } else if call_args_count > fake_params.len() { // 参数定义中最后一个参数是 `...` - if fake_params.last().map_or(false, |(name, typ)| { + if fake_params.last().is_some_and(|(name, typ)| { name == "..." || if let Some(typ) = typ { typ.is_variadic() @@ -280,12 +278,7 @@ fn check_params_count_is_match( fn get_signature_functions(signature: &LuaSignature) -> Vec> { let mut functions = Vec::new(); functions.push(signature.to_doc_func_type()); - functions.extend( - signature - .overloads - .iter() - .map(|overload| Arc::clone(overload)), - ); + functions.extend(signature.overloads.iter().map(Arc::clone)); functions } diff --git a/crates/emmylua_ls/src/handlers/definition/goto_path.rs b/crates/emmylua_ls/src/handlers/definition/goto_path.rs index da458a214..4be346319 100644 --- a/crates/emmylua_ls/src/handlers/definition/goto_path.rs +++ b/crates/emmylua_ls/src/handlers/definition/goto_path.rs @@ -23,7 +23,7 @@ pub fn goto_path( .into_iter() .filter_map(|semantic_info| { goto_def_definition( - &semantic_model, + semantic_model, compilation, semantic_info.semantic_decl?, trigger_token, diff --git a/crates/emmylua_ls/src/handlers/definition/mod.rs b/crates/emmylua_ls/src/handlers/definition/mod.rs index 6f437cedb..5e7ceb3f4 100644 --- a/crates/emmylua_ls/src/handlers/definition/mod.rs +++ b/crates/emmylua_ls/src/handlers/definition/mod.rs @@ -58,10 +58,9 @@ pub fn definition( let token = match root.syntax().token_at_offset(position_offset) { TokenAtOffset::Single(token) => token, TokenAtOffset::Between(left, right) => { - if left.kind() == LuaTokenKind::TkName.into() { - left - } else if left.kind() == LuaTokenKind::TkLeftBracket.into() - && right.kind() == LuaTokenKind::TkInt.into() + if left.kind() == LuaTokenKind::TkName.into() + || (left.kind() == LuaTokenKind::TkLeftBracket.into() + && right.kind() == LuaTokenKind::TkInt.into()) { left } else { @@ -93,7 +92,7 @@ pub fn definition( } } else if token.kind() == LuaTokenKind::TkDocSeeContent.into() { let general_token = LuaGeneralToken::cast(token.clone())?; - if let Some(_) = general_token.get_parent::() { + if general_token.get_parent::().is_some() { return goto_doc_see( &semantic_model, &analysis.compilation, diff --git a/crates/emmylua_ls/src/handlers/document_color/mod.rs b/crates/emmylua_ls/src/handlers/document_color/mod.rs index b1e8a82b9..a69066e14 100644 --- a/crates/emmylua_ls/src/handlers/document_color/mod.rs +++ b/crates/emmylua_ls/src/handlers/document_color/mod.rs @@ -62,7 +62,7 @@ pub async fn on_document_color_presentation( }; let document = semantic_model.get_document(); - let range = if let Some(range) = document.to_rowan_range(params.range.clone()) { + let range = if let Some(range) = document.to_rowan_range(params.range) { range } else { return vec![]; diff --git a/crates/emmylua_ls/src/handlers/document_formatting/external_format.rs b/crates/emmylua_ls/src/handlers/document_formatting/external_format.rs index 4a9000b65..77d7c3e7c 100644 --- a/crates/emmylua_ls/src/handlers/document_formatting/external_format.rs +++ b/crates/emmylua_ls/src/handlers/document_formatting/external_format.rs @@ -22,7 +22,7 @@ pub async fn external_tool_format( ) -> Option { let exe_path = &emmyrc_external_tool.program; let args = &emmyrc_external_tool.args; - let timeout_duration = Duration::from_millis(emmyrc_external_tool.timeout as u64); + let timeout_duration = Duration::from_millis(emmyrc_external_tool.timeout); let mut cmd = Command::new(exe_path); @@ -108,7 +108,7 @@ fn parse_macro_arg( let mut content = String::new(); let mut brace_count = 1; - while let Some(inner_ch) = chars.next() { + for inner_ch in chars.by_ref() { if inner_ch == '{' { brace_count += 1; if brace_count > 1 { diff --git a/crates/emmylua_ls/src/handlers/document_formatting/format_diff.rs b/crates/emmylua_ls/src/handlers/document_formatting/format_diff.rs index 79581f7c5..2c98f5118 100644 --- a/crates/emmylua_ls/src/handlers/document_formatting/format_diff.rs +++ b/crates/emmylua_ls/src/handlers/document_formatting/format_diff.rs @@ -158,10 +158,8 @@ fn generate_text_edits( formatted_lines: &[&str], document: &LuaDocument, ) -> Vec { - let mut edits = Vec::new(); - // Pre-allocate capacity to reduce Vec reallocations - edits.reserve(diffs.len().min(100)); // Limit max pre-allocation to avoid memory waste + let mut edits = Vec::with_capacity(diffs.len().min(100)); // Limit max pre-allocation to avoid memory waste // Batch consecutive edit operations to reduce the number of TextEdits let mut i = 0; @@ -182,21 +180,19 @@ fn generate_text_edits( } // Batch delete: calculate start and end positions - if let LineDiff::Deleted(first_line) = diffs[start_idx] { - if let LineDiff::Deleted(last_line) = diffs[i - 1] { - // Get the range from the start of the first line to the end of the last line - if let Some(start_range) = document.get_line_range(first_line) { - if let Some(end_range) = document.get_line_range(last_line) { - let combined_range = - rowan::TextRange::new(start_range.start(), end_range.end()); - if let Some(lsp_range) = document.to_lsp_range(combined_range) { - edits.push(TextEdit { - range: lsp_range, - new_text: String::new(), - }); - } - } - } + if let LineDiff::Deleted(first_line) = diffs[start_idx] + && let LineDiff::Deleted(last_line) = diffs[i - 1] + // Get the range from the start of the first line to the end of the last line + && let Some(start_range) = document.get_line_range(first_line) + && let Some(end_range) = document.get_line_range(last_line) + { + let combined_range = + rowan::TextRange::new(start_range.start(), end_range.end()); + if let Some(lsp_range) = document.to_lsp_range(combined_range) { + edits.push(TextEdit { + range: lsp_range, + new_text: String::new(), + }); } } } @@ -254,7 +250,8 @@ pub fn format_diff( let formatted_lines: Vec<&str> = formatted_text.lines().collect(); // Early exit: if line count difference is too large, do a global replace - let line_diff = (source_lines.len() as i32 - formatted_lines.len() as i32).abs() as usize; + let line_diff = + (source_lines.len() as i32 - formatted_lines.len() as i32).unsigned_abs() as usize; if line_diff >= replace_all_limit { let document_range = document.get_document_lsp_range(); return vec![TextEdit { @@ -352,8 +349,7 @@ mod performance_tests { #[test] fn benchmark_identical_files() { let line = "function test()\n return 42\nend"; - let source = std::iter::repeat(line) - .take(1000) + let source = std::iter::repeat_n(line, 1000) .collect::>() .join("\n"); let formatted = source.clone(); diff --git a/crates/emmylua_ls/src/handlers/document_formatting/mod.rs b/crates/emmylua_ls/src/handlers/document_formatting/mod.rs index a7886d59c..8e5945d22 100644 --- a/crates/emmylua_ls/src/handlers/document_formatting/mod.rs +++ b/crates/emmylua_ls/src/handlers/document_formatting/mod.rs @@ -53,7 +53,7 @@ pub async fn on_formatting_handler( let mut formatted_text = if let Some(external_config) = &emmyrc.format.external_tool { external_tool_format( - &external_config, + external_config, text, &normalized_path, None, diff --git a/crates/emmylua_ls/src/handlers/document_highlight/highlight_tokens.rs b/crates/emmylua_ls/src/handlers/document_highlight/highlight_tokens.rs index 47b59f2dd..dc18b10c9 100644 --- a/crates/emmylua_ls/src/handlers/document_highlight/highlight_tokens.rs +++ b/crates/emmylua_ls/src/handlers/document_highlight/highlight_tokens.rs @@ -16,7 +16,7 @@ pub fn highlight_tokens( semantic_model.find_decl(token.clone().into(), SemanticDeclLevel::NoTrace); match semantic_decl { Some(LuaSemanticDeclId::LuaDecl(decl_id)) => { - highlight_decl_references(&semantic_model, decl_id, token, &mut result); + highlight_decl_references(semantic_model, decl_id, token, &mut result); } _ => { highlight_name(semantic_model, token, &mut result); @@ -51,7 +51,7 @@ fn highlight_decl_references( .get_decl_references(&decl_id.file_id, &decl_id)?; for decl_ref in &decl_refs.cells { - let range: lsp_types::Range = document.to_lsp_range(decl_ref.range.clone())?; + let range: lsp_types::Range = document.to_lsp_range(decl_ref.range)?; let kind = if decl_ref.is_write { Some(DocumentHighlightKind::WRITE) } else { @@ -80,14 +80,15 @@ fn highlight_name( let token_name = token.text(); let document = semantic_model.get_document(); for node_or_token in root.syntax().descendants_with_tokens() { - if let NodeOrToken::Token(token) = node_or_token { - if token.kind() == LuaTokenKind::TkName.into() && token.text() == token_name { - let range = document.to_lsp_range(token.text_range())?; - result.push(DocumentHighlight { - range, - kind: Some(DocumentHighlightKind::TEXT), - }); - } + if let NodeOrToken::Token(token) = node_or_token + && token.kind() == LuaTokenKind::TkName.into() + && token.text() == token_name + { + let range = document.to_lsp_range(token.text_range())?; + result.push(DocumentHighlight { + range, + kind: Some(DocumentHighlightKind::TEXT), + }); } } @@ -95,26 +96,26 @@ fn highlight_name( } fn is_keyword(kind: LuaTokenKind) -> bool { - match kind { + matches!( + kind, LuaTokenKind::TkAnd - | LuaTokenKind::TkBreak - | LuaTokenKind::TkDo - | LuaTokenKind::TkElse - | LuaTokenKind::TkElseIf - | LuaTokenKind::TkEnd - | LuaTokenKind::TkFor - | LuaTokenKind::TkFunction - | LuaTokenKind::TkGoto - | LuaTokenKind::TkIf - | LuaTokenKind::TkIn - | LuaTokenKind::TkLocal - | LuaTokenKind::TkRepeat - | LuaTokenKind::TkReturn - | LuaTokenKind::TkThen - | LuaTokenKind::TkUntil - | LuaTokenKind::TkWhile => true, - _ => false, - } + | LuaTokenKind::TkBreak + | LuaTokenKind::TkDo + | LuaTokenKind::TkElse + | LuaTokenKind::TkElseIf + | LuaTokenKind::TkEnd + | LuaTokenKind::TkFor + | LuaTokenKind::TkFunction + | LuaTokenKind::TkGoto + | LuaTokenKind::TkIf + | LuaTokenKind::TkIn + | LuaTokenKind::TkLocal + | LuaTokenKind::TkRepeat + | LuaTokenKind::TkReturn + | LuaTokenKind::TkThen + | LuaTokenKind::TkUntil + | LuaTokenKind::TkWhile + ) } fn highlight_keywords( @@ -146,14 +147,14 @@ fn highlight_node_keywords( result: &mut Vec, ) -> Option<()> { for node_or_token in node.children_with_tokens() { - if let NodeOrToken::Token(token) = node_or_token { - if is_keyword(token.kind().into()) { - let range = document.to_lsp_range(token.text_range())?; - result.push(DocumentHighlight { - range, - kind: Some(DocumentHighlightKind::TEXT), - }); - } + if let NodeOrToken::Token(token) = node_or_token + && is_keyword(token.kind().into()) + { + let range = document.to_lsp_range(token.text_range())?; + result.push(DocumentHighlight { + range, + kind: Some(DocumentHighlightKind::TEXT), + }); } } diff --git a/crates/emmylua_ls/src/handlers/document_highlight/mod.rs b/crates/emmylua_ls/src/handlers/document_highlight/mod.rs index 84636506b..19c0d5b93 100644 --- a/crates/emmylua_ls/src/handlers/document_highlight/mod.rs +++ b/crates/emmylua_ls/src/handlers/document_highlight/mod.rs @@ -21,7 +21,7 @@ pub async fn on_document_highlight_handler( let analysis = context.analysis().read().await; let file_id = analysis.get_file_id(&uri)?; let position = params.text_document_position_params.position; - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; let root = semantic_model.get_root(); let position_offset = { let document = semantic_model.get_document(); @@ -46,7 +46,7 @@ pub async fn on_document_highlight_handler( } }; - highlight_tokens(&mut semantic_model, token) + highlight_tokens(&semantic_model, token) } pub struct DocumentHighlightCapabilities; diff --git a/crates/emmylua_ls/src/handlers/document_link/build_link.rs b/crates/emmylua_ls/src/handlers/document_link/build_link.rs index 2dc57beaf..aa17659a0 100644 --- a/crates/emmylua_ls/src/handlers/document_link/build_link.rs +++ b/crates/emmylua_ls/src/handlers/document_link/build_link.rs @@ -16,11 +16,11 @@ pub fn build_links( let string_tokens = root .descendants_with_tokens() .filter_map(|it| it.into_token()) - .filter_map(|it| LuaStringToken::cast(it)); + .filter_map(LuaStringToken::cast); let mut result = vec![]; for token in string_tokens { - try_build_file_link(db, token, document, &mut result, &emmyrc); + try_build_file_link(db, token, document, &mut result, emmyrc); } Some(result) @@ -39,7 +39,7 @@ fn try_build_file_link( } let file_path = token.get_value(); - if file_path.find(|c| c == '\\' || c == '/').is_some() { + if file_path.find(['\\', '/']).is_some() { let suffix_path = PathBuf::from(file_path); if suffix_path.exists() { if let Some(uri) = file_path_to_uri(&suffix_path) { diff --git a/crates/emmylua_ls/src/handlers/document_link/mod.rs b/crates/emmylua_ls/src/handlers/document_link/mod.rs index fb39f72fb..43c310696 100644 --- a/crates/emmylua_ls/src/handlers/document_link/mod.rs +++ b/crates/emmylua_ls/src/handlers/document_link/mod.rs @@ -25,7 +25,7 @@ pub async fn on_document_link_handler( let db = semantic_model.get_db(); let emmyrc = analysis.get_emmyrc(); - build_links(&db, root.syntax().clone(), &document, &emmyrc) + build_links(db, root.syntax().clone(), &document, &emmyrc) } #[allow(unused_variables)] diff --git a/crates/emmylua_ls/src/handlers/document_range_formatting/external_range_format.rs b/crates/emmylua_ls/src/handlers/document_range_formatting/external_range_format.rs index 21e6a35a1..a3c977a16 100644 --- a/crates/emmylua_ls/src/handlers/document_range_formatting/external_range_format.rs +++ b/crates/emmylua_ls/src/handlers/document_range_formatting/external_range_format.rs @@ -3,9 +3,9 @@ use emmylua_code_analysis::{ EmmyrcExternalTool, FormattingOptions, LuaDocument, RangeFormatResult, }; -pub async fn external_tool_range_format<'a>( +pub async fn external_tool_range_format( emmyrc_external_tool: &EmmyrcExternalTool, - document: &'a LuaDocument<'_>, + document: &LuaDocument<'_>, range: &lsp_types::Range, file_path: &str, options: FormattingOptions, @@ -25,7 +25,7 @@ pub async fn external_tool_range_format<'a>( let document_range = document.get_document_lsp_range(); let formatted_text = external_tool_format( emmyrc_external_tool, - &text, + text, file_path, Some(formatting_range), options, diff --git a/crates/emmylua_ls/src/handlers/document_selection_range/mod.rs b/crates/emmylua_ls/src/handlers/document_selection_range/mod.rs index 57d85a7e4..686d14d8a 100644 --- a/crates/emmylua_ls/src/handlers/document_selection_range/mod.rs +++ b/crates/emmylua_ls/src/handlers/document_selection_range/mod.rs @@ -36,9 +36,7 @@ pub async fn on_document_selection_range_handle( let mut ranges = Vec::new(); - let description = token - .parent() - .and_then(|parent| LuaDocDescription::cast(parent)); + let description = token.parent().and_then(LuaDocDescription::cast); if let Some(description) = description { add_detail_ranges(&semantic_model, description, offset, &mut ranges); } else { diff --git a/crates/emmylua_ls/src/handlers/document_symbol/builder.rs b/crates/emmylua_ls/src/handlers/document_symbol/builder.rs index 88860a376..6edfc5e55 100644 --- a/crates/emmylua_ls/src/handlers/document_symbol/builder.rs +++ b/crates/emmylua_ls/src/handlers/document_symbol/builder.rs @@ -46,11 +46,11 @@ impl<'a> DocumentSymbolBuilder<'a> { } pub fn add_node_symbol(&mut self, node: LuaSyntaxNode, symbol: LuaSymbol) { - let syntax_id = LuaSyntaxId::new(node.kind().into(), node.text_range()); + let syntax_id = LuaSyntaxId::new(node.kind(), node.text_range()); self.document_symbols.insert(syntax_id, Box::new(symbol)); let mut node = node; while let Some(parent) = node.parent() { - let parent_syntax_id = LuaSyntaxId::new(parent.kind().into(), parent.text_range()); + let parent_syntax_id = LuaSyntaxId::new(parent.kind(), parent.text_range()); if let Some(symbol) = self.document_symbols.get_mut(&parent_syntax_id) { symbol.add_child(syntax_id); break; @@ -61,13 +61,12 @@ impl<'a> DocumentSymbolBuilder<'a> { } pub fn add_token_symbol(&mut self, token: LuaSyntaxToken, symbol: LuaSymbol) { - let syntax_id = LuaSyntaxId::new(token.kind().into(), token.text_range()); + let syntax_id = LuaSyntaxId::new(token.kind(), token.text_range()); self.document_symbols.insert(syntax_id, Box::new(symbol)); let mut node = token.parent(); while let Some(parent_node) = node { - let parent_syntax_id = - LuaSyntaxId::new(parent_node.kind().into(), parent_node.text_range()); + let parent_syntax_id = LuaSyntaxId::new(parent_node.kind(), parent_node.text_range()); if let Some(symbol) = self.document_symbols.get_mut(&parent_syntax_id) { symbol.add_child(syntax_id); break; @@ -85,7 +84,7 @@ impl<'a> DocumentSymbolBuilder<'a> { let lsp_selection_range = lua_symbol .selection_range .and_then(|range| self.document.to_lsp_range(range)) - .unwrap_or_else(|| lsp_range.clone()); + .unwrap_or(lsp_range); let mut document_symbol = DocumentSymbol { name: lua_symbol.name.clone(), @@ -115,7 +114,7 @@ impl<'a> DocumentSymbolBuilder<'a> { let lsp_selection_range = child_symbol .selection_range .and_then(|range| self.document.to_lsp_range(range)) - .unwrap_or_else(|| lsp_range.clone()); + .unwrap_or(lsp_range); let child_symbol_name = if child_symbol.name.is_empty() { "(empty)".to_string() diff --git a/crates/emmylua_ls/src/handlers/document_symbol/mod.rs b/crates/emmylua_ls/src/handlers/document_symbol/mod.rs index 278fe4a47..a82c30860 100644 --- a/crates/emmylua_ls/src/handlers/document_symbol/mod.rs +++ b/crates/emmylua_ls/src/handlers/document_symbol/mod.rs @@ -29,8 +29,8 @@ pub async fn on_document_symbol( let uri = params.text_document.uri; let analysis = context.analysis().read().await; let file_id = analysis.get_file_id(&uri)?; - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; - let document_symbol_root = build_document_symbol(&mut semantic_model)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let document_symbol_root = build_document_symbol(&semantic_model)?; // remove root file symbol let children = document_symbol_root.children?; let response = DocumentSymbolResponse::Nested(children); diff --git a/crates/emmylua_ls/src/handlers/emmy_annotator/build_annotator.rs b/crates/emmylua_ls/src/handlers/emmy_annotator/build_annotator.rs index e3958da08..1c7946861 100644 --- a/crates/emmylua_ls/src/handlers/emmy_annotator/build_annotator.rs +++ b/crates/emmylua_ls/src/handlers/emmy_annotator/build_annotator.rs @@ -24,7 +24,7 @@ pub fn build_annotators(semantic: &SemanticModel) -> Vec { match node { LuaAst::LuaLocalStat(local_stat) => { build_local_stat_annotator( - &db, + db, &document, &mut use_range_set, &mut result, @@ -32,11 +32,11 @@ pub fn build_annotators(semantic: &SemanticModel) -> Vec { ); } LuaAst::LuaForStat(for_stat) => { - build_for_stat_annotator(&db, &document, &mut use_range_set, &mut result, for_stat); + build_for_stat_annotator(db, &document, &mut use_range_set, &mut result, for_stat); } LuaAst::LuaLocalFuncStat(local_func_stat) => { build_local_func_stat_annotator( - &db, + db, &document, &mut use_range_set, &mut result, @@ -45,7 +45,7 @@ pub fn build_annotators(semantic: &SemanticModel) -> Vec { } LuaAst::LuaForRangeStat(for_range_stat) => { build_for_range_annotator( - &db, + db, &document, &mut use_range_set, &mut result, @@ -53,13 +53,7 @@ pub fn build_annotators(semantic: &SemanticModel) -> Vec { ); } LuaAst::LuaParamList(params_list) => { - build_params_annotator( - &db, - &document, - &mut use_range_set, - &mut result, - params_list, - ); + build_params_annotator(db, &document, &mut use_range_set, &mut result, params_list); } LuaAst::LuaNameExpr(name_expr) => { build_name_expr_annotator(&document, &mut use_range_set, &mut result, name_expr); @@ -67,7 +61,7 @@ pub fn build_annotators(semantic: &SemanticModel) -> Vec { LuaAst::LuaDocDescription(description) => { if is_rendering_description { build_description_annotator( - &semantic, + semantic, &mut use_range_set, &mut result, description, @@ -107,7 +101,7 @@ fn build_local_stat_annotator( let ref_ranges = reference_index.get_decl_references(&file_id, &decl_id); if let Some(decl_refs) = ref_ranges { for decl_ref in &decl_refs.cells { - use_range_set.insert(decl_ref.range.clone()); + use_range_set.insert(decl_ref.range); if decl_ref.is_write { annotator.typ = EmmyAnnotatorType::MutLocal } @@ -149,7 +143,7 @@ fn build_params_annotator( let ref_ranges = reference_index.get_decl_references(&file_id, &decl_id); if let Some(decl_refs) = ref_ranges { for decl_ref in &decl_refs.cells { - use_range_set.insert(decl_ref.range.clone()); + use_range_set.insert(decl_ref.range); if decl_ref.is_write { annotator.typ = EmmyAnnotatorType::MutParam } @@ -220,10 +214,10 @@ fn build_for_stat_annotator( .get_decl_references(&file_id, &decl_id); if let Some(decl_refs) = ref_ranges { for decl_ref in &decl_refs.cells { - use_range_set.insert(decl_ref.range.clone()); + use_range_set.insert(decl_ref.range); annotator .ranges - .push(document.to_lsp_range(decl_ref.range.clone())?); + .push(document.to_lsp_range(decl_ref.range)?); } } @@ -257,10 +251,10 @@ fn build_for_range_annotator( .get_decl_references(&file_id, &decl_id); if let Some(decl_refs) = ref_ranges { for decl_ref in &decl_refs.cells { - use_range_set.insert(decl_ref.range.clone()); + use_range_set.insert(decl_ref.range); annotator .ranges - .push(document.to_lsp_range(decl_ref.range.clone())?); + .push(document.to_lsp_range(decl_ref.range)?); } } @@ -295,10 +289,10 @@ fn build_local_func_stat_annotator( .get_decl_references(&file_id, &decl_id); if let Some(decl_refs) = ref_ranges { for decl_ref in &decl_refs.cells { - use_range_set.insert(decl_ref.range.clone()); + use_range_set.insert(decl_ref.range); annotator .ranges - .push(document.to_lsp_range(decl_ref.range.clone())?); + .push(document.to_lsp_range(decl_ref.range)?); } } @@ -338,14 +332,12 @@ fn build_description_annotator( for item in items { match item.kind { DescItemKind::Em => { - use_range_set.insert(item.range.clone()); - em.ranges.push(document.to_lsp_range(item.range.clone())?); + use_range_set.insert(item.range); + em.ranges.push(document.to_lsp_range(item.range)?); } DescItemKind::Strong => { - use_range_set.insert(item.range.clone()); - strong - .ranges - .push(document.to_lsp_range(item.range.clone())?); + use_range_set.insert(item.range); + strong.ranges.push(document.to_lsp_range(item.range)?); } _ => {} } diff --git a/crates/emmylua_ls/src/handlers/fold_range/imports.rs b/crates/emmylua_ls/src/handlers/fold_range/imports.rs index 5575c26c7..1890bf0d4 100644 --- a/crates/emmylua_ls/src/handlers/fold_range/imports.rs +++ b/crates/emmylua_ls/src/handlers/fold_range/imports.rs @@ -46,7 +46,7 @@ pub fn build_imports_fold_range( Some(()) } -fn is_require_stat(stat: LuaStat, require_like_func: &Vec) -> Option { +fn is_require_stat(stat: LuaStat, require_like_func: &[String]) -> Option { match stat { LuaStat::LocalStat(local_stat) => { let exprs = local_stat.get_value_exprs(); @@ -76,7 +76,7 @@ fn is_require_stat(stat: LuaStat, require_like_func: &Vec) -> Option) -> Option { +fn is_require_expr(expr: LuaExpr, require_like_func: &[String]) -> Option { if let LuaExpr::CallExpr(call_expr) = expr { let name = call_expr.get_prefix_expr()?; if let LuaExpr::NameExpr(name_expr) = name { diff --git a/crates/emmylua_ls/src/handlers/fold_range/stats.rs b/crates/emmylua_ls/src/handlers/fold_range/stats.rs index 52f619fdc..632563195 100644 --- a/crates/emmylua_ls/src/handlers/fold_range/stats.rs +++ b/crates/emmylua_ls/src/handlers/fold_range/stats.rs @@ -105,26 +105,25 @@ pub fn build_if_stat_fold_range( if_stat: LuaIfStat, ) -> Option<()> { let mut collapsed_range_text = Vec::new(); - if let Some(block) = if_stat.get_block() { - if let Some(range) = builder.get_block_collapsed_range(block) { - collapsed_range_text.push((range, " .. ".to_string())); - } + if let Some(block) = if_stat.get_block() + && let Some(range) = builder.get_block_collapsed_range(block) + { + collapsed_range_text.push((range, " .. ".to_string())); } for else_if in if_stat.get_else_if_clause_list() { - if let Some(block) = else_if.get_block() { - if let Some(range) = builder.get_block_collapsed_range(block) { - collapsed_range_text.push((range, " .. ".to_string())); - } + if let Some(block) = else_if.get_block() + && let Some(range) = builder.get_block_collapsed_range(block) + { + collapsed_range_text.push((range, " .. ".to_string())); } } - if let Some(else_clause) = if_stat.get_else_clause() { - if let Some(block) = else_clause.get_block() { - if let Some(range) = builder.get_block_collapsed_range(block) { - collapsed_range_text.push((range, " .. ".to_string())); - } - } + if let Some(else_clause) = if_stat.get_else_clause() + && let Some(block) = else_clause.get_block() + && let Some(range) = builder.get_block_collapsed_range(block) + { + collapsed_range_text.push((range, " .. ".to_string())); } for (range, collapsed_text) in collapsed_range_text { diff --git a/crates/emmylua_ls/src/handlers/hover/build_hover.rs b/crates/emmylua_ls/src/handlers/hover/build_hover.rs index d227d8aa3..263c109d8 100644 --- a/crates/emmylua_ls/src/handlers/hover/build_hover.rs +++ b/crates/emmylua_ls/src/handlers/hover/build_hover.rs @@ -136,8 +136,8 @@ fn build_decl_hover( let decl = db.get_decl_index().get_decl(&decl_id)?; let mut semantic_decls = - find_decl_origin_owners(builder.compilation, &builder.semantic_model, decl_id) - .get_types(&builder.semantic_model); + find_decl_origin_owners(builder.compilation, builder.semantic_model, decl_id) + .get_types(builder.semantic_model); replace_semantic_type(&mut semantic_decls, &typ); // 处理类型签名 if is_function(&typ) { @@ -205,7 +205,7 @@ fn build_decl_hover( semantic_decl_set.insert(&decl_decl); semantic_decl_set.extend(semantic_decls.iter().map(|(decl, _)| decl)); for semantic_decl in semantic_decl_set { - builder.add_description(&semantic_decl); + builder.add_description(semantic_decl); } } @@ -219,13 +219,9 @@ fn build_member_hover( member_id: LuaMemberId, ) -> Option<()> { let member = db.get_member_index().get_member(&member_id)?; - let mut semantic_decls = find_member_origin_owners( - builder.compilation, - &builder.semantic_model, - member_id, - true, - ) - .get_types(&builder.semantic_model); + let mut semantic_decls = + find_member_origin_owners(builder.compilation, builder.semantic_model, member_id, true) + .get_types(builder.semantic_model); replace_semantic_type(&mut semantic_decls, &typ); let member_name = match member.get_key() { @@ -255,7 +251,7 @@ fn build_member_hover( hover_function_type(builder, db, &semantic_decls); - builder.set_location_path(Some(&member)); + builder.set_location_path(Some(member)); // `typ`此时可能是泛型实例化后的类型, 所以我们需要从member获取原始类型 builder.add_signature_params_rets_description( @@ -265,7 +261,7 @@ fn build_member_hover( if typ.is_const() { let const_value = hover_const_type(db, &typ); builder.set_type_description(format!("(field) {}: {}", member_name, const_value)); - builder.set_location_path(Some(&member)); + builder.set_location_path(Some(member)); } else { let member_hover_type = get_hover_type(builder, builder.semantic_model).unwrap_or(typ.clone()); @@ -273,7 +269,7 @@ fn build_member_hover( hover_humanize_type(builder, &member_hover_type, Some(RenderLevel::Simple)); builder .set_type_description(format!("(field) {}: {}", member_name, type_humanize_text)); - builder.set_location_path(Some(&member)); + builder.set_location_path(Some(member)); } // 添加注释文本 @@ -393,7 +389,7 @@ pub fn get_hover_type(builder: &HoverBuilder, semantic_model: &SemanticModel) -> match expr_type { Ok(expr_type) => match expr_type { LuaType::Variadic(muli_return) => { - return muli_return.get_type(multi_return_index).map(|t| t.clone()); + return muli_return.get_type(multi_return_index).cloned(); } _ => return Some(expr_type), }, diff --git a/crates/emmylua_ls/src/handlers/hover/find_origin.rs b/crates/emmylua_ls/src/handlers/hover/find_origin.rs index 4d4b8aaab..d43714a61 100644 --- a/crates/emmylua_ls/src/handlers/hover/find_origin.rs +++ b/crates/emmylua_ls/src/handlers/hover/find_origin.rs @@ -24,11 +24,11 @@ impl DeclOriginResult { let get_type = |decl: &LuaSemanticDeclId| -> Option<(LuaSemanticDeclId, LuaType)> { match decl { LuaSemanticDeclId::Member(member_id) => { - let typ = semantic_model.get_type(member_id.clone().into()); + let typ = semantic_model.get_type((*member_id).into()); Some((decl.clone(), typ)) } LuaSemanticDeclId::LuaDecl(decl_id) => { - let typ = semantic_model.get_type(decl_id.clone().into()); + let typ = semantic_model.get_type((*decl_id).into()); Some((decl.clone(), typ)) } _ => None, @@ -77,8 +77,8 @@ pub fn find_decl_origin_owners( } } -pub fn find_member_origin_owners<'a>( - compilation: &'a LuaCompilation, +pub fn find_member_origin_owners( + compilation: &LuaCompilation, semantic_model: &SemanticModel, member_id: LuaMemberId, find_all: bool, @@ -95,7 +95,7 @@ pub fn find_member_origin_owners<'a>( break; } - visited_members.insert(current_member_id.clone()); + visited_members.insert(*current_member_id); iteration_count += 1; match resolve_member_owner(compilation, semantic_model, current_member_id) { @@ -118,10 +118,10 @@ pub fn find_member_origin_owners<'a>( } // 如果存在多个同名成员, 则返回多个成员 - if let Some(same_named_members) = find_all_same_named_members(semantic_model, &final_owner) { - if same_named_members.len() > 1 { - return DeclOriginResult::Multiple(same_named_members); - } + if let Some(same_named_members) = find_all_same_named_members(semantic_model, &final_owner) + && same_named_members.len() > 1 + { + return DeclOriginResult::Multiple(same_named_members); } // 否则返回单个成员 DeclOriginResult::Single(final_owner.unwrap_or_else(|| LuaSemanticDeclId::Member(member_id))) @@ -148,7 +148,7 @@ pub fn find_all_same_named_members( let original_member = semantic_model .get_db() .get_member_index() - .get_member(&member_id)?; + .get_member(member_id)?; let target_key = original_member.get_key(); let current_owner = semantic_model @@ -186,20 +186,20 @@ fn resolve_member_owner( }; let root = semantic_model.get_root().syntax(); - let current_node = member_id.get_syntax_id().to_node_from_root(&root)?; + let current_node = member_id.get_syntax_id().to_node_from_root(root)?; let result = match member_id.get_syntax_id().get_kind() { LuaSyntaxKind::TableFieldAssign => { if LuaTableField::can_cast(current_node.kind().into()) { let table_field = LuaTableField::cast(current_node.clone())?; // 如果表是类, 那么通过类型推断获取 owner if let Some(owner_id) = - resolve_table_field_through_type_inference(&semantic_model, &table_field) + resolve_table_field_through_type_inference(semantic_model, &table_field) { return Some(owner_id); } // 非类, 那么通过右值推断 let value_expr = table_field.get_value_expr()?; - let value_node = value_expr.get_syntax_id().to_node_from_root(&root)?; + let value_node = value_expr.get_syntax_id().to_node_from_root(root)?; semantic_model.find_decl(value_node.into(), SemanticDeclLevel::default()) } else { None @@ -213,7 +213,7 @@ fn resolve_member_owner( let mut result = None; for (var, expr) in vars.iter().zip(exprs.iter()) { if var.syntax().text_range() == current_node.text_range() { - let expr_node = expr.get_syntax_id().to_node_from_root(&root)?; + let expr_node = expr.get_syntax_id().to_node_from_root(root)?; result = semantic_model.find_decl(expr_node.into(), SemanticDeclLevel::default()); break; diff --git a/crates/emmylua_ls/src/handlers/hover/function_humanize.rs b/crates/emmylua_ls/src/handlers/hover/function_humanize.rs index 2677af2bb..7038f4872 100644 --- a/crates/emmylua_ls/src/handlers/hover/function_humanize.rs +++ b/crates/emmylua_ls/src/handlers/hover/function_humanize.rs @@ -32,16 +32,14 @@ pub fn hover_function_type( semantic_decls: &[(LuaSemanticDeclId, LuaType)], ) -> Option<()> { let (name, is_local) = { - let Some((semantic_decl, _)) = semantic_decls.first() else { - return None; - }; + let (semantic_decl, _) = semantic_decls.first()?; match semantic_decl { LuaSemanticDeclId::LuaDecl(id) => { - let decl = db.get_decl_index().get_decl(&id)?; + let decl = db.get_decl_index().get_decl(id)?; (decl.get_name().to_string(), decl.is_local()) } LuaSemanticDeclId::Member(id) => { - let member = db.get_member_index().get_member(&id)?; + let member = db.get_member_index().get_member(id)?; (member.get_key().to_path(), false) } _ => { @@ -64,7 +62,7 @@ pub fn hover_function_type( type_description: String::new(), overloads: None, description: if is_new { - extract_description_from_property_owner(&builder.semantic_model, semantic_decl_id) + extract_description_from_property_owner(builder.semantic_model, semantic_decl_id) } else { None }, @@ -73,15 +71,16 @@ pub fn hover_function_type( let function_member = match semantic_decl_id { LuaSemanticDeclId::Member(id) => { - let member = db.get_member_index().get_member(&id)?; + let member = db.get_member_index().get_member(id)?; // 以 @field 定义的 function 描述信息绑定的 id 并不是 member, 需要特殊处理 - if is_new && function_info.description.is_none() { - if let Some(signature_id) = try_extract_signature_id_from_field(db, &member) { - function_info.description = extract_description_from_property_owner( - &builder.semantic_model, - &LuaSemanticDeclId::Signature(signature_id), - ); - } + if is_new + && function_info.description.is_none() + && let Some(signature_id) = try_extract_signature_id_from_field(db, member) + { + function_info.description = extract_description_from_property_owner( + builder.semantic_model, + &LuaSemanticDeclId::Signature(signature_id), + ); } Some(member) } @@ -89,37 +88,32 @@ pub fn hover_function_type( }; // 如果函数定义来自于其他文件, 我们需要添加原始的注释信息. 参考`test_other_file_function` - if let LuaType::Signature(signature_id) = typ { - if let Some(semantic_id) = - extract_semantic_decl_from_signature(builder.compilation, &signature_id) - { - if semantic_id != *semantic_decl_id { - // signature 的原始定义的描述信息 - if let Some(origin_description) = extract_description_from_property_owner( - &builder.semantic_model, - &semantic_id, - ) { - match &mut function_info.description { - Some(current_description) => { - // 如果描述不为空, 则合并描述 - if let Some(description) = origin_description.description { - if current_description.description.is_none() { - current_description.description = Some(description); - } else { - current_description.description = Some(format!( - "{}\n{}", - current_description.description.take()?, - description - )); - } - } - } - None => { - function_info.description = Some(origin_description); - } + if let LuaType::Signature(signature_id) = typ + && let Some(semantic_id) = + extract_semantic_decl_from_signature(builder.compilation, signature_id) + && semantic_id != *semantic_decl_id + // signature 的原始定义的描述信息 + && let Some(origin_description) = + extract_description_from_property_owner(builder.semantic_model, &semantic_id) + { + match &mut function_info.description { + Some(current_description) => { + // 如果描述不为空, 则合并描述 + if let Some(description) = origin_description.description { + if current_description.description.is_none() { + current_description.description = Some(description); + } else { + current_description.description = Some(format!( + "{}\n{}", + current_description.description.take()?, + description + )); } } } + None => { + function_info.description = Some(origin_description); + } } } @@ -194,14 +188,14 @@ pub fn hover_function_type( } // 此时是函数调用且具有完全匹配的签名, 那么只需要显示对应的签名, 不需要显示重载 - if let Some(info) = type_descs.first() { - if info.is_call_function { - builder.signature_overload = None; - builder.set_type_description(info.type_description.clone()); - - builder.add_description_from_info(info.description.clone()); - return Some(()); - } + if let Some(info) = type_descs.first() + && info.is_call_function + { + builder.signature_overload = None; + builder.set_type_description(info.type_description.clone()); + + builder.add_description_from_info(info.description.clone()); + return Some(()); } // 去重 @@ -288,9 +282,9 @@ fn hover_doc_function_type( if is_method { type_label = "(method) "; - name.push_str(":"); + name.push(':'); } else { - name.push_str("."); + name.push('.'); } if let LuaMemberKey::Name(n) = owner_member.get_key() { name.push_str(n.as_str()); @@ -372,9 +366,9 @@ fn hover_signature_type( is_method = signature.is_method(builder.semantic_model, Some(&self_real_type)); if is_method { type_label = "(method) "; - name.push_str(":"); + name.push(':'); } else { - name.push_str("."); + name.push('.'); } } Some(LuaMemberOwner::Element(element_id)) => { @@ -382,7 +376,7 @@ fn hover_signature_type( extract_owner_name_from_element(builder.semantic_model, element_id) { name.push_str(&owner_name); - name.push_str("."); + name.push('.'); } } _ => {} @@ -429,22 +423,22 @@ fn hover_signature_type( let rets = build_signature_rets(builder, signature, builder.is_completion, None); let result = format_function_type(type_label, async_label, full_name.clone(), params, rets); // 由于 @field 定义的`docfunction`会被视为`signature`, 因此这里额外处理 - if let Some(call_function) = call_function { - if call_function.get_params() == signature.get_type_params() { - // 如果具有完全匹配的签名, 那么将其设置为当前签名, 且不显示重载 - return Some(HoverSignatureResult { - type_description: result, - overloads: None, - call_function: Some(call_function.clone()), - }); - } + if let Some(call_function) = call_function + && call_function.get_params() == signature.get_type_params() + { + // 如果具有完全匹配的签名, 那么将其设置为当前签名, 且不显示重载 + return Some(HoverSignatureResult { + type_description: result, + overloads: None, + call_function: Some(call_function.clone()), + }); } result }; // 构建所有重载 let overloads: Vec = { let mut overloads = Vec::new(); - for (_, overload) in signature.overloads.iter().enumerate() { + for overload in &signature.overloads { let async_label = match overload.get_async_state() { AsyncState::Async => "async ", AsyncState::Sync => "sync ", @@ -475,15 +469,15 @@ fn hover_signature_type( let result = format_function_type(type_label, async_label, full_name.clone(), params, rets); - if let Some(call_function) = call_function { - if *call_function == **overload { - // 如果具有完全匹配的签名, 那么将其设置为当前签名, 且不显示重载 - return Some(HoverSignatureResult { - type_description: result, - overloads: None, - call_function: Some(call_function.clone()), - }); - } + if let Some(call_function) = call_function + && *call_function == **overload + { + // 如果具有完全匹配的签名, 那么将其设置为当前签名, 且不显示重载 + return Some(HoverSignatureResult { + type_description: result, + overloads: None, + call_function: Some(call_function.clone()), + }); }; overloads.push(result); } @@ -548,7 +542,7 @@ fn build_signature_rets( "".to_string() } else { let mut rets_string_multiline = String::new(); - rets_string_multiline.push_str("\n"); + rets_string_multiline.push('\n'); for (i, ret) in rets.iter().enumerate() { let type_text = build_signature_ret_type(builder, ret, i); @@ -645,7 +639,7 @@ fn process_single_function_type( }), LuaType::DocFunction(lua_func) => { let type_description = - hover_doc_function_type(builder, db, &lua_func, function_member, &name); + hover_doc_function_type(builder, db, lua_func, function_member, name); let is_call_function = if let Some(call_function) = call_function { call_function.get_params() == lua_func.get_params() } else { @@ -663,7 +657,7 @@ fn process_single_function_type( let signature_result = hover_signature_type( builder, db, - signature_id.clone(), + *signature_id, function_member, name, is_local, @@ -721,6 +715,7 @@ fn process_single_function_type( } } +#[allow(clippy::too_many_arguments)] fn process_single_function_type_with_exclusions( builder: &mut HoverBuilder, db: &DbIndex, diff --git a/crates/emmylua_ls/src/handlers/hover/hover_builder.rs b/crates/emmylua_ls/src/handlers/hover/hover_builder.rs index 8974a1e8a..354acfe5d 100644 --- a/crates/emmylua_ls/src/handlers/hover/hover_builder.rs +++ b/crates/emmylua_ls/src/handlers/hover/hover_builder.rs @@ -74,15 +74,15 @@ impl<'a> HoverBuilder<'a> { .get_db() .get_member_index() .get_current_owner(&owner_member.get_id()); - if let Some(LuaMemberOwner::Type(ty)) = owner_id { - if ty.get_name() != ty.get_simple_name() { - self.location_path = Some(MarkedString::from_markdown(format!( - "{}{} `{}`", - "  ", - "in class", - ty.get_name() - ))); - } + if let Some(LuaMemberOwner::Type(ty)) = owner_id + && ty.get_name() != ty.get_simple_name() + { + self.location_path = Some(MarkedString::from_markdown(format!( + "{}{} `{}`", + "  ", + "in class", + ty.get_name() + ))); } } } @@ -165,12 +165,12 @@ impl<'a> HoverBuilder<'a> { pub fn add_signature_params_rets_description(&mut self, typ: LuaType) { if let LuaType::Signature(signature_id) = typ { add_signature_param_description( - &self.semantic_model.get_db(), + self.semantic_model.get_db(), &mut self.annotation_description, signature_id, ); add_signature_ret_description( - &self.semantic_model.get_db(), + self.semantic_model.get_db(), &mut self.annotation_description, signature_id, ); @@ -182,27 +182,26 @@ impl<'a> HoverBuilder<'a> { return None; } // 根据当前输入的参数, 匹配完全匹配的签名 - if let Some(token) = self.trigger_token.clone() { - if let Some(call_expr) = token.parent()?.parent() { - if LuaCallExpr::can_cast(call_expr.kind().into()) { - let call_expr = LuaCallExpr::cast(call_expr)?; - let func = self - .semantic_model - .infer_call_expr_func(call_expr.clone(), None); - if let Some(func) = func { - // TODO: 对比参数类型确定是否完全匹配 - // 确定参数量是否与当前输入的参数数量一致, 因为`infer_call_expr_func`必然返回一个有效的类型, 即使不是完全匹配的 - let call_expr_args_count = call_expr.get_args_count(); - if let Some(mut call_expr_args_count) = call_expr_args_count { - let func_params_count = func.get_params().len(); - if !func.is_colon_define() && call_expr.is_colon_call() { - // 不是冒号定义的函数, 但是是冒号调用 - call_expr_args_count += 1; - } - if call_expr_args_count == func_params_count { - return Some((*func).clone()); - } - } + if let Some(token) = self.trigger_token.clone() + && let Some(call_expr) = token.parent()?.parent() + && LuaCallExpr::can_cast(call_expr.kind().into()) + { + let call_expr = LuaCallExpr::cast(call_expr)?; + let func = self + .semantic_model + .infer_call_expr_func(call_expr.clone(), None); + if let Some(func) = func { + // TODO: 对比参数类型确定是否完全匹配 + // 确定参数量是否与当前输入的参数数量一致, 因为`infer_call_expr_func`必然返回一个有效的类型, 即使不是完全匹配的 + let call_expr_args_count = call_expr.get_args_count(); + if let Some(mut call_expr_args_count) = call_expr_args_count { + let func_params_count = func.get_params().len(); + if !func.is_colon_define() && call_expr.is_colon_call() { + // 不是冒号定义的函数, 但是是冒号调用 + call_expr_args_count += 1; + } + if call_expr_args_count == func_params_count { + return Some((*func).clone()); } } } @@ -222,13 +221,10 @@ impl<'a> HoverBuilder<'a> { header.push_str(&format!("\n```{}\n{}\n```\n", s.language, s.value)); } } - if let Some(location_path) = &self.location_path { - match location_path { - MarkedString::String(s) => { - header.push_str(&format!("\n{}\n", s)); - } - _ => {} - } + if let Some(location_path) = &self.location_path + && let MarkedString::String(s) = location_path + { + header.push_str(&format!("\n{}\n", s)); } header }; diff --git a/crates/emmylua_ls/src/handlers/hover/hover_humanize.rs b/crates/emmylua_ls/src/handlers/hover/hover_humanize.rs index f644e8d06..cffbee8c4 100644 --- a/crates/emmylua_ls/src/handlers/hover/hover_humanize.rs +++ b/crates/emmylua_ls/src/handlers/hover/hover_humanize.rs @@ -31,18 +31,17 @@ pub fn hover_humanize_type( let db = builder.semantic_model.get_db(); match ty { LuaType::Ref(type_decl_id) => { - if let Some(type_decl) = db.get_type_index().get_type_decl(type_decl_id) { - if let Some(LuaType::MultiLineUnion(multi_union)) = + if let Some(type_decl) = db.get_type_index().get_type_decl(type_decl_id) + && let Some(LuaType::MultiLineUnion(multi_union)) = type_decl.get_alias_origin(db, None) - { - return hover_multi_line_union_type( - builder, - db, - multi_union.as_ref(), - Some(type_decl.get_full_name()), - ) - .unwrap_or_default(); - } + { + return hover_multi_line_union_type( + builder, + db, + multi_union.as_ref(), + Some(type_decl.get_full_name()), + ) + .unwrap_or_default(); } humanize_type(db, ty, fallback_level.unwrap_or(RenderLevel::Simple)) } @@ -85,7 +84,7 @@ fn hover_multi_line_union_type( }; let mut text = format!("{}:\n", type_name.clone().unwrap_or_default()); for (typ, description) in members { - let type_humanize_text = humanize_type(db, &typ, RenderLevel::Minimal); + let type_humanize_text = humanize_type(db, typ, RenderLevel::Minimal); if let Some(description) = description { text.push_str(&format!( " | {} -- {}\n", @@ -111,29 +110,23 @@ pub fn infer_prefix_global_name<'a>( .get_red_root(); let cur_node = member.get_syntax_id().to_node_from_root(&root)?; - match cur_node.kind().into() { - LuaSyntaxKind::IndexExpr => { - let index_expr = LuaIndexExpr::cast(cur_node)?; - let semantic_decl = semantic_model.find_decl( - index_expr - .get_prefix_expr()? - .get_syntax_id() - .to_node_from_root(&root) - .unwrap() - .into(), - SemanticDeclLevel::default(), - ); - if let Some(property_owner) = semantic_decl { - if let LuaSemanticDeclId::LuaDecl(id) = property_owner { - if let Some(decl) = semantic_model.get_db().get_decl_index().get_decl(&id) { - if decl.is_global() { - return Some(decl.get_name()); - } - } - } - } + if Into::::into(cur_node.kind()) == LuaSyntaxKind::IndexExpr { + let index_expr = LuaIndexExpr::cast(cur_node)?; + let semantic_decl = semantic_model.find_decl( + index_expr + .get_prefix_expr()? + .get_syntax_id() + .to_node_from_root(&root) + .unwrap() + .into(), + SemanticDeclLevel::default(), + ); + if let Some(LuaSemanticDeclId::LuaDecl(id)) = semantic_decl + && let Some(decl) = semantic_model.get_db().get_decl_index().get_decl(&id) + && decl.is_global() + { + return Some(decl.get_name()); } - _ => {} } None } @@ -166,7 +159,7 @@ pub fn extract_description_from_property_owner( let property = semantic_model .get_db() .get_property_index() - .get_property(&property_owner)?; + .get_property(property_owner)?; let mut result = DescriptionInfo::new(); @@ -175,29 +168,27 @@ pub fn extract_description_from_property_owner( match property_owner { LuaSemanticDeclId::Member(id) => { - if let Some(member) = semantic_model.get_db().get_member_index().get_member(&id) { - if let Some(LuaMemberOwner::Type(ty)) = semantic_model + if let Some(member) = semantic_model.get_db().get_member_index().get_member(id) + && let Some(LuaMemberOwner::Type(ty)) = semantic_model .get_db() .get_member_index() - .get_current_owner(&id) - { - if is_std(semantic_model.get_db(), member.get_file_id()) { - let std_desc = - hover_std_description(ty.get_name(), member.get_key().get_name()); - if !std_desc.is_empty() { - description = std_desc; - } - } + .get_current_owner(id) + && is_std(semantic_model.get_db(), member.get_file_id()) + { + let std_desc = + hover_std_description(ty.get_name(), member.get_key().get_name()); + if !std_desc.is_empty() { + description = std_desc; } } } LuaSemanticDeclId::LuaDecl(id) => { - if let Some(decl) = semantic_model.get_db().get_decl_index().get_decl(&id) { - if is_std(semantic_model.get_db(), decl.get_file_id()) { - let std_desc = hover_std_description(decl.get_name(), None); - if !std_desc.is_empty() { - description = std_desc; - } + if let Some(decl) = semantic_model.get_db().get_decl_index().get_decl(id) + && is_std(semantic_model.get_db(), decl.get_file_id()) + { + let std_desc = hover_std_description(decl.get_name(), None); + if !std_desc.is_empty() { + description = std_desc; } } } @@ -239,15 +230,12 @@ pub fn extract_owner_name_from_element( // 通过 TextRange 找到对应的 AST 节点 let node = LuaSyntaxId::to_node_at_range(&root, element_id.value)?; let stat = LuaStat::cast(node.clone().parent()?)?; - match stat { - LuaStat::LocalStat(local_stat) => { - let value = LuaExpr::cast(node)?; - let local_name = local_stat.get_local_name_by_value(value); - if let Some(local_name) = local_name { - return Some(local_name.get_name_token()?.get_name_text().to_string()); - } + if let LuaStat::LocalStat(local_stat) = stat { + let value = LuaExpr::cast(node)?; + let local_name = local_stat.get_local_name_by_value(value); + if let Some(local_name) = local_name { + return Some(local_name.get_name_token()?.get_name_text().to_string()); } - _ => {} } None diff --git a/crates/emmylua_ls/src/handlers/hover/keyword_hover.rs b/crates/emmylua_ls/src/handlers/hover/keyword_hover.rs index 9e593c49e..5ef191eea 100644 --- a/crates/emmylua_ls/src/handlers/hover/keyword_hover.rs +++ b/crates/emmylua_ls/src/handlers/hover/keyword_hover.rs @@ -2,25 +2,25 @@ use crate::meta_text::meta_keyword; use emmylua_parser::{LuaSyntaxToken, LuaTokenKind}; pub fn is_keyword(token: LuaSyntaxToken) -> bool { - match token.kind().into() { - LuaTokenKind::TkLocal => true, - LuaTokenKind::TkFunction => true, - LuaTokenKind::TkEnd => true, - LuaTokenKind::TkIf => true, - LuaTokenKind::TkThen => true, - LuaTokenKind::TkElse => true, - LuaTokenKind::TkElseIf => true, - LuaTokenKind::TkWhile => true, - LuaTokenKind::TkDo => true, - LuaTokenKind::TkFor => true, - LuaTokenKind::TkIn => true, - LuaTokenKind::TkRepeat => true, - LuaTokenKind::TkUntil => true, - LuaTokenKind::TkReturn => true, - LuaTokenKind::TkBreak => true, - LuaTokenKind::TkGoto => true, - _ => false, - } + matches!( + token.kind().into(), + LuaTokenKind::TkLocal + | LuaTokenKind::TkFunction + | LuaTokenKind::TkEnd + | LuaTokenKind::TkIf + | LuaTokenKind::TkThen + | LuaTokenKind::TkElse + | LuaTokenKind::TkElseIf + | LuaTokenKind::TkWhile + | LuaTokenKind::TkDo + | LuaTokenKind::TkFor + | LuaTokenKind::TkIn + | LuaTokenKind::TkRepeat + | LuaTokenKind::TkUntil + | LuaTokenKind::TkReturn + | LuaTokenKind::TkBreak + | LuaTokenKind::TkGoto + ) } // todo add usage diff --git a/crates/emmylua_ls/src/handlers/hover/mod.rs b/crates/emmylua_ls/src/handlers/hover/mod.rs index 46cb8e5fd..4aabcbb21 100644 --- a/crates/emmylua_ls/src/handlers/hover/mod.rs +++ b/crates/emmylua_ls/src/handlers/hover/mod.rs @@ -74,13 +74,13 @@ pub fn hover(analysis: &EmmyLuaAnalysis, file_id: FileId, position: Position) -> match token { keywords if is_keyword(keywords.clone()) => { let document = semantic_model.get_document(); - return Some(Hover { + Some(Hover { contents: HoverContents::Markup(MarkupContent { kind: lsp_types::MarkupKind::Markdown, value: hover_keyword(keywords.clone()), }), range: document.to_lsp_range(keywords.text_range()), - }); + }) } detail if detail.kind() == LuaTokenKind::TkDocDetail.into() => { let parent = detail.parent()?; diff --git a/crates/emmylua_ls/src/handlers/implementation/implementation_searcher.rs b/crates/emmylua_ls/src/handlers/implementation/implementation_searcher.rs index 6ade1a9aa..1eb3b1052 100644 --- a/crates/emmylua_ls/src/handlers/implementation/implementation_searcher.rs +++ b/crates/emmylua_ls/src/handlers/implementation/implementation_searcher.rs @@ -53,7 +53,7 @@ pub fn search_member_implementations( let index_references = semantic_model .get_db() .get_reference_index() - .get_index_references(&member_key)?; + .get_index_references(member_key)?; let mut semantic_cache = HashMap::new(); @@ -70,7 +70,7 @@ pub fn search_member_implementations( }; let root = semantic_model.get_root(); let node = in_filed_syntax_id.value.to_node_from_root(root.syntax())?; - if let Some(is_signature) = check_member_reference(&semantic_model, node.clone()) { + if let Some(is_signature) = check_member_reference(semantic_model, node.clone()) { if !semantic_model.is_reference_to( node, property_owner.clone(), @@ -98,17 +98,14 @@ fn check_member_reference(semantic_model: &SemanticModel, node: LuaSyntaxNode) - match &node { expr_node if LuaIndexExpr::can_cast(expr_node.kind().into()) => { let expr = LuaIndexExpr::cast(expr_node.clone())?; - let prefix_type = semantic_model - .infer_expr(expr.get_prefix_expr()?.into()) - .ok()?; + let prefix_type = semantic_model.infer_expr(expr.get_prefix_expr()?).ok()?; let mut is_signature = false; if let Some(current_type) = semantic_model .infer_expr(LuaExpr::IndexExpr(expr.clone())) .ok() + && current_type.is_signature() { - if current_type.is_signature() { - is_signature = true; - } + is_signature = true; } // TODO: 需要实现更复杂的逻辑, 即当为`Ref`时, 针对指定的实例定义到其实现 /* @@ -125,11 +122,8 @@ fn check_member_reference(semantic_model: &SemanticModel, node: LuaSyntaxNode) - local b = a b.a = 2 -- 这里寻找实现不能匹配到`a.a` */ - match prefix_type { - LuaType::Ref(_) => { - return None; - } - _ => {} + if let LuaType::Ref(_) = prefix_type { + return None; }; // 往上寻找 stat 节点 let stat = expr.ancestors::().next()?; @@ -225,10 +219,10 @@ pub fn search_decl_implementations( result.push(location); for decl_ref in &decl_refs.cells { - if decl_ref.is_write { - if let Some(location) = document.to_lsp_location(decl_ref.range) { - result.push(location); - } + if decl_ref.is_write + && let Some(location) = document.to_lsp_location(decl_ref.range) + { + result.push(location); } } @@ -254,7 +248,7 @@ pub fn search_decl_implementations( let Some(decl) = semantic_model .get_db() .get_decl_index() - .get_decl(&global_decl_id) + .get_decl(global_decl_id) else { continue; }; diff --git a/crates/emmylua_ls/src/handlers/implementation/mod.rs b/crates/emmylua_ls/src/handlers/implementation/mod.rs index 4d0e64331..305ba7a81 100644 --- a/crates/emmylua_ls/src/handlers/implementation/mod.rs +++ b/crates/emmylua_ls/src/handlers/implementation/mod.rs @@ -31,7 +31,7 @@ pub fn implementation( file_id: FileId, position: Position, ) -> Option { - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; let root = semantic_model.get_root(); let position_offset = { @@ -49,8 +49,7 @@ pub fn implementation( TokenAtOffset::Between(token, _) => token, }; - let implementations = - search_implementations(&mut semantic_model, &analysis.compilation, token)?; + let implementations = search_implementations(&semantic_model, &analysis.compilation, token)?; if implementations.is_empty() { return None; diff --git a/crates/emmylua_ls/src/handlers/initialized/client_config/default_config.rs b/crates/emmylua_ls/src/handlers/initialized/client_config/default_config.rs index 6b3ec9d41..24c4dc7b6 100644 --- a/crates/emmylua_ls/src/handlers/initialized/client_config/default_config.rs +++ b/crates/emmylua_ls/src/handlers/initialized/client_config/default_config.rs @@ -19,7 +19,7 @@ pub async fn get_client_config_default( .await .workspace_folders .clone(); - let main_workspace_folder = workspace_folders.get(0); + let main_workspace_folder = workspace_folders.first(); let client = context.client(); let scope_uri = main_workspace_folder.map(|p| file_path_to_uri(p).unwrap()); diff --git a/crates/emmylua_ls/src/handlers/initialized/collect_files.rs b/crates/emmylua_ls/src/handlers/initialized/collect_files.rs index 02a1ce11b..e1f274a7b 100644 --- a/crates/emmylua_ls/src/handlers/initialized/collect_files.rs +++ b/crates/emmylua_ls/src/handlers/initialized/collect_files.rs @@ -15,7 +15,7 @@ pub fn collect_files(workspaces: &Vec, emmyrc: &Emmyrc) -> Vec Option<()> { - let mut locale: String = params.locale.clone()?; - locale = get_locale_code(&locale); + let locale = params.locale.as_ref()?; + let locale = get_locale_code(locale); info!("set locale: {}", locale); emmylua_parser::set_locale(&locale); emmylua_code_analysis::set_locale(&locale); diff --git a/crates/emmylua_ls/src/handlers/initialized/mod.rs b/crates/emmylua_ls/src/handlers/initialized/mod.rs index f03b0f6f2..5219b63df 100644 --- a/crates/emmylua_ls/src/handlers/initialized/mod.rs +++ b/crates/emmylua_ls/src/handlers/initialized/mod.rs @@ -69,10 +69,7 @@ pub async fn initialized_handler( // init config // todo! support multi config - let config_root: Option = match main_root { - Some(root) => Some(PathBuf::from(root)), - None => None, - }; + let config_root: Option = main_root.map(PathBuf::from); let emmyrc = load_emmy_config(config_root, client_config.clone()); load_editorconfig(workspace_folders.clone()); @@ -195,7 +192,7 @@ pub fn get_workspace_folders(params: &InitializeParams) -> Vec { // However, most LSP clients still provide this field #[allow(deprecated)] if let Some(uri) = ¶ms.root_uri { - let root_workspace = uri_to_file_path(&uri); + let root_workspace = uri_to_file_path(uri); if let Some(path) = root_workspace { workspace_folders.push(path); } diff --git a/crates/emmylua_ls/src/handlers/inlay_hint/build_function_hint.rs b/crates/emmylua_ls/src/handlers/inlay_hint/build_function_hint.rs index 65f916a85..46d320967 100644 --- a/crates/emmylua_ls/src/handlers/inlay_hint/build_function_hint.rs +++ b/crates/emmylua_ls/src/handlers/inlay_hint/build_function_hint.rs @@ -45,12 +45,12 @@ pub fn build_closure_hint( if let Some(lua_param) = lua_params_map.get(signature_param_name) { let lsp_range = document.to_lsp_range(lua_param.get_range())?; // 构造 label - let mut label_parts = build_label_parts(semantic_model, &typ); + let mut label_parts = build_label_parts(semantic_model, typ); // 为空时添加默认值 if label_parts.is_empty() { let typ_desc = format!( ": {}", - hint_humanize_type(semantic_model, &typ, RenderLevel::Simple) + hint_humanize_type(semantic_model, typ, RenderLevel::Simple) ); label_parts.push(InlayHintLabelPart { value: typ_desc, @@ -129,21 +129,19 @@ pub fn build_label_parts(semantic_model: &SemanticModel, typ: &LuaType) -> Vec Option { match typ { LuaType::Union(_) => None, - LuaType::Nil => { - return Some(InlayHintLabelPart { - value: "?".to_string(), - location: get_type_location(semantic_model, typ, 0), - ..Default::default() - }); - } + LuaType::Nil => Some(InlayHintLabelPart { + value: "?".to_string(), + location: get_type_location(semantic_model, typ, 0), + ..Default::default() + }), _ => { let value = hint_humanize_type(semantic_model, typ, RenderLevel::Simple); let location = get_type_location(semantic_model, typ, 0); - return Some(InlayHintLabelPart { + Some(InlayHintLabelPart { value, location, ..Default::default() - }); + }) } } } @@ -158,10 +156,7 @@ fn get_type_location( } match typ { LuaType::Ref(id) | LuaType::Def(id) => { - let type_decl = semantic_model - .get_db() - .get_type_index() - .get_type_decl(&id)?; + let type_decl = semantic_model.get_db().get_type_index().get_type_decl(id)?; let location = type_decl.get_locations().first()?; let document = semantic_model.get_document_by_file_id(location.file_id)?; let lsp_range = document.to_lsp_range(location.range)?; diff --git a/crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs b/crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs index 5b0f474c3..32f2f13c0 100644 --- a/crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs +++ b/crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs @@ -196,7 +196,6 @@ fn build_call_args_for_func_type( func_type: &LuaFunctionType, params_location: Option>, ) -> Option<()> { - let call_args_len = call_args.len(); let mut params = func_type .get_params() .iter() @@ -209,7 +208,7 @@ fn build_call_args_for_func_type( params.insert(0, "self".to_string()); } (true, false) => { - if params.len() > 0 { + if !params.is_empty() { params.remove(0); } } @@ -217,12 +216,12 @@ fn build_call_args_for_func_type( } for (idx, name) in params.iter().enumerate() { - if idx >= call_args_len { + if idx >= call_args.len() { break; } if name == "..." { - for i in idx..call_args_len { + for (i, arg) in call_args.into_iter().enumerate().skip(idx) { let label_name = format!("var{}:", i - idx); let label = if let Some(params_location) = ¶ms_location { if let Some(location) = params_location.get(name) { @@ -238,7 +237,6 @@ fn build_call_args_for_func_type( InlayHintLabel::String(label_name) }; - let arg = &call_args[i]; let range = arg.get_range(); let document = semantic_model.get_document(); let lsp_range = document.to_lsp_range(range)?; @@ -258,13 +256,12 @@ fn build_call_args_for_func_type( } let arg = &call_args[idx]; - if let LuaExpr::NameExpr(name_expr) = arg { - if let Some(param_name) = name_expr.get_name_text() { - // optimize like rust analyzer - if ¶m_name == name { - continue; - } - } + if let LuaExpr::NameExpr(name_expr) = arg + && let Some(param_name) = name_expr.get_name_text() + // optimize like rust analyzer + && ¶m_name == name + { + continue; } let document = semantic_model.get_document(); @@ -318,12 +315,11 @@ fn build_local_name_hint( let local_stat = LuaLocalStat::cast(parent)?; let local_names = local_stat.get_local_name_list(); for (i, ln) in local_names.enumerate() { - if local_name == ln { - if let Some(value_expr) = local_stat.get_value_exprs().nth(i) { - if let LuaExpr::ClosureExpr(_) = value_expr { - return Some(()); - } - } + if local_name == ln + && let Some(value_expr) = local_stat.get_value_exprs().nth(i) + && let LuaExpr::ClosureExpr(_) = value_expr + { + return Some(()); } } } @@ -375,7 +371,7 @@ fn build_func_stat_override_hint( let func_name = func_stat.get_func_name()?; if let LuaVarExpr::IndexExpr(index_expr) = func_name { let prefix_expr = index_expr.get_prefix_expr()?; - let prefix_type = semantic_model.infer_expr(prefix_expr.into()).ok()?; + let prefix_type = semantic_model.infer_expr(prefix_expr).ok()?; if let LuaType::Def(id) = prefix_type { let supers = semantic_model .get_db() @@ -444,7 +440,7 @@ fn get_super_member_id( infer_guard.check(super_type_id).ok()?; let member_map = semantic_model.get_member_info_map(&super_type)?; - if let Some(member_infos) = member_map.get(&member_key) { + if let Some(member_infos) = member_map.get(member_key) { let first_property = member_infos.first()?.property_owner_id.clone()?; if let LuaSemanticDeclId::Member(member_id) = first_property { return Some(member_id); @@ -616,7 +612,7 @@ fn find_match_meta_call_operator_id( .unwrap_or(false); if is_match { - return Some((operator_id.clone(), operator_func)); + return Some((*operator_id, operator_func)); } } operator_ids.first().cloned().map(|id| (id, call_func)) @@ -639,7 +635,7 @@ fn build_index_expr_hint( // 获取前缀表达式的类型信息 let prefix_expr = index_expr.get_prefix_expr()?; - let prefix_type = semantic_model.infer_expr(prefix_expr.into()).ok()?; + let prefix_type = semantic_model.infer_expr(prefix_expr).ok()?; let member_key = semantic_model.get_member_key(&index_key)?; let member_infos = semantic_model.get_member_info_with_key(&prefix_type, member_key, false)?; @@ -782,14 +778,13 @@ fn process_enum_hint_for_arg( } LuaExpr::IndexExpr(index_expr) => { // 对索引访问需要完全匹配尾名称 - if let Some(index_name_token) = index_expr.get_index_name_token() { - if let Some(name_token) = + if let Some(index_name_token) = index_expr.get_index_name_token() + && let Some(name_token) = emmylua_parser::LuaNameToken::cast(index_name_token.clone()) - { - let index_name = name_token.get_name_text(); - if index_name == member_name { - return None; - } + { + let index_name = name_token.get_name_text(); + if index_name == member_name { + return None; } } } @@ -839,16 +834,14 @@ fn find_matching_enum_member<'a>( (LuaMemberKey::ExprType(typ), _) => typ == arg_type, _ => false, } + } else if let Some(type_cache) = semantic_model + .get_db() + .get_type_index() + .get_type_cache(&member_decl.get_id().into()) + { + type_cache.as_type() == arg_type } else { - if let Some(type_cache) = semantic_model - .get_db() - .get_type_index() - .get_type_cache(&member_decl.get_id().into()) - { - type_cache.as_type() == arg_type - } else { - false - } + false }; if is_match { diff --git a/crates/emmylua_ls/src/handlers/inlay_hint/mod.rs b/crates/emmylua_ls/src/handlers/inlay_hint/mod.rs index 6b9cce107..0202d1772 100644 --- a/crates/emmylua_ls/src/handlers/inlay_hint/mod.rs +++ b/crates/emmylua_ls/src/handlers/inlay_hint/mod.rs @@ -24,8 +24,8 @@ pub async fn on_inlay_hint_handler( } pub fn inlay_hint(analysis: &EmmyLuaAnalysis, file_id: FileId) -> Option> { - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; - build_inlay_hints(&mut semantic_model) + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; + build_inlay_hints(&semantic_model) } #[allow(unused_variables)] diff --git a/crates/emmylua_ls/src/handlers/inline_values/build_inline_values.rs b/crates/emmylua_ls/src/handlers/inline_values/build_inline_values.rs index 54cba7128..249e4a6c2 100644 --- a/crates/emmylua_ls/src/handlers/inline_values/build_inline_values.rs +++ b/crates/emmylua_ls/src/handlers/inline_values/build_inline_values.rs @@ -26,10 +26,10 @@ pub fn build_inline_values( })?; let mut node = block; - if let Some(closure) = node.parent() { - if closure.kind() == LuaSyntaxKind::ClosureExpr.into() { - node = closure; - } + if let Some(closure) = node.parent() + && closure.kind() == LuaSyntaxKind::ClosureExpr.into() + { + node = closure; } let ast_node = LuaAst::cast(node)?; diff --git a/crates/emmylua_ls/src/handlers/inline_values/mod.rs b/crates/emmylua_ls/src/handlers/inline_values/mod.rs index dd779353c..6ac3df6a4 100644 --- a/crates/emmylua_ls/src/handlers/inline_values/mod.rs +++ b/crates/emmylua_ls/src/handlers/inline_values/mod.rs @@ -18,12 +18,12 @@ pub async fn on_inline_values_handler( let stop_position = stop_location.start; let analysis = context.analysis().read().await; let file_id = analysis.get_file_id(&uri)?; - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; if !semantic_model.get_emmyrc().inline_values.enable { return None; } - build_inline_values(&mut semantic_model, stop_position) + build_inline_values(&semantic_model, stop_position) } pub struct InlineValuesCapabilities; diff --git a/crates/emmylua_ls/src/handlers/references/mod.rs b/crates/emmylua_ls/src/handlers/references/mod.rs index 38528c42b..1b2574b57 100644 --- a/crates/emmylua_ls/src/handlers/references/mod.rs +++ b/crates/emmylua_ls/src/handlers/references/mod.rs @@ -31,7 +31,7 @@ pub fn references( file_id: FileId, position: Position, ) -> Option> { - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; if !semantic_model.get_emmyrc().references.enable { return None; } @@ -60,7 +60,7 @@ pub fn references( } }; - search_references(&mut semantic_model, &analysis.compilation, token) + search_references(&semantic_model, &analysis.compilation, token) } pub struct ReferencesCapabilities; diff --git a/crates/emmylua_ls/src/handlers/references/reference_seacher.rs b/crates/emmylua_ls/src/handlers/references/reference_seacher.rs index 222b0761f..b562fab10 100644 --- a/crates/emmylua_ls/src/handlers/references/reference_seacher.rs +++ b/crates/emmylua_ls/src/handlers/references/reference_seacher.rs @@ -68,7 +68,7 @@ pub fn search_decl_references( let is_signature = typ.is_signature(); for decl_ref in &decl_refs.cells { - let location = document.to_lsp_location(decl_ref.range.clone())?; + let location = document.to_lsp_location(decl_ref.range)?; result.push(location); if is_signature { get_signature_decl_member_references(semantic_model, compilation, result, decl_ref); @@ -106,7 +106,7 @@ pub fn search_member_references( let index_references = semantic_model .get_db() .get_reference_index() - .get_index_references(&key)?; + .get_index_references(key)?; let mut semantic_cache = HashMap::new(); diff --git a/crates/emmylua_ls/src/handlers/rename/mod.rs b/crates/emmylua_ls/src/handlers/rename/mod.rs index 9020f7fec..9bb836082 100644 --- a/crates/emmylua_ls/src/handlers/rename/mod.rs +++ b/crates/emmylua_ls/src/handlers/rename/mod.rs @@ -87,7 +87,7 @@ pub fn rename( position: lsp_types::Position, new_name: String, ) -> Option { - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; let root = semantic_model.get_root(); let position_offset = { let document = semantic_model.get_document(); @@ -112,9 +112,10 @@ pub fn rename( } }; - rename_references(&mut semantic_model, &analysis.compilation, token, new_name) + rename_references(&semantic_model, &analysis.compilation, token, new_name) } +#[allow(clippy::mutable_key_type)] fn rename_references( semantic_model: &SemanticModel, compilation: &LuaCompilation, @@ -176,7 +177,7 @@ fn get_target_node(token: LuaSyntaxToken) -> Option { match parent.kind().into() { LuaSyntaxKind::LiteralExpr => { let literal_expr = LuaLiteralExpr::cast(parent)?; - return literal_expr.syntax().parent(); + literal_expr.syntax().parent() } LuaSyntaxKind::DocTagParam => { let doc_tag_param = LuaDocTagParam::cast(parent)?; @@ -195,7 +196,7 @@ fn get_target_node(token: LuaSyntaxToken) -> Option { false } })?; - return Some(param_name.syntax().clone()); + Some(param_name.syntax().clone()) } LuaAst::LuaFuncStat(func_stat) => { let closure_expr = func_stat.get_closure()?; @@ -207,12 +208,12 @@ fn get_target_node(token: LuaSyntaxToken) -> Option { false } })?; - return Some(param_name.syntax().clone()); + Some(param_name.syntax().clone()) } - _ => return None, + _ => None, } } - _ => return None, + _ => None, } } diff --git a/crates/emmylua_ls/src/handlers/rename/rename_decl.rs b/crates/emmylua_ls/src/handlers/rename/rename_decl.rs index 18da99125..191807747 100644 --- a/crates/emmylua_ls/src/handlers/rename/rename_decl.rs +++ b/crates/emmylua_ls/src/handlers/rename/rename_decl.rs @@ -7,6 +7,7 @@ use emmylua_parser::{ }; use lsp_types::Uri; +#[allow(clippy::mutable_key_type)] pub fn rename_decl_references( semantic_model: &SemanticModel, compilation: &LuaCompilation, @@ -27,10 +28,10 @@ pub fn rename_decl_references( let uri = document.get_uri(); if let Some(decl_refs) = local_references { for decl_ref in &decl_refs.cells { - let range = document.to_lsp_range(decl_ref.range.clone())?; + let range = document.to_lsp_range(decl_ref.range)?; result .entry(uri.clone()) - .or_insert_with(HashMap::new) + .or_default() .insert(range, new_name.clone()); } } @@ -38,7 +39,7 @@ pub fn rename_decl_references( let decl_range = get_decl_name_token_lsp_range(semantic_model, decl_id)?; result .entry(uri) - .or_insert_with(HashMap::new) + .or_default() .insert(decl_range, new_name.clone()); if decl.is_param() { @@ -69,7 +70,7 @@ pub fn rename_decl_references( let range = document.to_lsp_range(in_filed_syntax_id.value.get_range())?; result .entry(uri) - .or_insert_with(HashMap::new) + .or_default() .insert(range, new_name.clone()); } } @@ -89,6 +90,7 @@ fn get_decl_name_token_lsp_range( document.to_lsp_range(decl.get_range()) } +#[allow(clippy::mutable_key_type)] fn rename_doc_param( semantic_model: &SemanticModel, decl_id: LuaDeclId, @@ -116,18 +118,18 @@ fn rename_doc_param( let uri = document.get_uri(); for comment in comments { for tag_doc in comment.get_doc_tags() { - if let Some(doc_param) = LuaDocTagParam::cast(tag_doc.syntax().clone()) { - if let Some(name_token) = doc_param.get_name_token() { - if name_token.get_text() != name { - continue; - } - - let range = document.to_lsp_range(name_token.get_range())?; - result - .entry(uri.clone()) - .or_insert_with(HashMap::new) - .insert(range, new_name.clone()); + if let Some(doc_param) = LuaDocTagParam::cast(tag_doc.syntax().clone()) + && let Some(name_token) = doc_param.get_name_token() + { + if name_token.get_text() != name { + continue; } + + let range = document.to_lsp_range(name_token.get_range())?; + result + .entry(uri.clone()) + .or_default() + .insert(range, new_name.clone()); } } } diff --git a/crates/emmylua_ls/src/handlers/rename/rename_member.rs b/crates/emmylua_ls/src/handlers/rename/rename_member.rs index e111fe0ed..6d0103b75 100644 --- a/crates/emmylua_ls/src/handlers/rename/rename_member.rs +++ b/crates/emmylua_ls/src/handlers/rename/rename_member.rs @@ -11,6 +11,7 @@ use lsp_types::Uri; use crate::handlers::hover::find_member_origin_owner; +#[allow(clippy::mutable_key_type)] pub fn rename_member_references( semantic_model: &SemanticModel, compilation: &LuaCompilation, @@ -27,7 +28,7 @@ pub fn rename_member_references( semantic_model .get_db() .get_reference_index() - .get_index_references(&key)?; + .get_index_references(key)?; let origin_property_owner = find_member_origin_owner(compilation, semantic_model, member_id) .unwrap_or(LuaSemanticDeclId::Member(member_id)); @@ -57,7 +58,7 @@ pub fn rename_member_references( if let Some(range) = range { result .entry(semantic_model.get_document().get_uri()) - .or_insert_with(HashMap::new) + .or_default() .insert(range, new_name.clone()); } } @@ -76,7 +77,7 @@ fn get_member_name_token_lsp_range( } // 此时可能是 [] 访问 - if let Some(_) = node.token::() { + if node.token::().is_some() { match node { LuaAst::LuaDocTagField(tag) => { if let Some(token) = tag.token::() { diff --git a/crates/emmylua_ls/src/handlers/rename/rename_type.rs b/crates/emmylua_ls/src/handlers/rename/rename_type.rs index 82ced1f4d..fb914bdb5 100644 --- a/crates/emmylua_ls/src/handlers/rename/rename_type.rs +++ b/crates/emmylua_ls/src/handlers/rename/rename_type.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use emmylua_code_analysis::{LuaTypeDeclId, SemanticModel}; use lsp_types::Uri; +#[allow(clippy::mutable_key_type)] pub fn rename_type_references( semantic_model: &SemanticModel, type_decl_id: LuaTypeDeclId, @@ -15,20 +16,19 @@ pub fn rename_type_references( let mut reserved_namespace = String::new(); // 取出`full_name`在当前文件中使用的命名空间 - if let Some(file_namespace) = type_index.get_file_namespace(&semantic_model.get_file_id()) { - if full_name.starts_with(&format!("{}.", file_namespace)) { - reserved_namespace = file_namespace.clone(); - } + if let Some(file_namespace) = type_index.get_file_namespace(&semantic_model.get_file_id()) + && full_name.starts_with(&format!("{}.", file_namespace)) + { + reserved_namespace = file_namespace.clone(); } - if reserved_namespace.is_empty() { - if let Some(using_namespaces) = + if reserved_namespace.is_empty() + && let Some(using_namespaces) = type_index.get_file_using_namespace(&semantic_model.get_file_id()) - { - for using_namespace in using_namespaces { - if full_name.starts_with(&format!("{}.", using_namespace)) { - reserved_namespace = using_namespace.clone(); - break; - } + { + for using_namespace in using_namespaces { + if full_name.starts_with(&format!("{}.", using_namespace)) { + reserved_namespace = using_namespace.clone(); + break; } } } @@ -39,7 +39,7 @@ pub fn rename_type_references( let range = document.to_lsp_range(decl_location.range)?; result .entry(document.get_uri()) - .or_insert_with(HashMap::new) + .or_default() .insert(range, new_name.clone()); } @@ -70,7 +70,7 @@ pub fn rename_type_references( let location = document.to_lsp_location(in_filed_reference_range.value)?; result .entry(location.uri) - .or_insert_with(HashMap::new) + .or_default() .insert(location.range, actual_new_name); } diff --git a/crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs b/crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs index b9831a9f9..a61407c86 100644 --- a/crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs +++ b/crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs @@ -354,7 +354,7 @@ fn build_node_semantic_token( let position = index_expr.syntax().text_range().start(); let len = index_expr.syntax().text_range().len(); builder.push_at_position( - position.into(), + position, len.into(), SemanticTokenType::VARIABLE, None, @@ -363,17 +363,17 @@ fn build_node_semantic_token( _ => {} } } - if let Some(NodeOrToken::Token(token)) = doc_cast.syntax().prev_sibling_or_token() { - if token.kind() == LuaKind::Token(LuaTokenKind::TkDocLongStart) { - render_doc_at(builder, &token); - } + if let Some(NodeOrToken::Token(token)) = doc_cast.syntax().prev_sibling_or_token() + && token.kind() == LuaKind::Token(LuaTokenKind::TkDocLongStart) + { + render_doc_at(builder, &token); } } LuaAst::LuaDocTagAs(doc_as) => { - if let Some(NodeOrToken::Token(token)) = doc_as.syntax().prev_sibling_or_token() { - if token.kind() == LuaKind::Token(LuaTokenKind::TkDocLongStart) { - render_doc_at(builder, &token); - } + if let Some(NodeOrToken::Token(token)) = doc_as.syntax().prev_sibling_or_token() + && token.kind() == LuaKind::Token(LuaTokenKind::TkDocLongStart) + { + render_doc_at(builder, &token); } } LuaAst::LuaDocTagGeneric(doc_generic) => { @@ -410,7 +410,7 @@ fn build_node_semantic_token( } LuaAst::LuaParamName(param_name) => { let name_token = param_name.get_name_token()?; - handle_name_node(semantic_model, builder, ¶m_name.syntax(), &name_token); + handle_name_node(semantic_model, builder, param_name.syntax(), &name_token); } LuaAst::LuaLocalName(local_name) => { handle_name_node( @@ -426,7 +426,7 @@ fn build_node_semantic_token( .unwrap_or_else(|| { // 改进:为未知名称提供更好的默认分类 let name_text = name_token.get_name_text(); - if name_text.chars().next().map_or(false, |c| c.is_uppercase()) { + if name_text.chars().next().is_some_and(|c| c.is_uppercase()) { // 首字母大写可能是类或常量 builder.push(name_token.syntax(), SemanticTokenType::CLASS); } else { @@ -555,13 +555,10 @@ fn build_node_semantic_token( LuaAst::LuaDocObjectType(doc_object_type) => { let fields = doc_object_type.get_fields(); for field in fields { - if let Some(field_key) = field.get_field_key() { - match &field_key { - LuaDocObjectFieldKey::Name(name) => { - builder.push(name.syntax(), SemanticTokenType::PROPERTY); - } - _ => {} - } + if let Some(field_key) = field.get_field_key() + && let LuaDocObjectFieldKey::Name(name) = &field_key + { + builder.push(name.syntax(), SemanticTokenType::PROPERTY); } } } @@ -591,42 +588,40 @@ fn build_node_semantic_token( let name = index_expr.get_name_token()?; let semantic_decl = semantic_model .find_decl(name.syntax().clone().into(), SemanticDeclLevel::default()); - if let Some(property_owner) = semantic_decl { - if let LuaSemanticDeclId::Member(member_id) = property_owner { - let decl_type = semantic_model.get_type(member_id.into()); - if decl_type.is_function() { - builder.push(name.syntax(), SemanticTokenType::METHOD); - return Some(()); - } - if decl_type.is_def() { - builder.push_with_modifier( - name.syntax(), - SemanticTokenType::CLASS, - SemanticTokenModifier::READONLY, - ); - return Some(()); - } + if let Some(property_owner) = semantic_decl + && let LuaSemanticDeclId::Member(member_id) = property_owner + { + let decl_type = semantic_model.get_type(member_id.into()); + if decl_type.is_function() { + builder.push(name.syntax(), SemanticTokenType::METHOD); + return Some(()); + } + if decl_type.is_def() { + builder.push_with_modifier( + name.syntax(), + SemanticTokenType::CLASS, + SemanticTokenModifier::READONLY, + ); + return Some(()); + } - let owner_id = semantic_model + let owner_id = semantic_model + .get_db() + .get_member_index() + .get_current_owner(&member_id); + if let Some(LuaMemberOwner::Type(type_id)) = owner_id + && let Some(type_decl) = semantic_model .get_db() - .get_member_index() - .get_current_owner(&member_id); - if let Some(LuaMemberOwner::Type(type_id)) = owner_id { - if let Some(type_decl) = semantic_model - .get_db() - .get_type_index() - .get_type_decl(&type_id) - { - if type_decl.is_enum() { - builder.push_with_modifier( - name.syntax(), - SemanticTokenType::ENUM_MEMBER, - SemanticTokenModifier::READONLY, - ); - return Some(()); - } - } - } + .get_type_index() + .get_type_decl(type_id) + && type_decl.is_enum() + { + builder.push_with_modifier( + name.syntax(), + SemanticTokenType::ENUM_MEMBER, + SemanticTokenModifier::READONLY, + ); + return Some(()); } } @@ -653,23 +648,21 @@ fn build_node_semantic_token( .get_db() .get_member_index() .get_current_owner(&member.get_id()); - if let Some(LuaMemberOwner::Type(type_id)) = owner_id { - if let Some(type_decl) = semantic_model + if let Some(LuaMemberOwner::Type(type_id)) = owner_id + && let Some(type_decl) = semantic_model .get_db() .get_type_index() - .get_type_decl(&type_id) - { - if type_decl.is_enum() { - if let Some(field_name) = table_field.get_field_key()?.get_name() { - builder.push_with_modifier( - field_name.syntax(), - SemanticTokenType::ENUM_MEMBER, - SemanticTokenModifier::DECLARATION, - ); - } - return Some(()); - } + .get_type_decl(type_id) + && type_decl.is_enum() + { + if let Some(field_name) = table_field.get_field_key()?.get_name() { + builder.push_with_modifier( + field_name.syntax(), + SemanticTokenType::ENUM_MEMBER, + SemanticTokenModifier::DECLARATION, + ); } + return Some(()); } } @@ -697,16 +690,15 @@ fn build_node_semantic_token( } } } - LuaAst::LuaDocLiteralType(literal) => match &literal.get_literal()? { - LuaLiteralToken::Bool(bool_token) => { + LuaAst::LuaDocLiteralType(literal) => { + if let LuaLiteralToken::Bool(bool_token) = &literal.get_literal()? { builder.push_with_modifier( bool_token.syntax(), SemanticTokenType::KEYWORD, SemanticTokenModifier::DOCUMENTATION, ); } - _ => {} - }, + } LuaAst::LuaDocDescription(description) => { if !emmyrc.semantic_tokens.render_documentation_markup { for token in description.tokens::() { @@ -748,13 +740,10 @@ fn build_node_semantic_token( .get_parent::()? .get_parent::()?; let literal_token = literal_expr.get_literal()?; - match literal_token { - LuaLiteralToken::String(string_token) => { - if !builder.is_special_string_range(&string_token.get_range()) { - fun_string_highlight(builder, semantic_model, call_expr, &string_token); - } - } - _ => {} + if let LuaLiteralToken::String(string_token) = literal_token + && !builder.is_special_string_range(&string_token.get_range()) + { + fun_string_highlight(builder, semantic_model, call_expr, &string_token); } } _ => {} @@ -843,7 +832,7 @@ fn handle_name_node( .get_decl(&decl_id)?; let decl_type = semantic_model.get_type(decl_id.into()); - if let Some(true) = check_require_decl(semantic_model, &decl) { + if let Some(true) = check_require_decl(semantic_model, decl) { builder.push_with_modifier( name_token.syntax(), SemanticTokenType::CLASS, @@ -856,7 +845,7 @@ fn handle_name_node( LuaType::Def(_) => (SemanticTokenType::CLASS, None), LuaType::Ref(ref_id) => { if let Some(is_require) = - check_ref_is_require_def(semantic_model, &decl, &ref_id) + check_ref_is_require_def(semantic_model, decl, &ref_id) { if is_require { ( @@ -867,8 +856,6 @@ fn handle_name_node( // 改进:根据声明类型选择更准确的token类型 let base_type = if decl.is_param() { SemanticTokenType::PARAMETER - } else if decl.is_local() { - SemanticTokenType::VARIABLE } else { SemanticTokenType::VARIABLE }; @@ -877,8 +864,6 @@ fn handle_name_node( } else { let base_type = if decl.is_param() { SemanticTokenType::PARAMETER - } else if decl.is_local() { - SemanticTokenType::VARIABLE } else { SemanticTokenType::VARIABLE }; @@ -902,8 +887,6 @@ fn handle_name_node( } else { let base_type = if decl.is_param() { SemanticTokenType::PARAMETER - } else if decl.is_local() { - SemanticTokenType::VARIABLE } else { SemanticTokenType::VARIABLE }; @@ -918,7 +901,7 @@ fn handle_name_node( let signature = semantic_model .get_db() .get_signature_index() - .get(&signature_id)?; + .get(signature_id)?; if let Some(param_info) = signature.get_param_info_by_id(*idx) { if param_info.type_ref.is_function() { SemanticTokenType::FUNCTION @@ -932,8 +915,6 @@ fn handle_name_node( _ => { if decl.is_param() { SemanticTokenType::PARAMETER - } else if decl.is_local() { - SemanticTokenType::VARIABLE } else { SemanticTokenType::VARIABLE } @@ -951,10 +932,10 @@ fn handle_name_node( .get_db() .get_reference_index() .get_decl_references(&file_id, &decl_id); - if let Some(ref_decl) = ref_decl { - if !ref_decl.mutable { - modifier = Some(SemanticTokenModifier::READONLY); - } + if let Some(ref_decl) = ref_decl + && !ref_decl.mutable + { + modifier = Some(SemanticTokenModifier::READONLY); } } @@ -990,7 +971,7 @@ fn handle_name_node( } // 默认情况:如果不能确定类型,根据名称约定推断 - let default_type = if name_text.chars().next().map_or(false, |c| c.is_uppercase()) { + let default_type = if name_text.chars().next().is_some_and(|c| c.is_uppercase()) { SemanticTokenType::CLASS } else { SemanticTokenType::VARIABLE @@ -1135,7 +1116,7 @@ fn check_ref_is_require_def( /// 检查是否是导入语句 fn check_require_decl(semantic_model: &SemanticModel, decl: &LuaDecl) -> Option { let module_info = parse_require_module_info(semantic_model, decl)?; - if check_export_visibility(semantic_model, &module_info).unwrap_or(false) { + if check_export_visibility(semantic_model, module_info).unwrap_or(false) { return Some(true); } None diff --git a/crates/emmylua_ls/src/handlers/semantic_token/function_string_highlight.rs b/crates/emmylua_ls/src/handlers/semantic_token/function_string_highlight.rs index 1131261fc..4e6295a73 100644 --- a/crates/emmylua_ls/src/handlers/semantic_token/function_string_highlight.rs +++ b/crates/emmylua_ls/src/handlers/semantic_token/function_string_highlight.rs @@ -24,9 +24,7 @@ pub fn fun_string_highlight( match (colon_define, colon_call) { (true, false) => { - if param_idx > 0 { - param_idx -= 1 - } + param_idx = param_idx.saturating_sub(1); } (false, true) => { param_idx += 1; @@ -39,7 +37,7 @@ pub fn fun_string_highlight( let lang_name = get_lang_str_from_type(param_type)?; match CodeBlockLang::try_parse(&lang_name) { Some(lang) => { - process_inject_lang_string_token(builder, lang, &string_token); + process_inject_lang_string_token(builder, lang, string_token); } None => { // TODO diff --git a/crates/emmylua_ls/src/handlers/semantic_token/language_injector.rs b/crates/emmylua_ls/src/handlers/semantic_token/language_injector.rs index 5e7d19499..2826d59ab 100644 --- a/crates/emmylua_ls/src/handlers/semantic_token/language_injector.rs +++ b/crates/emmylua_ls/src/handlers/semantic_token/language_injector.rs @@ -32,7 +32,7 @@ pub fn process_inject_lang_string_token( lang: CodeBlockLang, str_token: &LuaStringToken, ) -> Option<()> { - let code_block_info = divide_into_quote_and_code_block(&str_token)?; + let code_block_info = divide_into_quote_and_code_block(str_token)?; let code_block_range = code_block_info.code_block; let code_block_source = SourceRange::from_start_end( u32::from(code_block_range.start()) as usize, diff --git a/crates/emmylua_ls/src/handlers/semantic_token/mod.rs b/crates/emmylua_ls/src/handlers/semantic_token/mod.rs index 972971d1e..0a92b1f2a 100644 --- a/crates/emmylua_ls/src/handlers/semantic_token/mod.rs +++ b/crates/emmylua_ls/src/handlers/semantic_token/mod.rs @@ -29,12 +29,7 @@ pub async fn on_semantic_token_handler( let client_id = workspace_manager.client_config.client_id; let _ = workspace_manager; - semantic_token( - &analysis, - file_id, - &context.client_capabilities(), - client_id, - ) + semantic_token(&analysis, file_id, context.client_capabilities(), client_id) } pub fn semantic_token( @@ -72,8 +67,8 @@ impl RegisterCapabilities for SemanticTokenCapabilities { server_capabilities.semantic_tokens_provider = Some( SemanticTokensServerCapabilities::SemanticTokensOptions(SemanticTokensOptions { legend: SemanticTokensLegend { - token_modifiers: SEMANTIC_TOKEN_MODIFIERS.iter().cloned().collect(), - token_types: SEMANTIC_TOKEN_TYPES.iter().cloned().collect(), + token_modifiers: SEMANTIC_TOKEN_MODIFIERS.to_vec(), + token_types: SEMANTIC_TOKEN_TYPES.to_vec(), }, full: Some(SemanticTokensFullOptions::Bool(true)), ..Default::default() @@ -83,12 +78,11 @@ impl RegisterCapabilities for SemanticTokenCapabilities { } fn supports_multiline_tokens(client_capability: &ClientCapabilities) -> bool { - if let Some(text_document) = &client_capability.text_document { - if let Some(support) = &text_document.semantic_tokens { - if let Some(support) = &support.multiline_token_support { - return *support; - } - } + if let Some(text_document) = &client_capability.text_document + && let Some(support) = &text_document.semantic_tokens + && let Some(support) = &support.multiline_token_support + { + return *support; } false diff --git a/crates/emmylua_ls/src/handlers/semantic_token/semantic_token_builder.rs b/crates/emmylua_ls/src/handlers/semantic_token/semantic_token_builder.rs index 25d7f4fb4..aba8232ae 100644 --- a/crates/emmylua_ls/src/handlers/semantic_token/semantic_token_builder.rs +++ b/crates/emmylua_ls/src/handlers/semantic_token/semantic_token_builder.rs @@ -143,8 +143,8 @@ impl<'a> SemanticBuilder<'a> { self.data.insert( position, SemanticTokenData::Basic(BasicSemanticTokenData { - line: start_line as u32, - col: start_col as u32, + line: start_line, + col: start_col, length, typ, modifiers, @@ -191,8 +191,8 @@ impl<'a> SemanticBuilder<'a> { self.data.insert( position, SemanticTokenData::Basic(BasicSemanticTokenData { - line: start_line as u32, - col: start_col as u32, + line: start_line, + col: start_col, length, typ: *self.type_to_id.get(&ty)?, modifiers: modifiers.map_or(0, |m| 1 << *self.modifier_to_id.get(&m).unwrap_or(&0)), @@ -210,7 +210,7 @@ impl<'a> SemanticBuilder<'a> { ) -> Option<()> { let mut modifier = 0; for m in modifiers { - modifier |= 1 << *self.modifier_to_id.get(&m)?; + modifier |= 1 << *self.modifier_to_id.get(m)?; } self.push_data(range, token_text, *self.type_to_id.get(&ty)?, modifier); Some(()) @@ -226,7 +226,7 @@ impl<'a> SemanticBuilder<'a> { let typ = *self.type_to_id.get(&ty)?; let mut modifier = 0; for m in modifiers { - modifier |= 1 << *self.modifier_to_id.get(&m)?; + modifier |= 1 << *self.modifier_to_id.get(m)?; } self.push_data(token.text_range(), token.text(), typ, modifier); diff --git a/crates/emmylua_ls/src/handlers/signature_helper/build_signature_helper.rs b/crates/emmylua_ls/src/handlers/signature_helper/build_signature_helper.rs index cc7e108f2..3c351ffd4 100644 --- a/crates/emmylua_ls/src/handlers/signature_helper/build_signature_helper.rs +++ b/crates/emmylua_ls/src/handlers/signature_helper/build_signature_helper.rs @@ -70,12 +70,11 @@ pub fn get_current_param_index(call_expr: &LuaCallExpr, token: &LuaSyntaxToken) let mut current_idx = 0; let token_position = token.text_range().start(); for node_or_token in arg_list.syntax().children_with_tokens() { - if let NodeOrToken::Token(token) = node_or_token { - if token.kind() == LuaTokenKind::TkComma.into() { - if token.text_range().start() <= token_position { - current_idx += 1; - } - } + if let NodeOrToken::Token(token) = node_or_token + && token.kind() == LuaTokenKind::TkComma.into() + && token.text_range().start() <= token_position + { + current_idx += 1; } } @@ -91,11 +90,7 @@ fn build_doc_function_signature_help( let semantic_model = builder.semantic_model; let db = semantic_model.get_db(); let mut current_idx = current_idx; - let params = func_type - .get_params() - .iter() - .map(|param| param.clone()) - .collect::>(); + let params = func_type.get_params().to_vec(); // 参数信息 let mut param_infos = vec![]; for param in params.iter() { @@ -133,17 +128,18 @@ fn build_doc_function_signature_help( _ => {} } - if let Some((name, _)) = params.last() { - if name == "..." && current_idx >= params.len() { - current_idx = params.len() - 1; - } + if let Some((name, _)) = params.last() + && name == "..." + && current_idx >= params.len() + { + current_idx = params.len() - 1; } let label = build_function_label( builder, ¶m_infos, func_type.is_method(builder.semantic_model, None), - &func_type.get_ret(), + func_type.get_ret(), ); let signature_info = SignatureInformation { @@ -174,20 +170,18 @@ fn build_sig_id_signature_help( let mut current_idx = current_idx; let mut params = signature.get_type_params(); let colon_define = signature.is_colon_define; - if is_call_operator { - if params.len() > 0 && !colon_define { - params.remove(0); - } + if is_call_operator && !params.is_empty() && !colon_define { + params.remove(0); } // 参数信息 let mut param_infos = vec![]; for param in params.iter() { let param_label = generate_param_label(db, param.clone()); let mut documentation_string = String::new(); - if let Some(desc) = signature.get_param_info_by_name(¶m.0) { - if let Some(description) = &desc.description { - documentation_string.push_str(description); - } + if let Some(desc) = signature.get_param_info_by_name(¶m.0) + && let Some(description) = &desc.description + { + documentation_string.push_str(description); } let documentation = if documentation_string.is_empty() { @@ -230,16 +224,17 @@ fn build_sig_id_signature_help( _ => {} } - if let Some((name, _)) = params.last() { - if name == "..." && current_idx >= params.len() { - current_idx = params.len() - 1; - } + if let Some((name, _)) = params.last() + && name == "..." + && current_idx >= params.len() + { + current_idx = params.len() - 1; } let label = build_function_label( builder, ¶m_infos, - signature.is_method(&semantic_model, None), + signature.is_method(semantic_model, None), &signature.get_return_type(), ); @@ -253,7 +248,7 @@ fn build_sig_id_signature_help( let mut signatures = vec![signature_info]; for overload in &signature.overloads { let signature = - build_doc_function_signature_help(&builder, &overload, colon_call, origin_current_idx); + build_doc_function_signature_help(builder, overload, colon_call, origin_current_idx); if let Some(mut signature) = signature { signature.signatures[0].documentation = builder.description.clone(); signatures.push(signature.signatures[0].clone()); @@ -275,12 +270,10 @@ fn build_type_signature_help( current_idx: usize, ) -> Option { let db = builder.semantic_model.get_db(); - if let Some(type_decl) = db.get_type_index().get_type_decl(type_decl_id) { - if let Some(origin) = type_decl.get_alias_origin(db, None) { - if let LuaType::DocFunction(f) = origin { - return build_doc_function_signature_help(builder, &f, colon_call, current_idx); - } - } + if let Some(type_decl) = db.get_type_index().get_type_decl(type_decl_id) + && let Some(LuaType::DocFunction(f)) = type_decl.get_alias_origin(db, None) + { + return build_doc_function_signature_help(builder, &f, colon_call, current_idx); } let operator_ids = db @@ -437,13 +430,13 @@ pub fn build_function_label( if let Some(prefix_name) = &builder.prefix_name { label.push_str(prefix_name); if is_method { - label.push_str(":"); + label.push(':'); } else { - label.push_str("."); + label.push('.'); } } label.push_str(&builder.function_name); - label.push_str("("); + label.push('('); label.push_str( ¶m_infos .iter() @@ -454,7 +447,7 @@ pub fn build_function_label( .collect::>() .join(", "), ); - label.push_str(")"); + label.push(')'); match return_type { LuaType::Nil => {} _ => { @@ -536,10 +529,8 @@ fn build_generic_signature_help( let type_decl_id = generic.get_base_type_id_ref(); if let Some(type_decl) = db.get_type_index().get_type_decl(type_decl_id) { let substitutor = TypeSubstitutor::from_type_array(generic_params.clone()); - if let Some(origin) = type_decl.get_alias_origin(db, Some(&substitutor)) { - if let LuaType::DocFunction(f) = origin { - return build_doc_function_signature_help(builder, &f, colon_call, current_idx); - } + if let Some(LuaType::DocFunction(f)) = type_decl.get_alias_origin(db, Some(&substitutor)) { + return build_doc_function_signature_help(builder, &f, colon_call, current_idx); } } diff --git a/crates/emmylua_ls/src/handlers/signature_helper/mod.rs b/crates/emmylua_ls/src/handlers/signature_helper/mod.rs index ce9a641e0..868ac93c6 100644 --- a/crates/emmylua_ls/src/handlers/signature_helper/mod.rs +++ b/crates/emmylua_ls/src/handlers/signature_helper/mod.rs @@ -40,7 +40,7 @@ pub fn signature_help( position: Position, param_context: SignatureHelpContext, ) -> Option { - let mut semantic_model = analysis.compilation.get_semantic_model(file_id)?; + let semantic_model = analysis.compilation.get_semantic_model(file_id)?; let root = semantic_model.get_root(); let position_offset = { let document = semantic_model.get_document(); @@ -63,7 +63,7 @@ pub fn signature_help( match node.kind().into() { LuaSyntaxKind::CallArgList => { let call_expr = LuaCallExpr::cast(node.parent()?)?; - build_signature_helper(&mut semantic_model, &analysis.compilation, call_expr, token) + build_signature_helper(&semantic_model, &analysis.compilation, call_expr, token) } // todo LuaSyntaxKind::TypeGeneric | LuaSyntaxKind::DocTypeList => None, @@ -90,7 +90,7 @@ pub fn signature_help( match node.kind().into() { LuaSyntaxKind::CallArgList => { let call_expr = LuaCallExpr::cast(node.parent()?)?; - build_signature_helper(&mut semantic_model, &analysis.compilation, call_expr, token) + build_signature_helper(&semantic_model, &analysis.compilation, call_expr, token) } // todo LuaSyntaxKind::TypeGeneric | LuaSyntaxKind::DocTypeList => None, @@ -104,8 +104,8 @@ pub struct SignatureHelperCapabilities; impl RegisterCapabilities for SignatureHelperCapabilities { fn register_capabilities(server_capabilities: &mut ServerCapabilities, _: &ClientCapabilities) { server_capabilities.signature_help_provider = Some(SignatureHelpOptions { - trigger_characters: Some(vec!["(", ","].iter().map(|s| s.to_string()).collect()), - retrigger_characters: Some(vec!["(", ","].iter().map(|s| s.to_string()).collect()), + trigger_characters: Some(["(", ","].iter().map(|s| s.to_string()).collect()), + retrigger_characters: Some(["(", ","].iter().map(|s| s.to_string()).collect()), ..Default::default() }); } diff --git a/crates/emmylua_ls/src/handlers/signature_helper/signature_helper_builder.rs b/crates/emmylua_ls/src/handlers/signature_helper/signature_helper_builder.rs index 0c7db6571..a08d3a37d 100644 --- a/crates/emmylua_ls/src/handlers/signature_helper/signature_helper_builder.rs +++ b/crates/emmylua_ls/src/handlers/signature_helper/signature_helper_builder.rs @@ -51,13 +51,11 @@ impl<'a> SignatureHelperBuilder<'a> { fn infer_self_type(&self) -> Option { let prefix_expr = self.call_expr.get_prefix_expr(); - if let Some(prefix_expr) = prefix_expr { - if let LuaExpr::IndexExpr(index) = prefix_expr { - let self_expr = index.get_prefix_expr(); - if let Some(self_expr) = self_expr { - return self.semantic_model.infer_expr(self_expr.into()).ok(); - } - } + if let Some(prefix_expr) = prefix_expr + && let LuaExpr::IndexExpr(index) = prefix_expr + && let Some(self_expr) = index.get_prefix_expr() + { + return self.semantic_model.infer_expr(self_expr).ok(); } None } @@ -71,7 +69,7 @@ impl<'a> SignatureHelperBuilder<'a> { let db = semantic_model.get_db(); let prefix_expr = self.call_expr.get_prefix_expr()?; let mut semantic_decl = semantic_model.find_decl( - NodeOrToken::Node(prefix_expr.syntax().clone().into()), + NodeOrToken::Node(prefix_expr.syntax().clone()), SemanticDeclLevel::Trace(50), ); // 推断为来源 @@ -83,9 +81,7 @@ impl<'a> SignatureHelperBuilder<'a> { Some(LuaSemanticDeclId::LuaDecl(_)) => semantic_decl, _ => None, }; - let Some(semantic_decl) = semantic_decl else { - return None; - }; + let semantic_decl = semantic_decl?; // 先设置原始描述 let property = self @@ -93,15 +89,15 @@ impl<'a> SignatureHelperBuilder<'a> { .get_db() .get_property_index() .get_property(&semantic_decl); - if let Some(property) = property { - if let Some(description) = property.description() { - self.set_description(description.to_string()); - } + if let Some(property) = property + && let Some(description) = property.description() + { + self.set_description(description.to_string()); } match &semantic_decl { LuaSemanticDeclId::Member(member_id) => { - let member = db.get_member_index().get_member(&member_id)?; + let member = db.get_member_index().get_member(member_id)?; let global_name = infer_prefix_global_name(self.semantic_model, member); // 处理前缀 let parent_owner = db.get_member_index().get_current_owner(&member.get_id()); @@ -125,7 +121,7 @@ impl<'a> SignatureHelperBuilder<'a> { self.function_name = member.get_key().to_path().to_string(); } LuaSemanticDeclId::LuaDecl(decl_id) => { - let decl = db.get_decl_index().get_decl(&decl_id)?; + let decl = db.get_decl_index().get_decl(decl_id)?; self.function_name = decl.get_name().to_string(); self.set_std_function_description(decl.get_file_id(), decl.get_name(), None); } @@ -194,7 +190,7 @@ impl<'a> SignatureHelperBuilder<'a> { self, &self.params_info, func.is_method(self.semantic_model, None), - &func.get_ret(), + func.get_ret(), ); Some(()) diff --git a/crates/emmylua_ls/src/handlers/signature_helper/signature_helper_humanize.rs b/crates/emmylua_ls/src/handlers/signature_helper/signature_helper_humanize.rs deleted file mode 100644 index e69de29bb..000000000 diff --git a/crates/emmylua_ls/src/handlers/test_lib/mod.rs b/crates/emmylua_ls/src/handlers/test_lib/mod.rs index e907ed028..fc30edd72 100644 --- a/crates/emmylua_ls/src/handlers/test_lib/mod.rs +++ b/crates/emmylua_ls/src/handlers/test_lib/mod.rs @@ -145,11 +145,10 @@ impl ProviderVirtualWorkspace { pub fn def_file(&mut self, file_name: &str, content: &str) -> FileId { let uri = self.virtual_url_generator.new_uri(file_name); - let file_id = self - .analysis + + self.analysis .update_file_by_uri(&uri, Some(content.to_string())) - .unwrap(); - file_id + .unwrap() } pub fn get_emmyrc(&self) -> Emmyrc { @@ -276,7 +275,7 @@ impl ProviderVirtualWorkspace { CompletionResponse::List(list) => list.items, }; let param = items - .get(0) + .first() .ok_or("failed to get completion item") .or_fail()?; let item = completion_resolve(&self.analysis, param.clone(), ClientId::VSCode); @@ -331,7 +330,7 @@ impl ProviderVirtualWorkspace { let mut items = result .iter() .map(|l| VirtualLocation { - file: l.uri.path().segments().last().unwrap().to_string(), + file: l.uri.path().segments().next_back().unwrap().to_string(), line: l.range.start.line, }) .collect::>(); @@ -402,7 +401,7 @@ impl ProviderVirtualWorkspace { block_str: &str, expected: Vec, ) -> Result<()> { - let file_id = self.def(&block_str); + let file_id = self.def(block_str); let result = inlay_hint(&self.analysis, file_id) .ok_or("failed to get inlay hints") .or_fail()?; @@ -423,7 +422,7 @@ impl ProviderVirtualWorkspace { Some(part) => part .location .as_ref() - .map(|loc| loc.uri.path().segments().last().unwrap().to_string()), + .map(|loc| loc.uri.path().segments().next_back().unwrap().to_string()), None => None, }, InlayHintLabel::String(_) => None, @@ -568,7 +567,12 @@ impl ProviderVirtualWorkspace { .changes .or_fail()? .into_iter() - .map(|(uri, edits)| Ok((uri.path().segments().last().or_fail()?.to_string(), edits))) + .map(|(uri, edits)| { + Ok(( + uri.path().segments().next_back().or_fail()?.to_string(), + edits, + )) + }) .collect::>>()?; items.sort_by_key(|(path, _)| path.clone()); for (_, edits) in &mut items { diff --git a/crates/emmylua_ls/src/handlers/text_document/register_file_watch.rs b/crates/emmylua_ls/src/handlers/text_document/register_file_watch.rs index 28b0c24d3..9d4d58213 100644 --- a/crates/emmylua_ls/src/handlers/text_document/register_file_watch.rs +++ b/crates/emmylua_ls/src/handlers/text_document/register_file_watch.rs @@ -27,14 +27,12 @@ pub async fn register_files_watch( } fn is_lsp_client_can_watch_files(client_capabilities: &ClientCapabilities) -> bool { - if let Some(workspace) = &client_capabilities.workspace { - if let Some(did_change_watched_files) = &workspace.did_change_watched_files { - if let Some(dynamic_registration) = &did_change_watched_files.dynamic_registration { - return dynamic_registration.clone(); - } - } - } - false + client_capabilities + .workspace + .as_ref() + .and_then(|ws| ws.did_change_watched_files.as_ref()) + .and_then(|d| d.dynamic_registration) + .unwrap_or_default() } fn register_files_watch_use_lsp_client(client: &ClientProxy) { @@ -76,16 +74,13 @@ async fn register_files_watch_use_fsnotify(context: ServerContextSnapshot) -> Op let config = Config::default().with_poll_interval(Duration::from_secs(5)); let mut watcher = match RecommendedWatcher::new( move |res| { - match res { - Ok(event) => { - match tx.send(event) { - Ok(_) => {} - Err(e) => { - warn!("send notify event failed: {:?}", e); - } - }; - } - _ => {} + if let Ok(event) = res { + match tx.send(event) { + Ok(_) => {} + Err(e) => { + warn!("send notify event failed: {:?}", e); + } + }; }; }, config, @@ -122,7 +117,7 @@ async fn register_files_watch_use_fsnotify(context: ServerContextSnapshot) -> Op for path in event.paths.iter() { for ext in WATCH_FILE_EXTENSIONS.iter() { if path.as_os_str().to_string_lossy().ends_with(ext) { - if let Some(uri) = file_path_to_uri(&path) { + if let Some(uri) = file_path_to_uri(path) { file_events.push(FileEvent { uri, typ }); } break; diff --git a/crates/emmylua_ls/src/handlers/text_document/text_document_handler.rs b/crates/emmylua_ls/src/handlers/text_document/text_document_handler.rs index 561fd4bc2..399d61b3f 100644 --- a/crates/emmylua_ls/src/handlers/text_document/text_document_handler.rs +++ b/crates/emmylua_ls/src/handlers/text_document/text_document_handler.rs @@ -109,19 +109,19 @@ pub async fn on_did_close_document( drop(workspace); // 如果关闭后文件不存在, 则移除 - if let Some(file_path) = uri_to_file_path(uri) { - if !file_path.exists() { - let mut mut_analysis = context.analysis().write().await; - mut_analysis.remove_file_by_uri(uri); - drop(mut_analysis); - - context - .file_diagnostic() - .clear_file_diagnostics(uri.clone()) - .await; - - return Some(()); - } + if let Some(file_path) = uri_to_file_path(uri) + && !file_path.exists() + { + let mut mut_analysis = context.analysis().write().await; + mut_analysis.remove_file_by_uri(uri); + drop(mut_analysis); + + context + .file_diagnostic() + .clear_file_diagnostics(uri.clone()) + .await; + + return Some(()); } let analysis = context.analysis().read().await; diff --git a/crates/emmylua_ls/src/handlers/workspace/did_rename_files.rs b/crates/emmylua_ls/src/handlers/workspace/did_rename_files.rs index cbd172664..2eafb3d77 100644 --- a/crates/emmylua_ls/src/handlers/workspace/did_rename_files.rs +++ b/crates/emmylua_ls/src/handlers/workspace/did_rename_files.rs @@ -1,8 +1,4 @@ -use std::{ - collections::HashMap, - path::{Path, PathBuf}, - str::FromStr, -}; +use std::{collections::HashMap, path::Path, str::FromStr}; use emmylua_code_analysis::{ FileId, LuaCompilation, LuaModuleIndex, LuaType, SemanticModel, WorkspaceId, file_path_to_uri, @@ -37,13 +33,13 @@ pub async fn on_did_rename_files_handler( let new_path = uri_to_file_path(&new_uri)?; // 提取重命名信息 - let rename_info = collect_rename_info(&old_uri, &new_uri, &module_index); + let rename_info = collect_rename_info(&old_uri, &new_uri, module_index); if let Some(rename_info) = rename_info { all_renames.push(rename_info.clone()); } else { // 有可能是目录重命名, 需要收集目录下所有 lua 文件 if let Some(collected_renames) = - collect_directory_lua_files(&old_path, &new_path, &module_index) + collect_directory_lua_files(&old_path, &new_path, module_index) { all_renames.extend(collected_renames); } @@ -58,10 +54,10 @@ pub async fn on_did_rename_files_handler( let encoding = &analysis.get_emmyrc().workspace.encoding; for rename in all_renames.iter() { analysis.remove_file_by_uri(&rename.old_uri); - if let Some(new_path) = uri_to_file_path(&rename.new_uri) { - if let Some(text) = read_file_with_encoding(&new_path, encoding) { - analysis.update_file_by_uri(&rename.new_uri, Some(text)); - } + if let Some(new_path) = uri_to_file_path(&rename.new_uri) + && let Some(text) = read_file_with_encoding(&new_path, encoding) + { + analysis.update_file_by_uri(&rename.new_uri, Some(text)); } } drop(analysis); @@ -128,11 +124,11 @@ fn collect_rename_info( module_index: &LuaModuleIndex, ) -> Option { let (mut old_module_path, workspace_id) = - module_index.extract_module_path(uri_to_file_path(&old_uri)?.to_str()?)?; + module_index.extract_module_path(uri_to_file_path(old_uri)?.to_str()?)?; old_module_path = old_module_path.replace(['\\', '/'], "."); let (mut new_module_path, _) = - module_index.extract_module_path(uri_to_file_path(&new_uri)?.to_str()?)?; + module_index.extract_module_path(uri_to_file_path(new_uri)?.to_str()?)?; new_module_path = new_module_path.replace(['\\', '/'], "."); Some(RenameInfo { @@ -146,8 +142,8 @@ fn collect_rename_info( /// 收集目录重命名后所有的Lua文件 fn collect_directory_lua_files( - old_path: &PathBuf, - new_path: &PathBuf, + old_path: &Path, + new_path: &Path, module_index: &LuaModuleIndex, ) -> Option> { // 检查新路径是否是目录(旧路径已经不存在了) @@ -213,6 +209,7 @@ fn try_modify_require_path( compilation: &LuaCompilation, renames: &Vec, ) -> Option>> { + #[allow(clippy::mutable_key_type)] let mut changes: HashMap> = HashMap::new(); for file_id in compilation.get_db().get_vfs().get_all_file_ids() { if compilation.get_db().get_module_index().is_std(&file_id) { @@ -230,6 +227,7 @@ fn try_modify_require_path( Some(changes) } +#[allow(clippy::mutable_key_type)] fn try_convert( semantic_model: &SemanticModel, call_expr: LuaCallExpr, @@ -275,10 +273,10 @@ fn try_convert( let full_module_path = match separator.as_str() { "." | "" => rename.new_module_path.clone(), - _ => rename.new_module_path.replace(".", &separator), + _ => rename.new_module_path.replace(".", separator), }; - changes.entry(current_uri).or_insert(vec![]).push(TextEdit { + changes.entry(current_uri).or_default().push(TextEdit { range: lsp_range, new_text: format!("'{}'", full_module_path), }); diff --git a/crates/emmylua_ls/src/handlers/workspace_symbol/build_workspace_symbols.rs b/crates/emmylua_ls/src/handlers/workspace_symbol/build_workspace_symbols.rs index aeb1fce5f..38fb5d785 100644 --- a/crates/emmylua_ls/src/handlers/workspace_symbol/build_workspace_symbols.rs +++ b/crates/emmylua_ls/src/handlers/workspace_symbol/build_workspace_symbols.rs @@ -35,7 +35,7 @@ fn add_global_variable_symbols( if decl.get_name().contains(query) { let typ = db .get_type_index() - .get_type_cache(&decl_id.clone().into()) + .get_type_cache(&decl_id.into()) .map(|cache| cache.as_type()) .unwrap_or(&LuaType::Unknown); let property_owner_id = LuaSemanticDeclId::LuaDecl(decl_id); @@ -116,11 +116,5 @@ fn get_symbol_kind(typ: &LuaType) -> SymbolKind { fn is_deprecated(db: &DbIndex, id: LuaSemanticDeclId) -> bool { let property = db.get_property_index().get_property(&id); - if let Some(property) = property { - if property.deprecated().is_some() { - return true; - } - } - - false + property.is_some_and(|prop| prop.deprecated().is_some()) } diff --git a/crates/emmylua_ls/src/logger/mod.rs b/crates/emmylua_ls/src/logger/mod.rs index 7cd3850fe..123cc6d8f 100644 --- a/crates/emmylua_ls/src/logger/mod.rs +++ b/crates/emmylua_ls/src/logger/mod.rs @@ -33,7 +33,7 @@ pub fn init_logger(root: Option<&str>, cmd_args: &CmdArgs) { "root".to_string() } else { root.trim_start_matches('/') - .split(|c| c == '/' || c == '\\' || c == ':') + .split(['/', '\\', ':']) .filter(|s| !s.is_empty()) .collect::>() .join("_") diff --git a/crates/emmylua_ls/src/util/desc.rs b/crates/emmylua_ls/src/util/desc.rs index 25982f19e..7d9cb0911 100644 --- a/crates/emmylua_ls/src/util/desc.rs +++ b/crates/emmylua_ls/src/util/desc.rs @@ -61,7 +61,7 @@ pub fn find_ref_at( None } -pub fn resolve_ref_single<'a>( +pub fn resolve_ref_single( db: &DbIndex, file_id: FileId, path: &[(LuaDescRefPathItem, TextRange)], @@ -77,7 +77,7 @@ pub fn resolve_ref_single<'a>( results.into_iter().next() } -pub fn resolve_ref<'a>( +pub fn resolve_ref( db: &DbIndex, file_id: FileId, path: &[(LuaDescRefPathItem, TextRange)], @@ -92,7 +92,7 @@ pub fn resolve_ref<'a>( typ: LuaType::Ref(scope.clone()), semantic_decl: Some(scope.into()), }]; - if let Some(found_refs) = find_members(db, scopes, &path) { + if let Some(found_refs) = find_members(db, scopes, path) { result.extend(found_refs); } } @@ -161,7 +161,7 @@ pub fn resolve_ref<'a>( typ: module.export_type.clone().unwrap_or(LuaType::Nil), semantic_decl: module.semantic_id.clone(), }]; - if let Some(found_refs) = find_members(db, scopes, &path) { + if let Some(found_refs) = find_members(db, scopes, path) { result.extend( found_refs .into_iter() @@ -171,24 +171,24 @@ pub fn resolve_ref<'a>( } // Find in globals. - if let Some((LuaDescRefPathItem::Name(name), _)) = path.first() { - if let Some(globals) = db.get_global_index().get_global_decl_ids(name) { - let scopes = globals - .into_iter() - .filter_map(|&global| { - Some(SemanticInfo { - typ: db - .get_type_index() - .get_type_cache(&global.into())? - .as_type() - .clone(), - semantic_decl: Some(global.into()), - }) + if let Some((LuaDescRefPathItem::Name(name), _)) = path.first() + && let Some(globals) = db.get_global_index().get_global_decl_ids(name) + { + let scopes = globals + .iter() + .filter_map(|&global| { + Some(SemanticInfo { + typ: db + .get_type_index() + .get_type_cache(&global.into())? + .as_type() + .clone(), + semantic_decl: Some(global.into()), }) - .collect(); - if let Some(found_refs) = find_members(db, scopes, &path[1..]) { - result.extend(found_refs); - } + }) + .collect(); + if let Some(found_refs) = find_members(db, scopes, &path[1..]) { + result.extend(found_refs); } } diff --git a/crates/emmylua_ls/src/util/module_name_convert.rs b/crates/emmylua_ls/src/util/module_name_convert.rs index be21b1d46..ceb066713 100644 --- a/crates/emmylua_ls/src/util/module_name_convert.rs +++ b/crates/emmylua_ls/src/util/module_name_convert.rs @@ -18,10 +18,10 @@ pub fn module_name_convert( } EmmyrcFilenameConvention::Keep => {} EmmyrcFilenameConvention::KeepClass => { - if let Some(export_type) = &module_info.export_type { - if let LuaType::Def(id) = export_type { - module_name = id.get_simple_name().to_string(); - } + if let Some(export_type) = &module_info.export_type + && let LuaType::Def(id) = export_type + { + module_name = id.get_simple_name().to_string(); } } } diff --git a/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs b/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs index 057e60776..a1a42e7a3 100644 --- a/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/json/json_lexer.rs @@ -1,5 +1,6 @@ use emmylua_parser::{LexerState, Reader, SourceRange}; +#[allow(clippy::enum_variant_names)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum JsonTokenKind { TkEof, diff --git a/crates/emmylua_parser_desc/src/lang/protobuf/protobuf_lexer.rs b/crates/emmylua_parser_desc/src/lang/protobuf/protobuf_lexer.rs index 69279b64b..fe00a7690 100644 --- a/crates/emmylua_parser_desc/src/lang/protobuf/protobuf_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/protobuf/protobuf_lexer.rs @@ -1,5 +1,6 @@ use emmylua_parser::{LexerState, Reader, SourceRange}; +#[allow(clippy::enum_variant_names)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ProtobufTokenKind { TkEof, diff --git a/crates/emmylua_parser_desc/src/lang/shell/shell_lexer.rs b/crates/emmylua_parser_desc/src/lang/shell/shell_lexer.rs index 41a3df8bd..85653f9cc 100644 --- a/crates/emmylua_parser_desc/src/lang/shell/shell_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/shell/shell_lexer.rs @@ -1,5 +1,6 @@ use emmylua_parser::{LexerState, Reader, SourceRange}; +#[allow(clippy::enum_variant_names)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ShellTokenKind { TkEof, diff --git a/crates/emmylua_parser_desc/src/lang/sql/sql_lexer.rs b/crates/emmylua_parser_desc/src/lang/sql/sql_lexer.rs index 149580e45..6118bf2c9 100644 --- a/crates/emmylua_parser_desc/src/lang/sql/sql_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/sql/sql_lexer.rs @@ -1,5 +1,6 @@ use emmylua_parser::{LexerState, Reader, SourceRange}; +#[allow(clippy::enum_variant_names)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum SqlTokenKind { TkEof, diff --git a/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs b/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs index 8421cfb88..8448f8d30 100644 --- a/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs +++ b/crates/emmylua_parser_desc/src/lang/vimscript/vim_lexer.rs @@ -1,5 +1,6 @@ use emmylua_parser::{LexerState, Reader, SourceRange}; +#[allow(clippy::enum_variant_names)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum VimTokenKind { TkEof, diff --git a/crates/emmylua_parser_desc/src/markdown_rst/mod.rs b/crates/emmylua_parser_desc/src/markdown_rst/mod.rs index e4209011c..e9cbaea68 100644 --- a/crates/emmylua_parser_desc/src/markdown_rst/mod.rs +++ b/crates/emmylua_parser_desc/src/markdown_rst/mod.rs @@ -438,9 +438,7 @@ impl MarkdownRstParser { line.eat_till_end(); self.emit(line, DescItemKind::CodeBlock); - for i in start + 1..lines.len() { - let line = &mut lines[i]; - + for (i, line) in lines.iter_mut().enumerate().skip(start + 1) { if is_blank(line.tail_text()) { line.eat_till_end(); line.reset_buff(); @@ -769,8 +767,8 @@ impl MarkdownRstParser { } let mut line_ending = LineEnding::Normal; - for i in start..end { - line_ending = self.process_inline_content(&mut lines[i]); + for line in lines.iter_mut().take(end).skip(start) { + line_ending = self.process_inline_content(line); } (end, line_ending) @@ -784,8 +782,7 @@ impl MarkdownRstParser { ) -> usize { let mut end = start; let mut common_indent = None; - for i in start..lines.len() { - let line = &lines[i]; + for (i, line) in lines.iter().enumerate().skip(start) { let indent = line.tail_text().chars().take_while(|c| is_ws(*c)).count(); if indent >= 1 { end = i + 1; @@ -815,8 +812,7 @@ impl MarkdownRstParser { allow_blank_lines: bool, ) -> usize { let mut end = start; - for i in start..lines.len() { - let line = &mut lines[i]; + for (i, line) in lines.iter_mut().enumerate().skip(start) { let indent = line.tail_text().chars().take_while(|c| is_ws(*c)).count(); if indent >= min_indent { end = i + 1; @@ -831,8 +827,7 @@ impl MarkdownRstParser { fn gather_prefixed_lines(&mut self, lines: &mut [Reader], start: usize, prefix: char) -> usize { let mut end = start; - for i in start..lines.len() { - let line = &mut lines[i]; + for (i, line) in lines.iter_mut().enumerate().skip(start) { if line.current_char() == prefix { end = i + 1; line.bump(); diff --git a/crates/emmylua_parser_desc/src/markdown_rst/test.rs b/crates/emmylua_parser_desc/src/markdown_rst/test.rs index 993429064..c7b4c8b81 100644 --- a/crates/emmylua_parser_desc/src/markdown_rst/test.rs +++ b/crates/emmylua_parser_desc/src/markdown_rst/test.rs @@ -456,9 +456,9 @@ mod tests { "#; test( - &code, + code, Box::new(MarkdownRstParser::new(None, None, None)), - &expected, + expected, ) .or_fail()?; Ok(()) @@ -493,13 +493,13 @@ local t = 123 "#; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), None, )), - &expected, + expected, ) .or_fail()?; Ok(()) @@ -512,13 +512,13 @@ local t = 123 let expected = r#"--- See `ref`"#; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), None, )), - &expected, + expected, ) .or_fail()?; Ok(()) @@ -533,9 +533,9 @@ local t = 123 "#; test( - &code, + code, Box::new(MarkdownRstParser::new(Some("lua".to_string()), None, None)), - &expected, + expected, ) .or_fail()?; Ok(()) @@ -546,39 +546,39 @@ local t = 123 let code = r#"--- See :lua:obj:`x` :lua:obj:`ref`"#; let expected = r#"--- See :lua:obj:`x` :lua:obj:`ref`"#; test( - &code, + code, Box::new(MarkdownRstParser::new(None, None, Some(31))), - &expected, + expected, ) .or_fail()?; test( - &code, + code, Box::new(MarkdownRstParser::new(None, None, Some(32))), - &expected, + expected, ) .or_fail()?; test( - &code, + code, Box::new(MarkdownRstParser::new(None, None, Some(34))), - &expected, + expected, ) .or_fail()?; let code = r#"--- See :lua:obj:`x` :lua:obj:`"#; let expected = r#"--- See :lua:obj:`x` :lua:obj:`"#; test( - &code, + code, Box::new(MarkdownRstParser::new(None, None, Some(31))), - &expected, + expected, ) .or_fail()?; let code = r#"--- See :lua:obj:`x` :lua:obj:``..."#; let expected = r#"--- See :lua:obj:`x` :lua:obj:``..."#; test( - &code, + code, Box::new(MarkdownRstParser::new(None, None, Some(31))), - &expected, + expected, ) .or_fail()?; Ok(()) @@ -589,72 +589,72 @@ local t = 123 let code = r#"--- See `ab`"#; let expected = r#"--- See `ab`"#; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), Some(9), )), - &expected, + expected, ) .or_fail()?; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), Some(10), )), - &expected, + expected, ) .or_fail()?; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), Some(11), )), - &expected, + expected, ) .or_fail()?; let code = r#"--- See `"#; let expected = r#"--- See `"#; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), Some(9), )), - &expected, + expected, ) .or_fail()?; let code = r#"--- See `..."#; let expected = r#"--- See `..."#; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), Some(9), )), - &expected, + expected, ) .or_fail()?; let code = r#"--- See ``"#; let expected = r#"--- See ``"#; test( - &code, + code, Box::new(MarkdownRstParser::new( None, Some("lua:obj".to_string()), Some(9), )), - &expected, + expected, ) .or_fail()?; Ok(()) diff --git a/crates/emmylua_parser_desc/src/testlib.rs b/crates/emmylua_parser_desc/src/testlib.rs index 30633cb8f..ac82c36ee 100644 --- a/crates/emmylua_parser_desc/src/testlib.rs +++ b/crates/emmylua_parser_desc/src/testlib.rs @@ -10,8 +10,7 @@ pub fn test(code: &str, mut parser: Box, expected: &str) -> R let Some(desc) = tree .get_red_root() .descendants() - .filter(|node| matches!(node.kind(), LuaKind::Syntax(LuaSyntaxKind::DocDescription))) - .next() + .find(|node| matches!(node.kind(), LuaKind::Syntax(LuaSyntaxKind::DocDescription))) else { return fail!("No desc found in {:?}", tree.get_red_root()); }; @@ -32,8 +31,7 @@ pub fn print_result(code: &str, mut parser: Box) { let Some(desc) = tree .get_red_root() .descendants() - .filter(|node| matches!(node.kind(), LuaKind::Syntax(LuaSyntaxKind::DocDescription))) - .next() + .find(|node| matches!(node.kind(), LuaKind::Syntax(LuaSyntaxKind::DocDescription))) else { panic!("No desc found in {:?}", tree.get_red_root()); };