]> git.lizzy.rs Git - rust.git/commitdiff
ast: make Name its own type
authorCorey Richardson <corey@octayn.net>
Sun, 6 Jul 2014 08:17:59 +0000 (01:17 -0700)
committerCorey Richardson <corey@octayn.net>
Wed, 9 Jul 2014 07:49:54 +0000 (00:49 -0700)
src/librustc/lint/builtin.rs
src/librustc/metadata/decoder.rs
src/libsyntax/ast.rs
src/libsyntax/ext/base.rs
src/libsyntax/ext/mtwt.rs
src/libsyntax/ext/quote.rs
src/libsyntax/parse/attr.rs
src/libsyntax/parse/lexer/mod.rs
src/libsyntax/parse/parser.rs
src/libsyntax/parse/token.rs
src/libsyntax/util/interner.rs

index 98a6f7d5ed38d2879255f6065f3c7510839e3179..ae401b9d6f15c969a0e748ba58d5b5e4b47aa2ee 100644 (file)
@@ -1114,7 +1114,7 @@ fn check_unused_mut_pat(&self, cx: &Context, pats: &[Gc<ast::Pat>]) {
                 match mode {
                     ast::BindByValue(ast::MutMutable) => {
                         if !token::get_ident(ident).get().starts_with("_") {
-                            mutables.insert_or_update_with(ident.name as uint,
+                            mutables.insert_or_update_with(ident.name.uint(),
                                 vec!(id), |_, old| { old.push(id); });
                         }
                     }
index 8a2b95ae463b414f34c8e75774e00ac09562b2bc..cc41223688ee0b9eab8f8ff7f3c6caaff54d262d 100644 (file)
@@ -323,7 +323,7 @@ fn item_name(intr: &IdentInterner, item: ebml::Doc) -> ast::Ident {
     let string = name.as_str_slice();
     match intr.find_equiv(&string) {
         None => token::str_to_ident(string),
-        Some(val) => ast::Ident::new(val as ast::Name),
+        Some(val) => ast::Ident::new(val),
     }
 }
 
index 2a49d0e0f5bf81a71d8b6e1778992364c6466a3a..ebfc45d22cee9da33124293ab4c0efb6c23197f5 100644 (file)
@@ -52,10 +52,7 @@ impl Ident {
     pub fn new(name: Name) -> Ident { Ident {name: name, ctxt: EMPTY_CTXT}}
 
     pub fn as_str<'a>(&'a self) -> &'a str {
-        unsafe {
-            // FIXME #12938: can't use copy_lifetime since &str isn't a &T
-            ::std::mem::transmute(token::get_ident(*self).get())
-        }
+        self.name.as_str()
     }
 }
 
@@ -109,7 +106,26 @@ fn ne(&self, other: &Ident) -> bool {
 
 /// A name is a part of an identifier, representing a string or gensym. It's
 /// the result of interning.
-pub type Name = u32;
+#[deriving(Eq, Ord, PartialEq, PartialOrd, Hash, Encodable, Decodable, Clone, Show)]
+pub struct Name(pub u32);
+
+impl Name {
+    pub fn as_str<'a>(&'a self) -> &'a str {
+        unsafe {
+            // FIXME #12938: can't use copy_lifetime since &str isn't a &T
+            ::std::mem::transmute(token::get_name(*self).get())
+        }
+    }
+
+    pub fn uint(&self) -> uint {
+        let Name(nm) = *self;
+        nm as uint
+    }
+
+    pub fn ident(&self) -> Ident {
+        Ident { name: *self, ctxt: 0 }
+    }
+}
 
 /// A mark represents a unique id associated with a macro expansion
 pub type Mrk = u32;
index 1dbbe3b973c83f7e0b49ce78ced52b2cd828cb84..9a5c7e86d21c6df035f0df0fa52f617eed43e8c8 100644 (file)
@@ -535,6 +535,9 @@ pub fn set_trace_macros(&mut self, x: bool) {
     pub fn ident_of(&self, st: &str) -> ast::Ident {
         str_to_ident(st)
     }
+    pub fn name_of(&self, st: &str) -> ast::Name {
+        token::intern(st)
+    }
 }
 
 /// Extract a string literal from the macro expanded version of `expr`,
