Static and const parsing
diff --git a/src/data.rs b/src/data.rs
index 7082363..2f1cca7 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -192,9 +192,7 @@
             for attr in &self.attrs {
                 attr.to_tokens(tokens);
             }
-            if let Visibility::Public = self.vis {
-                tokens.append("pub");
-            }
+            self.vis.to_tokens(tokens);
             if let Some(ref ident) = self.ident {
                 ident.to_tokens(tokens);
                 tokens.append(":");
@@ -203,6 +201,14 @@
         }
     }
 
+    impl ToTokens for Visibility {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            if let Visibility::Public = *self {
+                tokens.append("pub");
+            }
+        }
+    }
+
     impl ToTokens for Discriminant {
         fn to_tokens(&self, tokens: &mut Tokens) {
             Lit::Int(self.value, self.ty).to_tokens(tokens);
diff --git a/src/expr.rs b/src/expr.rs
index e94fe9e..ed33b3e 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -653,8 +653,48 @@
     impl ToTokens for Expr {
         fn to_tokens(&self, tokens: &mut Tokens) {
             match *self {
+                Expr::Box(ref _inner) => unimplemented!(),
+                Expr::Vec(ref _inner) => unimplemented!(),
+                Expr::Call(ref _func, ref _args) => unimplemented!(),
+                Expr::MethodCall(ref _ident, ref _ascript, ref _args) => unimplemented!(),
+                Expr::Tup(ref fields) => {
+                    tokens.append("(");
+                    tokens.append_separated(fields, ",");
+                    if fields.len() == 1 {
+                        tokens.append(",");
+                    }
+                    tokens.append(")");
+                }
+                Expr::Binary(_op, ref _left, ref _right) => unimplemented!(),
+                Expr::Unary(_op, ref _expr) => unimplemented!(),
                 Expr::Lit(ref lit) => lit.to_tokens(tokens),
-                _ => unimplemented!(),
+                Expr::Cast(ref _expr, ref _ty) => unimplemented!(),
+                Expr::Type(ref _expr, ref _ty) => unimplemented!(),
+                Expr::If(ref _cond, ref _then_block, ref _else_block) => unimplemented!(),
+                Expr::IfLet(ref _pat, ref _expr, ref _then_block, ref _else_block) => unimplemented!(),
+                Expr::While(ref _cond, ref _body, ref _label) => unimplemented!(),
+                Expr::WhileLet(ref _pat, ref _expr, ref _body, ref _label) => unimplemented!(),
+                Expr::ForLoop(ref _pat, ref _expr, ref _body, ref _label) => unimplemented!(),
+                Expr::Loop(ref _body, ref _label) => unimplemented!(),
+                Expr::Match(ref _expr, ref _arms) => unimplemented!(),
+                Expr::Closure(_capture, ref _decl, ref _body) => unimplemented!(),
+                Expr::Block(ref _block) => unimplemented!(),
+                Expr::Assign(ref _var, ref _expr) => unimplemented!(),
+                Expr::AssignOp(_op, ref _var, ref _expr) => unimplemented!(),
+                Expr::Field(ref _expr, ref _field) => unimplemented!(),
+                Expr::TupField(ref _expr, _field) => unimplemented!(),
+                Expr::Index(ref _expr, ref _index) => unimplemented!(),
+                Expr::Range(ref _from, ref _to, _limits) => unimplemented!(),
+                Expr::Path(ref _qself, ref _path) => unimplemented!(),
+                Expr::AddrOf(_mutability, ref _expr) => unimplemented!(),
+                Expr::Break(ref _label) => unimplemented!(),
+                Expr::Continue(ref _label) => unimplemented!(),
+                Expr::Ret(ref _expr) => unimplemented!(),
+                Expr::Mac(ref _mac) => unimplemented!(),
+                Expr::Struct(ref _path, ref _fields, ref _base) => unimplemented!(),
+                Expr::Repeat(ref _expr, ref _times) => unimplemented!(),
+                Expr::Paren(ref _inner) => unimplemented!(),
+                Expr::Try(ref _expr) => unimplemented!(),
             }
         }
     }
diff --git a/src/item.rs b/src/item.rs
index 86c7df9..011a6ff 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -211,15 +211,19 @@
     use super::*;
     use attr::parsing::outer_attr;
     use data::parsing::visibility;
+    use expr::parsing::expr;
     use ident::parsing::ident;
     use macro_input::{Body, MacroInput};
     use macro_input::parsing::macro_input;
+    use ty::parsing::{mutability, ty};
 
     named!(pub item -> Item, alt!(
         item_extern_crate
         // TODO: Use
-        // TODO: Static
-        // TODO: Const
+        |
+        item_static
+        |
+        item_const
         // TODO: Fn
         // TODO: Mod
         // TODO: ForeignMod
@@ -258,6 +262,43 @@
         })
     ));
 
