@@ -230,16 +230,26 @@ impl ProjectWorkspace {
230230 project_json : ProjectJson ,
231231 target : Option < & str > ,
232232 ) -> Result < ProjectWorkspace > {
233- let sysroot = match project_json. sysroot_src . clone ( ) {
234- Some ( sysroot_src) => {
235- // if `sysroot` isn't specified (only `sysroot_src`), we won't have
236- // a real sysroot path, that's fine. it's just used to discover
237- // the standalone `proc-macro-srv` binary.
238- let sysroot = project_json. sysroot . clone ( ) . unwrap_or_else ( || sysroot_src. clone ( ) ) ;
233+ let sysroot = match ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) {
234+ ( Some ( sysroot) , Some ( sysroot_src) ) => Some ( Sysroot :: load ( sysroot, sysroot_src) ?) ,
235+ ( Some ( sysroot) , None ) => {
236+ // assume sysroot is structured like rustup's and guess `sysroot_src`
237+ let sysroot_src =
238+ sysroot. join ( "lib" ) . join ( "rustlib" ) . join ( "src" ) . join ( "rust" ) . join ( "library" ) ;
239+
239240 Some ( Sysroot :: load ( sysroot, sysroot_src) ?)
240241 }
241- None => None ,
242+ ( None , Some ( sysroot_src) ) => {
243+ // assume sysroot is structured like rustup's and guess `sysroot`
244+ let mut sysroot = sysroot_src. clone ( ) ;
245+ for _ in 0 ..5 {
246+ sysroot. pop ( ) ;
247+ }
248+ Some ( Sysroot :: load ( sysroot, sysroot_src) ?)
249+ }
250+ ( None , None ) => None ,
242251 } ;
252+
243253 let rustc_cfg = rustc_cfg:: get ( None , target) ;
244254 Ok ( ProjectWorkspace :: Json { project : project_json, sysroot, rustc_cfg } )
245255 }
0 commit comments