]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc/front/std_inject.rs
auto merge of #10696 : fhahn/rust/issue9543-remove-extern-mod-foo, r=pcwalton
[rust.git] / src / librustc / front / std_inject.rs
index 2253f151ddf59d7d53c48b1e88a1e13fdce37560..cebf42eff111aabbe6ded39fae5c3d963b12aaf4 100644 (file)
 use std::vec;
 use syntax::ast;
 use syntax::attr;
-use syntax::codemap::dummy_sp;
+use syntax::codemap::DUMMY_SP;
 use syntax::codemap;
 use syntax::fold::ast_fold;
 use syntax::fold;
 use syntax::opt_vec;
+use syntax::util::small_vector::SmallVector;
 
-static STD_VERSION: &'static str = "0.9-pre";
+pub static VERSION: &'static str = "0.9-pre";
 
 pub fn maybe_inject_libstd_ref(sess: Session, crate: ast::Crate)
                                -> ast::Crate {
@@ -35,6 +36,10 @@ fn use_std(crate: &ast::Crate) -> bool {
     !attr::contains_name(crate.attrs, "no_std")
 }
 
+fn use_uv(crate: &ast::Crate) -> bool {
+    !attr::contains_name(crate.attrs, "no_uv")
+}
+
 fn no_prelude(attrs: &[ast::Attribute]) -> bool {
     attr::contains_name(attrs, "no_implicit_prelude")
 }
@@ -42,7 +47,7 @@ fn no_prelude(attrs: &[ast::Attribute]) -> bool {
 fn spanned<T>(x: T) -> codemap::Spanned<T> {
     codemap::Spanned {
         node: x,
-        span: dummy_sp(),
+        span: DUMMY_SP,
     }
 }
 
@@ -51,21 +56,39 @@ struct StandardLibraryInjector {
 }
 
 impl fold::ast_fold for StandardLibraryInjector {
-    fn fold_crate(&self, crate: ast::Crate) -> ast::Crate {
-        let version = STD_VERSION.to_managed();
-        let vi1 = ast::view_item {
+    fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
+        let mut vis = ~[ast::view_item {
             node: ast::view_item_extern_mod(self.sess.ident_of("std"),
-                                            None,
-                                            ~[],
+                                            Some((format!("std\\#{}", VERSION).to_managed(),
+                                                  ast::CookedStr)),
                                             ast::DUMMY_NODE_ID),
-            attrs: ~[
-                attr::mk_attr(attr::mk_name_value_item_str(@"vers", version))
-            ],
+            attrs: ~[],
             vis: ast::private,
-            span: dummy_sp()
-        };
+            span: DUMMY_SP
+        }];
+
+        if use_uv(&crate) && !self.sess.building_library.get() {
+            vis.push(ast::view_item {
+                node: ast::view_item_extern_mod(self.sess.ident_of("green"),
+                                                Some((format!("green\\#{}", VERSION).to_managed(),
+                                                      ast::CookedStr)),
+                                                ast::DUMMY_NODE_ID),
+                attrs: ~[],
+                vis: ast::private,
+                span: DUMMY_SP
+            });
+            vis.push(ast::view_item {
+                node: ast::view_item_extern_mod(self.sess.ident_of("rustuv"),
+                                                Some((format!("rustuv\\#{}", VERSION).to_managed(),
+                                                      ast::CookedStr)),
+                                                ast::DUMMY_NODE_ID),
+                attrs: ~[],
+                vis: ast::private,
+                span: DUMMY_SP
+            });
+        }
 
-        let vis = vec::append(~[vi1], crate.module.view_items);
+        vis.push_all(crate.module.view_items);
         let mut new_module = ast::_mod {
             view_items: vis,
             ..crate.module.clone()
@@ -83,30 +106,30 @@ fn fold_crate(&self, crate: ast::Crate) -> ast::Crate {
         }
     }
 
-    fn fold_item(&self, item: @ast::item) -> Option<@ast::item> {
+    fn fold_item(&mut self, item: @ast::item) -> SmallVector<@ast::item> {
         if !no_prelude(item.attrs) {
             // only recur if there wasn't `#[no_implicit_prelude];`
             // on this item, i.e. this means that the prelude is not
             // implicitly imported though the whole subtree
             fold::noop_fold_item(item, self)
         } else {
-            Some(item)
+            SmallVector::one(item)
         }
     }
 
-    fn fold_mod(&self, module: &ast::_mod) -> ast::_mod {
+    fn fold_mod(&mut self, module: &ast::_mod) -> ast::_mod {
         let prelude_path = ast::Path {
-            span: dummy_sp(),
+            span: DUMMY_SP,
             global: false,
             segments: ~[
                 ast::PathSegment {
                     identifier: self.sess.ident_of("std"),
-                    lifetime: None,
+                    lifetimes: opt_vec::Empty,
                     types: opt_vec::Empty,
                 },
                 ast::PathSegment {
                     identifier: self.sess.ident_of("prelude"),
-                    lifetime: None,
+                    lifetimes: opt_vec::Empty,
                     types: opt_vec::Empty,
                 },
             ],
@@ -118,7 +141,7 @@ fn fold_mod(&self, module: &ast::_mod) -> ast::_mod {
             node: ast::view_item_use(~[vp]),
             attrs: ~[],
             vis: ast::private,
-            span: dummy_sp(),
+            span: DUMMY_SP,
         };
 
         let vis = vec::append(~[vi2], module.view_items);
@@ -133,7 +156,7 @@ fn fold_mod(&self, module: &ast::_mod) -> ast::_mod {
 }
 
 fn inject_libstd_ref(sess: Session, crate: ast::Crate) -> ast::Crate {
-    let fold = StandardLibraryInjector {
+    let mut fold = StandardLibraryInjector {
         sess: sess,
     };
     fold.fold_crate(crate)