]> git.lizzy.rs Git - rust.git/commitdiff
macro-generate froms
authorAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 24 Jan 2019 16:12:11 +0000 (19:12 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 24 Jan 2019 16:16:25 +0000 (19:16 +0300)
crates/ra_hir/src/code_model_api.rs
crates/ra_hir/src/generics.rs
crates/ra_hir/src/lib.rs
crates/ra_hir/src/ty.rs

index a094268caed5549ab0a6fa820979831c40dd29c0..4b79358e4b86aae446965cf887862d281b033716 100644 (file)
@@ -70,30 +70,7 @@ pub enum ModuleDef {
     Enum(Enum),
     Def(DefId),
 }
-//FIXME: change to from
-impl From<Module> for ModuleDef {
-    fn from(it: Module) -> ModuleDef {
-        ModuleDef::Module(it)
-    }
-}
-
-impl From<Function> for ModuleDef {
-    fn from(it: Function) -> ModuleDef {
-        ModuleDef::Function(it)
-    }
-}
-
-impl From<Struct> for ModuleDef {
-    fn from(it: Struct) -> ModuleDef {
-        ModuleDef::Struct(it)
-    }
-}
-
-impl From<Enum> for ModuleDef {
-    fn from(it: Enum) -> ModuleDef {
-        ModuleDef::Enum(it)
-    }
-}
+impl_froms!(ModuleDef: Module, Function, Struct, Enum);
 
 impl From<DefId> for ModuleDef {
     fn from(it: DefId) -> ModuleDef {
index df23871c76a281ffa4dd8da3ce07861b9fb27738..a8cacbb4ad7b54150b07585024016dfb1aa63558 100644 (file)
@@ -29,24 +29,7 @@ pub enum GenericDef {
     Enum(Enum),
     Def(DefId),
 }
-
-impl From<Function> for GenericDef {
-    fn from(func: Function) -> GenericDef {
-        GenericDef::Function(func)
-    }
-}
-
-impl From<Struct> for GenericDef {
-    fn from(s: Struct) -> GenericDef {
-        GenericDef::Struct(s)
-    }
-}
-
-impl From<Enum> for GenericDef {
-    fn from(e: Enum) -> GenericDef {
-        GenericDef::Enum(e)
-    }
-}
+impl_froms!(GenericDef: Function, Struct, Enum);
 
 impl From<DefId> for GenericDef {
     fn from(def_id: DefId) -> GenericDef {
index 5d63718924e003e8ea5a36c51a92ae549df3fe9a..33438509c7218a05826db5140828dbff2619c089 100644 (file)
@@ -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;
index b81899661483ffc74e1cca6ac00dcd1fdae0bfe3..fcf8a1dbb091472caa429a48510d4a5bd671a507 100644 (file)
@@ -168,18 +168,7 @@ pub enum AdtDef {
     Struct(Struct),
     Enum(Enum),
 }
-
-impl From<Struct> for AdtDef {
-    fn from(s: Struct) -> AdtDef {
-        AdtDef::Struct(s)
-    }
-}
-
-impl From<Enum> for AdtDef {
-    fn from(e: Enum) -> AdtDef {
-        AdtDef::Enum(e)
-    }
-}
+impl_froms!(AdtDef: Struct, Enum);
 
 impl AdtDef {
     fn krate(self, db: &impl HirDatabase) -> Option<Crate> {
@@ -701,24 +690,7 @@ pub enum TypableDef {
     Enum(Enum),
     Def(DefId),
 }
-
-impl From<Function> for TypableDef {
-    fn from(func: Function) -> TypableDef {
-        TypableDef::Function(func)
-    }
-}
-
-impl From<Struct> for TypableDef {
-    fn from(s: Struct) -> TypableDef {
-        TypableDef::Struct(s)
-    }
-}
-
-impl From<Enum> for TypableDef {
-    fn from(e: Enum) -> TypableDef {
-        TypableDef::Enum(e)
-    }
-}
+impl_froms!(TypableDef: Function, Struct, Enum);
 
 impl From<DefId> for TypableDef {
     fn from(func: DefId) -> TypableDef {
@@ -763,12 +735,7 @@ pub enum VariantDef {
     Struct(Struct),
     Def(DefId), // EnumVariant
 }
-
-impl From<Struct> for VariantDef {
-    fn from(struct_: Struct) -> VariantDef {
-        VariantDef::Struct(struct_)
-    }
-}
+impl_froms!(VariantDef: Struct);
 
 impl From<DefId> for VariantDef {
     fn from(def_id: DefId) -> VariantDef {