Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid some allocations #16722

Merged
merged 5 commits into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 9 additions & 9 deletions crates/rust-analyzer/src/cli/analysis_stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions crates/rust-analyzer/src/global_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -481,23 +481,23 @@ 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();
url_from_abs_path(path)
}

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(
&self,
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, .. } => {
Expand Down
4 changes: 2 additions & 2 deletions crates/rust-analyzer/src/handlers/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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<VfsPath> {
fn crate_path(root_file_path: &VfsPath) -> Option<VfsPath> {
let mut current_dir = root_file_path.parent();
while let Some(path) = current_dir {
let cargo_toml_path = path.join("../Cargo.toml")?;
Expand Down
17 changes: 10 additions & 7 deletions crates/test-fixture/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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))
}
Expand All @@ -206,7 +209,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);
Expand Down Expand Up @@ -443,7 +446,7 @@ struct FileMeta {
path: String,
krate: Option<(String, CrateOrigin, Option<String>)>,
deps: Vec<String>,
extern_prelude: Vec<String>,
extern_prelude: Option<Vec<String>>,
cfg: CfgOptions,
edition: Edition,
env: Env,
Expand Down Expand Up @@ -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()),
Expand Down
4 changes: 2 additions & 2 deletions crates/vfs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions lib/lsp-server/src/req_queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl<I> Incoming<I> {
}

pub fn cancel(&mut self, id: RequestId) -> Option<Response> {
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(),
Expand All @@ -46,8 +46,8 @@ impl<I> Incoming<I> {
Some(Response { id, result: None, error: Some(error) })
}

pub fn complete(&mut self, id: RequestId) -> Option<I> {
self.pending.remove(&id)
pub fn complete(&mut self, id: &RequestId) -> Option<I> {
self.pending.remove(id)
}

pub fn is_completed(&self, id: &RequestId) -> bool {
Expand Down