rust/src/rustc/front/core_inject.rs

50 lines
1.3 KiB
Rust

use driver::session::session;
use syntax::codemap;
use syntax::ast;
use syntax::ast_util::*;
use syntax::attr;
export maybe_inject_libcore_ref;
fn maybe_inject_libcore_ref(sess: session,
crate: @ast::crate) -> @ast::crate {
if use_core(crate) {
inject_libcore_ref(sess, crate)
} else {
crate
}
}
fn use_core(crate: @ast::crate) -> bool {
!attr::attrs_contains_name(crate.node.attrs, ~"no_core")
}
fn inject_libcore_ref(sess: session,
crate: @ast::crate) -> @ast::crate {
fn spanned<T: Copy>(x: T) -> @ast::spanned<T> {
return @{node: x,
span: dummy_sp()};
}
let n1 = sess.next_node_id();
let n2 = sess.next_node_id();
let vi1 = @{node: ast::view_item_use(sess.ident_of(~"core"), ~[], n1),
attrs: ~[],
vis: ast::public,
span: dummy_sp()};
let vp = spanned(ast::view_path_glob(
ident_to_path(dummy_sp(), sess.ident_of(~"core")),
n2));
let vi2 = @{node: ast::view_item_import(~[vp]),
attrs: ~[],
vis: ast::public,
span: dummy_sp()};
let vis = vec::append(~[vi1, vi2], crate.node.module.view_items);
return @{node: {module: { view_items: vis,.. crate.node.module },
.. crate.node},.. *crate }
}