diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index 0f7ba99301f..cafea5ed976 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -439,6 +439,10 @@ enum view_item_ { view_item_import_glob(@simple_path, node_id), view_item_import_from(@simple_path, [import_ident], node_id), view_item_export([ident], node_id), + // export foo::{} + view_item_export_tag_none(ident, node_id), + // export foo::{bar, baz, blat} + view_item_export_tag_some(ident, [ident], node_id) } // Meta-data associated with an item 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 { diff --git a/src/test/compile-fail/tag-exports-2.rs b/src/test/compile-fail/tag-exports-2.rs new file mode 100644 index 00000000000..04bac524d9b --- /dev/null +++ b/src/test/compile-fail/tag-exports-2.rs @@ -0,0 +1,18 @@ +// xfail-test +mod alder { + export burnside; + export everett::{flanders}; + export irving::{johnson, kearney}; + export marshall::{}; + + tag burnside { couch, davis } + tag everett { flanders, glisan, hoyt } + tag irving { johnson, kearney, lovejoy } + tag marshall { northrup, overton } +} + +import alder::*; + +fn main() { + let raleigh: irving = lovejoy; +} \ No newline at end of file diff --git a/src/test/compile-fail/tag-exports-3.rs b/src/test/compile-fail/tag-exports-3.rs new file mode 100644 index 00000000000..8b58c1b9ff0 --- /dev/null +++ b/src/test/compile-fail/tag-exports-3.rs @@ -0,0 +1,19 @@ +// xfail-test +mod alder { + export burnside; + export everett::{flanders}; + export irving::{johnson, kearney}; + export marshall::{}; + + tag burnside { couch, davis } + tag everett { flanders, glisan, hoyt } + tag irving { johnson, kearney, lovejoy } + tag marshall { northrup, overton } +} + +import alder::*; + +fn main() { + let savier: marshall = northrup; + +} \ No newline at end of file diff --git a/src/test/compile-fail/tag-exports.rs b/src/test/compile-fail/tag-exports.rs new file mode 100644 index 00000000000..79cb33f0fb2 --- /dev/null +++ b/src/test/compile-fail/tag-exports.rs @@ -0,0 +1,18 @@ +// xfail-test +mod alder { + export burnside; + export everett::{flanders}; + export irving::{johnson, kearney}; + export marshall::{}; + + tag burnside { couch, davis } + tag everett { flanders, glisan, hoyt } + tag irving { johnson, kearney, lovejoy } + tag marshall { northrup, overton } +} + +import alder::*; + +fn main() { + let quimby: everett = glisan; +} \ No newline at end of file diff --git a/src/test/run-pass/tag-exports.rs b/src/test/run-pass/tag-exports.rs new file mode 100644 index 00000000000..719e252b732 --- /dev/null +++ b/src/test/run-pass/tag-exports.rs @@ -0,0 +1,21 @@ +// xfail-test +mod alder { + export burnside; + export everett::{flanders}; + export irving::{johnson, kearney}; + export marshall::{}; + + tag burnside { couch, davis } + tag everett { flanders, glisan, hoyt } + tag irving { johnson, kearney, lovejoy } + tag marshall { northrup, overton } +} + +import alder::*; + +fn main() { + let pettygrove: burnside = couch; + let quimby: everett = flanders; + let raleigh: irving = johnson; + let savier: marshall; +} \ No newline at end of file