Skip to content

Commit a510021

Browse files
committed
Replace some more ide usages of ModuleDef with Definition
1 parent e42ff91 commit a510021

File tree

4 files changed

+132
-130
lines changed

4 files changed

+132
-130
lines changed

crates/ide/src/annotations.rs

Lines changed: 71 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use either::Either;
21
use hir::{HasSource, InFile, Semantics};
32
use ide_db::{
43
base_db::{FileId, FilePosition, FileRange},
4+
defs::Definition,
55
helpers::visit_file_defs,
66
RootDatabase,
77
};
@@ -62,91 +62,83 @@ pub(crate) fn annotations(
6262
}
6363
}
6464

65-
visit_file_defs(&Semantics::new(db), file_id, &mut |def| match def {
66-
Either::Left(def) => {
67-
let range = match def {
68-
hir::ModuleDef::Const(konst) if config.annotate_references => {
69-
konst.source(db).and_then(|node| name_range(&node, file_id))
70-
}
71-
hir::ModuleDef::Trait(trait_)
72-
if config.annotate_references || config.annotate_impls =>
73-
{
74-
trait_.source(db).and_then(|node| name_range(&node, file_id))
75-
}
76-
hir::ModuleDef::Adt(adt) => match adt {
77-
hir::Adt::Enum(enum_) => {
78-
if config.annotate_enum_variant_references {
79-
enum_
80-
.variants(db)
81-
.into_iter()
82-
.map(|variant| {
83-
variant.source(db).and_then(|node| name_range(&node, file_id))
84-
})
85-
.filter_map(std::convert::identity)
86-
.for_each(|range| {
87-
annotations.push(Annotation {
88-
range,
89-
kind: AnnotationKind::HasReferences {
90-
position: FilePosition {
91-
file_id,
92-
offset: range.start(),
93-
},
94-
data: None,
95-
},
96-
})
65+
visit_file_defs(&Semantics::new(db), file_id, &mut |def| {
66+
let range = match def {
67+
Definition::Const(konst) if config.annotate_references => {
68+
konst.source(db).and_then(|node| name_range(&node, file_id))
69+
}
70+
Definition::Trait(trait_) if config.annotate_references || config.annotate_impls => {
71+
trait_.source(db).and_then(|node| name_range(&node, file_id))
72+
}
73+
Definition::Adt(adt) => match adt {
74+
hir::Adt::Enum(enum_) => {
75+
if config.annotate_enum_variant_references {
76+
enum_
77+
.variants(db)
78+
.into_iter()
79+
.map(|variant| {
80+
variant.source(db).and_then(|node| name_range(&node, file_id))
81+
})
82+
.filter_map(std::convert::identity)
83+
.for_each(|range| {
84+
annotations.push(Annotation {
85+
range,
86+
kind: AnnotationKind::HasReferences {
87+
position: FilePosition { file_id, offset: range.start() },
88+
data: None,
89+
},
9790
})
98-
}
99-
if config.annotate_references || config.annotate_impls {
100-
enum_.source(db).and_then(|node| name_range(&node, file_id))
101-
} else {
102-
None
103-
}
91+
})
92+
}
93+
if config.annotate_references || config.annotate_impls {
94+
enum_.source(db).and_then(|node| name_range(&node, file_id))
95+
} else {
96+
None
10497
}
105-
_ => {
106-
if config.annotate_references || config.annotate_impls {
107-
adt.source(db).and_then(|node| name_range(&node, file_id))
108-
} else {
109-
None
110-
}
98+
}
99+
_ => {
100+
if config.annotate_references || config.annotate_impls {
101+
adt.source(db).and_then(|node| name_range(&node, file_id))
102+
} else {
103+
None
111104
}
105+
}
106+
},
107+
_ => None,
108+
};
109+
110+
let (range, offset) = match range {
111+
Some(range) => (range, range.start()),
112+
None => return,
113+
};
114+
115+
if config.annotate_impls && !matches!(def, Definition::Const(_)) {
116+
annotations.push(Annotation {
117+
range,
118+
kind: AnnotationKind::HasImpls {
119+
position: FilePosition { file_id, offset },
120+
data: None,
112121
},
113-
_ => None,
114-
};
115-
116-
let (range, offset) = match range {
117-
Some(range) => (range, range.start()),
118-
None => return,
119-
};
120-
121-
if config.annotate_impls && !matches!(def, hir::ModuleDef::Const(_)) {
122-
annotations.push(Annotation {
123-
range,
124-
kind: AnnotationKind::HasImpls {
125-
position: FilePosition { file_id, offset },
126-
data: None,
127-
},
128-
});
129-
}
130-
if config.annotate_references {
131-
annotations.push(Annotation {
132-
range,
133-
kind: AnnotationKind::HasReferences {
134-
position: FilePosition { file_id, offset },
135-
data: None,
136-
},
137-
});
138-
}
122+
});
123+
}
124+
if config.annotate_references {
125+
annotations.push(Annotation {
126+
range,
127+
kind: AnnotationKind::HasReferences {
128+
position: FilePosition { file_id, offset },
129+
data: None,
130+
},
131+
});
132+
}
139133

140-
fn name_range<T: HasName>(node: &InFile<T>, file_id: FileId) -> Option<TextRange> {
141-
if node.file_id == file_id.into() {
142-
node.value.name().map(|it| it.syntax().text_range())
143-
} else {
144-
// Node is outside the file we are adding annotations to (e.g. macros).
145-
None
146-
}
134+
fn name_range<T: HasName>(node: &InFile<T>, file_id: FileId) -> Option<TextRange> {
135+
if node.file_id == file_id.into() {
136+
node.value.name().map(|it| it.syntax().text_range())
137+
} else {
138+
// Node is outside the file we are adding annotations to (e.g. macros).
139+
None
147140
}
148141
}
149-
Either::Right(_) => (),
150142
});
151143

152144
if config.annotate_method_references {

crates/ide/src/runnables.rs

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ use std::fmt;
22

33
use ast::HasName;
44
use cfg::CfgExpr;
5-
use either::Either;
65
use hir::{AsAssocItem, HasAttrs, HasSource, HirDisplay, InFile, Semantics};
76
use ide_assists::utils::test_related_attribute;
87
use ide_db::{
98
base_db::{FilePosition, FileRange},
9+
defs::Definition,
1010
helpers::visit_file_defs,
1111
search::SearchScope,
1212
RootDatabase, SymbolKind,
@@ -138,8 +138,8 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
138138
}) {
139139
if let Some(def) = def {
140140
let file_id = match def {
141-
hir::ModuleDef::Module(it) => it.declaration_source(db).map(|src| src.file_id),
142-
hir::ModuleDef::Function(it) => it.source(db).map(|src| src.file_id),
141+
Definition::Module(it) => it.declaration_source(db).map(|src| src.file_id),
142+
Definition::Function(it) => it.source(db).map(|src| src.file_id),
143143
_ => None,
144144
};
145145
if let Some(file_id) = file_id.filter(|file| file.call_node(db).is_some()) {
@@ -150,32 +150,25 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
150150
res.push(runnable);
151151
}
152152
};
153-
visit_file_defs(&sema, file_id, &mut |def| match def {
154-
Either::Left(def) => {
155-
let runnable = match def {
156-
hir::ModuleDef::Module(it) => runnable_mod(&sema, it),
157-
hir::ModuleDef::Function(it) => runnable_fn(&sema, it),
158-
_ => None,
159-
};
160-
add_opt(runnable.or_else(|| module_def_doctest(sema.db, def)), Some(def));
161-
}
162-
Either::Right(impl_) => {
163-
add_opt(runnable_impl(&sema, &impl_), None);
164-
impl_
165-
.items(db)
166-
.into_iter()
167-
.map(|assoc| {
168-
(
169-
match assoc {
170-
hir::AssocItem::Function(it) => runnable_fn(&sema, it)
171-
.or_else(|| module_def_doctest(sema.db, it.into())),
172-
hir::AssocItem::Const(it) => module_def_doctest(sema.db, it.into()),
173-
hir::AssocItem::TypeAlias(it) => module_def_doctest(sema.db, it.into()),
174-
},
175-
assoc,
176-
)
177-
})
178-
.for_each(|(r, assoc)| add_opt(r, Some(assoc.into())));
153+
visit_file_defs(&sema, file_id, &mut |def| {
154+
let runnable = match def {
155+
Definition::Module(it) => runnable_mod(&sema, it),
156+
Definition::Function(it) => runnable_fn(&sema, it),
157+
Definition::SelfType(impl_) => runnable_impl(&sema, &impl_),
158+
_ => None,
159+
};
160+
add_opt(runnable.or_else(|| module_def_doctest(sema.db, def)), Some(def));
161+
if let Definition::SelfType(impl_) = def {
162+
impl_.items(db).into_iter().for_each(|assoc| {
163+
let runnable = match assoc {
164+
hir::AssocItem::Function(it) => {
165+
runnable_fn(&sema, it).or_else(|| module_def_doctest(sema.db, it.into()))
166+
}
167+
hir::AssocItem::Const(it) => module_def_doctest(sema.db, it.into()),
168+
hir::AssocItem::TypeAlias(it) => module_def_doctest(sema.db, it.into()),
169+
};
170+
add_opt(runnable, Some(assoc.into()))
171+
});
179172
}
180173
});
181174

@@ -392,17 +385,19 @@ fn runnable_mod_outline_definition(
392385
}
393386
}
394387

395-
fn module_def_doctest(db: &RootDatabase, def: hir::ModuleDef) -> Option<Runnable> {
388+
fn module_def_doctest(db: &RootDatabase, def: Definition) -> Option<Runnable> {
396389
let attrs = match def {
397-
hir::ModuleDef::Module(it) => it.attrs(db),
398-
hir::ModuleDef::Function(it) => it.attrs(db),
399-
hir::ModuleDef::Adt(it) => it.attrs(db),
400-
hir::ModuleDef::Variant(it) => it.attrs(db),
401-
hir::ModuleDef::Const(it) => it.attrs(db),
402-
hir::ModuleDef::Static(it) => it.attrs(db),
403-
hir::ModuleDef::Trait(it) => it.attrs(db),
404-
hir::ModuleDef::TypeAlias(it) => it.attrs(db),
405-
hir::ModuleDef::BuiltinType(_) => return None,
390+
Definition::Module(it) => it.attrs(db),
391+
Definition::Function(it) => it.attrs(db),
392+
Definition::Adt(it) => it.attrs(db),
393+
Definition::Variant(it) => it.attrs(db),
394+
Definition::Const(it) => it.attrs(db),
395+
Definition::Static(it) => it.attrs(db),
396+
Definition::Trait(it) => it.attrs(db),
397+
Definition::TypeAlias(it) => it.attrs(db),
398+
Definition::Macro(it) => it.attrs(db),
399+
Definition::SelfType(it) => it.attrs(db),
400+
_ => return None,
406401
};
407402
if !has_runnable_doc_test(&attrs) {
408403
return None;
@@ -440,7 +435,7 @@ fn module_def_doctest(db: &RootDatabase, def: hir::ModuleDef) -> Option<Runnable
440435
let test_id = path.map_or_else(|| TestId::Name(def_name.to_string()), TestId::Path);
441436

442437
let mut nav = match def {
443-
hir::ModuleDef::Module(def) => NavigationTarget::from_module_to_decl(db, def),
438+
Definition::Module(def) => NavigationTarget::from_module_to_decl(db, def),
444439
def => def.try_to_nav(db)?,
445440
};
446441
nav.focus_range = None;

crates/ide_db/src/defs.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,18 @@ impl NameRefClass {
516516
}
517517
}
518518

519+
impl_from!(
520+
Field, Module, Function, Adt, Variant, Const, Static, Trait, TypeAlias, BuiltinType, Local,
521+
GenericParam, Label
522+
for Definition
523+
);
524+
525+
impl From<Impl> for Definition {
526+
fn from(impl_: Impl) -> Self {
527+
Definition::SelfType(impl_)
528+
}
529+
}
530+
519531
impl AsAssocItem for Definition {
520532
fn as_assoc_item(self, db: &dyn hir::db::HirDatabase) -> Option<AssocItem> {
521533
match self {
@@ -527,11 +539,15 @@ impl AsAssocItem for Definition {
527539
}
528540
}
529541

530-
impl_from!(
531-
Field, Module, Function, Adt, Variant, Const, Static, Trait, TypeAlias, BuiltinType, Local,
532-
GenericParam, Label
533-
for Definition
534-
);
542+
impl From<AssocItem> for Definition {
543+
fn from(assoc_item: AssocItem) -> Self {
544+
match assoc_item {
545+
AssocItem::Function(it) => Definition::Function(it),
546+
AssocItem::Const(it) => Definition::Const(it),
547+
AssocItem::TypeAlias(it) => Definition::TypeAlias(it),
548+
}
549+
}
550+
}
535551

536552
impl From<PathResolution> for Definition {
537553
fn from(path_resolution: PathResolution) -> Self {

crates/ide_db/src/helpers.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ pub mod rust_doc;
1010
use std::{collections::VecDeque, iter};
1111

1212
use base_db::FileId;
13-
use either::Either;
1413
use hir::{ItemInNs, MacroDef, ModuleDef, Name, PathResolution, Semantics};
1514
use itertools::Itertools;
1615
use syntax::{
@@ -19,7 +18,7 @@ use syntax::{
1918
T,
2019
};
2120

22-
use crate::RootDatabase;
21+
use crate::{defs::Definition, RootDatabase};
2322

2423
pub use self::famous_defs::FamousDefs;
2524

@@ -122,7 +121,7 @@ pub fn mod_path_to_ast(path: &hir::ModPath) -> ast::Path {
122121
pub fn visit_file_defs(
123122
sema: &Semantics<RootDatabase>,
124123
file_id: FileId,
125-
cb: &mut dyn FnMut(Either<hir::ModuleDef, hir::Impl>),
124+
cb: &mut dyn FnMut(Definition),
126125
) {
127126
let db = sema.db;
128127
let module = match sema.to_module_def(file_id) {
@@ -134,12 +133,12 @@ pub fn visit_file_defs(
134133
if let ModuleDef::Module(submodule) = def {
135134
if let hir::ModuleSource::Module(_) = submodule.definition_source(db).value {
136135
defs.extend(submodule.declarations(db));
137-
submodule.impl_defs(db).into_iter().for_each(|impl_| cb(Either::Right(impl_)));
136+
submodule.impl_defs(db).into_iter().for_each(|impl_| cb(impl_.into()));
138137
}
139138
}
140-
cb(Either::Left(def));
139+
cb(def.into());
141140
}
142-
module.impl_defs(db).into_iter().for_each(|impl_| cb(Either::Right(impl_)));
141+
module.impl_defs(db).into_iter().for_each(|impl_| cb(impl_.into()));
143142
}
144143

145144
#[derive(Clone, Copy, Debug, PartialEq, Eq)]

0 commit comments

Comments
 (0)