about summary refs log tree commit diff
path: root/src/comp/syntax/parse/parser.rs
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-01-20 19:44:38 -0800
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-01-20 19:48:33 -0800
commitba5cc236f7596148ad560b0bb651d82d15f0fc7f (patch)
tree6fc876ee1034498409e53e3a5d5534b2bc1e60ca /src/comp/syntax/parse/parser.rs
parentae4c139144d45bedb985afa093dee57d91fdb0ef (diff)
downloadrust-ba5cc236f7596148ad560b0bb651d82d15f0fc7f.tar.gz
rust-ba5cc236f7596148ad560b0bb651d82d15f0fc7f.zip
WIP on issue 1426 (exporting all tags)
Support Lenny222's proposed syntax for exporting a tag without
its variants, or selected tags from a variant, in the AST and parser.
No support further down the line yet. Tests are xfailed.
Diffstat (limited to 'src/comp/syntax/parse/parser.rs')
-rw-r--r--src/comp/syntax/parse/parser.rs32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 46b6c474363..d020c46c6a0 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -2391,11 +2391,35 @@ fn parse_import(p: parser) -> ast::view_item_ {
     }
 }
 
+fn parse_tag_export(p:parser, tyname:ast::ident) -> ast::view_item_ {
+    let tagnames:[ast::ident] =
+        parse_seq(token::LBRACE, token::RBRACE,
+                    seq_sep(token::COMMA), {|p| parse_ident(p) }, p).node;
+    let id = p.get_id();
+    if vec::is_empty(tagnames) {
+       ret ast::view_item_export_tag_none(tyname, id);
+    }
+    else {
+       ret ast::view_item_export_tag_some(tyname, tagnames, id);
+    }
+}
+
 fn parse_export(p: parser) -> ast::view_item_ {
-    let ids =
-        parse_seq_to_before_end(token::SEMI, seq_sep(token::COMMA),
-                                parse_ident, p);
-    ret ast::view_item_export(ids, p.get_id());
+    let first = parse_ident(p);
+    alt p.token {
+       token::COLON {
+           p.bump();
+           expect(p, token::COLON);
+           ret parse_tag_export(p, first);
+       }
+       t {
+           if t == token::COMMA { p.bump(); }
+           let ids =
+               parse_seq_to_before_end(token::SEMI, seq_sep(token::COMMA),
+                                       parse_ident, p);
+           ret ast::view_item_export(vec::concat([[first], ids]), p.get_id());
+       }
+    }
 }
 
 fn parse_view_item(p: parser) -> @ast::view_item {