@@ -29,13 +29,7 @@ pub enum ProjectWorkspace {
29
29
/// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`.
30
30
Cargo { cargo : CargoWorkspace , sysroot : Sysroot } ,
31
31
/// Project workspace was manually specified using a `rust-project.json` file.
32
- Json { project : JsonProject } ,
33
- }
34
-
35
- impl From < JsonProject > for ProjectWorkspace {
36
- fn from ( project : JsonProject ) -> ProjectWorkspace {
37
- ProjectWorkspace :: Json { project }
38
- }
32
+ Json { project : JsonProject , project_location : PathBuf } ,
39
33
}
40
34
41
35
/// `PackageRoot` describes a package root folder.
@@ -164,10 +158,15 @@ impl ProjectWorkspace {
164
158
format ! ( "Failed to open json file {}" , project_json. display( ) )
165
159
} ) ?;
166
160
let reader = BufReader :: new ( file) ;
161
+ let project_location = match project_json. parent ( ) {
162
+ Some ( parent) => PathBuf :: from ( parent) ,
163
+ None => PathBuf :: new ( ) ,
164
+ } ;
167
165
ProjectWorkspace :: Json {
168
166
project : from_reader ( reader) . with_context ( || {
169
167
format ! ( "Failed to deserialize json file {}" , project_json. display( ) )
170
168
} ) ?,
169
+ project_location : project_location,
171
170
}
172
171
}
173
172
ProjectManifest :: CargoToml ( cargo_toml) => {
@@ -200,9 +199,11 @@ impl ProjectWorkspace {
200
199
/// the root is a member of the current workspace
201
200
pub fn to_roots ( & self ) -> Vec < PackageRoot > {
202
201
match self {
203
- ProjectWorkspace :: Json { project } => {
204
- project. roots . iter ( ) . map ( |r| PackageRoot :: new_member ( r. path . clone ( ) ) ) . collect ( )
205
- }
202
+ ProjectWorkspace :: Json { project, project_location } => project
203
+ . roots
204
+ . iter ( )
205
+ . map ( |r| PackageRoot :: new_member ( project_location. join ( & r. path ) ) )
206
+ . collect ( ) ,
206
207
ProjectWorkspace :: Cargo { cargo, sysroot } => cargo
207
208
. packages ( )
208
209
. map ( |pkg| PackageRoot {
@@ -219,7 +220,7 @@ impl ProjectWorkspace {
219
220
220
221
pub fn proc_macro_dylib_paths ( & self ) -> Vec < PathBuf > {
221
222
match self {
222
- ProjectWorkspace :: Json { project } => project
223
+ ProjectWorkspace :: Json { project, .. } => project
223
224
. crates
224
225
. iter ( )
225
226
. filter_map ( |krate| krate. proc_macro_dylib_path . as_ref ( ) )
@@ -235,7 +236,7 @@ impl ProjectWorkspace {
235
236
236
237
pub fn n_packages ( & self ) -> usize {
237
238
match self {
238
- ProjectWorkspace :: Json { project } => project. crates . len ( ) ,
239
+ ProjectWorkspace :: Json { project, .. } => project. crates . len ( ) ,
239
240
ProjectWorkspace :: Cargo { cargo, sysroot } => {
240
241
cargo. packages ( ) . len ( ) + sysroot. crates ( ) . len ( )
241
242
}
@@ -251,13 +252,14 @@ impl ProjectWorkspace {
251
252
) -> CrateGraph {
252
253
let mut crate_graph = CrateGraph :: default ( ) ;
253
254
match self {
254
- ProjectWorkspace :: Json { project } => {
255
+ ProjectWorkspace :: Json { project, project_location } => {
255
256
let crates: FxHashMap < _ , _ > = project
256
257
. crates
257
258
. iter ( )
258
259
. enumerate ( )
259
260
. filter_map ( |( seq_index, krate) | {
260
- let file_id = load ( & krate. root_module ) ?;
261
+ let file_path = project_location. join ( & krate. root_module ) ;
262
+ let file_id = load ( & file_path) ?;
261
263
let edition = match krate. edition {
262
264
json_project:: Edition :: Edition2015 => Edition :: Edition2015 ,
263
265
json_project:: Edition :: Edition2018 => Edition :: Edition2018 ,
@@ -540,7 +542,7 @@ impl ProjectWorkspace {
540
542
ProjectWorkspace :: Cargo { cargo, .. } => {
541
543
Some ( cargo. workspace_root ( ) ) . filter ( |root| path. starts_with ( root) )
542
544
}
543
- ProjectWorkspace :: Json { project : JsonProject { roots, .. } } => roots
545
+ ProjectWorkspace :: Json { project : JsonProject { roots, .. } , .. } => roots
544
546
. iter ( )
545
547
. find ( |root| path. starts_with ( & root. path ) )
546
548
. map ( |root| root. path . as_ref ( ) ) ,
0 commit comments