@@ -24,7 +24,7 @@ use serde_json;
2424use crate :: actions:: progress:: ProgressUpdate ;
2525use crate :: build:: cargo_plan:: CargoPlan ;
2626use crate :: build:: environment:: { self , Environment , EnvironmentLock } ;
27- use crate :: build:: plan:: BuildPlan ;
27+ use crate :: build:: plan:: { BuildPlan , Crate } ;
2828use crate :: build:: { BufWriter , BuildResult , CompilationContext , Internals , PackageArg } ;
2929use crate :: config:: Config ;
3030use crate :: lsp_data:: { Position , Range } ;
@@ -58,6 +58,8 @@ pub(super) fn cargo(
5858 let diagnostics_clone = diagnostics. clone ( ) ;
5959 let analysis = Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ;
6060 let analysis_clone = analysis. clone ( ) ;
61+ let input_files = Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ;
62+ let input_files_clone = input_files. clone ( ) ;
6163 let out = Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ;
6264 let out_clone = out. clone ( ) ;
6365
@@ -74,6 +76,7 @@ pub(super) fn cargo(
7476 env_lock,
7577 diagnostics,
7678 analysis,
79+ input_files,
7780 out,
7881 progress_sender,
7982 )
@@ -93,7 +96,11 @@ pub(super) fn cargo(
9396 . unwrap ( )
9497 . into_inner ( )
9598 . unwrap ( ) ;
96- BuildResult :: Success ( cwd. clone ( ) , diagnostics, analysis, true )
99+ let input_files = Arc :: try_unwrap ( input_files_clone)
100+ . unwrap ( )
101+ . into_inner ( )
102+ . unwrap ( ) ;
103+ BuildResult :: Success ( cwd. clone ( ) , diagnostics, analysis, input_files, true )
97104 }
98105 Err ( error) => {
99106 let stdout = String :: from_utf8 ( out_clone. lock ( ) . unwrap ( ) . to_owned ( ) ) . unwrap ( ) ;
@@ -123,6 +130,7 @@ fn run_cargo(
123130 env_lock : Arc < EnvironmentLock > ,
124131 compiler_messages : Arc < Mutex < Vec < String > > > ,
125132 analysis : Arc < Mutex < Vec < Analysis > > > ,
133+ input_files : Arc < Mutex < HashMap < PathBuf , HashSet < Crate > > > > ,
126134 out : Arc < Mutex < Vec < u8 > > > ,
127135 progress_sender : Sender < ProgressUpdate > ,
128136) -> Result < PathBuf , failure:: Error > {
@@ -163,6 +171,7 @@ fn run_cargo(
163171 vfs,
164172 compiler_messages,
165173 analysis,
174+ input_files,
166175 progress_sender,
167176 inner_lock,
168177 restore_env,
@@ -180,6 +189,7 @@ fn run_cargo_ws(
180189 vfs : Arc < Vfs > ,
181190 compiler_messages : Arc < Mutex < Vec < String > > > ,
182191 analysis : Arc < Mutex < Vec < Analysis > > > ,
192+ input_files : Arc < Mutex < HashMap < PathBuf , HashSet < Crate > > > > ,
183193 progress_sender : Sender < ProgressUpdate > ,
184194 inner_lock : environment:: InnerLock ,
185195 mut restore_env : Environment < ' _ > ,
@@ -275,6 +285,7 @@ fn run_cargo_ws(
275285 vfs,
276286 compiler_messages,
277287 analysis,
288+ input_files,
278289 progress_sender,
279290 reached_primary. clone ( ) ,
280291 ) ;
@@ -321,6 +332,7 @@ struct RlsExecutor {
321332 /// Packages which are directly a member of the workspace, for which
322333 /// analysis and diagnostics will be provided
323334 member_packages : Mutex < HashSet < PackageId > > ,
335+ input_files : Arc < Mutex < HashMap < PathBuf , HashSet < Crate > > > > ,
324336 /// JSON compiler messages emitted for each primary compiled crate
325337 compiler_messages : Arc < Mutex < Vec < String > > > ,
326338 progress_sender : Mutex < Sender < ProgressUpdate > > ,
@@ -341,6 +353,7 @@ impl RlsExecutor {
341353 vfs : Arc < Vfs > ,
342354 compiler_messages : Arc < Mutex < Vec < String > > > ,
343355 analysis : Arc < Mutex < Vec < Analysis > > > ,
356+ input_files : Arc < Mutex < HashMap < PathBuf , HashSet < Crate > > > > ,
344357 progress_sender : Sender < ProgressUpdate > ,
345358 reached_primary : Arc < AtomicBool > ,
346359 ) -> RlsExecutor {
@@ -352,6 +365,7 @@ impl RlsExecutor {
352365 env_lock,
353366 vfs,
354367 analysis,
368+ input_files,
355369 member_packages : Mutex :: new ( member_packages) ,
356370 compiler_messages,
357371 progress_sender : Mutex :: new ( progress_sender) ,
@@ -559,18 +573,32 @@ impl Executor for RlsExecutor {
559573 cx. build_dir . clone ( ) . unwrap ( )
560574 } ;
561575
562- if let BuildResult :: Success ( _, mut messages, mut analysis, success) = super :: rustc:: rustc (
563- & self . vfs ,
564- & args,
565- & envs,
566- cargo_cmd. get_cwd ( ) ,
567- & build_dir,
568- Arc :: clone ( & self . config ) ,
569- & self . env_lock . as_facade ( ) ,
570- ) {
576+ if let BuildResult :: Success ( _, mut messages, mut analysis, input_files, success) =
577+ super :: rustc:: rustc (
578+ & self . vfs ,
579+ & args,
580+ & envs,
581+ cargo_cmd. get_cwd ( ) ,
582+ & build_dir,
583+ Arc :: clone ( & self . config ) ,
584+ & self . env_lock . as_facade ( ) ,
585+ ) {
571586 self . compiler_messages . lock ( ) . unwrap ( ) . append ( & mut messages) ;
572587 self . analysis . lock ( ) . unwrap ( ) . append ( & mut analysis) ;
573588
589+ // Cache calculated input files for a given rustc invocation
590+ {
591+ let mut cx = self . compilation_cx . lock ( ) . unwrap ( ) ;
592+ let plan = cx. build_plan . as_cargo_mut ( ) . unwrap ( ) ;
593+ let input_files = input_files. keys ( ) . cloned ( ) . collect ( ) ;
594+ plan. cache_input_files ( id, target, mode, input_files, cargo_cmd. get_cwd ( ) ) ;
595+ }
596+
597+ let mut self_input_files = self . input_files . lock ( ) . unwrap ( ) ;
598+ for ( file, inputs) in input_files {
599+ self_input_files. entry ( file) . or_default ( ) . extend ( inputs) ;
600+ }
601+
574602 if !success {
575603 return Err ( format_err ! ( "Build error" ) ) ;
576604 }
0 commit comments