4949//! user explores them belongs to that extension (it's totally valid to change
5050//! rust-project.json over time via configuration request!)
5151
52- use std:: path:: PathBuf ;
53-
52+ use anyhow:: Result ;
5453use base_db:: { CrateDisplayName , CrateId , CrateName , Dependency , Edition } ;
5554use la_arena:: RawIdx ;
5655use paths:: { AbsPath , AbsPathBuf } ;
5756use rustc_hash:: FxHashMap ;
5857use serde:: { de, Deserialize } ;
58+ use std:: path:: PathBuf ;
5959
6060use crate :: cfg_flag:: CfgFlag ;
6161
@@ -98,34 +98,62 @@ impl ProjectJson {
9898 /// * `base` - The path to the workspace root (i.e. the folder containing `rust-project.json`)
9999 /// * `data` - The parsed contents of `rust-project.json`, or project json that's passed via
100100 /// configuration.
101- pub fn new ( base : & AbsPath , data : ProjectJsonData ) -> ProjectJson {
102- ProjectJson {
103- sysroot : data. sysroot . map ( |it| base. join ( it) ) ,
104- sysroot_src : data. sysroot_src . map ( |it| base. join ( it) ) ,
101+ pub fn new ( base : & AbsPath , data : ProjectJsonData ) -> Result < ProjectJson > {
102+ let absolutize = |p| AbsPathBuf :: try_from ( p) . map ( |it| it. normalize ( ) ) ;
103+ Ok ( ProjectJson {
104+ sysroot : data
105+ . sysroot
106+ . map ( absolutize)
107+ . transpose ( )
108+ . map_err ( |path| {
109+ anyhow:: format_err!(
110+ "sysroot path is required to be absolute: {}" ,
111+ path. display( )
112+ )
113+ } ) ?,
114+ sysroot_src : data
115+ . sysroot_src
116+ . map ( absolutize)
117+ . transpose ( )
118+ . map_err ( |path| {
119+ anyhow:: format_err!(
120+ "sysroot-src path is required to be absolute: {}" ,
121+ path. display( )
122+ )
123+ } ) ?,
105124 project_root : base. to_path_buf ( ) ,
106125 crates : data
107126 . crates
108127 . into_iter ( )
109128 . map ( |crate_data| {
110- let is_workspace_member = crate_data. is_workspace_member . unwrap_or_else ( || {
111- crate_data. root_module . is_relative ( )
112- && !crate_data. root_module . starts_with ( ".." )
113- || crate_data. root_module . starts_with ( base)
114- } ) ;
115- let root_module = base. join ( crate_data. root_module ) . normalize ( ) ;
129+ let root_module = absolutize ( crate_data. root_module ) . map_err ( |path| {
130+ anyhow:: format_err!(
131+ "crate root module path is required to be absolute: {}" ,
132+ path. display( )
133+ )
134+ } ) ?;
135+ let is_workspace_member = crate_data
136+ . is_workspace_member
137+ . unwrap_or_else ( || root_module. starts_with ( base) ) ;
116138 let ( include, exclude) = match crate_data. source {
117139 Some ( src) => {
118140 let absolutize = |dirs : Vec < PathBuf > | {
119141 dirs. into_iter ( )
120- . map ( |it| base. join ( it) . normalize ( ) )
121- . collect :: < Vec < _ > > ( )
142+ . map ( absolutize)
143+ . collect :: < Result < Vec < _ > , _ > > ( )
144+ . map_err ( |path| {
145+ anyhow:: format_err!(
146+ "include and exclude paths are required to be absolute: {}" ,
147+ path. display( )
148+ )
149+ } )
122150 } ;
123- ( absolutize ( src. include_dirs ) , absolutize ( src. exclude_dirs ) )
151+ ( absolutize ( src. include_dirs ) ? , absolutize ( src. exclude_dirs ) ? )
124152 }
125153 None => ( vec ! [ root_module. parent( ) . unwrap( ) . to_path_buf( ) ] , Vec :: new ( ) ) ,
126154 } ;
127155
128- Crate {
156+ Ok ( Crate {
129157 display_name : crate_data
130158 . display_name
131159 . map ( CrateDisplayName :: from_canonical_name) ,
@@ -147,16 +175,23 @@ impl ProjectJson {
147175 env : crate_data. env ,
148176 proc_macro_dylib_path : crate_data
149177 . proc_macro_dylib_path
150- . map ( |it| base. join ( it) ) ,
178+ . map ( absolutize)
179+ . transpose ( )
180+ . map_err ( |path| {
181+ anyhow:: format_err!(
182+ "crate proc macro dylib path is required to be absolute: {}" ,
183+ path. display( )
184+ )
185+ } ) ?,
151186 is_workspace_member,
152187 include,
153188 exclude,
154189 is_proc_macro : crate_data. is_proc_macro ,
155190 repository : crate_data. repository ,
156- }
191+ } )
157192 } )
158- . collect :: < Vec < _ > > ( ) ,
159- }
193+ . collect :: < Result < Vec < _ > > > ( ) ? ,
194+ } )
160195 }
161196
162197 /// Returns the number of crates in the project.
@@ -243,7 +278,7 @@ struct CrateSource {
243278 exclude_dirs : Vec < PathBuf > ,
244279}
245280
246- fn deserialize_crate_name < ' de , D > ( de : D ) -> Result < CrateName , D :: Error >
281+ fn deserialize_crate_name < ' de , D > ( de : D ) -> std :: result :: Result < CrateName , D :: Error >
247282where
248283 D : de:: Deserializer < ' de > ,
249284{
0 commit comments