about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPaul Stansifer <paul.stansifer@gmail.com>2012-07-17 11:22:11 -0700
committerPaul Stansifer <paul.stansifer@gmail.com>2012-07-30 18:04:19 -0700
commite040ab8423b7ae74eeb2ee5d9b1f1da5256f59fd (patch)
tree68f9087d3330940d1b4ed468b13f282da2645119 /src/libsyntax
parenta7125971c652393af33fbc7121edfd4ecb7307eb (diff)
downloadrust-e040ab8423b7ae74eeb2ee5d9b1f1da5256f59fd.tar.gz
rust-e040ab8423b7ae74eeb2ee5d9b1f1da5256f59fd.zip
Impl-ize interner.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/pipes/pipec.rs1
-rw-r--r--src/libsyntax/parse/lexer.rs19
-rw-r--r--src/libsyntax/parse/parser.rs5
-rw-r--r--src/libsyntax/parse/token.rs18
-rw-r--r--src/libsyntax/print/pprust.rs7
-rw-r--r--src/libsyntax/util/interner.rs46
6 files changed, 47 insertions, 49 deletions
diff --git a/src/libsyntax/ext/pipes/pipec.rs b/src/libsyntax/ext/pipes/pipec.rs
index c1274d12f1d..c5a56cac1f2 100644
--- a/src/libsyntax/ext/pipes/pipec.rs
+++ b/src/libsyntax/ext/pipes/pipec.rs
@@ -9,7 +9,6 @@ import tuple::extensions;
 
 import ast::ident;
 import util::interner;
-import interner::{intern, get};
 import print::pprust;
 import pprust::{item_to_str, ty_to_str};
 import ext::base::{mk_ctxt, ext_ctxt};
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 94e12e16185..f70a1fae59d 100644
--- a/src/libsyntax/parse/lexer.rs
+++ b/src/libsyntax/parse/lexer.rs
@@ -1,4 +1,4 @@
-import util::interner::{interner,intern};
+import util::interner::interner;
 import diagnostic::span_handler;
 import codemap::span;
 import ext::tt::transcribe::{tt_reader,  new_tt_reader, dup_tt_reader,
@@ -217,7 +217,7 @@ fn consume_any_line_comment(rdr: string_reader)
                     bump(rdr);
                 }
                 ret some({
-                    tok: token::DOC_COMMENT(intern(*rdr.interner, @acc)),
+                    tok: token::DOC_COMMENT(rdr.interner.intern(@acc)),
                     sp: ast_util::mk_sp(start_chpos, rdr.chpos)
                 });
             } else {
@@ -262,7 +262,7 @@ fn consume_block_comment(rdr: string_reader)
             bump(rdr);
             bump(rdr);
             ret some({
-                tok: token::DOC_COMMENT(intern(*rdr.interner, @acc)),
+                tok: token::DOC_COMMENT(rdr.interner.intern(@acc)),
                 sp: ast_util::mk_sp(start_chpos, rdr.chpos)
             });
         }
