about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-06-29 18:36:52 -0700
committerBrian Anderson <banderson@mozilla.com>2011-06-30 10:06:25 -0700
commitafc8a5c03179cae725837c95fe0bc426bcad304d (patch)
tree988d1517e0dc5dd91975d0057012e973e29c593c
parentd53bfad8e7b6f199436d8838f75eb90713dffd1d (diff)
downloadrust-afc8a5c03179cae725837c95fe0bc426bcad304d.tar.gz
rust-afc8a5c03179cae725837c95fe0bc426bcad304d.zip
Convert the eval::env to an ast::crate_cfg
crate_cfg will replace eval::env as the mechanism for conditional compilation.
This is a transitional step so they can both exist together.

Issue #489
-rw-r--r--src/comp/front/parser.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index a383e79619a..9a4e08f8e27 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -33,6 +33,7 @@ type parser =
         fn get_restriction() -> restriction ;
         fn get_file_type() -> file_type ;
         fn get_env() -> eval::env ;
+        fn get_cfg() -> ast::crate_cfg;
         fn get_session() -> session::session ;
         fn get_span() -> common::span ;
         fn get_lo_pos() -> uint ;
@@ -53,6 +54,7 @@ fn new_parser(session::session sess, eval::env env,
               str path, uint pos, ast::node_id next_id) -> parser {
     obj stdio_parser(session::session sess,
                      eval::env env,
+                     ast::crate_cfg cfg,
                      file_type ftype,
                      mutable token::token tok,
                      mutable uint lo,
@@ -84,6 +86,7 @@ fn new_parser(session::session sess, eval::env env,
         fn get_last_lo_pos() -> uint { ret last_lo; }
         fn get_file_type() -> file_type { ret ftype; }
         fn get_env() -> eval::env { ret env; }
+        fn get_cfg() -> ast::crate_cfg { ret cfg; }
         fn get_prec_table() -> vec[op_spec] { ret precs; }
         fn get_str(token::str_num i) -> str {
             ret interner::get(*rdr.get_interner(), i);
@@ -102,6 +105,18 @@ fn new_parser(session::session sess, eval::env env,
         }
         fn next_id() -> ast::node_id { ret next_id_var; }
     }
+
+    auto cfg = {
+        fn m(&tup(ast::ident, eval::val) item) -> @ast::meta_item {
+            auto name = item._0;
+            auto value = eval::val_as_str(item._1);
+            auto meta_item_ = ast::meta_name_value(name, value);
+            ret @rec(node=meta_item_,
+                     span=rec(lo=0u,hi=0u));
+        }
+        vec::map(m, env)
+    };
+
     auto ftype = SOURCE_FILE;
     if (str::ends_with(path, ".rc")) { ftype = CRATE_FILE; }
     auto srdr = io::file_reader(path);
@@ -113,8 +128,8 @@ fn new_parser(session::session sess, eval::env env,
 
     lexer::consume_whitespace_and_comments(rdr);
     auto npos = rdr.get_chpos();
-    ret stdio_parser(sess, env, ftype, lexer::next_token(rdr), npos, npos,
-                     npos, UNRESTRICTED, rdr,
+    ret stdio_parser(sess, env, cfg, ftype, lexer::next_token(rdr),
+                     npos, npos, npos, UNRESTRICTED, rdr,
                      prec_table(), next_id, bad_expr_word_table(),
                      ext::syntax_expander_table());
 }
@@ -2319,7 +2334,7 @@ fn parse_crate_from_source_file(&parser p) -> @ast::crate {
     ret @spanned(lo, p.get_lo_pos(), rec(directives=cdirs,
                                          module=m,
                                          attrs=crate_attrs._0,
-                                         config=[]));
+                                         config=p.get_cfg()));
 }
 
 fn parse_str(&parser p) -> ast::ident {
@@ -2452,7 +2467,7 @@ fn parse_crate_from_crate_file(&parser p) -> @ast::crate {
     ret @spanned(lo, hi, rec(directives=cdirs,
                              module=m,
                              attrs=crate_attrs,
-                             config=[]));
+                             config=p.get_cfg()));
 }
 //
 // Local Variables: