Skip to content

Commit c41f127

Browse files
committed
Inline name classification reference calls
1 parent c65bb7f commit c41f127

File tree

9 files changed

+117
-80
lines changed

9 files changed

+117
-80
lines changed

crates/ide/src/doc_links.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,16 @@ 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_field())?,
116-
ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.defined_or_referenced_field())?,
115+
ast::NameRef(name_ref) => match NameRefClass::classify(&sema, &name_ref)? {
116+
NameRefClass::Definition(def) => def,
117+
NameRefClass::FieldShorthand { local_ref: _, field_ref } => {
118+
Definition::Field(field_ref)
119+
}
120+
},
121+
ast::Name(name) => match NameClass::classify(&sema, &name)? {
122+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
123+
NameClass::PatFieldShorthand { local_def: _, field_ref } => Definition::Field(field_ref),
124+
},
117125
_ => return None,
118126
}
119127
};

crates/ide/src/goto_declaration.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ pub(crate) fn goto_declaration(
2323
let parent = token.parent()?;
2424
let def = match_ast! {
2525
match parent {
26-
ast::NameRef(name_ref) => {
27-
let name_kind = NameRefClass::classify(&sema, &name_ref)?;
28-
name_kind.referenced_local()
26+
ast::NameRef(name_ref) => match NameRefClass::classify(&sema, &name_ref)? {
27+
NameRefClass::Definition(def) => def,
28+
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
29+
Definition::Local(local_ref)
30+
}
2931
},
30-
ast::Name(name) => {
31-
NameClass::classify(&sema, &name)?.defined_or_referenced_local()
32+
ast::Name(name) => match NameClass::classify(&sema, &name)? {
33+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
34+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => Definition::Local(local_def),
3235
},
3336
_ => return None,
3437
}

crates/ide/src/goto_definition.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,17 @@ 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)?.defined_or_referenced_local();
63+
let def = match NameClass::classify(&sema, &name)? {
64+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
65+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => Definition::Local(local_def),
66+
};
6467
try_find_trait_item_definition(sema.db, &def).or_else(|| def.try_to_nav(sema.db))
6568
},
6669
ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, &lt) {
67-
let def = name_class.defined_or_referenced_local();
70+
let def = match name_class {
71+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
72+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => Definition::Local(local_def),
73+
};
6874
def.try_to_nav(sema.db)
6975
} else {
7076
reference_definition(&sema, Either::Left(&lt))
@@ -139,7 +145,10 @@ pub(crate) fn reference_definition(
139145
|lifetime| NameRefClass::classify_lifetime(sema, lifetime),
140146
|name_ref| NameRefClass::classify(sema, name_ref),
141147
)?;
142-
let def = name_kind.referenced_local();
148+
let def = match name_kind {
149+
NameRefClass::Definition(def) => def,
150+
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => Definition::Local(local_ref),
151+
};
143152
def.try_to_nav(sema.db)
144153
}
145154

crates/ide/src/goto_implementation.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,19 @@ pub(crate) fn goto_implementation(
2828

2929
let node = sema.find_node_at_offset_with_descend(&syntax, position.offset)?;
3030
let def = match &node {
31-
ast::NameLike::Name(name) => {
32-
NameClass::classify(&sema, name).map(|class| class.defined_or_referenced_local())
33-
}
31+
ast::NameLike::Name(name) => NameClass::classify(&sema, name).map(|class| match class {
32+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
33+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => {
34+
Definition::Local(local_def)
35+
}
36+
}),
3437
ast::NameLike::NameRef(name_ref) => {
35-
NameRefClass::classify(&sema, name_ref).map(|class| class.referenced_local())
38+
NameRefClass::classify(&sema, name_ref).map(|class| match class {
39+
NameRefClass::Definition(def) => def,
40+
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
41+
Definition::Local(local_ref)
42+
}
43+
})
3644
}
3745
ast::NameLike::Lifetime(_) => None,
3846
}?;

