libsyntax: Remove some more `@fn` uses

This commit is contained in:
Patrick Walton 2013-08-30 12:21:45 -07:00
parent d126be068b
commit 6a8169db0a
2 changed files with 61 additions and 37 deletions

View File

@ -16,9 +16,10 @@ use extra::getopts::groups::getopts;
use syntax::ast_util::*;
use syntax::codemap::{dummy_sp, Spanned};
use syntax::ext::base::ExtCtxt;
use syntax::{ast, attr, codemap, diagnostic, fold};
use syntax::{ast, attr, codemap, diagnostic, fold, visit};
use syntax::attr::AttrMetaMethods;
use syntax::fold::ast_fold;
use syntax::visit::Visitor;
use rustc::back::link::output_type_exe;
use rustc::back::link;
use rustc::driver::session::{lib_crate, bin_crate};
@ -28,6 +29,7 @@ use package_source::PkgSrc;
use workspace::pkg_parent_workspaces;
use path_util::{installed_library_in_workspace, U_RWX, rust_path, system_library, target_build_dir};
use messages::error;
use conditions::nonexistent_package::cond;
pub use target::{OutputType, Main, Lib, Bench, Test, JustOne, lib_name_of, lib_crate_filename};
use workcache_support::{digest_file_with_date, digest_only_date};
@ -395,31 +397,28 @@ pub fn compile_crate(ctxt: &BuildContext,
compile_input(ctxt, exec, pkg_id, crate, workspace, flags, cfgs, opt, what)
}
struct ViewItemVisitor<'self> {
context: &'self BuildContext,
parent: &'self PkgId,
sess: session::Session,
exec: &'self mut workcache::Exec,
c: &'self ast::Crate,
save: @fn(Path),
}
/// Collect all `extern mod` directives in `c`, then
/// try to install their targets, failing if any target
/// can't be found.
pub fn find_and_install_dependencies(context: &BuildContext,
parent: &PkgId,
sess: session::Session,
exec: &mut workcache::Exec,
c: &ast::Crate,
save: @fn(Path)
) {
use conditions::nonexistent_package::cond;
do c.each_view_item() |vi: &ast::view_item| {
impl<'self> Visitor<()> for ViewItemVisitor<'self> {
fn visit_view_item(&mut self, vi: &ast::view_item, env: ()) {
debug!("A view item!");
match vi.node {
// ignore metadata, I guess
ast::view_item_extern_mod(lib_ident, path_opt, _, _) => {
let lib_name = match path_opt {
Some(p) => p,
None => sess.str_of(lib_ident)
None => self.sess.str_of(lib_ident)
};
debug!("Finding and installing... %s", lib_name);
// Check standard Rust library path first
match system_library(&context.sysroot(), lib_name) {
match system_library(&self.context.sysroot(), lib_name) {
Some(ref installed_path) => {
debug!("It exists: %s", installed_path.to_str());
// Say that [path for c] has a discovered dependency on
@ -428,8 +427,9 @@ pub fn find_and_install_dependencies(context: &BuildContext,
// I'm not sure what the right thing is.
// Now we know that this crate has a discovered dependency on
// installed_path
exec.discover_input("binary", installed_path.to_str(),
digest_only_date(installed_path));
self.exec.discover_input("binary",
installed_path.to_str(),
digest_only_date(installed_path));
}
None => {
// FIXME #8711: need to parse version out of path_opt
@ -437,35 +437,44 @@ pub fn find_and_install_dependencies(context: &BuildContext,
lib_name.to_str());
// Try to install it
let pkg_id = PkgId::new(lib_name);
let workspaces = pkg_parent_workspaces(&context.context, &pkg_id);
let workspaces = pkg_parent_workspaces(&self.context.context,
&pkg_id);
let dep_workspace = if workspaces.is_empty() {
error(fmt!("Couldn't find package %s, which is needed by %s, \
in any of the workspaces in the RUST_PATH (%?)",
lib_name, parent.to_str(), rust_path()));
lib_name,
self.parent.to_str(),
rust_path()));
cond.raise((pkg_id.clone(), ~"Dependency not found"))
}
else {
workspaces[0]
};
let (outputs_disc, inputs_disc) =
context.install(PkgSrc::new(dep_workspace.clone(),
false, pkg_id), &JustOne(Path(lib_crate_filename)));
self.context.install(PkgSrc::new(dep_workspace.clone(),
false,
pkg_id),
&JustOne(Path(
lib_crate_filename)));
debug!("Installed %s, returned %? dependencies and \
%? transitive dependencies",
lib_name, outputs_disc.len(), inputs_disc.len());
for dep in outputs_disc.iter() {
debug!("Discovering a binary input: %s", dep.to_str());
exec.discover_input("binary", dep.to_str(),
digest_only_date(dep));
self.exec.discover_input("binary",
dep.to_str(),
digest_only_date(dep));
}
for &(ref what, ref dep) in inputs_disc.iter() {
if *what == ~"file" {
exec.discover_input(*what, *dep,
digest_file_with_date(&Path(*dep)));
self.exec.discover_input(*what,
*dep,
digest_file_with_date(&Path(*dep)));
}
else if *what == ~"binary" {
exec.discover_input(*what, *dep,
digest_only_date(&Path(*dep)));
self.exec.discover_input(*what,
*dep,
digest_only_date(&Path(*dep)));
}
else {
fail!("Bad kind: %s", *what);
@ -480,14 +489,36 @@ pub fn find_and_install_dependencies(context: &BuildContext,
let install_dir = installed_library.pop();
debug!("Installed %s into %s [%?]", lib_name, install_dir.to_str(),
datestamp(&installed_library));
save(install_dir);
(self.save)(install_dir);
}
}}
// Ignore `use`s
_ => ()
}
true
visit::walk_view_item(self, vi, env)
}
}
/// Collect all `extern mod` directives in `c`, then
/// try to install their targets, failing if any target
/// can't be found.
pub fn find_and_install_dependencies(context: &BuildContext,
parent: &PkgId,
sess: session::Session,
exec: &mut workcache::Exec,
c: &ast::Crate,
save: @fn(Path)) {
debug!("In find_and_install_dependencies...");
let mut visitor = ViewItemVisitor {
context: context,
parent: parent,
sess: sess,
exec: exec,
c: c,
save: save,
};
visit::walk_crate(&mut visitor, c, ())
}
pub fn mk_string_lit(s: @str) -> ast::lit {

View File

@ -236,13 +236,6 @@ fn print_diagnostic(topic: &str, lvl: level, msg: &str) {
print_maybe_styled(fmt!("%s\n", msg), term::attr::Bold);
}
pub fn collect(messages: @mut ~[~str])
-> @fn(Option<(@codemap::CodeMap, Span)>, &str, level) {
let f: @fn(Option<(@codemap::CodeMap, Span)>, &str, level) =
|_o, msg: &str, _l| { messages.push(msg.to_str()); };
f
}
pub struct DefaultEmitter;
impl Emitter for DefaultEmitter {