about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorLuca Bruno <lucab@debian.org>2013-01-19 16:52:06 +0100
committerLuca Bruno <lucab@debian.org>2013-03-19 14:02:59 +0100
commit0a34a3f0f52cc353bb08efa2005bf92cb7d4921f (patch)
treeb99c56738c12f6693b2aa37a3d54d1416c7e1be5 /src
parente67448d397ed8f468170d6fba95ceae081ece624 (diff)
downloadrust-0a34a3f0f52cc353bb08efa2005bf92cb7d4921f.tar.gz
rust-0a34a3f0f52cc353bb08efa2005bf92cb7d4921f.zip
Make driver::driver::parse_cfgspecs parse any variety of meta_item
All current meta items types (word, name-value, list) are now
properly parsed by rustc --cfg command line. Fixes #2399

Signed-off-by: Luca Bruno <lucab@debian.org>
Diffstat (limited to 'src')
-rw-r--r--src/librustc/driver/driver.rs16
-rw-r--r--src/libsyntax/parse/mod.rs16
2 files changed, 24 insertions, 8 deletions
diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs
index 509ef704b07..c4db61842a5 100644
--- a/src/librustc/driver/driver.rs
+++ b/src/librustc/driver/driver.rs
@@ -132,15 +132,15 @@ pub fn build_configuration(sess: Session, +argv0: ~str, input: input) ->
 }
 
 // Convert strings provided as --cfg [cfgspec] into a crate_cfg
-pub fn parse_cfgspecs(cfgspecs: ~[~str]) -> ast::crate_cfg {
-    // FIXME (#2399): It would be nice to use the parser to parse all
-    // varieties of meta_item here. At the moment we just support the
-    // meta_word variant.
-    let mut words = ~[];
+fn parse_cfgspecs(cfgspecs: ~[~str],
+                  demitter: diagnostic::Emitter) -> ast::crate_cfg {
+    let mut meta = ~[];
     for cfgspecs.each |s| {
-        words.push(attr::mk_word_item(@/*bad*/copy *s));
+        let sess = parse::new_parse_sess(Some(demitter));
+        let m = parse::parse_meta_from_source_str(~"cfgspec", @/*bad*/ copy *s, ~[], sess);
+        meta.push(m)
     }
-    return words;
+    return meta;
 }
 
 pub enum input {
@@ -639,7 +639,7 @@ pub fn build_session_options(+binary: ~str,
     let addl_lib_search_paths =
         getopts::opt_strs(matches, ~"L")
         .map(|s| Path(*s));
-    let cfg = parse_cfgspecs(getopts::opt_strs(matches, ~"cfg"));
+    let cfg = parse_cfgspecs(getopts::opt_strs(matches, ~"cfg"), demitter);
     let test = opt_present(matches, ~"test");
     let android_cross_path = getopts::opt_maybe_str(
         matches, ~"android-cross-path");
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index 66a3ae7a2ae..a133befb046 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -139,6 +139,22 @@ pub fn parse_item_from_source_str(
     maybe_aborted(p.parse_item(attrs),p)
 }
 
+pub fn parse_meta_from_source_str(
+    name: ~str,
+    source: @~str,
+    +cfg: ast::crate_cfg,
+    sess: @mut ParseSess
+) -> @ast::meta_item {
+    let p = new_parser_from_source_str(
+        sess,
+        cfg,
+        /*bad*/ copy name,
+        codemap::FssNone,
+        source
+    );
+    maybe_aborted(p.parse_meta_item(),p)
+}
+
 pub fn parse_stmt_from_source_str(
     name: ~str,
     source: @~str,