Skip to content

Commit 0fe7417

Browse files
bors[bot]Veykril
andauthored
Merge #11875
11875: internal: Simplify r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <[email protected]>
2 parents a9ae0b0 + f610e2c commit 0fe7417

File tree

10 files changed

+105
-154
lines changed

10 files changed

+105
-154
lines changed

crates/ide/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub use ide_assists::{
102102
Assist, AssistConfig, AssistId, AssistKind, AssistResolveStrategy, SingleResolve,
103103
};
104104
pub use ide_completion::{
105-
CompletionConfig, CompletionItem, CompletionItemKind, CompletionRelevance, ImportEdit, Snippet,
105+
CompletionConfig, CompletionItem, CompletionItemKind, CompletionRelevance, Snippet,
106106
SnippetScope,
107107
};
108108
pub use ide_db::{

crates/ide_completion/src/completions/flyimport.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use syntax::{AstNode, SyntaxNode, T};
1010
use crate::{
1111
context::{CompletionContext, PathKind},
1212
render::{render_resolution_with_import, RenderContext},
13-
ImportEdit,
1413
};
1514

1615
use super::Completions;
@@ -136,10 +135,10 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
136135

137136
let user_input_lowercased = potential_import_name.to_lowercase();
138137
let import_assets = import_assets(ctx, potential_import_name)?;
139-
let import_scope = ImportScope::find_insert_use_container(
140-
&position_for_import(ctx, Some(import_assets.import_candidate()))?,
141-
&ctx.sema,
142-
)?;
138+
let position = position_for_import(ctx, Some(import_assets.import_candidate()))?;
139+
if ImportScope::find_insert_use_container(&position, &ctx.sema).is_none() {
140+
return None;
141+
}
143142

144143
let path_kind = match ctx.path_kind() {
145144
Some(kind) => Some(kind),
@@ -199,12 +198,7 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
199198
&user_input_lowercased,
200199
)
201200
})
202-
.filter_map(|import| {
203-
render_resolution_with_import(
204-
RenderContext::new(ctx),
205-
ImportEdit { import, scope: import_scope.clone() },
206-
)
207-
}),
201+
.filter_map(|import| render_resolution_with_import(RenderContext::new(ctx), import)),
208202
);
209203
Some(())
210204
}

