Skip to content

Commit 87621de

Browse files
bors[bot]matkladmahdifrmz
authored
Merge #9567 #9568
9567: remove unneded special case r=matklad a=matklad bors r+ 🤖 9568: feat: add 'for' postfix completion r=lnicola a=mahdi-frms ![Peek 2021-07-11 16-45](https://user-images.githubusercontent.com/62165556/125194692-a0aaf780-e267-11eb-952a-81de7955d9a1.gif) adds #9561 used ```ele``` as identifier for each element in the iteration Co-authored-by: Aleksey Kladov <[email protected]> Co-authored-by: mahdi-frms <[email protected]>
3 parents a70d931 + bbb0535 + 7bae9c9 commit 87621de

File tree

17 files changed

+92
-53
lines changed

17 files changed

+92
-53
lines changed

crates/ide/src/doc_links.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ pub(crate) fn external_docs(
112112
let node = token.parent()?;
113113
let definition = match_ast! {
114114
match node {
115-
ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db))?,
116-
ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined(sema.db))?,
115+
ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced())?,
116+
ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined())?,
117117
_ => return None,
118118
}
119119
};

crates/ide/src/goto_declaration.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ pub(crate) fn goto_declaration(
2525
match parent {
2626
ast::NameRef(name_ref) => {
2727
let name_kind = NameRefClass::classify(&sema, &name_ref)?;
28-
name_kind.referenced(sema.db)
28+
name_kind.referenced()
2929
},
3030
ast::Name(name) => {
31-
NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db)
31+
NameClass::classify(&sema, &name)?.referenced_or_defined()
3232
},
3333
_ => return None,
3434
}

crates/ide/src/goto_definition.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ pub(crate) fn goto_definition(
6060
reference_definition(&sema, Either::Right(&name_ref))
6161
},
6262
ast::Name(name) => {
63-
let def = NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db);
63+
let def = NameClass::classify(&sema, &name)?.referenced_or_defined();
6464
try_find_trait_item_definition(sema.db, &def)
6565
.or_else(|| def.try_to_nav(sema.db))
6666
},
6767
ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, &lt) {
68-
let def = name_class.referenced_or_defined(sema.db);
68+
let def = name_class.referenced_or_defined();
6969
def.try_to_nav(sema.db)
7070
} else {
7171
reference_definition(&sema, Either::Left(&lt))
@@ -140,7 +140,7 @@ pub(crate) fn reference_definition(
140140
|lifetime| NameRefClass::classify_lifetime(sema, lifetime),
141141
|name_ref| NameRefClass::classify(sema, name_ref),
142142
)?;
143-
let def = name_kind.referenced(sema.db);
143+
let def = name_kind.referenced();
144144
def.try_to_nav(sema.db)
145145
}
146146

crates/ide/src/goto_implementation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ pub(crate) fn goto_implementation(
2929
let node = sema.find_node_at_offset_with_descend(&syntax, position.offset)?;
3030
let def = match &node {
3131
ast::NameLike::Name(name) => {
32-
NameClass::classify(&sema, name).map(|class| class.referenced_or_defined(sema.db))
32+
NameClass::classify(&sema, name).map(|class| class.referenced_or_defined())
3333
}
3434
ast::NameLike::NameRef(name_ref) => {
35-
NameRefClass::classify(&sema, name_ref).map(|class| class.referenced(sema.db))
35+
NameRefClass::classify(&sema, name_ref).map(|class| class.referenced())
3636
}
3737
ast::NameLike::Lifetime(_) => None,
3838
}?;

crates/ide/src/hover.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,14 @@ pub(crate) fn hover(
9898
// field pattern shorthands to their definition
9999
ast::Name(name) => NameClass::classify(&sema, &name).and_then(|class| match class {
100100
NameClass::ConstReference(def) => Some(def),
101-
def => def.defined(db),
101+
def => def.defined(),
102102
}),
103103
ast::NameRef(name_ref) => {
104-
NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(db))
104+
NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced())
105105
},
106106
ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime).map_or_else(
107-
|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(db)),
108-
|d| d.defined(db),
107+
|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced()),
108+
|d| d.defined(),
109109
),
110110

