diff options
| author | Andrew Paseltiner <apaseltiner@gmail.com> | 2013-03-11 16:47:23 -0400 |
|---|---|---|
| committer | Andrew Paseltiner <apaseltiner@gmail.com> | 2013-03-12 12:52:39 -0400 |
| commit | 24efea720860e1dc8d4d1035f1ea8d56a3498614 (patch) | |
| tree | 838e8d82a18edfba22e497e76281f2664aa95dd8 /src/libsyntax/ext | |
| parent | e9a0db6abd40913f3b366a62ebf0f59adac57bb6 (diff) | |
| download | rust-24efea720860e1dc8d4d1035f1ea8d56a3498614.tar.gz rust-24efea720860e1dc8d4d1035f1ea8d56a3498614.zip | |
syntax: implement #[deriving] meta-attribute
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving.rs | 42 |
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, |
