@@ -33,7 +33,7 @@ pub enum ProjectWorkspace {
3333 /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`.
3434 Cargo { cargo : CargoWorkspace , sysroot : Sysroot } ,
3535 /// Project workspace was manually specified using a `rust-project.json` file.
36- Json { project : ProjectJson } ,
36+ Json { project : ProjectJson , sysroot : Option < Sysroot > } ,
3737}
3838
3939impl fmt:: Debug for ProjectWorkspace {
@@ -44,10 +44,10 @@ impl fmt::Debug for ProjectWorkspace {
4444 . field ( "n_packages" , & cargo. packages ( ) . len ( ) )
4545 . field ( "n_sysroot_crates" , & sysroot. crates ( ) . len ( ) )
4646 . finish ( ) ,
47- ProjectWorkspace :: Json { project } => {
47+ ProjectWorkspace :: Json { project, sysroot } => {
4848 let mut debug_struct = f. debug_struct ( "Json" ) ;
4949 debug_struct. field ( "n_crates" , & project. n_crates ( ) ) ;
50- if let Some ( sysroot) = & project . sysroot {
50+ if let Some ( sysroot) = sysroot {
5151 debug_struct. field ( "n_sysroot_crates" , & sysroot. crates ( ) . len ( ) ) ;
5252 }
5353 debug_struct. finish ( )
@@ -169,7 +169,11 @@ impl ProjectWorkspace {
169169 } ) ?;
170170 let project_location = project_json. parent ( ) . unwrap ( ) . to_path_buf ( ) ;
171171 let project = ProjectJson :: new ( & project_location, data) ;
172- ProjectWorkspace :: Json { project }
172+ let sysroot = match & project. sysroot_src {
173+ Some ( path) => Some ( Sysroot :: load ( path) ?) ,
174+ None => None ,
175+ } ;
176+ ProjectWorkspace :: Json { project, sysroot }
173177 }
174178 ProjectManifest :: CargoToml ( cargo_toml) => {
175179 let cargo_version = utf8_stdout ( {
@@ -203,12 +207,21 @@ impl ProjectWorkspace {
203207 Ok ( res)
204208 }
205209
210+ pub fn load_inline ( project_json : ProjectJson ) -> Result < ProjectWorkspace > {
211+ let sysroot = match & project_json. sysroot_src {
212+ Some ( path) => Some ( Sysroot :: load ( path) ?) ,
213+ None => None ,
214+ } ;
215+
216+ Ok ( ProjectWorkspace :: Json { project : project_json, sysroot } )
217+ }
218+
206219 /// Returns the roots for the current `ProjectWorkspace`
207220 /// The return type contains the path and whether or not
208221 /// the root is a member of the current workspace
209222 pub fn to_roots ( & self ) -> Vec < PackageRoot > {
210223 match self {
211- ProjectWorkspace :: Json { project } => project
224+ ProjectWorkspace :: Json { project, sysroot } => project
212225 . crates ( )
213226 . map ( |( _, krate) | PackageRoot {
214227 is_member : krate. is_workspace_member ,
@@ -217,7 +230,7 @@ impl ProjectWorkspace {
217230 } )
218231 . collect :: < FxHashSet < _ > > ( )
219232 . into_iter ( )
220- . chain ( project . sysroot . as_ref ( ) . into_iter ( ) . flat_map ( |sysroot| {
233+ . chain ( sysroot. as_ref ( ) . into_iter ( ) . flat_map ( |sysroot| {
221234 sysroot. crates ( ) . map ( move |krate| PackageRoot {
222235 is_member : false ,
223236 include : vec ! [ sysroot[ krate] . root_dir( ) . to_path_buf( ) ] ,
@@ -255,7 +268,7 @@ impl ProjectWorkspace {
255268
256269 pub fn proc_macro_dylib_paths ( & self ) -> Vec < AbsPathBuf > {
257270 match self {
258- ProjectWorkspace :: Json { project } => project
271+ ProjectWorkspace :: Json { project, sysroot : _ } => project
259272 . crates ( )
260273 . filter_map ( |( _, krate) | krate. proc_macro_dylib_path . as_ref ( ) )
261274 . cloned ( )
@@ -285,9 +298,8 @@ impl ProjectWorkspace {
285298 ) -> CrateGraph {
286299 let mut crate_graph = CrateGraph :: default ( ) ;
287300 match self {
288- ProjectWorkspace :: Json { project } => {
289- let sysroot_dps = project
290- . sysroot
301+ ProjectWorkspace :: Json { project, sysroot } => {
302+ let sysroot_dps = sysroot
291303 . as_ref ( )
292304 . map ( |sysroot| sysroot_to_crate_graph ( & mut crate_graph, sysroot, target, load) ) ;
293305
0 commit comments