From 06a883e32f097398ec3348524555c0fde45fe24a Mon Sep 17 00:00:00 2001 From: mo8it Date: Thu, 29 Feb 2024 16:05:26 +0100 Subject: [PATCH 1/5] Take a reference instead of cloning --- lib/lsp-server/src/req_queue.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/lsp-server/src/req_queue.rs b/lib/lsp-server/src/req_queue.rs index 7b47f5388b..347a9fb6fb 100644 --- a/lib/lsp-server/src/req_queue.rs +++ b/lib/lsp-server/src/req_queue.rs @@ -37,7 +37,7 @@ impl Incoming { } pub fn cancel(&mut self, id: RequestId) -> Option { - let _data = self.complete(id.clone())?; + let _data = self.complete(&id)?; let error = ResponseError { code: ErrorCode::RequestCanceled as i32, message: "canceled by client".to_owned(), @@ -46,8 +46,8 @@ impl Incoming { Some(Response { id, result: None, error: Some(error) }) } - pub fn complete(&mut self, id: RequestId) -> Option { - self.pending.remove(&id) + pub fn complete(&mut self, id: &RequestId) -> Option { + self.pending.remove(id) } pub fn is_completed(&self, id: &RequestId) -> bool { From 748f57c16da357eb1df6e129170354a7d3851130 Mon Sep 17 00:00:00 2001 From: mo8it Date: Thu, 29 Feb 2024 16:28:59 +0100 Subject: [PATCH 2/5] Only clone when required --- crates/rust-analyzer/src/cli/analysis_stats.rs | 12 ++++++------ crates/rust-analyzer/src/global_state.rs | 8 ++++---- crates/rust-analyzer/src/handlers/request.rs | 4 ++-- crates/vfs/src/lib.rs | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs index 186b65692e..b500db77d9 100644 --- a/crates/rust-analyzer/src/cli/analysis_stats.rs +++ b/crates/rust-analyzer/src/cli/analysis_stats.rs @@ -1075,12 +1075,12 @@ fn location_csv_pat(db: &RootDatabase, vfs: &Vfs, sm: &BodySourceMap, pat_id: Pa format!("{path},{}:{},{}:{}", start.line + 1, start.col, end.line + 1, end.col) } -fn expr_syntax_range( +fn expr_syntax_range<'a>( db: &RootDatabase, - vfs: &Vfs, + vfs: &'a Vfs, sm: &BodySourceMap, expr_id: ExprId, -) -> Option<(VfsPath, LineCol, LineCol)> { +) -> Option<(&'a VfsPath, LineCol, LineCol)> { let src = sm.expr_syntax(expr_id); if let Ok(src) = src { let root = db.parse_or_expand(src.file_id); @@ -1096,12 +1096,12 @@ fn expr_syntax_range( None } } -fn pat_syntax_range( +fn pat_syntax_range<'a>( db: &RootDatabase, - vfs: &Vfs, + vfs: &'a Vfs, sm: &BodySourceMap, pat_id: PatId, -) -> Option<(VfsPath, LineCol, LineCol)> { +) -> Option<(&'a VfsPath, LineCol, LineCol)> { let src = sm.pat_syntax(pat_id); if let Ok(src) = src { let root = db.parse_or_expand(src.file_id); diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index b2d507491b..9bcee6465a 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs @@ -297,7 +297,7 @@ impl GlobalState { let mut bytes = vec![]; let mut modified_rust_files = vec![]; for file in changed_files { - let vfs_path = &vfs.file_path(file.file_id); + let vfs_path = vfs.file_path(file.file_id); if let Some(path) = vfs_path.as_path() { let path = path.to_path_buf(); if reload::should_refresh_for_change(&path, file.kind()) { @@ -481,7 +481,7 @@ impl GlobalStateSnapshot { } pub(crate) fn anchored_path(&self, path: &AnchoredPathBuf) -> Url { - let mut base = self.vfs_read().file_path(path.anchor); + let mut base = self.vfs_read().file_path(path.anchor).clone(); base.pop(); let path = base.join(&path.path).unwrap(); let path = path.as_path().unwrap(); @@ -489,7 +489,7 @@ impl GlobalStateSnapshot { } pub(crate) fn file_id_to_file_path(&self, file_id: FileId) -> vfs::VfsPath { - self.vfs_read().file_path(file_id) + self.vfs_read().file_path(file_id).clone() } pub(crate) fn cargo_target_for_crate_root( @@ -497,7 +497,7 @@ impl GlobalStateSnapshot { crate_id: CrateId, ) -> Option<(&CargoWorkspace, Target)> { let file_id = self.analysis.crate_root(crate_id).ok()?; - let path = self.vfs_read().file_path(file_id); + let path = self.vfs_read().file_path(file_id).clone(); let path = path.as_path()?; self.workspaces.iter().find_map(|ws| match ws { ProjectWorkspace::Cargo { cargo, .. } => { diff --git a/crates/rust-analyzer/src/handlers/request.rs b/crates/rust-analyzer/src/handlers/request.rs index 04a0439542..0e005975fb 100644 --- a/crates/rust-analyzer/src/handlers/request.rs +++ b/crates/rust-analyzer/src/handlers/request.rs @@ -2097,7 +2097,7 @@ pub(crate) fn fetch_dependency_list( .into_iter() .filter_map(|it| { let root_file_path = state.file_id_to_file_path(it.root_file_id); - crate_path(root_file_path).and_then(to_url).map(|path| CrateInfoResult { + crate_path(&root_file_path).and_then(to_url).map(|path| CrateInfoResult { name: it.name, version: it.version, path, @@ -2118,7 +2118,7 @@ pub(crate) fn fetch_dependency_list( /// An `Option` value representing the path to the directory of the crate with the given /// name, if such a crate is found. If no crate with the given name is found, this function /// returns `None`. -fn crate_path(root_file_path: VfsPath) -> Option { +fn crate_path(root_file_path: &VfsPath) -> Option { let mut current_dir = root_file_path.parent(); while let Some(path) = current_dir { let cargo_toml_path = path.join("../Cargo.toml")?; diff --git a/crates/vfs/src/lib.rs b/crates/vfs/src/lib.rs index 34a85818eb..824ce39870 100644 --- a/crates/vfs/src/lib.rs +++ b/crates/vfs/src/lib.rs @@ -163,8 +163,8 @@ impl Vfs { /// # Panics /// /// Panics if the id is not present in the `Vfs`. - pub fn file_path(&self, file_id: FileId) -> VfsPath { - self.interner.lookup(file_id).clone() + pub fn file_path(&self, file_id: FileId) -> &VfsPath { + self.interner.lookup(file_id) } /// Returns an iterator over the stored ids and their corresponding paths. From 4aab2d5cb4c3380665d27c80d2789ed0ac4e5bf6 Mon Sep 17 00:00:00 2001 From: mo8it Date: Thu, 29 Feb 2024 16:29:15 +0100 Subject: [PATCH 3/5] Remove unneeded to_owned --- crates/rust-analyzer/src/cli/analysis_stats.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs index b500db77d9..f17a7eee43 100644 --- a/crates/rust-analyzer/src/cli/analysis_stats.rs +++ b/crates/rust-analyzer/src/cli/analysis_stats.rs @@ -369,7 +369,7 @@ impl flags::AnalysisStats { let parse = sema.parse(file_id); let file_txt = db.file_text(file_id); - let path = vfs.file_path(file_id).as_path().unwrap().to_owned(); + let path = vfs.file_path(file_id).as_path().unwrap(); for node in parse.syntax().descendants() { let expr = match syntax::ast::Expr::cast(node.clone()) { @@ -444,7 +444,7 @@ impl flags::AnalysisStats { edit.apply(&mut txt); if self.validate_term_search { - std::fs::write(&path, txt).unwrap(); + std::fs::write(path, txt).unwrap(); let res = ws.run_build_scripts(&cargo_config, &|_| ()).unwrap(); if let Some(err) = res.error() { @@ -493,7 +493,7 @@ impl flags::AnalysisStats { } // Revert file back to original state if self.validate_term_search { - std::fs::write(&path, file_txt.to_string()).unwrap(); + std::fs::write(path, file_txt.to_string()).unwrap(); } bar.inc(1); From 9df73c6cb048fc28598ad0cbfb228444a4e9a553 Mon Sep 17 00:00:00 2001 From: mo8it Date: Thu, 29 Feb 2024 16:53:48 +0100 Subject: [PATCH 4/5] Convert directly into an Arc --- crates/test-fixture/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/test-fixture/src/lib.rs b/crates/test-fixture/src/lib.rs index e118262b4e..68324cfeab 100644 --- a/crates/test-fixture/src/lib.rs +++ b/crates/test-fixture/src/lib.rs @@ -149,15 +149,15 @@ impl ChangeFixture { for entry in fixture { let text = if entry.text.contains(CURSOR_MARKER) { if entry.text.contains(ESCAPED_CURSOR_MARKER) { - entry.text.replace(ESCAPED_CURSOR_MARKER, CURSOR_MARKER) + entry.text.replace(ESCAPED_CURSOR_MARKER, CURSOR_MARKER).into() } else { let (range_or_offset, text) = extract_range_or_offset(&entry.text); assert!(file_position.is_none()); file_position = Some((file_id, range_or_offset)); - text + text.into() } } else { - entry.text.clone() + entry.text.as_str().into() }; let meta = FileMeta::from_fixture(entry, current_source_root_kind); @@ -206,7 +206,7 @@ impl ChangeFixture { default_env.extend(meta.env.iter().map(|(x, y)| (x.to_owned(), y.to_owned()))); } - source_change.change_file(file_id, Some(text.into())); + source_change.change_file(file_id, Some(text)); let path = VfsPath::new_virtual_path(meta.path); file_set.insert(file_id, path); files.push(file_id); From 00a049b585554320d49e20d549530cf87df2fe02 Mon Sep 17 00:00:00 2001 From: mo8it Date: Thu, 29 Feb 2024 17:01:32 +0100 Subject: [PATCH 5/5] Avoid cloning deps --- crates/test-fixture/src/lib.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/test-fixture/src/lib.rs b/crates/test-fixture/src/lib.rs index 68324cfeab..58a0e48bc4 100644 --- a/crates/test-fixture/src/lib.rs +++ b/crates/test-fixture/src/lib.rs @@ -195,7 +195,10 @@ impl ChangeFixture { let prev = crates.insert(crate_name.clone(), crate_id); assert!(prev.is_none(), "multiple crates with same name: {}", crate_name); for dep in meta.deps { - let prelude = meta.extern_prelude.contains(&dep); + let prelude = match &meta.extern_prelude { + Some(v) => v.contains(&dep), + None => true, + }; let dep = CrateName::normalize_dashes(&dep); crate_deps.push((crate_name.clone(), dep, prelude)) } @@ -443,7 +446,7 @@ struct FileMeta { path: String, krate: Option<(String, CrateOrigin, Option)>, deps: Vec, - extern_prelude: Vec, + extern_prelude: Option>, cfg: CfgOptions, edition: Edition, env: Env, @@ -473,7 +476,7 @@ impl FileMeta { Self { path: f.path, krate: f.krate.map(|it| parse_crate(it, current_source_root_kind, f.library)), - extern_prelude: f.extern_prelude.unwrap_or_else(|| deps.clone()), + extern_prelude: f.extern_prelude, deps, cfg, edition: f.edition.map_or(Edition::CURRENT, |v| Edition::from_str(&v).unwrap()),