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.
This commit is contained in:
Tim Chevalier 2012-01-20 19:44:38 -08:00
parent ae4c139144
commit ba5cc236f7
6 changed files with 108 additions and 4 deletions

View File

@ -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

View File

@ -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 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(ids, p.get_id());
ret ast::view_item_export(vec::concat([[first], ids]), p.get_id());
}
}
}
fn parse_view_item(p: parser) -> @ast::view_item {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}