Skip to content

Commit b795128

Browse files
committed
Use hir::GenericParam in ide_db::Definition instead of relisting all 3
1 parent 6a0a47d commit b795128

File tree

9 files changed

+65
-42
lines changed

9 files changed

+65
-42
lines changed

crates/hir/src/code_model.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,24 @@ pub enum GenericParam {
12631263
}
12641264
impl_from!(TypeParam, LifetimeParam, ConstParam for GenericParam);
12651265

1266+
impl GenericParam {
1267+
pub fn module(self, db: &dyn HirDatabase) -> Module {
1268+
match self {
1269+
GenericParam::TypeParam(it) => it.module(db),
1270+
GenericParam::LifetimeParam(it) => it.module(db),
1271+
GenericParam::ConstParam(it) => it.module(db),
1272+
}
1273+
}
1274+
1275+
pub fn name(self, db: &dyn HirDatabase) -> Name {
1276+
match self {
1277+
GenericParam::TypeParam(it) => it.name(db),
1278+
GenericParam::LifetimeParam(it) => it.name(db),
1279+
GenericParam::ConstParam(it) => it.name(db),
1280+
}
1281+
}
1282+
}
1283+
12661284
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
12671285
pub struct TypeParam {
12681286
pub(crate) id: TypeParamId,

crates/ide/src/display/navigation_target.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,8 @@ impl TryToNav for Definition {
215215
Definition::ModuleDef(it) => it.try_to_nav(db),
216216
Definition::SelfType(it) => it.try_to_nav(db),
217217
Definition::Local(it) => Some(it.to_nav(db)),
218-
Definition::TypeParam(it) => it.try_to_nav(db),
219-
Definition::LifetimeParam(it) => it.try_to_nav(db),
218+
Definition::GenericParam(it) => it.try_to_nav(db),
220219
Definition::Label(it) => Some(it.to_nav(db)),
221-
Definition::ConstParam(it) => it.try_to_nav(db),
222220
}
223221
}
224222
}
@@ -389,6 +387,16 @@ impl TryToNav for hir::AssocItem {
389387
}
390388
}
391389

390+
impl TryToNav for hir::GenericParam {
391+
fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
392+
match self {
393+
hir::GenericParam::TypeParam(it) => it.try_to_nav(db),
394+
hir::GenericParam::ConstParam(it) => it.try_to_nav(db),
395+
hir::GenericParam::LifetimeParam(it) => it.try_to_nav(db),
396+
}
397+
}
398+
}
399+
392400
impl ToNav for hir::Local {
393401
fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
394402
let src = self.source(db);

crates/ide/src/doc_links.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,7 @@ fn rewrite_intra_doc_link(
216216
Definition::Field(it) => it.resolve_doc_path(db, link, ns),
217217
Definition::SelfType(_)
218218
| Definition::Local(_)
219-
| Definition::TypeParam(_)
220-
| Definition::ConstParam(_)
221-
| Definition::LifetimeParam(_)
219+
| Definition::GenericParam(_)
222220
| Definition::Label(_) => return None,
223221
}?;
224222
let krate = resolved.module(db)?.krate();

crates/ide/src/goto_definition.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,7 @@ fn def_for_doc_comment(
111111
Definition::Field(it) => it.resolve_doc_path(db, link, ns),
112112
Definition::SelfType(_)
113113
| Definition::Local(_)
114-
| Definition::TypeParam(_)
115-
| Definition::LifetimeParam(_)
116-
| Definition::ConstParam(_)
114+
| Definition::GenericParam(_)
117115
| Definition::Label(_) => return None,
118116
}
119117
}

crates/ide/src/hover.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use hir::{
2-
Adt, AsAssocItem, AssocItemContainer, FieldSource, HasAttrs, HasSource, HirDisplay, Module,
3-
ModuleDef, ModuleSource, Semantics,
2+
Adt, AsAssocItem, AssocItemContainer, FieldSource, GenericParam, HasAttrs, HasSource,
3+
HirDisplay, Module, ModuleDef, ModuleSource, Semantics,
44
};
55
use ide_db::base_db::SourceDatabase;
66
use ide_db::{
@@ -220,12 +220,12 @@ fn goto_type_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> {
220220
}
221221
};
222222

