From a7c0336a7516e4973a9efb86bfb97cf290441413 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 24 Jan 2019 19:12:11 +0300 Subject: macro-generate froms --- crates/ra_hir/src/code_model_api.rs | 25 +----------------------- crates/ra_hir/src/generics.rs | 19 +----------------- crates/ra_hir/src/lib.rs | 12 ++++++++++++ crates/ra_hir/src/ty.rs | 39 +++---------------------------------- 4 files changed, 17 insertions(+), 78 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index a094268ca..4b79358e4 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -70,30 +70,7 @@ pub enum ModuleDef { Enum(Enum), Def(DefId), } -//FIXME: change to from -impl From for ModuleDef { - fn from(it: Module) -> ModuleDef { - ModuleDef::Module(it) - } -} - -impl From for ModuleDef { - fn from(it: Function) -> ModuleDef { - ModuleDef::Function(it) - } -} - -impl From for ModuleDef { - fn from(it: Struct) -> ModuleDef { - ModuleDef::Struct(it) - } -} - -impl From for ModuleDef { - fn from(it: Enum) -> ModuleDef { - ModuleDef::Enum(it) - } -} +impl_froms!(ModuleDef: Module, Function, Struct, Enum); impl From for ModuleDef { fn from(it: DefId) -> ModuleDef { diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index df23871c7..a8cacbb4a 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -29,24 +29,7 @@ pub enum GenericDef { Enum(Enum), Def(DefId), } - -impl From for GenericDef { - fn from(func: Function) -> GenericDef { - GenericDef::Function(func) - } -} - -impl From for GenericDef { - fn from(s: Struct) -> GenericDef { - GenericDef::Struct(s) - } -} - -impl From for GenericDef { - fn from(e: Enum) -> GenericDef { - GenericDef::Enum(e) - } -} +impl_froms!(GenericDef: Function, Struct, Enum); impl From for GenericDef { fn from(def_id: DefId) -> GenericDef { diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 5d6371892..33438509c 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -5,6 +5,18 @@ //! to a particular crate instance. That is, it has cfg flags and features //! applied. So, the relation between syntax and HIR is many-to-one. +macro_rules! impl_froms { + ($e:ident: $($v:ident), *) => { + $( + impl From<$v> for $e { + fn from(it: $v) -> $e { + $e::$v(it) + } + } + )* + } +} + pub mod db; #[cfg(test)] mod mock; diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index b81899661..fcf8a1dbb 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs @@ -168,18 +168,7 @@ pub enum AdtDef { Struct(Struct), Enum(Enum), } - -impl From for AdtDef { - fn from(s: Struct) -> AdtDef { - AdtDef::Struct(s) - } -} - -impl From for AdtDef { - fn from(e: Enum) -> AdtDef { - AdtDef::Enum(e) - } -} +impl_froms!(AdtDef: Struct, Enum); impl AdtDef { fn krate(self, db: &impl HirDatabase) -> Option { @@ -701,24 +690,7 @@ pub enum TypableDef { Enum(Enum), Def(DefId), } - -impl From for TypableDef { - fn from(func: Function) -> TypableDef { - TypableDef::Function(func) - } -} - -impl From for TypableDef { - fn from(s: Struct) -> TypableDef { - TypableDef::Struct(s) - } -} - -impl From for TypableDef { - fn from(e: Enum) -> TypableDef { - TypableDef::Enum(e) - } -} +impl_froms!(TypableDef: Function, Struct, Enum); impl From for TypableDef { fn from(func: DefId) -> TypableDef { @@ -763,12 +735,7 @@ pub enum VariantDef { Struct(Struct), Def(DefId), // EnumVariant } - -impl From for VariantDef { - fn from(struct_: Struct) -> VariantDef { - VariantDef::Struct(struct_) - } -} +impl_froms!(VariantDef: Struct); impl From for VariantDef { fn from(def_id: DefId) -> VariantDef { -- cgit v1.2.3