Add enum variants to the type namespace

Change to resolve and update compiler and libs for uses.

[breaking-change]

Enum variants are now in both the value and type namespaces. This means that
if you have a variant with the same name as a type in scope in a module, you
will get a name clash and thus an error. The solution is to either rename the
type or the variant.
This commit is contained in:
Nick Cameron
2014-09-11 17:07:49 +12:00
parent af3889f697
commit ce0907e46e
72 changed files with 489 additions and 457 deletions

View File

@@ -53,7 +53,7 @@ pub enum Ast {
Nothing,
Literal(char, Flags),
Dot(Flags),
Class(Vec<(char, char)>, Flags),
AstClass(Vec<(char, char)>, Flags),
Begin(Flags),
End(Flags),
WordBoundary(Flags),
@@ -101,7 +101,7 @@ impl Greed {
/// state.
#[deriving(Show)]
enum BuildAst {
Ast(Ast),
Expr(Ast),
Paren(Flags, uint, String), // '('
Bar, // '|'
}
@@ -152,7 +152,7 @@ impl BuildAst {
fn unwrap(self) -> Result<Ast, Error> {
match self {
Ast(x) => Ok(x),
Expr(x) => Ok(x),
_ => fail!("Tried to unwrap non-AST item: {}", self),
}
}
@@ -311,7 +311,7 @@ impl<'a> Parser<'a> {
}
fn push(&mut self, ast: Ast) {
self.stack.push(Ast(ast))
self.stack.push(Expr(ast))
}
fn push_repeater(&mut self, c: char) -> Result<(), Error> {
@@ -388,8 +388,8 @@ impl<'a> Parser<'a> {
match c {
'[' =>
match self.try_parse_ascii() {
Some(Class(asciis, flags)) => {
alts.push(Class(asciis, flags ^ negated));
Some(AstClass(asciis, flags)) => {
alts.push(AstClass(asciis, flags ^ negated));
continue
}
Some(ast) =>
@@ -399,8 +399,8 @@ impl<'a> Parser<'a> {
},
'\\' => {
match try!(self.parse_escape()) {
Class(asciis, flags) => {
alts.push(Class(asciis, flags ^ negated));
AstClass(asciis, flags) => {
alts.push(AstClass(asciis, flags ^ negated));
continue
}
Literal(c2, _) => c = c2, // process below
@@ -417,7 +417,7 @@ impl<'a> Parser<'a> {
']' => {
if ranges.len() > 0 {
let flags = negated | (self.flags & FLAG_NOCASE);
let mut ast = Class(combine_ranges(ranges), flags);
let mut ast = AstClass(combine_ranges(ranges), flags);
for alt in alts.into_iter() {
ast = Alt(box alt, box ast)
}
@@ -485,7 +485,7 @@ impl<'a> Parser<'a> {
Some(ranges) => {
self.chari = closer;
let flags = negated | (self.flags & FLAG_NOCASE);
Some(Class(combine_ranges(ranges), flags))
Some(AstClass(combine_ranges(ranges), flags))
}
}
}
@@ -611,7 +611,7 @@ impl<'a> Parser<'a> {
let ranges = perl_unicode_class(c);
let mut flags = self.flags & FLAG_NOCASE;
if c.is_uppercase() { flags |= FLAG_NEGATED }
Ok(Class(ranges, flags))
Ok(AstClass(ranges, flags))
}
_ => {
self.err(format!("Invalid escape sequence '\\\\{}'",
@@ -655,7 +655,7 @@ impl<'a> Parser<'a> {
name).as_slice())
}
Some(ranges) => {
Ok(Class(ranges, negated | (self.flags & FLAG_NOCASE)))
Ok(AstClass(ranges, negated | (self.flags & FLAG_NOCASE)))
}
}
}
@@ -888,7 +888,7 @@ impl<'a> Parser<'a> {
while i > from {
i = i - 1;
match self.stack.pop().unwrap() {
Ast(x) => combined = mk(x, combined),
Expr(x) => combined = mk(x, combined),
_ => {},
}
}