223-
if let Definition::TypeParam(it) = def {
223+
if let Definition::GenericParam(GenericParam::TypeParam(it)) = def {
224224
it.trait_bounds(db).into_iter().for_each(|it| push_new_def(it.into()));
225225
} else {
226226
let ty = match def {
227227
Definition::Local(it) => it.ty(db),
228-
Definition::ConstParam(it) => it.ty(db),
228+
Definition::GenericParam(GenericParam::ConstParam(it)) => it.ty(db),
229229
_ => return None,
230230
};
231231

@@ -357,9 +357,11 @@ fn hover_for_definition(db: &RootDatabase, def: Definition) -> Option<Markup> {
357357
})
358358
}
359359
Definition::Label(it) => Some(Markup::fenced_block(&it.name(db))),
360-
Definition::LifetimeParam(it) => Some(Markup::fenced_block(&it.name(db))),
361-
Definition::TypeParam(type_param) => Some(Markup::fenced_block(&type_param.display(db))),
362-
Definition::ConstParam(it) => from_def_source(db, it, None),
360+
Definition::GenericParam(it) => match it {
361+
GenericParam::TypeParam(it) => Some(Markup::fenced_block(&it.display(db))),
362+
GenericParam::LifetimeParam(it) => Some(Markup::fenced_block(&it.name(db))),
363+
GenericParam::ConstParam(it) => from_def_source(db, it, None),
364+
},
363365
};
364366

365367
fn from_def_source<A, D>(db: &RootDatabase, def: D, mod_path: Option<String>) -> Option<Markup>

crates/ide/src/references.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,10 @@ pub(crate) fn find_all_refs(
130130
kind = ReferenceKind::FieldShorthandForLocal;
131131
}
132132
}
133-
} else if matches!(def, Definition::LifetimeParam(_) | Definition::Label(_)) {
133+
} else if matches!(
134+
def,
135+
Definition::GenericParam(hir::GenericParam::LifetimeParam(_)) | Definition::Label(_)
136+
) {
134137
kind = ReferenceKind::Lifetime;
135138
};
136139

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,11 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
328328
}
329329
},
330330
Definition::SelfType(_) => HlTag::Symbol(SymbolKind::Impl),
331-
Definition::TypeParam(_) => HlTag::Symbol(SymbolKind::TypeParam),
332-
Definition::ConstParam(_) => HlTag::Symbol(SymbolKind::ConstParam),
331+
Definition::GenericParam(it) => match it {
332+
hir::GenericParam::TypeParam(_) => HlTag::Symbol(SymbolKind::TypeParam),
333+
hir::GenericParam::ConstParam(_) => HlTag::Symbol(SymbolKind::ConstParam),
334+
hir::GenericParam::LifetimeParam(_) => HlTag::Symbol(SymbolKind::LifetimeParam),
335+
},
333336
Definition::Local(local) => {
334337
let tag = if local.is_param(db) {
335338
HlTag::Symbol(SymbolKind::ValueParam)
@@ -345,7 +348,6 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
345348
}
346349
return h;
347350
}
348-
Definition::LifetimeParam(_) => HlTag::Symbol(SymbolKind::LifetimeParam),
349351
Definition::Label(_) => HlTag::Symbol(SymbolKind::Label),
350352
}
351353
.into()

crates/ide_db/src/defs.rs