111111
_ => {

crates/ide/src/references.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ pub(crate) fn find_all_refs(
5858

5959
let (def, is_literal_search) =
6060
if let Some(name) = get_name_of_item_declaration(&syntax, position) {
61-
(NameClass::classify(sema, &name)?.referenced_or_defined(sema.db), true)
61+
(NameClass::classify(sema, &name)?.referenced_or_defined(), true)
6262
} else {
6363
(find_def(sema, &syntax, position.offset)?, false)
6464
};
@@ -116,17 +116,13 @@ pub(crate) fn find_def(
116116
offset: TextSize,
117117
) -> Option<Definition> {
118118
let def = match sema.find_node_at_offset_with_descend(syntax, offset)? {
119-
ast::NameLike::NameRef(name_ref) => {
120-
NameRefClass::classify(sema, &name_ref)?.referenced(sema.db)
121-
}
122-
ast::NameLike::Name(name) => {
123-
NameClass::classify(sema, &name)?.referenced_or_defined(sema.db)
124-
}
119+
ast::NameLike::NameRef(name_ref) => NameRefClass::classify(sema, &name_ref)?.referenced(),
120+
ast::NameLike::Name(name) => NameClass::classify(sema, &name)?.referenced_or_defined(),
125121
ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime)
126-
.map(|class| class.referenced(sema.db))
122+
.map(|class| class.referenced())
127123
.or_else(|| {
128124
NameClass::classify_lifetime(sema, &lifetime)
129-
.map(|class| class.referenced_or_defined(sema.db))
125+
.map(|class| class.referenced_or_defined())
130126
})?,
131127
};
132128
Some(def)

crates/ide/src/rename.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@ fn find_definition(
108108
bail!("Renaming aliases is currently unsupported")
109109
}
110110
ast::NameLike::Name(name) => {
111-
NameClass::classify(sema, &name).map(|class| class.referenced_or_defined(sema.db))
111+
NameClass::classify(sema, &name).map(|class| class.referenced_or_defined())
112112
}
113113
ast::NameLike::NameRef(name_ref) => {
114114
if let Some(def) =
115-
NameRefClass::classify(sema, &name_ref).map(|class| class.referenced(sema.db))
115+
NameRefClass::classify(sema, &name_ref).map(|class| class.referenced())
116116
{
117117
// if the name differs from the definitions name it has to be an alias
118118
if def.name(sema.db).map_or(false, |it| it.to_string() != name_ref.text()) {
@@ -124,10 +124,9 @@ fn find_definition(
124124
}
125125
}
126126
ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime)
127-
.map(|class| NameRefClass::referenced(class, sema.db))
127+
.map(|class| class.referenced())
128128
.or_else(|| {
129-
NameClass::classify_lifetime(sema, &lifetime)
130-
.map(|it| it.referenced_or_defined(sema.db))
129+
NameClass::classify_lifetime(sema, &lifetime).map(|it| it.referenced_or_defined())
131130
}),
132131
}
133132
.ok_or_else(|| format_err!("No references found at position"))?;

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ pub(super) fn element(
4646
};
4747

4848
match name_kind {
49-
Some(NameClass::ExternCrate(_)) => SymbolKind::Module.into(),
5049
Some(NameClass::Definition(def)) => {
5150
let mut h = highlight_def(db, krate, def) | HlMod::Definition;
5251
if let Definition::ModuleDef(hir::ModuleDef::Trait(trait_)) = &def {
@@ -111,7 +110,6 @@ pub(super) fn element(
111110
}
112111
};
113112
let h = match name_class {
114-
NameRefClass::ExternCrate(_) => SymbolKind::Module.into(),
115113
NameRefClass::Definition(def) => {
116114
if let Definition::Local(local) = &def {
117115
if let Some(name) = local.name(db) {

crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@
3838

3939
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4040
</style>
41-
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module">std</span><span class="semicolon">;</span>
42-
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module">alloc</span> <span class="keyword">as</span> <span class="module">abc</span><span class="semicolon">;</span>
41+
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module library">std</span><span class="semicolon">;</span>
42+
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module library">alloc</span> <span class="keyword">as</span> <span class="module declaration library">abc</span><span class="semicolon">;</span>
4343
</code></pre>

crates/ide_assists/src/handlers/add_turbo_fish.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext) -> Option<(
4141
let name_ref = ast::NameRef::cast(ident.parent()?)?;
4242
let def = match NameRefClass::classify(&ctx.sema, &name_ref)? {
4343
NameRefClass::Definition(def) => def,
44-
NameRefClass::ExternCrate(_) | NameRefClass::FieldShorthand { .. } => return None,
44+
NameRefClass::FieldShorthand { .. } => return None,
4545
};
4646
let fun = match def {
4747
Definition::ModuleDef(hir::ModuleDef::Function(it)) => it,

crates/ide_assists/src/handlers/extract_function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ fn vars_used_in_body(ctx: &AssistContext, body: &FunctionBody) -> Vec<Local> {
638638
body.descendants()
639639
.filter_map(ast::NameRef::cast)
640640
.filter_map(|name_ref| NameRefClass::classify(&ctx.sema, &name_ref))
641-
.map(|name_kind| name_kind.referenced(ctx.db()))
641+
.map(|name_kind| name_kind.referenced())
642642
.filter_map(|definition| match definition {
643643
Definition::Local(local) => Some(local),
644644
_ => None,

crates/ide_assists/src/handlers/remove_unused_param.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,36 @@ use super::foo;
310310
fn bar() {
311311
let _ = foo(1);
312312
}
313+
"#,
314+
)
315+
}
316+
317+
#[test]
318+
fn remove_method_param() {
319+
// FIXME: This is completely wrong:
320+
// * method call expressions are not handled
321+
// * assoc function syntax removes the wrong argument.
322+
check_assist(
323+
remove_unused_param,
324+
r#"
325+
struct S;
326+
impl S { fn f(&self, $0_unused: i32) {} }
327+
fn main() {
328+
S.f(92);
329+
S.f();
330+
S.f(92, 92);
331+
S::f(&S, 92);
332+
}
333+
"#,
334+
r#"
335+
struct S;
336+
impl S { fn f(&self) {} }
337+
fn main() {
338+
S.f(92);
339+
S.f();
340+
S.f(92, 92);
341+
S::f(92);
342+
}
313343
"#,
314344
)
315345
}

crates/ide_completion/src/completions/postfix.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
33
mod format_like;
44

5-
use ide_db::{helpers::SnippetCap, ty_filter::TryEnum};
5+
use ide_db::{
6+
helpers::{FamousDefs, SnippetCap},
7+
ty_filter::TryEnum,
8+
};
69
use syntax::{
710
ast::{self, AstNode, AstToken},
811
SyntaxKind::{BLOCK_EXPR, EXPR_STMT},
@@ -110,6 +113,18 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
110113
.add_to(acc);
111114
postfix_snippet(ctx, cap, dot_receiver, "not", "!expr", &format!("!{}", receiver_text))
112115
.add_to(acc);
116+
} else if let Some(trait_) = FamousDefs(&ctx.sema, ctx.krate).core_iter_IntoIterator() {
117+
if receiver_ty.impls_trait(ctx.db, trait_, &[]) {
118+
postfix_snippet(
119+
ctx,
120+
cap,
121+
dot_receiver,
122+
"for",
123+
"for ele in expr {}",
124+
&format!("for ele in {} {{\n $0\n}}", receiver_text),
125+
)
126+
.add_to(acc);
127+
}
113128
}
114129

115130
postfix_snippet(ctx, cap, dot_receiver, "ref", "&expr", &format!("&{}", receiver_text))

crates/ide_db/src/defs.rs

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
77

88
use hir::{
9-
db::HirDatabase, Crate, Field, GenericParam, HasVisibility, Impl, Label, Local, MacroDef,
10-
Module, ModuleDef, Name, PathResolution, Semantics, Visibility,
9+
Field, GenericParam, HasVisibility, Impl, Label, Local, MacroDef, Module, ModuleDef, Name,
10+
PathResolution, Semantics, Visibility,
1111
};
1212
use syntax::{
1313
ast::{self, AstNode, PathSegmentKind},
@@ -101,14 +101,13 @@ impl Definition {
101101
/// scope. That is, that, by just looking at the syntactical category, we can
102102
/// unambiguously define the semantic category.
103103
///
104-
/// Sadly, that's not 100% true, there are special cases. To make sure that call
105-
/// the code handles all the special cases correctly via exhaustive matching, we
104+
/// Sadly, that's not 100% true, there are special cases. To make sure that
105+
/// callers handle all the special cases correctly via exhaustive matching, we
106106
/// add a [`NameClass`] enum which lists all of them!
107107
///
108108
/// A model special case is `None` constant in pattern.
109109
#[derive(Debug)]
110110
pub enum NameClass {
111-
ExternCrate(Crate),
112111
Definition(Definition),
113112
/// `None` in `if let None = Some(82) {}`.
114113
/// Syntactically, it is a name, but semantically it is a reference.
@@ -124,9 +123,8 @@ pub enum NameClass {
124123

125124
impl NameClass {
126125
/// `Definition` defined by this name.
127-
pub fn defined(self, db: &dyn HirDatabase) -> Option<Definition> {
126+
pub fn defined(self) -> Option<Definition> {
128127
let res = match self {
129-
NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()),
130128
NameClass::Definition(it) => it,
131129
NameClass::ConstReference(_) => return None,
132130
NameClass::PatFieldShorthand { local_def, field_ref: _ } => {
@@ -137,9 +135,8 @@ impl NameClass {
137135
}
138136

139137
/// `Definition` referenced or defined by this name.
140-
pub fn referenced_or_defined(self, db: &dyn HirDatabase) -> Definition {
138+
pub fn referenced_or_defined(self) -> Definition {
141139
match self {
142-
NameClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()),
143140
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
144141
NameClass::PatFieldShorthand { local_def: _, field_ref } => field_ref,
145142
}
@@ -186,11 +183,12 @@ impl NameClass {
186183
})
187184
.and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?;
188185

189-
Some(NameClass::Definition(name_ref_class.referenced(sema.db)))
186+
Some(NameClass::Definition(name_ref_class.referenced()))
190187
} else {
191188
let extern_crate = it.syntax().parent().and_then(ast::ExternCrate::cast)?;
192-
let resolved = sema.resolve_extern_crate(&extern_crate)?;
193-
Some(NameClass::ExternCrate(resolved))
189+
let krate = sema.resolve_extern_crate(&extern_crate)?;
190+
let root_module = krate.root_module(sema.db);
191+
Some(NameClass::Definition(Definition::ModuleDef(root_module.into())))
194192
}
195193
},
196194
ast::IdentPat(it) => {
@@ -303,16 +301,14 @@ impl NameClass {
303301
/// reference to point to two different defs.
304302
#[derive(Debug)]
305303
pub enum NameRefClass {
306-
ExternCrate(Crate),
307304
Definition(Definition),
308305
FieldShorthand { local_ref: Local, field_ref: Definition },
309306
}
310307

311308
impl NameRefClass {
312309
/// `Definition`, which this name refers to.
313-
pub fn referenced(self, db: &dyn HirDatabase) -> Definition {
310+
pub fn referenced(self) -> Definition {
314311
match self {
315-
NameRefClass::ExternCrate(krate) => Definition::ModuleDef(krate.root_module(db).into()),
316312
NameRefClass::Definition(def) => def,
317313
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
318314
// FIXME: this is inherently ambiguous -- this name refers to
@@ -428,8 +424,9 @@ impl NameRefClass {
428424
}
429425

430426
let extern_crate = ast::ExternCrate::cast(parent)?;
431-
let resolved = sema.resolve_extern_crate(&extern_crate)?;
432-
Some(NameRefClass::ExternCrate(resolved))
427+
let krate = sema.resolve_extern_crate(&extern_crate)?;
428+
let root_module = krate.root_module(sema.db);
429+
Some(NameRefClass::Definition(Definition::ModuleDef(root_module.into())))
433430
}
434431

435432
pub fn classify_lifetime(

crates/ide_db/src/helpers.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ impl FamousDefs<'_, '_> {
134134
self.find_trait("core:iter:traits:iterator:Iterator")
135135
}
136136

137+
pub fn core_iter_IntoIterator(&self) -> Option<Trait> {
138+
self.find_trait("core:iter:traits:collect:IntoIterator")
139+
}
140+
137141
pub fn core_iter(&self) -> Option<Module> {
138142
self.find_module("core:iter")
139143
}

crates/ide_db/src/items_locator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fn get_name_definition(
142142
candidate_node
143143
};
144144
let name = ast::Name::cast(candidate_name_node)?;
145-
NameClass::classify(sema, &name)?.defined(sema.db)
145+
NameClass::classify(sema, &name)?.defined()
146146
}
147147

148148
fn is_assoc_item(item: ItemInNs, db: &RootDatabase) -> bool {

crates/ide_diagnostics/src/handlers/incorrect_case.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub(crate) fn incorrect_case(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCas
2929
fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCase) -> Option<Vec<Assist>> {
3030
let root = ctx.sema.db.parse_or_expand(d.file)?;
3131
let name_node = d.ident.to_node(&root);
32-
let def = NameClass::classify(&ctx.sema, &name_node)?.defined(ctx.sema.db)?;
32+
let def = NameClass::classify(&ctx.sema, &name_node)?.defined()?;
3333

3434
let name_node = InFile::new(d.file, name_node.syntax());
3535
let frange = name_node.original_file_range(ctx.sema.db);

0 commit comments

Comments
 (0)