replace a chain of if let by macro

This commit is contained in:
Ekaterina Babshukova 2019-10-03 03:00:47 +03:00
parent d6ae1b5f0f
commit 0b5d0a41fd
3 changed files with 87 additions and 255 deletions

View file

@ -12,8 +12,7 @@ use crate::{
ids::{AstItemDef, LocationCtx},
name::AsName,
AssocItem, Const, Crate, Enum, EnumVariant, FieldSource, Function, HasSource, ImplBlock,
Module, ModuleDef, ModuleSource, Source, Static, Struct, StructField, Trait, TypeAlias, Union,
VariantDef,
Module, ModuleSource, Source, Static, Struct, StructField, Trait, TypeAlias, Union, VariantDef,
};
pub trait FromSource: Sized {
@ -148,43 +147,6 @@ impl FromSource for AssocItem {
}
}
// not fully matched
impl FromSource for ModuleDef {
type Ast = ast::ModuleItem;
fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> {
macro_rules! def {
($kind:ident, $ast:ident) => {
$kind::from_source(db, Source { file_id: src.file_id, ast: $ast })
.and_then(|it| Some(ModuleDef::from(it)))
};
}
match src.ast {
ast::ModuleItem::FnDef(f) => def!(Function, f),
ast::ModuleItem::ConstDef(c) => def!(Const, c),
ast::ModuleItem::TypeAliasDef(a) => def!(TypeAlias, a),
ast::ModuleItem::TraitDef(t) => def!(Trait, t),
ast::ModuleItem::StaticDef(s) => def!(Static, s),
ast::ModuleItem::StructDef(s) => {
let src = Source { file_id: src.file_id, ast: s };
let s = Struct::from_source(db, src)?;
Some(ModuleDef::Adt(s.into()))
}
ast::ModuleItem::EnumDef(e) => {
let src = Source { file_id: src.file_id, ast: e };
let e = Enum::from_source(db, src)?;
Some(ModuleDef::Adt(e.into()))
}
ast::ModuleItem::Module(ref m) if !m.has_semi() => {
let src = Source { file_id: src.file_id, ast: ModuleSource::Module(m.clone()) };
let module = Module::from_definition(db, src)?;
Some(ModuleDef::Module(module))
}
_ => None,
}
}
}
// FIXME: simplify it
impl ModuleSource {
pub fn from_position(