Skip to content

Commit 3d7ec11

Browse files
committed
Reduce copy-paste
1 parent 2045ac9 commit 3d7ec11

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

crates/ra_hir/src/from_source.rs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
use either::Either;
33

44
use hir_def::{
5-
child_from_source::ChildFromSource, AstItemDef, EnumVariantId, LocationCtx, ModuleId, VariantId,
5+
child_from_source::ChildFromSource, AstItemDef, EnumVariantId, ImplId, LocationCtx, ModuleId,
6+
TraitId, VariantId,
67
};
78
use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind};
89
use ra_syntax::{
@@ -52,24 +53,18 @@ impl FromSource for Trait {
5253
impl FromSource for Function {
5354
type Ast = ast::FnDef;
5455
fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> {
55-
match Container::find(db, src.as_ref().map(|it| it.syntax()))? {
56-
Container::Trait(it) => it.id.child_from_source(db, src),
57-
Container::ImplBlock(it) => it.id.child_from_source(db, src),
58-
Container::Module(it) => it.id.child_from_source(db, src),
59-
}
60-
.map(Function::from)
56+
Container::find(db, src.as_ref().map(|it| it.syntax()))?
57+
.child_from_source(db, src)
58+
.map(Function::from)
6159
}
6260
}
6361

6462
impl FromSource for Const {
6563
type Ast = ast::ConstDef;
6664
fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> {
67-
match Container::find(db, src.as_ref().map(|it| it.syntax()))? {
68-
Container::Trait(it) => it.id.child_from_source(db, src),
69-
Container::ImplBlock(it) => it.id.child_from_source(db, src),
70-
Container::Module(it) => it.id.child_from_source(db, src),
71-
}
72-
.map(Const::from)
65+
Container::find(db, src.as_ref().map(|it| it.syntax()))?
66+
.child_from_source(db, src)
67+
.map(Const::from)
7368
}
7469
}
7570
impl FromSource for Static {
@@ -85,12 +80,9 @@ impl FromSource for Static {
8580
impl FromSource for TypeAlias {
8681
type Ast = ast::TypeAliasDef;
8782
fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> {
88-
match Container::find(db, src.as_ref().map(|it| it.syntax()))? {
89-
Container::Trait(it) => it.id.child_from_source(db, src),
90-
Container::ImplBlock(it) => it.id.child_from_source(db, src),
91-
Container::Module(it) => it.id.child_from_source(db, src),
92-
}
93-
.map(TypeAlias::from)
83+
Container::find(db, src.as_ref().map(|it| it.syntax()))?
84+
.child_from_source(db, src)
85+
.map(TypeAlias::from)
9486
}
9587
}
9688

@@ -263,3 +255,22 @@ impl Container {
263255
Some(Container::Module(c))
264256
}
265257
}
258+
259+
impl<CHILD, SOURCE> ChildFromSource<CHILD, SOURCE> for Container
260+
where
261+
TraitId: ChildFromSource<CHILD, SOURCE>,
262+
ImplId: ChildFromSource<CHILD, SOURCE>,
263+
ModuleId: ChildFromSource<CHILD, SOURCE>,
264+
{
265+
fn child_from_source(
266+
&self,
267+
db: &impl DefDatabase,
268+
child_source: InFile<SOURCE>,
269+
) -> Option<CHILD> {
270+
match self {
271+
Container::Trait(it) => it.id.child_from_source(db, child_source),
272+
Container::ImplBlock(it) => it.id.child_from_source(db, child_source),
273+
Container::Module(it) => it.id.child_from_source(db, child_source),
274+
}
275+
}
276+
}

0 commit comments

Comments
 (0)