Implement some atom exprs
diff --git a/src/ty.rs b/src/ty.rs
index 9052968..2ca5e57 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -249,7 +249,9 @@
 #[cfg(feature = "parsing")]
 pub mod parsing {
     use super::*;
+
     use parse::{Parse, ParseStream, Result};
+    use path;
 
     impl Parse for Type {
         fn parse(input: ParseStream) -> Result<Self> {
@@ -559,58 +561,13 @@
 
     impl Parse for TypePath {
         fn parse(input: ParseStream) -> Result<Self> {
-            let (qself, mut path) = if input.peek(Token![<]) {
-                let lt_token: Token![<] = input.parse()?;
-                let this: Type = input.parse()?;
-                let path = if input.peek(Token![as]) {
-                    let as_token: Token![as] = input.parse()?;
-                    let path: Path = input.parse()?;
-                    Some((as_token, path))
-                } else {
-                    None
-                };
-                let gt_token: Token![>] = input.parse()?;
-                let colon2_token: Token![::] = input.parse()?;
-                let rest = input.parse_synom(Punctuated::parse_separated_nonempty)?;
-                let (position, as_token, path) = match path {
-                    Some((as_token, mut path)) => {
-                        let pos = path.segments.len();
-                        path.segments.push_punct(colon2_token);
-                        path.segments.extend(rest.into_pairs());
-                        (pos, Some(as_token), path)
-                    }
-                    None => {
-                        let path = Path {
-                            leading_colon: Some(colon2_token),
-                            segments: rest,
-                        };
-                        (0, None, path)
-                    }
-                };
-                let qself = QSelf {
-                    lt_token: lt_token,
-                    ty: Box::new(this),
-                    position: position,
-                    as_token: as_token,
-                    gt_token: gt_token,
-                };
-                (Some(qself), path)
-            } else {
-                let path: Path = input.parse()?;
-                (None, path)
-            };
+            let (qself, mut path) = path::parsing::qpath(input, false)?;
 
-            let parenthesized = if path.segments.last().unwrap().value().arguments.is_empty()
+            if path.segments.last().unwrap().value().arguments.is_empty()
                 && input.peek(token::Paren)
             {
                 let args: ParenthesizedGenericArguments = input.parse()?;
-                Some(args)
-            } else {
-                None
-            };
-
-            if let Some(parenthesized) = parenthesized {
-                let parenthesized = PathArguments::Parenthesized(parenthesized);
+                let parenthesized = PathArguments::Parenthesized(args);
                 path.segments.last_mut().unwrap().value_mut().arguments = parenthesized;
             }