@@ -395,13 +395,11 @@ fn scan_number(c: char, rdr: string_reader) -> token::token {
         if c == '3' && n == '2' {
             bump(rdr);
             bump(rdr);
-            ret token::LIT_FLOAT(intern(*rdr.interner, @num_str),
-                                 ast::ty_f32);
+            ret token::LIT_FLOAT(rdr.interner.intern(@num_str), ast::ty_f32);
         } else if c == '6' && n == '4' {
             bump(rdr);
             bump(rdr);
-            ret token::LIT_FLOAT(intern(*rdr.interner, @num_str),
-                                 ast::ty_f64);
+            ret token::LIT_FLOAT(rdr.interner.intern(@num_str), ast::ty_f64);
             /* FIXME (#2252): if this is out of range for either a
             32-bit or 64-bit float, it won't be noticed till the
             back-end.  */
@@ -410,8 +408,7 @@ fn scan_number(c: char, rdr: string_reader) -> token::token {
         }
     }
     if is_float {
-        ret token::LIT_FLOAT(intern(*rdr.interner, @num_str),
-                             ast::ty_f);
+        ret token::LIT_FLOAT(rdr.interner.intern(@num_str), ast::ty_f);
     } else {
         if str::len(num_str) == 0u {
             rdr.fatal(~"no valid digits found for number");
@@ -459,7 +456,7 @@ fn next_token_inner(rdr: string_reader) -> token::token {
         let is_mod_name = c == ':' && nextch(rdr) == ':';
 
         // FIXME: perform NFKC normalization here. (Issue #2253)
-        ret token::IDENT(intern(*rdr.interner, @accum_str), is_mod_name);
+        ret token::IDENT(rdr.interner.intern(@accum_str), is_mod_name);
     }
     if is_dec_digit(c) {
         ret scan_number(c, rdr);
@@ -623,7 +620,7 @@ fn next_token_inner(rdr: string_reader) -> token::token {
             }
         }
         bump(rdr);
-        ret token::LIT_STR(intern(*rdr.interner, @accum_str));
+        ret token::LIT_STR(rdr.interner.intern(@accum_str));
       }
       '-' {
         if nextch(rdr) == '>' {
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 888bb256852..ac130024546 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -224,7 +224,7 @@ class parser {
         self.sess.span_diagnostic.span_warn(copy self.span, m)
     }
     pure fn get_str(i: token::str_num) -> @~str {
-        interner::get(*self.reader.interner(), i)
+        (*self.reader.interner()).get(i)
     }
     fn get_id() -> node_id { next_node_id(self.sess) }
 
@@ -2121,8 +2121,7 @@ class parser {
             }
 
             if self.eat_keyword(~"of") {
-                let for_atom = interner::intern(*self.reader.interner(),
-                                                @~"for");
+                let for_atom = (*self.reader.interner()).intern(@~"for");
                 traits = self.parse_trait_ref_list
                     (token::IDENT(for_atom, false));
                 if traits.len() >= 1 && option::is_none(ident_old) {
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index b6672936be6..eecb6cf405f 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -165,24 +165,16 @@ fn to_str(in: interner<@~str>, t: token) -> ~str {
       LIT_INT_UNSUFFIXED(i) {
         int::to_str(i as int, 10u)
       }
-      LIT_FLOAT(s, t) {
-        *interner::get(in, s) +
-            ast_util::float_ty_to_str(t)
-      }
-      LIT_STR(s) {
-        ~"\""
-            + str::escape_default(*interner::get(in, s))
-            + ~"\""
-      }
+      LIT_FLOAT(s, t) { *in.get(s) + ast_util::float_ty_to_str(t) }
+      LIT_STR(s) { ~"\"" + str::escape_default( *in.get(s)) + ~"\"" }
 
       /* Name components */
-      IDENT(s, _) {
-        *interner::get(in, s)
-      }
+      IDENT(s, _) { *in.get(s) }
+
       UNDERSCORE { ~"_" }
 
       /* Other */
-      DOC_COMMENT(s) { *interner::get(in, s) }
+      DOC_COMMENT(s) { *in.get(s) }
       EOF { ~"<eof>" }
       INTERPOLATED(nt) {
         ~"an interpolated " +
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 8e541aed76d..9adc3b05ac6 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -9,6 +9,7 @@ import ast::{required, provided};
 import ast_util::operator_prec;
 import dvec::{dvec, extensions};
 import parse::classify::*;
+import util::interner;
 
 // The ps is stored here to prevent recursive type.
 enum ann_node {
@@ -27,6 +28,7 @@ fn no_ann() -> pp_ann {
 type ps =
     @{s: pp::printer,
       cm: option<codemap>,
+      //in: interner::interner<@~str>,
       comments: option<~[comments::cmnt]>,
       literals: option<~[comments::lit]>,
       mut cur_cmnt: uint,
@@ -47,6 +49,7 @@ fn end(s: ps) {
 fn rust_printer(writer: io::writer) -> ps {
     ret @{s: pp::mk_printer(writer, default_columns),
           cm: none::<codemap>,
+        //in: interner::mk::<@~str>(|x| str::hash(*x), |x,y| str::eq(*x, *y)),
           comments: none::<~[comments::cmnt]>,
           literals: none::<~[comments::lit]>,
           mut cur_cmnt: 0u,
@@ -63,7 +66,8 @@ const default_columns: uint = 78u;
 // Requires you to pass an input filename and reader so that
 // it can scan the input text for comments and literals to
 // copy forward.
-fn print_crate(cm: codemap, span_diagnostic: diagnostic::span_handler,
+fn print_crate(cm: codemap, //in: interner::interner<@~str>,
+               span_diagnostic: diagnostic::span_handler,
                crate: @ast::crate, filename: ~str, in: io::reader,
                out: io::writer, ann: pp_ann, is_expanded: bool) {
     let r = comments::gather_comments_and_literals(span_diagnostic,
@@ -71,6 +75,7 @@ fn print_crate(cm: codemap, span_diagnostic: diagnostic::span_handler,
     let s =
         @{s: pp::mk_printer(out, default_columns),
           cm: some(cm),
+          //in: in,
           comments: some(r.cmnts),
           // If the code is post expansion, don't use the table of
           // literals, since it doesn't correspond with the literals
diff --git a/src/libsyntax/util/interner.rs b/src/libsyntax/util/interner.rs
index 0e69f2c10b7..f25604ab991 100644
--- a/src/libsyntax/util/interner.rs
+++ b/src/libsyntax/util/interner.rs
@@ -5,7 +5,7 @@ import std::map;
 import std::map::{hashmap, hashfn, eqfn};
 import dvec::{dvec, extensions};
 
-type interner<T: const> =
+type hash_interner<T: const> =
     {map: hashmap<T, uint>,
      vect: dvec<T>,
      hasher: hashfn<T>,
@@ -13,28 +13,34 @@ type interner<T: const> =
 
 fn mk<T: const copy>(hasher: hashfn<T>, eqer: eqfn<T>) -> interner<T> {
     let m = map::hashmap::<T, uint>(hasher, eqer);
-    ret {map: m, vect: dvec(), hasher: hasher, eqer: eqer};
+    let hi: hash_interner<T> =
+        {map: m, vect: dvec(), hasher: hasher, eqer: eqer};
+    ret hi as interner::<T>;
 }
 
-fn intern<T: const copy>(itr: interner<T>, val: T) -> uint {
-    alt itr.map.find(val) {
-      some(idx) { ret idx; }
-      none {
-        let new_idx = itr.vect.len();
-        itr.map.insert(val, new_idx);
-        itr.vect.push(val);
-        ret new_idx;
-      }
-    }
+/* when traits can extend traits, we should extend index<uint,T> to get [] */
+iface interner<T: const copy> {
+    fn intern(T) -> uint;
+    pure fn get(uint) -> T;
+    fn len() -> uint;
 }
 
-// |get| isn't "pure" in the traditional sense, because it can go from
-// failing to returning a value as items are interned. But for typestate,
-// where we first check a pred and then rely on it, ceasing to fail is ok.
-pure fn get<T: const copy>(itr: interner<T>, idx: uint) -> T {
-    unchecked {
-        itr.vect.get_elt(idx)
+impl <T: const copy> of interner<T> for hash_interner<T> {
+    fn intern(val: T) -> uint {
+        alt self.map.find(val) {
+          some(idx) { ret idx; }
+          none {
+            let new_idx = self.vect.len();
+            self.map.insert(val, new_idx);
+            self.vect.push(val);
+            ret new_idx;
+          }
+        }
     }
-}
 
-fn len<T: const>(itr: interner<T>) -> uint { ret itr.vect.len(); }
+    // this isn't "pure" in the traditional sense, because it can go from
+    // failing to returning a value as items are interned. But for typestate,
+    // where we first check a pred and then rely on it, ceasing to fail is ok.
+    pure fn get(idx: uint) -> T { self.vect.get_elt(idx) }
+    fn len() -> uint { ret self.vect.len(); }
+}
\ No newline at end of file