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 {
!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")
}
fn spanned<T>(x: T) -> codemap::Spanned<T> {
codemap::Spanned {
node: x,
- span: dummy_sp(),
+ span: DUMMY_SP,
}
}
}
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()
}
}
- 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,
},
],
node: ast::view_item_use(~[vp]),
attrs: ~[],
vis: ast::private,
- span: dummy_sp(),
+ span: DUMMY_SP,
};
let vis = vec::append(~[vi2], module.view_items);
}
fn inject_libstd_ref(sess: Session, crate: ast::Crate) -> ast::Crate {
- let fold = StandardLibraryInjector {
+ let mut fold = StandardLibraryInjector {
sess: sess,
};
fold.fold_crate(crate)