about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorAndrew Paseltiner <apaseltiner@gmail.com>2013-03-11 16:47:23 -0400
committerAndrew Paseltiner <apaseltiner@gmail.com>2013-03-12 12:52:39 -0400
commit24efea720860e1dc8d4d1035f1ea8d56a3498614 (patch)
tree838e8d82a18edfba22e497e76281f2664aa95dd8 /src/libsyntax
parente9a0db6abd40913f3b366a62ebf0f59adac57bb6 (diff)
downloadrust-24efea720860e1dc8d4d1035f1ea8d56a3498614.tar.gz
rust-24efea720860e1dc8d4d1035f1ea8d56a3498614.zip
syntax: implement #[deriving] meta-attribute
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/base.rs3
-rw-r--r--src/libsyntax/ext/deriving.rs42
2 files changed, 45 insertions, 0 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs
index 23cabc09946..1edaebefedb 100644
--- a/src/libsyntax/ext/base.rs
+++ b/src/libsyntax/ext/base.rs
@@ -148,6 +148,9 @@ pub fn syntax_expander_table() -> SyntaxEnv {
     syntax_expanders.insert(@~"log_syntax",
                             builtin_normal_tt(
                                 ext::log_syntax::expand_syntax_ext));
+    syntax_expanders.insert(@~"deriving",
+                            @SE(ItemDecorator(
+                                ext::deriving::expand_meta_deriving)));
     syntax_expanders.insert(@~"deriving_eq",
                             @SE(ItemDecorator(
                                 ext::deriving::expand_deriving_eq)));
diff --git a/src/libsyntax/ext/deriving.rs b/src/libsyntax/ext/deriving.rs
index efea962a089..093327ec32e 100644
--- a/src/libsyntax/ext/deriving.rs
+++ b/src/libsyntax/ext/deriving.rs
@@ -56,6 +56,48 @@ type ExpandDerivingEnumDefFn = &self/fn(ext_ctxt,
                                         ident,
                                         y: &Generics) -> @item;
 
+pub fn expand_meta_deriving(cx: ext_ctxt,
+                            _span: span,
+                            mitem: @meta_item,
+                            in_items: ~[@item])
+                         -> ~[@item] {
+    use ast::{meta_list, meta_name_value, meta_word};
+
+    match mitem.node {
+        meta_name_value(_, l) => {
+            cx.span_err(l.span, ~"unexpected value in `deriving`");
+            in_items
+        }
+        meta_word(_) | meta_list(_, []) => {
+            cx.span_warn(mitem.span, ~"empty trait list in `deriving`");
+            in_items
+        }
+        meta_list(_, titems) => {
+            do titems.foldr(in_items) |&titem, in_items| {
+                match titem.node {
+                    meta_name_value(tname, _) |
+                    meta_list(tname, _) |
+                    meta_word(tname) => {
+                        match *tname {
+                            ~"Clone" => expand_deriving_clone(cx,
+                                titem.span, titem, in_items),
+                            ~"Eq" => expand_deriving_eq(cx, titem.span,
+                                titem, in_items),
+                            ~"IterBytes" => expand_deriving_iter_bytes(cx,
+                                titem.span, titem, in_items),
+                            tname => {
+                                cx.span_err(titem.span, fmt!("unknown \
+                                    `deriving` trait: `%s`", tname));
+                                in_items
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
 pub fn expand_deriving_eq(cx: ext_ctxt,
                           span: span,
                           _mitem: @meta_item,