crates/ide/src/hover.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,21 @@ pub(crate) fn hover(
9696
match node {
9797
// we don't use NameClass::referenced_or_defined here as we do not want to resolve
9898
// field pattern shorthands to their definition
99-
ast::Name(name) => NameClass::classify(&sema, &name).map(|class| class.defined_or_referenced_local()),
100-
ast::NameRef(name_ref) => {
101-
NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced_field())
102-
},
99+
ast::Name(name) => NameClass::classify(&sema, &name).map(|class| match class {
100+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
101+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => Definition::Local(local_def),
102+
}),
103+
ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|class| match class {
104+
NameRefClass::Definition(def) => def,
105+
NameRefClass::FieldShorthand { local_ref: _, field_ref } => {
106+
Definition::Field(field_ref)
107+
}
108+
}),
103109
ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime).map_or_else(
104-
|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced_local()),
110+
|| NameRefClass::classify_lifetime(&sema, &lifetime).and_then(|class| match class {
111+
NameRefClass::Definition(it) => Some(it),
112+
_ => None,
113+
}),
105114
|d| d.defined(),
106115
),
107116
_ => {

crates/ide/src/references.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,15 @@ 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)?.defined_or_referenced_field(), true)
61+
(
62+
match NameClass::classify(sema, &name)? {
63+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
64+
NameClass::PatFieldShorthand { local_def: _, field_ref } => {
65+
Definition::Field(field_ref)
66+
}
67+
},
68+
true,
69+
)
6270
} else {
6371
(find_def(sema, &syntax, position.offset)?, false)
6472
};
@@ -116,17 +124,28 @@ pub(crate) fn find_def(
116124
offset: TextSize,
117125
) -> Option<Definition> {
118126
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_local()
121-
}
122-
ast::NameLike::Name(name) => {
123-
NameClass::classify(sema, &name)?.defined_or_referenced_local()
124-
}
127+
ast::NameLike::NameRef(name_ref) => match NameRefClass::classify(sema, &name_ref)? {
128+
NameRefClass::Definition(def) => def,
129+
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
130+
Definition::Local(local_ref)
131+
}
132+
},
133+
ast::NameLike::Name(name) => match NameClass::classify(sema, &name)? {
134+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
135+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => {
136+
Definition::Local(local_def)
137+
}
138+
},
125139
ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime)
126-
.map(|class| class.referenced_local())
140+
.and_then(|class| match class {
141+
NameRefClass::Definition(it) => Some(it),
142+
_ => None,
143+
})
127144
.or_else(|| {
128-
NameClass::classify_lifetime(sema, &lifetime)
129-
.map(|class| class.defined_or_referenced_local())
145+
NameClass::classify_lifetime(sema, &lifetime).and_then(|class| match class {
146+
NameClass::Definition(it) => Some(it),
147+
_ => None,
148+
})
130149
})?,
131150
};
132151
Some(def)