crates/ide_completion/src/completions/postfix.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,12 @@ fn add_custom_postfix_completions(
261261
postfix_snippet: impl Fn(&str, &str, &str) -> Builder,
262262
receiver_text: &str,
263263
) -> Option<()> {
264-
let import_scope = ImportScope::find_insert_use_container(&ctx.token.parent()?, &ctx.sema)?;
264+
if ImportScope::find_insert_use_container(&ctx.token.parent()?, &ctx.sema).is_none() {
265+
return None;
266+
}
265267
ctx.config.postfix_snippets().filter(|(_, snip)| snip.scope == SnippetScope::Expr).for_each(
266268
|(trigger, snippet)| {
267-
let imports = match snippet.imports(ctx, &import_scope) {
269+
let imports = match snippet.imports(ctx) {
268270
Some(imports) => imports,
269271
None => return,
270272
};

crates/ide_completion/src/completions/snippet.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,12 @@ fn add_custom_completions(
104104
cap: SnippetCap,
105105
scope: SnippetScope,
106106
) -> Option<()> {
107-
let import_scope = ImportScope::find_insert_use_container(&ctx.token.parent()?, &ctx.sema)?;
107+
if ImportScope::find_insert_use_container(&ctx.token.parent()?, &ctx.sema).is_none() {
108+
return None;
109+
}
108110
ctx.config.prefix_snippets().filter(|(_, snip)| snip.scope == scope).for_each(
109111
|(trigger, snip)| {
110-
let imports = match snip.imports(ctx, &import_scope) {
112+
let imports = match snip.imports(ctx) {
111113
Some(imports) => imports,
112114
None => return,
113115
};

crates/ide_completion/src/item.rs

+54-99
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,10 @@
33
use std::fmt;
44

55
use hir::{Documentation, Mutability};
6-
use ide_db::{
7-
helpers::mod_path_to_ast,
8-
imports::{
9-
import_assets::LocatedImport,
10-
insert_use::{self, ImportScope, InsertUseConfig},
11-
},
12-
SnippetCap, SymbolKind,
13-
};
6+
use ide_db::{imports::import_assets::LocatedImport, SnippetCap, SymbolKind};
147
use smallvec::SmallVec;
158
use stdx::{impl_from, never};
16-
use syntax::{algo, SmolStr, TextRange};
9+
use syntax::{SmolStr, TextRange};
1710
use text_edit::TextEdit;
1811

1912
/// `CompletionItem` describes a single completion variant in the editor pop-up.
@@ -73,7 +66,7 @@ pub struct CompletionItem {
7366
ref_match: Option<Mutability>,
7467

7568
/// The import data to add to completion's edits.
76-
import_to_add: SmallVec<[ImportEdit; 1]>,
69+
import_to_add: SmallVec<[LocatedImport; 1]>,
7770
}
7871

7972
// We use custom debug for CompletionItem to make snapshot tests more readable.
@@ -187,7 +180,6 @@ pub enum CompletionRelevancePostfixMatch {
187180
}
188181

189182
impl CompletionRelevance {
190-
const BASE_LINE: u32 = 3;
191183
/// Provides a relevance score. Higher values are more relevant.
192184
///
193185
/// The absolute value of the relevance score is not meaningful, for
@@ -197,35 +189,42 @@ impl CompletionRelevance {
197189
///
198190
/// See is_relevant if you need to make some judgement about score
199191
/// in an absolute sense.
200-
pub fn score(&self) -> u32 {
201-
let mut score = Self::BASE_LINE;
202-
203-
// score decreases
204-
if self.is_op_method {
205-
score -= 1;
206-
}
207-
if self.is_private_editable {
208-
score -= 1;
192+
pub fn score(self) -> u32 {
193+
let mut score = 0;
194+
let CompletionRelevance {
195+
exact_name_match,
196+
type_match,
197+
is_local,
198+
is_op_method,
199+
is_private_editable,
200+
postfix_match,
201+
} = self;
202+
203+
// lower rank private things
204+
if !is_private_editable {
205+
score += 1;
209206
}
210-
if self.postfix_match.is_some() {
211-
score -= 3;
207+
// lower rank trait op methods
208+
if !is_op_method {
209+
score += 10;
212210
}
213-
214-
// score increases
215-
if self.exact_name_match {
216-
score += 1;
211+
if exact_name_match {
212+
score += 10;
217213
}
218-
score += match self.type_match {
219-
Some(CompletionRelevanceTypeMatch::Exact) => 4,
214+
score += match postfix_match {
215+
Some(CompletionRelevancePostfixMatch::Exact) => 100,
216+
Some(CompletionRelevancePostfixMatch::NonExact) => 0,
217+
None => 3,
218+
};
219+
score += match type_match {
220+
Some(CompletionRelevanceTypeMatch::Exact) => 8,
220221
Some(CompletionRelevanceTypeMatch::CouldUnify) => 3,
221222
None => 0,
222223
};
223-
if self.is_local {
224+
// slightly prefer locals
225+
if is_local {
224226
score += 1;
225227
}
226-
if self.postfix_match == Some(CompletionRelevancePostfixMatch::Exact) {
227-
score += 100;
228-
}
229228

230229
score
231230
}
@@ -234,7 +233,7 @@ impl CompletionRelevance {
234233
/// some threshold such that we think it is especially likely
235234
/// to be relevant.
236235
pub fn is_relevant(&self) -> bool {
237-
self.score() > Self::BASE_LINE
236+
self.score() > 0
238237
}
239238
}
240239

@@ -374,40 +373,17 @@ impl CompletionItem {
374373
self.ref_match.map(|mutability| (mutability, relevance))
375374
}
376375

377-
pub fn imports_to_add(&self) -> &[ImportEdit] {
376+
pub fn imports_to_add(&self) -> &[LocatedImport] {
378377
&self.import_to_add
379378
}
380379
}
381380

382-
/// An extra import to add after the completion is applied.
383-
#[derive(Debug, Clone)]
384-
pub struct ImportEdit {
385-
pub import: LocatedImport,
386-
pub scope: ImportScope,
387-
}
388-
389-
impl ImportEdit {
390-
/// Attempts to insert the import to the given scope, producing a text edit.
391-
/// May return no edit in edge cases, such as scope already containing the import.
392-
pub fn to_text_edit(&self, cfg: InsertUseConfig) -> Option<TextEdit> {
393-
let _p = profile::span("ImportEdit::to_text_edit");
394-
395-
let new_ast = self.scope.clone_for_update();
396-
insert_use::insert_use(&new_ast, mod_path_to_ast(&self.import.import_path), &cfg);
397-
let mut import_insert = TextEdit::builder();
398-
algo::diff(self.scope.as_syntax_node(), new_ast.as_syntax_node())
399-
.into_text_edit(&mut import_insert);
400-
401-
Some(import_insert.finish())
402-
}
403-
}
404-
405381
/// A helper to make `CompletionItem`s.
406382
#[must_use]
407383
#[derive(Clone)]
408384
pub(crate) struct Builder {
409385
source_range: TextRange,
410-
imports_to_add: SmallVec<[ImportEdit; 1]>,
386+
imports_to_add: SmallVec<[LocatedImport; 1]>,
411387
trait_name: Option<SmolStr>,
412388
label: SmolStr,
413389
insert_text: Option<String>,
@@ -433,7 +409,7 @@ impl Builder {
433409

434410
if let [import_edit] = &*self.imports_to_add {
435411
// snippets can have multiple imports, but normal completions only have up to one
436-
if let Some(original_path) = import_edit.import.original_path.as_ref() {
412+
if let Some(original_path) = import_edit.original_path.as_ref() {
437413
lookup = lookup.or_else(|| Some(label.clone()));
438414
label = SmolStr::from(format!("{} (use {})", label, original_path));
439415
}
@@ -527,7 +503,7 @@ impl Builder {
527503
self.trigger_call_info = Some(true);
528504
self
529505
}
530-
pub(crate) fn add_import(&mut self, import_to_add: ImportEdit) -> &mut Builder {
506+
pub(crate) fn add_import(&mut self, import_to_add: LocatedImport) -> &mut Builder {
531507
self.imports_to_add.push(import_to_add);
532508
self
533509
}
@@ -584,55 +560,34 @@ mod tests {
584560

585561
#[test]
586562
fn relevance_score() {
563+
use CompletionRelevance as Cr;
564+
let default = Cr::default();
587565
// This test asserts that the relevance score for these items is ascending, and
588566
// that any items in the same vec have the same score.
589567
let expected_relevance_order = vec![
590-
vec![CompletionRelevance {
591-
postfix_match: Some(CompletionRelevancePostfixMatch::NonExact),
592-
..CompletionRelevance::default()
593-
}],
594-
vec![CompletionRelevance {
595-
is_op_method: true,
596-
is_private_editable: true,
597-
..CompletionRelevance::default()
598-
}],
599-
vec![
600-
CompletionRelevance { is_private_editable: true, ..CompletionRelevance::default() },
601-
CompletionRelevance { is_op_method: true, ..CompletionRelevance::default() },
602-
],
603-
vec![CompletionRelevance::default()],
604-
vec![
605-
CompletionRelevance { exact_name_match: true, ..CompletionRelevance::default() },
606-
CompletionRelevance { is_local: true, ..CompletionRelevance::default() },
607-
],
608-
vec![CompletionRelevance {
568+
vec![],
569+
vec![Cr { is_op_method: true, is_private_editable: true, ..default }],
570+
vec![Cr { is_op_method: true, ..default }],
571+
vec![Cr { postfix_match: Some(CompletionRelevancePostfixMatch::NonExact), ..default }],
572+
vec![Cr { is_private_editable: true, ..default }],
573+
vec![default],
574+
vec![Cr { is_local: true, ..default }],
575+
vec![Cr { type_match: Some(CompletionRelevanceTypeMatch::CouldUnify), ..default }],
576+
vec![Cr { type_match: Some(CompletionRelevanceTypeMatch::Exact), ..default }],
577+
vec![Cr { exact_name_match: true, ..default }],
578+
vec![Cr { exact_name_match: true, is_local: true, ..default }],
579+
vec![Cr {
609580
exact_name_match: true,
610-
is_local: true,
611-
..CompletionRelevance::default()
612-
}],
613-
vec![CompletionRelevance {
614-
type_match: Some(CompletionRelevanceTypeMatch::CouldUnify),
615-
..CompletionRelevance::default()
616-
}],
617-
vec![CompletionRelevance {
618581
type_match: Some(CompletionRelevanceTypeMatch::Exact),
619-
..CompletionRelevance::default()
582+
..default
620583
}],
621-
vec![CompletionRelevance {
622-
exact_name_match: true,
623-
type_match: Some(CompletionRelevanceTypeMatch::Exact),
624-
..CompletionRelevance::default()
625-
}],
626-
vec![CompletionRelevance {
584+
vec![Cr {
627585
exact_name_match: true,
628586
type_match: Some(CompletionRelevanceTypeMatch::Exact),
629587
is_local: true,
630-
..CompletionRelevance::default()
631-
}],
632-
vec![CompletionRelevance {
633-
postfix_match: Some(CompletionRelevancePostfixMatch::Exact),
634-
..CompletionRelevance::default()
588+
..default
635589
}],
590+
vec![Cr { postfix_match: Some(CompletionRelevancePostfixMatch::Exact), ..default }],
636591
];
637592

638593
check_relevance_score_ordered(expected_relevance_order);

crates/ide_completion/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ pub use crate::{
3030
config::CompletionConfig,
3131
item::{
3232
CompletionItem, CompletionItemKind, CompletionRelevance, CompletionRelevancePostfixMatch,
33-
ImportEdit,
3433
},
3534
snippet::{Snippet, SnippetScope},
3635
};
@@ -193,7 +192,6 @@ pub fn resolve_completion_edits(
193192
let new_ast = scope.clone_for_update();
194193
let mut import_insert = TextEdit::builder();
195194

196-
// FIXME: lift out and make some tests here, this is ImportEdit::to_text_edit but changed to work with multiple edits
197195
imports.into_iter().for_each(|(full_import_path, imported_name)| {
198196
let items_with_name = items_locator::items_with_name(
199197
&ctx.sema,

0 commit comments

Comments
 (0)