index 8608f7fb54553fd7d75a18631095c10852ba3123..7b29bbaef77eb2d4325b7a1b3e9f1ba3bff6db01 100644 (file)
@@ -82,8 +82,8 @@ fn apply_rename_internal(id: Ident,
                        to: Name,
                        ctxt: SyntaxContext,
                        table: &SCTable) -> SyntaxContext {
-    let key = (ctxt,id,to);
-    let new_ctxt = |_: &(SyntaxContext, Ident, Mrk)|
+    let key = (ctxt, id, to);
+    let new_ctxt = |_: &(SyntaxContext, Ident, Name)|
                    idx_push(&mut *table.table.borrow_mut(), Rename(id, to, ctxt));
 
     *table.rename_memo.borrow_mut().find_or_insert_with(key, new_ctxt)
@@ -142,7 +142,7 @@ pub fn clear_tables() {
 }
 
 /// Add a value to the end of a vec, return its index
-fn idx_push<T>(vec: &mut Vec<T> , val: T) -> u32 {
+fn idx_push<T>(vec: &mut Vec<T>, val: T) -> u32 {
     vec.push(val);
     (vec.len() - 1) as u32
 }
index 24630dd09a20eda282f459edd087e17bada72975..696d62838ba799150a68a998929e8277099a9e8e 100644 (file)
@@ -363,6 +363,15 @@ fn mk_ident(cx: &ExtCtxt, sp: Span, ident: ast::Ident) -> Gc<ast::Expr> {
                         vec!(e_str))
 }
 
+// Lift a name to the expr that evaluates to that name
+fn mk_name(cx: &ExtCtxt, sp: Span, ident: ast::Ident) -> Gc<ast::Expr> {
+    let e_str = cx.expr_str(sp, token::get_ident(ident));
+    cx.expr_method_call(sp,
+                        cx.expr_ident(sp, id_ext("ext_cx")),
+                        id_ext("name_of"),
+                        vec!(e_str))
+}
+
 fn mk_ast_path(cx: &ExtCtxt, sp: Span, name: &str) -> Gc<ast::Expr> {
     let idents = vec!(id_ext("syntax"), id_ext("ast"), id_ext(name));
     cx.expr_path(cx.path_global(sp, idents))
@@ -401,37 +410,37 @@ fn mk_token(cx: &ExtCtxt, sp: Span, tok: &token::Token) -> Gc<ast::Expr> {
         }
 
         LIT_BYTE(i) => {
-            let e_byte = mk_ident(cx, sp, i);
+            let e_byte = mk_name(cx, sp, i.ident());
 
             return cx.expr_call(sp, mk_token_path(cx, sp, "LIT_BYTE"), vec!(e_byte));
         }
 
         LIT_CHAR(i) => {
-            let e_char = mk_ident(cx, sp, i);
+            let e_char = mk_name(cx, sp, i.ident());
 
             return cx.expr_call(sp, mk_token_path(cx, sp, "LIT_CHAR"), vec!(e_char));
         }
 
         LIT_INTEGER(i) => {
-            let e_int = mk_ident(cx, sp, i);
+            let e_int = mk_name(cx, sp, i.ident());
             return cx.expr_call(sp, mk_token_path(cx, sp, "LIT_INTEGER"), vec!(e_int));
         }
 
         LIT_FLOAT(fident) => {
-            let e_fident = mk_ident(cx, sp, fident);
+            let e_fident = mk_name(cx, sp, fident.ident());
             return cx.expr_call(sp, mk_token_path(cx, sp, "LIT_FLOAT"), vec!(e_fident));
         }
 
         LIT_STR(ident) => {
             return cx.expr_call(sp,
                                 mk_token_path(cx, sp, "LIT_STR"),
-                                vec!(mk_ident(cx, sp, ident)));
+                                vec!(mk_name(cx, sp, ident.ident())));
         }
 
         LIT_STR_RAW(ident, n) => {
             return cx.expr_call(sp,
                                 mk_token_path(cx, sp, "LIT_STR_RAW"),
-                                vec!(mk_ident(cx, sp, ident), cx.expr_uint(sp, n)));
+                                vec!(mk_name(cx, sp, ident.ident()), cx.expr_uint(sp, n)));
         }
 
         IDENT(ident, b) => {
@@ -449,7 +458,7 @@ fn mk_token(cx: &ExtCtxt, sp: Span, tok: &token::Token) -> Gc<ast::Expr> {
         DOC_COMMENT(ident) => {
             return cx.expr_call(sp,
                                 mk_token_path(cx, sp, "DOC_COMMENT"),
-                                vec!(mk_ident(cx, sp, ident)));
+                                vec!(mk_name(cx, sp, ident.ident())));
         }
 
         INTERPOLATED(_) => fail!("quote! with interpolated token"),
index c227d8a0fedc840893763a335661b6aad096de95..55ad1b771231011d9c1168103af456be83fffcdb 100644 (file)
@@ -43,7 +43,7 @@ fn parse_outer_attributes(&mut self) -> Vec<ast::Attribute> {
               token::DOC_COMMENT(s) => {
                 let attr = ::attr::mk_sugared_doc_attr(
                     attr::mk_attr_id(),
-                    self.id_to_interned_str(s),
+                    self.id_to_interned_str(s.ident()),
                     self.span.lo,
                     self.span.hi
                 );
@@ -139,7 +139,7 @@ fn parse_inner_attrs_and_next(&mut self)
                     let Span { lo, hi, .. } = self.span;
                     self.bump();
                     attr::mk_sugared_doc_attr(attr::mk_attr_id(),
-                                              self.id_to_interned_str(s),
+                                              self.id_to_interned_str(s.ident()),
                                               lo,
                                               hi)
                 }
index 947f3d59b86fab32bd5699d859aa5a1b4e287884..f462ab92383accac1ef413e1d7b7e32aebf9e668 100644 (file)
@@ -216,18 +216,18 @@ pub fn with_str_from<T>(&self, start: BytePos, f: |s: &str| -> T) -> T {
         self.with_str_from_to(start, self.last_pos, f)
     }
 
-    /// Create an Ident from a given offset to the current offset, each
+    /// Create a Name from a given offset to the current offset, each
     /// adjusted 1 towards each other (assumes that on either side there is a
     /// single-byte delimiter).
-    pub fn ident_from(&self, start: BytePos) -> ast::Ident {
+    pub fn name_from(&self, start: BytePos) -> ast::Name {
         debug!("taking an ident from {} to {}", start, self.last_pos);
-        self.with_str_from(start, str_to_ident)
+        self.with_str_from(start, token::intern)
     }
 
-    /// As ident_from, with an explicit endpoint.
-    pub fn ident_from_to(&self, start: BytePos, end: BytePos) -> ast::Ident {
+    /// As name_from, with an explicit endpoint.
+    pub fn name_from_to(&self, start: BytePos, end: BytePos) -> ast::Name {
         debug!("taking an ident from {} to {}", start, end);
-        self.with_str_from_to(start, end, str_to_ident)
+        self.with_str_from_to(start, end, token::intern)
     }
 
     /// Calls `f` with a string slice of the source text spanning from `start`
@@ -377,7 +377,7 @@ fn scan_comment(&mut self) -> Option<TokenAndSpan> {
                         return self.with_str_from(start_bpos, |string| {
                             // but comments with only more "/"s are not
                             let tok = if is_doc_comment(string) {
-                                token::DOC_COMMENT(str_to_ident(string))
+                                token::DOC_COMMENT(token::intern(string))
                             } else {
                                 token::COMMENT
                             };
@@ -421,7 +421,7 @@ fn scan_comment(&mut self) -> Option<TokenAndSpan> {
                     let start = self.last_pos;
                     while !self.curr_is('\n') && !self.is_eof() { self.bump(); }
                     return Some(TokenAndSpan {
-                        tok: token::SHEBANG(self.ident_from(start)),
+                        tok: token::SHEBANG(self.name_from(start)),
                         sp: codemap::mk_sp(start, self.last_pos)
                     });
                 }
@@ -500,7 +500,7 @@ fn scan_block_comment(&mut self) -> Option<TokenAndSpan> {
                     self.translate_crlf(start_bpos, string,
                                         "bare CR not allowed in block doc-comment")
                 } else { string.into_maybe_owned() };
-                token::DOC_COMMENT(str_to_ident(string.as_slice()))
+                token::DOC_COMMENT(token::intern(string.as_slice()))
             } else {
                 token::COMMENT
             };
@@ -548,17 +548,17 @@ fn scan_number(&mut self, c: char) -> token::Token {
                 }
                 'u' | 'i' => {
                     self.scan_int_suffix();
-                    return token::LIT_INTEGER(self.ident_from(start_bpos));
+                    return token::LIT_INTEGER(self.name_from(start_bpos));
                 },
                 'f' => {
                     let last_pos = self.last_pos;
                     self.scan_float_suffix();
                     self.check_float_base(start_bpos, last_pos, base);
-                    return token::LIT_FLOAT(self.ident_from(start_bpos));
+                    return token::LIT_FLOAT(self.name_from(start_bpos));
                 }
                 _ => {
                     // just a 0
-                    return token::LIT_INTEGER(self.ident_from(start_bpos));
+                    return token::LIT_INTEGER(self.name_from(start_bpos));
                 }
             }
         } else if c.is_digit_radix(10) {
@@ -571,7 +571,7 @@ fn scan_number(&mut self, c: char) -> token::Token {
             self.err_span_(start_bpos, self.last_pos, "no valid digits found for number");
             // eat any suffix
             self.scan_int_suffix();
-            return token::LIT_INTEGER(str_to_ident("0"));
+            return token::LIT_INTEGER(token::intern("0"));
         }
 
         // might be a float, but don't be greedy if this is actually an
@@ -589,13 +589,13 @@ fn scan_number(&mut self, c: char) -> token::Token {
             }
             let last_pos = self.last_pos;
             self.check_float_base(start_bpos, last_pos, base);
-            return token::LIT_FLOAT(self.ident_from(start_bpos));
+            return token::LIT_FLOAT(self.name_from(start_bpos));
         } else if self.curr_is('f') {
             // or it might be an integer literal suffixed as a float
             self.scan_float_suffix();
             let last_pos = self.last_pos;
             self.check_float_base(start_bpos, last_pos, base);
-            return token::LIT_FLOAT(self.ident_from(start_bpos));
+            return token::LIT_FLOAT(self.name_from(start_bpos));
         } else {
             // it might be a float if it has an exponent
             if self.curr_is('e') || self.curr_is('E') {
@@ -603,11 +603,11 @@ fn scan_number(&mut self, c: char) -> token::Token {
                 self.scan_float_suffix();
                 let last_pos = self.last_pos;
                 self.check_float_base(start_bpos, last_pos, base);
-                return token::LIT_FLOAT(self.ident_from(start_bpos));
+                return token::LIT_FLOAT(self.name_from(start_bpos));
             }
             // but we certainly have an integer!
             self.scan_int_suffix();
-            return token::LIT_INTEGER(self.ident_from(start_bpos));
+            return token::LIT_INTEGER(self.name_from(start_bpos));
         }
     }
 
@@ -980,7 +980,7 @@ fn next_token_inner(&mut self) -> token::Token {
                                    start - BytePos(1), last_bpos,
                                    "unterminated character constant".to_string());
             }
-            let id = if valid { self.ident_from(start) } else { str_to_ident("0") };
+            let id = if valid { self.name_from(start) } else { token::intern("0") };
             self.bump(); // advance curr past token
             return token::LIT_CHAR(id);
           }
@@ -1010,8 +1010,8 @@ fn next_token_inner(&mut self) -> token::Token {
                 valid &= self.scan_char_or_byte(ch_start, ch, /* ascii_only = */ false, '"');
             }
             // adjust for the ACSII " at the start of the literal
-            let id = if valid { self.ident_from(start_bpos + BytePos(1)) }
-                     else { str_to_ident("??") };
+            let id = if valid { self.name_from(start_bpos + BytePos(1)) }
+                     else { token::intern("??") };
             self.bump();
             return token::LIT_STR(id);
           }
@@ -1076,9 +1076,9 @@ fn next_token_inner(&mut self) -> token::Token {
             }
             self.bump();
             let id = if valid {
-                self.ident_from_to(content_start_bpos, content_end_bpos)
+                self.name_from_to(content_start_bpos, content_end_bpos)
             } else {
-                str_to_ident("??")
+                token::intern("??")
             };
             return token::LIT_STR_RAW(id, hash_count);
           }