crates/ide/src/rename.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,19 @@ fn find_definition(
107107
{
108108
bail!("Renaming aliases is currently unsupported")
109109
}
110-
ast::NameLike::Name(name) => {
111-
NameClass::classify(sema, &name).map(|class| class.defined_or_referenced_local())
112-
}
110+
ast::NameLike::Name(name) => NameClass::classify(sema, &name).map(|class| match class {
111+
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
112+
NameClass::PatFieldShorthand { local_def, field_ref: _ } => {
113+
Definition::Local(local_def)
114+
}
115+
}),
113116
ast::NameLike::NameRef(name_ref) => {
114-
if let Some(def) =
115-
NameRefClass::classify(sema, &name_ref).map(|class| class.referenced_local())
116-
{
117+
if let Some(def) = NameRefClass::classify(sema, &name_ref).map(|class| match class {
118+
NameRefClass::Definition(def) => def,
119+
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
120+
Definition::Local(local_ref)
121+
}
122+
}) {
117123
// if the name differs from the definitions name it has to be an alias
118124
if def.name(sema.db).map_or(false, |it| it.to_string() != name_ref.text()) {
119125
bail!("Renaming aliases is currently unsupported");
@@ -124,10 +130,15 @@ fn find_definition(
124130
}
125131
}
126132
ast::NameLike::Lifetime(lifetime) => NameRefClass::classify_lifetime(sema, &lifetime)
127-
.map(|class| class.referenced_local())
133+
.and_then(|class| match class {
134+
NameRefClass::Definition(def) => Some(def),
135+
_ => None,
136+
})
128137
.or_else(|| {
129-
NameClass::classify_lifetime(sema, &lifetime)
130-
.map(|it| it.defined_or_referenced_field())
138+
NameClass::classify_lifetime(sema, &lifetime).and_then(|it| match it {
139+
NameClass::Definition(it) => Some(it),
140+
_ => None,
141+
})
131142
}),
132143
}
133144
.ok_or_else(|| format_err!("No references found at position"))?;

crates/ide_assists/src/handlers/extract_function.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,12 @@ 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_local())
641+
.map(|name_kind| match name_kind {
642+
NameRefClass::Definition(def) => def,
643+
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
644+
Definition::Local(local_ref)
645+
}
646+
})
642647
.filter_map(|definition| match definition {
643648
Definition::Local(local) => Some(local),
644649
_ => None,

crates/ide_db/src/defs.rs

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,6 @@ impl NameClass {
133133
Some(res)
134134
}
135135

136-
/// `Definition` referenced or defined by this name, in case of a shorthand this will yield the field reference.
137-
pub fn defined_or_referenced_field(self) -> Definition {
138-
match self {
139-
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
140-
NameClass::PatFieldShorthand { local_def: _, field_ref } => {
141-
Definition::Field(field_ref)
142-
}
143-
}
144-
}
145-
146-
/// `Definition` referenced or defined by this name, in case of a shorthand this will yield the local definition.
147-
pub fn defined_or_referenced_local(self) -> Definition {
148-
match self {
149-
NameClass::Definition(it) | NameClass::ConstReference(it) => it,
150-
NameClass::PatFieldShorthand { local_def, field_ref: _ } => {
151-
Definition::Local(local_def)
152-
}
153-
}
154-
}
155-
156136
pub fn classify(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option<NameClass> {
157137
let _p = profile::span("classify_name");
158138

@@ -194,7 +174,12 @@ impl NameClass {
194174
})
195175
.and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?;
196176

197-
Some(NameClass::Definition(name_ref_class.referenced_field()))
177+
Some(NameClass::Definition(match name_ref_class {
178+
NameRefClass::Definition(def) => def,
179+
NameRefClass::FieldShorthand { local_ref: _, field_ref } => {
180+
Definition::Field(field_ref)
181+
}
182+
}))
198183
} else {
199184
let extern_crate = it.syntax().parent().and_then(ast::ExternCrate::cast)?;
200185
let krate = sema.resolve_extern_crate(&extern_crate)?;
@@ -316,26 +301,6 @@ pub enum NameRefClass {
316301
}
317302

318303
impl NameRefClass {
319-
/// `Definition`, which this name refers to with a preference for the field reference in case of a field shorthand.
320-
pub fn referenced_field(self) -> Definition {
321-
match self {
322-
NameRefClass::Definition(def) => def,
323-
NameRefClass::FieldShorthand { local_ref: _, field_ref } => {
324-
Definition::Field(field_ref)
325-
}
326-
}
327-
}
328-
329-
/// `Definition`, which this name refers to with a preference for the local reference in case of a field shorthand.
330-
pub fn referenced_local(self) -> Definition {
331-
match self {
332-
NameRefClass::Definition(def) => def,
333-
NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
334-
Definition::Local(local_ref)
335-
}
336-
}
337-
}
338-
339304
// Note: we don't have unit-tests for this rather important function.
340305
// It is primarily exercised via goto definition tests in `ide`.
341306
pub fn classify(

0 commit comments

Comments
 (0)