Skip to content

Commit dcbb77c

Browse files
bors[bot]Veykrilmatklad
authored
Merge #7206 #7231
7206: Use hir::GenericParam in ide_db::Definition instead of relisting all 3 r=Veykril a=Veykril Basically just this: ```diff pub enum Definition { Macro(MacroDef), Field(Field), ModuleDef(ModuleDef), SelfType(Impl), Local(Local), - TypeParam(TypeParam), - LifetimeParam(LifetimeParam), - ConstParam(ConstParam), + GenericParam(GenericParam), Label(Label), } ``` 7231: Cleaner API r=matklad a=matklad bors r+ 🤖 Co-authored-by: Lukas Wirth <[email protected]> Co-authored-by: Aleksey Kladov <[email protected]>
3 parents f90664b + b795128 + fc3fc57 commit dcbb77c

File tree

12 files changed

+75
-51
lines changed

12 files changed

+75
-51
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/src/syntax_highlighting/highlights.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,20 @@ impl Node {
5151
}
5252
}
5353

54-
let (start, len) =
54+
let overlapping =
5555
equal_range_by(&self.nested, |n| ordering(n.hl_range.range, hl_range.range));
5656

57-
if len == 1 && self.nested[start].hl_range.range.contains_range(hl_range.range) {
58-
return self.nested[start].add(hl_range);
57+
if overlapping.len() == 1
58+
&& self.nested[overlapping.start].hl_range.range.contains_range(hl_range.range)
59+
{
60+
return self.nested[overlapping.start].add(hl_range);
5961
}
6062

6163
let nested = self
6264
.nested
63-
.splice(start..start + len, iter::once(Node::new(hl_range)))
65+
.splice(overlapping.clone(), iter::once(Node::new(hl_range)))
6466
.collect::<Vec<_>>();
65-
self.nested[start].nested = nested;
67+
self.nested[overlapping.start].nested = nested;
6668
}
6769

6870
fn flatten(&self, acc: &mut Vec<HlRange>) {

crates/ide/src/syntax_highlighting/injector.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ impl Injector {
3333
&self.buf
3434
}
3535
pub(super) fn map_range_up(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ {
36-
let (start, len) = equal_range_by(&self.ranges, |&(r, _)| ordering(r, range));
37-
(start..start + len).filter_map(move |i| {
36+
equal_range_by(&self.ranges, |&(r, _)| ordering(r, range)).filter_map(move |i| {
3837
let (target_range, delta) = self.ranges[i];
3938
let intersection = target_range.intersect(range).unwrap();
4039
Some(intersection + delta?)

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()))

crates/stdx/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,13 @@ where
152152
left
153153
}
154154

155-
pub fn equal_range_by<T, F>(slice: &[T], mut key: F) -> (usize, usize)
155+
pub fn equal_range_by<T, F>(slice: &[T], mut key: F) -> ops::Range<usize>
156156
where
157157
F: FnMut(&T) -> Ordering,
158158
{
159159
let start = partition_point(slice, |it| key(it) == Ordering::Less);
160160
let len = partition_point(&slice[start..], |it| key(it) == Ordering::Equal);
161-
(start, len)
161+
start..start + len
162162
}
163163

164164
pub struct JodChild(pub process::Child);

0 commit comments

Comments
 (0)