Skip to content

Commit 14bf5bb

Browse files
bors[bot]lnicola
andauthored
Merge #5167
5167: Reuse Semantics instances r=matklad a=lnicola Co-authored-by: Laurențiu Nicola <[email protected]>
2 parents f565447 + 9710ad8 commit 14bf5bb

File tree

7 files changed

+39
-39
lines changed

7 files changed

+39
-39
lines changed

crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub(crate) fn extract_struct_from_enum_variant(
5353
target,
5454
|builder| {
5555
let definition = Definition::ModuleDef(ModuleDef::EnumVariant(variant_hir));
56-
let res = definition.find_usages(&ctx.db(), None);
56+
let res = definition.find_usages(&ctx.sema, None);
5757
let start_offset = variant.parent_enum().syntax().text_range().start();
5858
let mut visited_modules_set = FxHashSet::default();
5959
visited_modules_set.insert(current_module);

crates/ra_assists/src/handlers/inline_local_variable.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O
4444

4545
let def = ctx.sema.to_def(&bind_pat)?;
4646
let def = Definition::Local(def);
47-
let refs = def.find_usages(ctx.db(), None);
47+
let refs = def.find_usages(&ctx.sema, None);
4848
if refs.is_empty() {
4949
mark::hit!(test_not_applicable_if_variable_unused);
5050
return None;

crates/ra_ide/src/call_hierarchy.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,11 @@ pub(crate) fn call_hierarchy(
3939

4040
pub(crate) fn incoming_calls(db: &RootDatabase, position: FilePosition) -> Option<Vec<CallItem>> {
4141
let sema = Semantics::new(db);
42+
4243
// 1. Find all refs
4344
// 2. Loop through refs and determine unique fndef. This will become our `from: CallHierarchyItem,` in the reply.
4445
// 3. Add ranges relative to the start of the fndef.
45-
let refs = references::find_all_refs(db, position, None)?;
46+
let refs = references::find_all_refs(&sema, position, None)?;
4647

4748
let mut calls = CallLocations::default();
4849

crates/ra_ide/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pub use crate::{
7575
},
7676
};
7777

78-
pub use hir::Documentation;
78+
pub use hir::{Documentation, Semantics};
7979
pub use ra_assists::{Assist, AssistConfig, AssistId, ResolvedAssist};
8080
pub use ra_db::{
8181
Canceled, CrateGraph, CrateId, Edition, FileId, FilePosition, FileRange, SourceRoot,
@@ -385,7 +385,9 @@ impl Analysis {
385385
position: FilePosition,
386386
search_scope: Option<SearchScope>,
387387
) -> Cancelable<Option<ReferenceSearchResult>> {
388-
self.with_db(|db| references::find_all_refs(db, position, search_scope).map(|it| it.info))
388+
self.with_db(|db| {
389+
references::find_all_refs(&Semantics::new(db), position, search_scope).map(|it| it.info)
390+
})
389391
}
390392

391393
/// Returns a short text describing element at position.

crates/ra_ide/src/references.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,11 @@ impl IntoIterator for ReferenceSearchResult {
8686
}
8787

8888
pub(crate) fn find_all_refs(
89-
db: &RootDatabase,
89+
sema: &Semantics<RootDatabase>,
9090
position: FilePosition,
9191
search_scope: Option<SearchScope>,
9292
) -> Option<RangeInfo<ReferenceSearchResult>> {
9393
let _p = profile("find_all_refs");
94-
let sema = Semantics::new(db);
9594
let syntax = sema.parse(position.file_id).syntax().clone();
9695

9796
let (opt_name, search_kind) = if let Some(name) =
@@ -108,15 +107,15 @@ pub(crate) fn find_all_refs(
108107
let RangeInfo { range, info: def } = find_name(&sema, &syntax, position, opt_name)?;
109108

110109
let references = def
111-
.find_usages(db, search_scope)
110+
.find_usages(sema, search_scope)
112111
.into_iter()
113112
.filter(|r| search_kind == ReferenceKind::Other || search_kind == r.kind)
114113
.collect();
115114

116-
let decl_range = def.try_to_nav(db)?.range();
115+
let decl_range = def.try_to_nav(sema.db)?.range();
117116

118117
let declaration = Declaration {
119-
nav: def.try_to_nav(db)?,
118+
nav: def.try_to_nav(sema.db)?,
120119
kind: ReferenceKind::Other,
121120
access: decl_access(&def, &syntax, decl_range),
122121
};

crates/ra_ide/src/references/rename.rs

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,24 @@ pub(crate) fn rename(
2424
position: FilePosition,
2525
new_name: &str,
2626
) -> Option<RangeInfo<SourceChange>> {
27+
let sema = Semantics::new(db);
28+
2729
match lex_single_valid_syntax_kind(new_name)? {
2830
SyntaxKind::IDENT | SyntaxKind::UNDERSCORE => (),
29-
SyntaxKind::SELF_KW => return rename_to_self(db, position),
31+
SyntaxKind::SELF_KW => return rename_to_self(&sema, position),
3032
_ => return None,
3133
}
3234

33-
let sema = Semantics::new(db);
3435
let source_file = sema.parse(position.file_id);
3536
let syntax = source_file.syntax();
3637
if let Some(module) = find_module_at_offset(&sema, position, syntax) {
37-
rename_mod(db, position, module, new_name)
38+
rename_mod(&sema, position, module, new_name)
3839
} else if let Some(self_token) =
3940
syntax.token_at_offset(position.offset).find(|t| t.kind() == SyntaxKind::SELF_KW)
4041
{
41-
rename_self_to_param(db, position, self_token, new_name)
42+
rename_self_to_param(&sema, position, self_token, new_name)
4243
} else {
43-
rename_reference(sema.db, position, new_name)
44+
rename_reference(&sema, position, new_name)
4445
}
4546
}
4647

@@ -97,20 +98,20 @@ fn source_edit_from_reference(reference: Reference, new_name: &str) -> SourceFil
9798
}
9899

99100
fn rename_mod(
100-
db: &RootDatabase,
101+
sema: &Semantics<RootDatabase>,
101102
position: FilePosition,
102103
module: Module,
103104
new_name: &str,
104105
) -> Option<RangeInfo<SourceChange>> {
105106
let mut source_file_edits = Vec::new();
106107
let mut file_system_edits = Vec::new();
107108

108-
let src = module.definition_source(db);
109-
let file_id = src.file_id.original_file(db);
109+
let src = module.definition_source(sema.db);
110+
let file_id = src.file_id.original_file(sema.db);
110111
match src.value {
111112
ModuleSource::SourceFile(..) => {
112113
// mod is defined in path/to/dir/mod.rs
113-
let dst = if module.is_mod_rs(db) {
114+
let dst = if module.is_mod_rs(sema.db) {
114115
format!("../{}/mod.rs", new_name)
115116
} else {
116117
format!("{}.rs", new_name)
@@ -122,17 +123,17 @@ fn rename_mod(
122123
ModuleSource::Module(..) => {}
123124
}
124125

125-
if let Some(src) = module.declaration_source(db) {
126-
let file_id = src.file_id.original_file(db);
126+
if let Some(src) = module.declaration_source(sema.db) {
127+
let file_id = src.file_id.original_file(sema.db);
127128
let name = src.value.name()?;
128129
let edit = SourceFileEdit {
129-
file_id: file_id,
130+
file_id,
130131
edit: TextEdit::replace(name.syntax().text_range(), new_name.into()),
131132
};
132133
source_file_edits.push(edit);
133134
}
134135

135-
let RangeInfo { range, info: refs } = find_all_refs(db, position, None)?;
136+
let RangeInfo { range, info: refs } = find_all_refs(sema, position, None)?;
136137
let ref_edits = refs
137138
.references
138139
.into_iter()
@@ -142,8 +143,10 @@ fn rename_mod(
142143
Some(RangeInfo::new(range, SourceChange::from_edits(source_file_edits, file_system_edits)))
143144
}
144145

145-
fn rename_to_self(db: &RootDatabase, position: FilePosition) -> Option<RangeInfo<SourceChange>> {
146-
let sema = Semantics::new(db);
146+
fn rename_to_self(
147+
sema: &Semantics<RootDatabase>,
148+
position: FilePosition,
149+
) -> Option<RangeInfo<SourceChange>> {
147150
let source_file = sema.parse(position.file_id);
148151
let syn = source_file.syntax();
149152

@@ -158,7 +161,7 @@ fn rename_to_self(db: &RootDatabase, position: FilePosition) -> Option<RangeInfo
158161
_ => return None, // not renaming other types
159162
};
160163

161-
let RangeInfo { range, info: refs } = find_all_refs(db, position, None)?;
164+
let RangeInfo { range, info: refs } = find_all_refs(sema, position, None)?;
162165

163166
let param_range = first_param.syntax().text_range();
164167
let (param_ref, usages): (Vec<Reference>, Vec<Reference>) = refs
@@ -210,16 +213,15 @@ fn text_edit_from_self_param(
210213
}
211214

212215
fn rename_self_to_param(
213-
db: &RootDatabase,
216+
sema: &Semantics<RootDatabase>,
214217
position: FilePosition,
215218
self_token: SyntaxToken,
216219
new_name: &str,
217220
) -> Option<RangeInfo<SourceChange>> {
218-
let sema = Semantics::new(db);
219221
let source_file = sema.parse(position.file_id);
220222
let syn = source_file.syntax();
221223

222-
let text = db.file_text(position.file_id);
224+
let text = sema.db.file_text(position.file_id);
223225
let fn_def = find_node_at_offset::<ast::FnDef>(syn, position.offset)?;
224226
let search_range = fn_def.syntax().text_range();
225227

@@ -249,11 +251,11 @@ fn rename_self_to_param(
249251
}
250252

251253
fn rename_reference(
252-
db: &RootDatabase,
254+
sema: &Semantics<RootDatabase>,
253255
position: FilePosition,
254256
new_name: &str,
255257
) -> Option<RangeInfo<SourceChange>> {
256-
let RangeInfo { range, info: refs } = find_all_refs(db, position, None)?;
258+
let RangeInfo { range, info: refs } = find_all_refs(sema, position, None)?;
257259

258260
let edit = refs
259261
.into_iter()

crates/ra_ide_db/src/search.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,20 +180,20 @@ impl Definition {
180180

181181
pub fn find_usages(
182182
&self,
183-
db: &RootDatabase,
183+
sema: &Semantics<RootDatabase>,
184184
search_scope: Option<SearchScope>,
185185
) -> Vec<Reference> {
186186
let _p = profile("Definition::find_usages");
187187

188188
let search_scope = {
189-
let base = self.search_scope(db);
189+
let base = self.search_scope(sema.db);
190190
match search_scope {
191191
None => base,
192192
Some(scope) => base.intersection(&scope),
193193
}
194194
};
195195

196-
let name = match self.name(db) {
196+
let name = match self.name(sema.db) {
197197
None => return Vec::new(),
198198
Some(it) => it.to_string(),
199199
};
@@ -202,11 +202,10 @@ impl Definition {
202202
let mut refs = vec![];
203203

204204
for (file_id, search_range) in search_scope {
205-
let text = db.file_text(file_id);
205+
let text = sema.db.file_text(file_id);
206206
let search_range =
207207
search_range.unwrap_or(TextRange::up_to(TextSize::of(text.as_str())));
208208

209-
let sema = Semantics::new(db);
210209
let tree = Lazy::new(|| sema.parse(file_id).syntax().clone());
211210

212211
for (idx, _) in text.match_indices(pat) {
@@ -222,9 +221,6 @@ impl Definition {
222221
continue;
223222
};
224223

225-
// FIXME: reuse sb
226-
// See https://github.com/rust-lang/rust/pull/68198#issuecomment-574269098
227-
228224
match classify_name_ref(&sema, &name_ref) {
229225
Some(NameRefClass::Definition(def)) if &def == self => {
230226
let kind = if is_record_lit_name_ref(&name_ref)

0 commit comments

Comments
 (0)