@@ -1168,7 +1168,7 @@ fn scan_byte(&mut self) -> token::Token {
                 "unterminated byte constant".to_string());
         }
 
-        let id = if valid { self.ident_from(start) } else { str_to_ident("??") };
+        let id = if valid { self.name_from(start) } else { token::intern("??") };
         self.bump(); // advance curr past token
         return token::LIT_BYTE(id);
     }
@@ -1190,7 +1190,7 @@ fn scan_byte_string(&mut self) -> token::Token {
             self.bump();
             valid &= self.scan_char_or_byte(ch_start, ch, /* ascii_only = */ true, '"');
         }
-        let id = if valid { self.ident_from(start) } else { str_to_ident("??") };
+        let id = if valid { self.name_from(start) } else { token::intern("??") };
         self.bump();
         return token::LIT_BINARY(id);
     }
@@ -1243,7 +1243,7 @@ fn scan_raw_byte_string(&mut self) -> token::Token {
             self.bump();
         }
         self.bump();
-        return token::LIT_BINARY_RAW(self.ident_from_to(content_start_bpos, content_end_bpos),
+        return token::LIT_BINARY_RAW(self.name_from_to(content_start_bpos, content_end_bpos),
                                      hash_count);
     }
 }
index 51f2c74d3aeff5d6e8dfe7d56984049e142061fd..743eeed9da5e247c4dc8fe77a6e0f94e8b993180 100644 (file)
@@ -1560,8 +1560,8 @@ pub fn lit_from_token(&mut self, tok: &token::Token) -> Lit_ {
         match *tok {
             token::LIT_BYTE(i) => LitByte(parse::byte_lit(i.as_str()).val0()),
             token::LIT_CHAR(i) => LitChar(parse::char_lit(i.as_str()).val0()),
-            token::LIT_INTEGER(s) => parse::integer_lit(self.id_to_interned_str(s).get(),
-                                                       &self.sess.span_diagnostic, self.span),
+            token::LIT_INTEGER(s) => parse::integer_lit(s.as_str(),
+                                                        &self.sess.span_diagnostic, self.span),
             token::LIT_FLOAT(s) => parse::float_lit(s.as_str()),
             token::LIT_STR(s) => {
                 LitStr(token::intern_and_get_ident(parse::str_lit(s.as_str()).as_slice()),
@@ -1572,7 +1572,7 @@ pub fn lit_from_token(&mut self, tok: &token::Token) -> Lit_ {
                        ast::RawStr(n))
             }
             token::LIT_BINARY(i) =>
-                LitBinary(parse::binary_lit(self.id_to_interned_str(i).get())),
+                LitBinary(parse::binary_lit(i.as_str())),
             token::LIT_BINARY_RAW(i, _) =>
                 LitBinary(Rc::new(i.as_str().as_bytes().iter().map(|&x| x).collect())),
             token::LPAREN => { self.expect(&token::RPAREN); LitNil },
@@ -1948,7 +1948,12 @@ pub fn parse_bottom_expr(&mut self) -> Gc<Expr> {
                     });
                 return self.mk_expr(lo, body.span.hi, ExprProc(decl, fakeblock));
             },
-            token::IDENT(id @ ast::Ident{name:token::SELF_KEYWORD_NAME,ctxt:_},false) => {
+            // FIXME #13626: Should be able to stick in
+            // token::SELF_KEYWORD_NAME
+            token::IDENT(id @ ast::Ident{
+                        name: ast::Name(token::SELF_KEYWORD_NAME_NUM),
+                        ctxt: _
+                    } ,false) => {
                 self.bump();
                 let path = ast_util::ident_to_path(mk_sp(lo, hi), id);
                 ex = ExprPath(path);
@@ -4770,8 +4775,7 @@ fn parse_opt_abi(&mut self) -> Option<abi::Abi> {
         match self.token {
             token::LIT_STR(s) | token::LIT_STR_RAW(s, _) => {
                 self.bump();
-                let identifier_string = token::get_ident(s);
-                let the_string = identifier_string.get();
+                let the_string = s.as_str();
                 match abi::lookup(the_string) {
                     Some(abi) => Some(abi),
                     None => {
@@ -5389,9 +5393,9 @@ pub fn parse_crate_mod(&mut self) -> Crate {
     pub fn parse_optional_str(&mut self)
                               -> Option<(InternedString, ast::StrStyle)> {
         let (s, style) = match self.token {
-            token::LIT_STR(s) => (self.id_to_interned_str(s), ast::CookedStr),
+            token::LIT_STR(s) => (self.id_to_interned_str(s.ident()), ast::CookedStr),
             token::LIT_STR_RAW(s, n) => {
-                (self.id_to_interned_str(s), ast::RawStr(n))
+                (self.id_to_interned_str(s.ident()), ast::RawStr(n))
             }
             _ => return None
         };
index e65f9f208a317ce29c03d76de64940b13f06330c..076db789f063a66bfd7ad52fda31fe5d8f5693d0 100644 (file)
@@ -78,14 +78,14 @@ pub enum Token {
     QUESTION,
 
     /* Literals */
-    LIT_BYTE(Ident),
-    LIT_CHAR(Ident),
-    LIT_INTEGER(Ident),
-    LIT_FLOAT(Ident),
-    LIT_STR(Ident),
-    LIT_STR_RAW(Ident, uint), /* raw str delimited by n hash symbols */
-    LIT_BINARY(Ident),
-    LIT_BINARY_RAW(Ident, uint), /* raw binary str delimited by n hash symbols */
+    LIT_BYTE(Name),
+    LIT_CHAR(Name),
+    LIT_INTEGER(Name),
+    LIT_FLOAT(Name),
+    LIT_STR(Name),
+    LIT_STR_RAW(Name, uint), /* raw str delimited by n hash symbols */
+    LIT_BINARY(Name),
+    LIT_BINARY_RAW(Name, uint), /* raw binary str delimited by n hash symbols */
 
     /* Name components */
     /// An identifier contains an "is_mod_name" boolean,
@@ -97,7 +97,7 @@ pub enum Token {
 
     /* For interpolation */
     INTERPOLATED(Nonterminal),
-    DOC_COMMENT(Ident),
+    DOC_COMMENT(Name),
 
     // Junk. These carry no data because we don't really care about the data
     // they *would* carry, and don't really want to allocate a new ident for
@@ -107,7 +107,7 @@ pub enum Token {
     WS,
     /// Comment
     COMMENT,
-    SHEBANG(Ident),
+    SHEBANG(Name),
 
     EOF,
 }
@@ -207,28 +207,28 @@ pub fn to_string(t: &Token) -> String {
 
       /* Literals */
       LIT_BYTE(b) => {
-          format!("b'{}'", get_ident(b).get())
+          format!("b'{}'", b.as_str())
       }
       LIT_CHAR(c) => {
-          format!("'{}'", get_ident(c).get())
+          format!("'{}'", c.as_str())
       }
       LIT_INTEGER(c) | LIT_FLOAT(c) => {
-          get_ident(c).get().to_string()
+          c.as_str().to_string()
       }
 
       LIT_STR(s) => {
-          format!("\"{}\"", get_ident(s).get())
+          format!("\"{}\"", s.as_str())
       }
       LIT_STR_RAW(s, n) => {
         format!("r{delim}\"{string}\"{delim}",
-                 delim="#".repeat(n), string=get_ident(s))
+                 delim="#".repeat(n), string=s.as_str())
       }
       LIT_BINARY(v) => {
-          format!("b\"{}\"", get_ident(v).get())
+          format!("b\"{}\"", v.as_str())
       }
       LIT_BINARY_RAW(s, n) => {
         format!("br{delim}\"{string}\"{delim}",
-                 delim="#".repeat(n), string=get_ident(s).get())
+                 delim="#".repeat(n), string=s.as_str())
       }
 
       /* Name components */
@@ -239,7 +239,7 @@ pub fn to_string(t: &Token) -> String {
       UNDERSCORE => "_".to_string(),
 
       /* Other */
-      DOC_COMMENT(s) => get_ident(s).get().to_string(),
+      DOC_COMMENT(s) => s.as_str().to_string(),
       EOF => "<eof>".to_string(),
       WS => " ".to_string(),
       COMMENT => "/* */".to_string(),
@@ -374,19 +374,19 @@ pub mod keywords {
         $( ($rk_name:expr, $rk_variant:ident, $rk_str:expr); )*
     }
 ) => {
-    static STRICT_KEYWORD_START: Name = first!($( $sk_name, )*);
-    static STRICT_KEYWORD_FINAL: Name = last!($( $sk_name, )*);
-    static RESERVED_KEYWORD_START: Name = first!($( $rk_name, )*);
-    static RESERVED_KEYWORD_FINAL: Name = last!($( $rk_name, )*);
+    static STRICT_KEYWORD_START: Name = first!($( Name($sk_name), )*);
+    static STRICT_KEYWORD_FINAL: Name = last!($( Name($sk_name), )*);
+    static RESERVED_KEYWORD_START: Name = first!($( Name($rk_name), )*);
+    static RESERVED_KEYWORD_FINAL: Name = last!($( Name($rk_name), )*);
 
     pub mod special_idents {
-        use ast::Ident;
-        $( pub static $si_static: Ident = Ident { name: $si_name, ctxt: 0 }; )*
+        use ast::{Ident, Name};
+        $( pub static $si_static: Ident = Ident { name: Name($si_name), ctxt: 0 }; )*
     }
 
     pub mod special_names {
         use ast::Name;
-        $( pub static $si_static: Name =  $si_name; )*
+        $( pub static $si_static: Name =  Name($si_name); )*
     }
 
     /**
@@ -407,8 +407,8 @@ pub enum Keyword {
         impl Keyword {
             pub fn to_name(&self) -> Name {
                 match *self {
-                    $( $sk_variant => $sk_name, )*
-                    $( $rk_variant => $rk_name, )*
+                    $( $sk_variant => Name($sk_name), )*
+                    $( $rk_variant => Name($rk_name), )*
                 }
             }
         }
@@ -427,8 +427,11 @@ fn mk_fresh_ident_interner() -> IdentInterner {
 }}
 
 // If the special idents get renumbered, remember to modify these two as appropriate
-pub static SELF_KEYWORD_NAME: Name = 1;
-static STATIC_KEYWORD_NAME: Name = 2;
+pub static SELF_KEYWORD_NAME: Name = Name(SELF_KEYWORD_NAME_NUM);
+static STATIC_KEYWORD_NAME: Name = Name(STATIC_KEYWORD_NAME_NUM);
+
+pub static SELF_KEYWORD_NAME_NUM: u32 = 1;
+static STATIC_KEYWORD_NAME_NUM: u32 = 2;
 
 // NB: leaving holes in the ident table is bad! a different ident will get
 // interned with the id from the hole, but it will be between the min and max
@@ -438,8 +441,8 @@ fn mk_fresh_ident_interner() -> IdentInterner {
     pub mod special_idents {
         // These ones are statics
         (0,                          invalid,                "");
-        (super::SELF_KEYWORD_NAME,   self_,                  "self");
-        (super::STATIC_KEYWORD_NAME, statik,                 "static");
+        (super::SELF_KEYWORD_NAME_NUM,   self_,                  "self");
+        (super::STATIC_KEYWORD_NAME_NUM, statik,                 "static");
         (3,                          static_lifetime,        "'static");
 
         // for matcher NTs
@@ -479,8 +482,8 @@ pub mod keywords {
         (29,                         Ref,        "ref");
         (30,                         Return,     "return");
         // Static and Self are also special idents (prefill de-dupes)
-        (super::STATIC_KEYWORD_NAME, Static,     "static");
-        (super::SELF_KEYWORD_NAME,   Self,       "self");
+        (super::STATIC_KEYWORD_NAME_NUM, Static,     "static");
+        (super::SELF_KEYWORD_NAME_NUM,   Self,       "self");
         (31,                         Struct,     "struct");
         (32,                         Super,      "super");
         (33,                         True,       "true");
@@ -687,7 +690,7 @@ pub fn fresh_name(src: &Ident) -> Name {
 
 // create a fresh mark.
 pub fn fresh_mark() -> Mrk {
-    gensym("mark")
+    gensym("mark").uint() as u32
 }
 
 // See the macro above about the types of keywords
@@ -701,10 +704,13 @@ pub fn is_keyword(kw: keywords::Keyword, tok: &Token) -> bool {
 
 pub fn is_any_keyword(tok: &Token) -> bool {
     match *tok {
-        token::IDENT(sid, false) => match sid.name {
-            SELF_KEYWORD_NAME | STATIC_KEYWORD_NAME |
-            STRICT_KEYWORD_START .. RESERVED_KEYWORD_FINAL => true,
-            _ => false,
+        token::IDENT(sid, false) => {
+            let n = sid.name;
+
+               n == SELF_KEYWORD_NAME
+            || n == STATIC_KEYWORD_NAME
+            || STRICT_KEYWORD_START <= n
+            && n <= RESERVED_KEYWORD_FINAL
         },
         _ => false
     }
@@ -712,10 +718,13 @@ pub fn is_any_keyword(tok: &Token) -> bool {
 
 pub fn is_strict_keyword(tok: &Token) -> bool {
     match *tok {
-        token::IDENT(sid, false) => match sid.name {
-            SELF_KEYWORD_NAME | STATIC_KEYWORD_NAME |
-            STRICT_KEYWORD_START .. STRICT_KEYWORD_FINAL => true,
-            _ => false,
+        token::IDENT(sid, false) => {
+            let n = sid.name;
+
+               n == SELF_KEYWORD_NAME
+            || n == STATIC_KEYWORD_NAME
+            || STRICT_KEYWORD_START <= n
+            && n <= STRICT_KEYWORD_FINAL
         },
         _ => false,
     }
@@ -723,9 +732,11 @@ pub fn is_strict_keyword(tok: &Token) -> bool {
 
 pub fn is_reserved_keyword(tok: &Token) -> bool {
     match *tok {
-        token::IDENT(sid, false) => match sid.name {
-            RESERVED_KEYWORD_START .. RESERVED_KEYWORD_FINAL => true,
-            _ => false,
+        token::IDENT(sid, false) => {
+            let n = sid.name;
+
+               RESERVED_KEYWORD_START <= n
+            && n <= RESERVED_KEYWORD_FINAL
         },
         _ => false,
     }
index 55fff38f9913112ac0792d5a707caacde29c7664..b370678c6df21747fe036a7b18b53b7abc96b03f 100644 (file)
@@ -52,7 +52,7 @@ pub fn intern(&self, val: T) -> Name {
         }
 
         let mut vect = self.vect.borrow_mut();
-        let new_idx = (*vect).len() as Name;
+        let new_idx = Name((*vect).len() as u32);
         (*map).insert(val.clone(), new_idx);
         (*vect).push(val);
         new_idx
@@ -60,7 +60,7 @@ pub fn intern(&self, val: T) -> Name {
 
     pub fn gensym(&self, val: T) -> Name {
         let mut vect = self.vect.borrow_mut();
-        let new_idx = (*vect).len() as Name;
+        let new_idx = Name((*vect).len() as u32);
         // leave out of .map to avoid colliding
         (*vect).push(val);
         new_idx
@@ -68,7 +68,7 @@ pub fn gensym(&self, val: T) -> Name {
 
     pub fn get(&self, idx: Name) -> T {
         let vect = self.vect.borrow();
-        (*(*vect).get(idx as uint)).clone()
+        (*(*vect).get(idx.uint())).clone()
     }
 
     pub fn len(&self) -> uint {
@@ -155,7 +155,7 @@ pub fn intern(&self, val: &str) -> Name {
             None => (),
         }
 
-        let new_idx = self.len() as Name;
+        let new_idx = Name(self.len() as u32);
         let val = RcStr::new(val);
         map.insert(val.clone(), new_idx);
         self.vect.borrow_mut().push(val);
@@ -163,7 +163,7 @@ pub fn intern(&self, val: &str) -> Name {
     }
 
     pub fn gensym(&self, val: &str) -> Name {
-        let new_idx = self.len() as Name;
+        let new_idx = Name(self.len() as u32);
         // leave out of .map to avoid colliding
         self.vect.borrow_mut().push(RcStr::new(val));
         new_idx
@@ -180,23 +180,23 @@ pub fn gensym(&self, val: &str) -> Name {
     /// Create a gensym with the same name as an existing
     /// entry.
     pub fn gensym_copy(&self, idx : Name) -> Name {
-        let new_idx = self.len() as Name;
+        let new_idx = Name(self.len() as u32);
         // leave out of map to avoid colliding
         let mut vect = self.vect.borrow_mut();
-        let existing = (*vect.get(idx as uint)).clone();
+        let existing = (*vect.get(idx.uint())).clone();
         vect.push(existing);
         new_idx
     }
 
     pub fn get(&self, idx: Name) -> RcStr {
-        (*self.vect.borrow().get(idx as uint)).clone()
+        (*self.vect.borrow().get(idx.uint())).clone()
     }
 
     /// Returns this string with lifetime tied to the interner. Since
     /// strings may never be removed from the interner, this is safe.
     pub fn get_ref<'a>(&'a self, idx: Name) -> &'a str {
         let vect = self.vect.borrow();
-        let s: &str = vect.get(idx as uint).as_slice();
+        let s: &str = vect.get(idx.uint()).as_slice();
         unsafe {
             mem::transmute(s)
         }