diff options
| author | Igor Matuszewski <Xanewok@gmail.com> | 2018-09-24 16:28:53 +0200 |
|---|---|---|
| committer | Igor Matuszewski <Xanewok@gmail.com> | 2018-09-28 01:54:00 +0200 |
| commit | 1e593be5936a3b42a2b2680b3d04082e89fa4158 (patch) | |
| tree | c8c0e6bd79061ca75e28de8dd8aef95b31e62251 /src/librustc_save_analysis | |
| parent | d45f87701ce9926ecd4f4e01c4a60443227de62d (diff) | |
| download | rust-1e593be5936a3b42a2b2680b3d04082e89fa4158.tar.gz rust-1e593be5936a3b42a2b2680b3d04082e89fa4158.zip | |
Remap only source files in the command line
Diffstat (limited to 'src/librustc_save_analysis')
| -rw-r--r-- | src/librustc_save_analysis/dump_visitor.rs | 47 | ||||
| -rw-r--r-- | src/librustc_save_analysis/lib.rs | 23 |
2 files changed, 31 insertions, 39 deletions
diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs index c87f52f8bd1..278880b841d 100644 --- a/src/librustc_save_analysis/dump_visitor.rs +++ b/src/librustc_save_analysis/dump_visitor.rs @@ -25,12 +25,12 @@ use rustc::hir::def::Def as HirDef; use rustc::hir::def_id::DefId; +use rustc::session::config::Input; use rustc::ty::{self, TyCtxt}; use rustc_data_structures::fx::FxHashSet; use std::path::Path; use std::env; -use std::fs; use syntax::ast::{self, Attribute, NodeId, PatKind, CRATE_NODE_ID}; use syntax::parse::token; @@ -173,20 +173,13 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> { self.dumper.crate_prelude(data); } - pub fn dump_compilation_options(&mut self, crate_name: &str) { - // Apply possible `remap-path-prefix` remapping to the raw command - let command = { - let mapping = self.tcx.sess.source_map().path_mapping(); - let remap_arg = |x: &str| -> String { - match fs::canonicalize(x) { - Ok(path) => mapping.map_prefix(path).0.to_str().unwrap().to_owned(), - Err(_) => x.to_owned(), // Probably not a path, ignore - } - }; - + pub fn dump_compilation_options(&mut self, input: &Input, crate_name: &str) { + // Apply possible `remap-path-prefix` remapping to the input source file + // (and don't include remapping args anymore) + let (program, arguments) = { let remap_arg_indices = { let mut indices = FxHashSet(); - // rustc args are guaranteed to be valid UTF-8 (checked early) + // Args are guaranteed to be valid UTF-8 (checked early) for (i, e) in env::args().enumerate() { if e.starts_with("--remap-path-prefix=") { indices.insert(i); @@ -198,26 +191,30 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> { indices }; - let args = env::args() + let mut args = env::args() .enumerate() .filter(|(i, _)| !remap_arg_indices.contains(i)) - .map(|(_, elem)| { - let mut arg = elem.splitn(2, '='); - match (arg.next(), arg.next()) { - // Apart from `--remap...`, in `a=b` args usually only - // `b` is a path (e.g. `--extern some_crate=/path/to..`) - (Some(a), Some(b)) => format!("{}={}", a, remap_arg(b)), - (Some(a), _) => remap_arg(a), - _ => unreachable!(), + .map(|(_, arg)| { + match input { + Input::File(ref path) if path == Path::new(&arg) => { + let mapped = &self.tcx.sess.local_crate_source_file; + mapped + .as_ref() + .unwrap() + .to_string_lossy() + .into() + }, + _ => arg, } - }).collect::<Vec<_>>(); + }); - args.as_slice().join(" ") + (args.next().unwrap(), args.collect()) }; let data = CompilationOptions { directory: self.tcx.sess.working_dir.0.clone(), - command, + program, + arguments, output: self.save_ctxt.compilation_output(crate_name), }; diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index 702edb70757..e092fc786dd 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -46,7 +46,7 @@ use rustc::hir::def::Def as HirDef; use rustc::hir::Node; use rustc::hir::def_id::{DefId, LOCAL_CRATE}; use rustc::middle::cstore::ExternCrate; -use rustc::session::config::{CrateType, OutputType}; +use rustc::session::config::{CrateType, Input, OutputType}; use rustc::ty::{self, TyCtxt}; use rustc_typeck::hir_ty_to_ty; use rustc_codegen_utils::link::{filename_for_metadata, out_filename}; @@ -74,7 +74,7 @@ use span_utils::SpanUtils; use rls_data::config::Config; use rls_data::{ - CrateSource, Def, DefKind, ExternalCrateData, GlobalCrateId, Impl, ImplKind, MacroRef, Ref, + Def, DefKind, ExternalCrateData, GlobalCrateId, Impl, ImplKind, MacroRef, Ref, RefKind, Relation, RelationKind, SpanData, }; @@ -143,11 +143,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> { continue; } }; - let src = self.tcx.used_crate_source(n); let lo_loc = self.span_utils.sess.source_map().lookup_char_pos(span.lo()); - let map_prefix = |path: &PathBuf| -> PathBuf { - self.tcx.sess.source_map().path_mapping().map_prefix(path.to_owned()).0 - }; result.push(ExternalCrateData { // FIXME: change file_name field to PathBuf in rls-data @@ -158,11 +154,6 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> { name: self.tcx.crate_name(n).to_string(), disambiguator: self.tcx.crate_disambiguator(n).to_fingerprint().as_value(), }, - source: CrateSource { - dylib: src.dylib.as_ref().map(|(path, _)| map_prefix(path)), - rlib: src.rlib.as_ref().map(|(path, _)| map_prefix(path)), - rmeta: src.rmeta.as_ref().map(|(path, _)| map_prefix(path)), - } }); } @@ -1046,6 +1037,7 @@ pub trait SaveHandler { save_ctxt: SaveContext<'l, 'tcx>, krate: &ast::Crate, cratename: &str, + input: &'l Input, ); } @@ -1111,13 +1103,14 @@ impl<'a> SaveHandler for DumpHandler<'a> { save_ctxt: SaveContext<'l, 'tcx>, krate: &ast::Crate, cratename: &str, + input: &'l Input, ) { let output = &mut self.output_file(&save_ctxt); let mut dumper = JsonDumper::new(output, save_ctxt.config.clone()); let mut visitor = DumpVisitor::new(save_ctxt, &mut dumper); visitor.dump_crate_info(cratename, krate); - visitor.dump_compilation_options(cratename); + visitor.dump_compilation_options(input, cratename); visit::walk_crate(&mut visitor, krate); } } @@ -1133,6 +1126,7 @@ impl<'b> SaveHandler for CallbackHandler<'b> { save_ctxt: SaveContext<'l, 'tcx>, krate: &ast::Crate, cratename: &str, + input: &'l Input, ) { // We're using the JsonDumper here because it has the format of the // save-analysis results that we will pass to the callback. IOW, we are @@ -1143,7 +1137,7 @@ impl<'b> SaveHandler for CallbackHandler<'b> { let mut visitor = DumpVisitor::new(save_ctxt, &mut dumper); visitor.dump_crate_info(cratename, krate); - visitor.dump_compilation_options(cratename); + visitor.dump_compilation_options(input, cratename); visit::walk_crate(&mut visitor, krate); } } @@ -1153,6 +1147,7 @@ pub fn process_crate<'l, 'tcx, H: SaveHandler>( krate: &ast::Crate, analysis: &'l ty::CrateAnalysis, cratename: &str, + input: &'l Input, config: Option<Config>, mut handler: H, ) { @@ -1170,7 +1165,7 @@ pub fn process_crate<'l, 'tcx, H: SaveHandler>( impl_counter: Cell::new(0), }; - handler.save(save_ctxt, krate, cratename) + handler.save(save_ctxt, krate, cratename, input) }) } |