Lines changed: 15 additions & 21 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, ConstParam, Crate, Field, HasVisibility, Impl, Label, LifetimeParam, Local,
10-
MacroDef, Module, ModuleDef, Name, PathResolution, Semantics, TypeParam, Visibility,
9+
db::HirDatabase, Crate, Field, GenericParam, HasVisibility, Impl, Label, Local, MacroDef,
10+
Module, ModuleDef, Name, PathResolution, Semantics, Visibility,
1111
};
1212
use syntax::{
1313
ast::{self, AstNode},
@@ -24,9 +24,7 @@ pub enum Definition {
2424
ModuleDef(ModuleDef),
2525
SelfType(Impl),
2626
Local(Local),
27-
TypeParam(TypeParam),
28-
LifetimeParam(LifetimeParam),
29-
ConstParam(ConstParam),
27+
GenericParam(GenericParam),
3028
Label(Label),
3129
}
3230

@@ -38,9 +36,7 @@ impl Definition {
3836
Definition::ModuleDef(it) => it.module(db),
3937
Definition::SelfType(it) => Some(it.module(db)),
4038
Definition::Local(it) => Some(it.module(db)),
41-
Definition::TypeParam(it) => Some(it.module(db)),
42-
Definition::LifetimeParam(it) => Some(it.module(db)),
43-
Definition::ConstParam(it) => Some(it.module(db)),
39+
Definition::GenericParam(it) => Some(it.module(db)),
4440
Definition::Label(it) => Some(it.module(db)),
4541
}
4642
}
@@ -52,9 +48,7 @@ impl Definition {
5248
Definition::ModuleDef(def) => def.definition_visibility(db),
5349
Definition::SelfType(_) => None,
5450
Definition::Local(_) => None,
55-
Definition::TypeParam(_) => None,
56-
Definition::LifetimeParam(_) => None,
57-
Definition::ConstParam(_) => None,
51+
Definition::GenericParam(_) => None,
5852
Definition::Label(_) => None,
5953
}
6054
}
@@ -80,9 +74,7 @@ impl Definition {
8074
},
8175
Definition::SelfType(_) => return None,
8276
Definition::Local(it) => it.name(db)?,
83-
Definition::TypeParam(it) => it.name(db),
84-
Definition::LifetimeParam(it) => it.name(db),
85-
Definition::ConstParam(it) => it.name(db),
77+
Definition::GenericParam(it) => it.name(db),
8678
Definition::Label(it) => it.name(db),
8779
};
8880
Some(name)
@@ -235,11 +227,11 @@ impl NameClass {
235227
},
236228
ast::TypeParam(it) => {
237229
let def = sema.to_def(&it)?;
238-
Some(NameClass::Definition(Definition::TypeParam(def)))
230+
Some(NameClass::Definition(Definition::GenericParam(def.into())))
239231
},
240232
ast::ConstParam(it) => {
241233
let def = sema.to_def(&it)?;
242-
Some(NameClass::Definition(Definition::ConstParam(def)))
234+
Some(NameClass::Definition(Definition::GenericParam(def.into())))
243235
},
244236
_ => None,
245237
}
@@ -257,7 +249,7 @@ impl NameClass {
257249
match parent {
258250
ast::LifetimeParam(it) => {
259251
let def = sema.to_def(&it)?;
260-
Some(NameClass::Definition(Definition::LifetimeParam(def)))
252+
Some(NameClass::Definition(Definition::GenericParam(def.into())))
261253
},
262254
ast::Label(it) => {
263255
let def = sema.to_def(&it)?;
@@ -393,15 +385,17 @@ impl NameRefClass {
393385
| SyntaxKind::WHERE_PRED
394386
| SyntaxKind::REF_TYPE => sema
395387
.resolve_lifetime_param(lifetime)
396-
.map(Definition::LifetimeParam)
388+
.map(GenericParam::LifetimeParam)
389+
.map(Definition::GenericParam)
397390
.map(NameRefClass::Definition),
398391
// lifetime bounds, as in the 'b in 'a: 'b aren't wrapped in TypeBound nodes so we gotta check
399392
// if our lifetime is in a LifetimeParam without being the constrained lifetime
400393
_ if ast::LifetimeParam::cast(parent).and_then(|param| param.lifetime()).as_ref()
401394
!= Some(lifetime) =>
402395
{
403396
sema.resolve_lifetime_param(lifetime)
404-
.map(Definition::LifetimeParam)
397+
.map(GenericParam::LifetimeParam)
398+
.map(Definition::GenericParam)
405399
.map(NameRefClass::Definition)
406400
}
407401
_ => None,
@@ -422,10 +416,10 @@ impl From<PathResolution> for Definition {
422416
Definition::ModuleDef(def)
423417
}
424418
PathResolution::Local(local) => Definition::Local(local),
425-
PathResolution::TypeParam(par) => Definition::TypeParam(par),
419+
PathResolution::TypeParam(par) => Definition::GenericParam(par.into()),
426420
PathResolution::Macro(def) => Definition::Macro(def),
427421
PathResolution::SelfType(impl_def) => Definition::SelfType(impl_def),
428-
PathResolution::ConstParam(par) => Definition::ConstParam(par),
422+
PathResolution::ConstParam(par) => Definition::GenericParam(par.into()),
429423
}
430424
}
431425
}

crates/ide_db/src/search.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl Definition {
136136
return SearchScope::new(res);
137137
}
138138

139-
if let Definition::LifetimeParam(param) = self {
139+
if let Definition::GenericParam(hir::GenericParam::LifetimeParam(param)) = self {
140140
let range = match param.parent(db) {
141141
hir::GenericDef::Function(it) => {
142142
it.source(db).and_then(|src| Some(src.value.syntax().text_range()))

0 commit comments

Comments
 (0)