+    named!(item_static -> Item, do_parse!(
+        attrs: many0!(outer_attr) >>
+        vis: visibility >>
+        keyword!("static") >>
+        mutability: mutability >>
+        id: ident >>
+        punct!(":") >>
+        ty: ty >>
+        punct!("=") >>
+        value: expr >>
+        punct!(";") >>
+        (Item {
+            ident: id,
+            vis: vis,
+            attrs: attrs,
+            node: ItemKind::Static(Box::new(ty), mutability, Box::new(value)),
+        })
+    ));
+
+    named!(item_const -> Item, do_parse!(
+        attrs: many0!(outer_attr) >>
+        vis: visibility >>
+        keyword!("const") >>
+        id: ident >>
+        punct!(":") >>
+        ty: ty >>
+        punct!("=") >>
+        value: expr >>
+        punct!(";") >>
+        (Item {
+            ident: id,
+            vis: vis,
+            attrs: attrs,
+            node: ItemKind::Const(Box::new(ty), Box::new(value)),
+        })
+    ));
+
     named!(item_struct_or_enum -> Item, map!(
         macro_input,
         |def: MacroInput| Item {
@@ -280,7 +321,7 @@
 mod printing {
     use super::*;
     use attr::FilterAttrs;
-    use data::{VariantData, Visibility};
+    use data::VariantData;
     use quote::{Tokens, ToTokens};
 
     impl ToTokens for Item {
@@ -300,16 +341,33 @@
                     tokens.append(";");
                 }
                 ItemKind::Use(ref _view_path) => unimplemented!(),
-                ItemKind::Static(ref _ty, ref _mutability, ref _expr) => unimplemented!(),
-                ItemKind::Const(ref _ty, ref _expr) => unimplemented!(),
+                ItemKind::Static(ref ty, ref mutability, ref expr) => {
+                    self.vis.to_tokens(tokens);
+                    tokens.append("static");
+                    mutability.to_tokens(tokens);
+                    self.ident.to_tokens(tokens);
+                    tokens.append(":");
+                    ty.to_tokens(tokens);
+                    tokens.append("=");
+                    expr.to_tokens(tokens);
+                    tokens.append(";");
+                }
+                ItemKind::Const(ref ty, ref expr) => {
+                    self.vis.to_tokens(tokens);
+                    tokens.append("const");
+                    self.ident.to_tokens(tokens);
+                    tokens.append(":");
+                    ty.to_tokens(tokens);
+                    tokens.append("=");
+                    expr.to_tokens(tokens);
+                    tokens.append(";");
+                }
                 ItemKind::Fn(ref _decl, _unsafety, _constness, ref _abi, ref _generics, ref _block) => unimplemented!(),
                 ItemKind::Mod(ref _items) => unimplemented!(),
                 ItemKind::ForeignMod(ref _foreign_mod) => unimplemented!(),
                 ItemKind::Ty(ref _ty, ref _generics) => unimplemented!(),
                 ItemKind::Enum(ref variants, ref generics) => {
-                    if let Visibility::Public = self.vis {
-                        tokens.append("pub");
-                    }
+                    self.vis.to_tokens(tokens);
                     tokens.append("enum");
                     self.ident.to_tokens(tokens);
                     generics.to_tokens(tokens);
@@ -322,9 +380,7 @@
                     tokens.append("}");
                 }
                 ItemKind::Struct(ref variant_data, ref generics) => {
-                    if let Visibility::Public = self.vis {
-                        tokens.append("pub");
-                    }
+                    self.vis.to_tokens(tokens);
                     tokens.append("struct");
                     self.ident.to_tokens(tokens);
                     generics.to_tokens(tokens);
diff --git a/src/macro_input.rs b/src/macro_input.rs
index 976b7ce..149b6d7 100644
--- a/src/macro_input.rs
+++ b/src/macro_input.rs
@@ -56,7 +56,7 @@
 mod printing {
     use super::*;
     use attr::FilterAttrs;
-    use data::{Visibility, VariantData};
+    use data::VariantData;
     use quote::{Tokens, ToTokens};
 
     impl ToTokens for MacroInput {
@@ -64,9 +64,7 @@
             for attr in self.attrs.outer() {
                 attr.to_tokens(tokens);
             }
-            if let Visibility::Public = self.vis {
-                tokens.append("pub");
-            }
+            self.vis.to_tokens(tokens);
             match self.body {
                 Body::Enum(_) => tokens.append("enum"),
                 Body::Struct(_) => tokens.append("struct"),
diff --git a/src/ty.rs b/src/ty.rs
index 80fe7b8..3ee68e5 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -337,7 +337,7 @@
         (Ty::Paren(Box::new(elem)))
     ));
 
-    named!(mutability -> Mutability, alt!(
+    named!(pub mutability -> Mutability, alt!(
         do_parse!(
             keyword!("mut") >>
             (Mutability::Mutable)
@@ -447,9 +447,7 @@
                 Ty::Rptr(ref lifetime, ref target) => {
                     tokens.append("&");
                     lifetime.to_tokens(tokens);
-                    if let Mutability::Mutable = target.mutability {
-                        tokens.append("mut");
-                    }
+                    target.mutability.to_tokens(tokens);
                     target.ty.to_tokens(tokens);
                 }
                 Ty::BareFn(ref func) => {
@@ -508,6 +506,14 @@
         }
     }
 
+    impl ToTokens for Mutability {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            if let Mutability::Mutable = *self {
+                tokens.append("mut");
+            }
+        }
+    }
+
     impl ToTokens for Path {
         fn to_tokens(&self, tokens: &mut Tokens) {
             for (i, segment) in self.segments.iter().enumerate() {