1
+ use anyhow:: { bail, Context , Result } ;
1
2
use glob:: glob;
2
3
use serde:: { Deserialize , Serialize } ;
3
4
use std:: env;
@@ -22,11 +23,44 @@ pub struct Crate {
22
23
}
23
24
24
25
impl RustAnalyzerProject {
25
- pub fn new ( ) -> RustAnalyzerProject {
26
- RustAnalyzerProject {
27
- sysroot_src : String :: new ( ) ,
28
- crates : Vec :: new ( ) ,
26
+ pub fn build ( ) -> Result < Self > {
27
+ // check if RUST_SRC_PATH is set
28
+ if let Ok ( sysroot_src) = env:: var ( "RUST_SRC_PATH" ) {
29
+ return Ok ( Self {
30
+ sysroot_src,
31
+ crates : Vec :: new ( ) ,
32
+ } ) ;
29
33
}
34
+
35
+ let toolchain = Command :: new ( "rustc" )
36
+ . arg ( "--print" )
37
+ . arg ( "sysroot" )
38
+ . output ( )
39
+ . context ( "Failed to get the sysroot from `rustc`. Do you have `rustc` installed?" ) ?
40
+ . stdout ;
41
+
42
+ let toolchain =
43
+ String :: from_utf8 ( toolchain) . context ( "The toolchain path is invalid UTF8" ) ?;
44
+ let toolchain = toolchain. trim_end ( ) ;
45
+
46
+ println ! ( "Determined toolchain: {toolchain}\n " ) ;
47
+
48
+ let Ok ( sysroot_src) = Path :: new ( toolchain)
49
+ . join ( "lib" )
50
+ . join ( "rustlib" )
51
+ . join ( "src" )
52
+ . join ( "rust" )
53
+ . join ( "library" )
54
+ . into_os_string ( )
55
+ . into_string ( )
56
+ else {
57
+ bail ! ( "The sysroot path is invalid UTF8" ) ;
58
+ } ;
59
+
60
+ Ok ( Self {
61
+ sysroot_src,
62
+ crates : Vec :: new ( ) ,
63
+ } )
30
64
}
31
65
32
66
/// Write rust-project.json to disk
@@ -66,39 +100,4 @@ impl RustAnalyzerProject {
66
100
}
67
101
Ok ( ( ) )
68
102
}
69
-
70
- /// Use `rustc` to determine the default toolchain
71
- pub fn get_sysroot_src ( & mut self ) -> Result < ( ) , Box < dyn Error > > {
72
- // check if RUST_SRC_PATH is set
73
- if let Ok ( path) = env:: var ( "RUST_SRC_PATH" ) {
74
- self . sysroot_src = path;
75
- return Ok ( ( ) ) ;
76
- }
77
-
78
- let toolchain = Command :: new ( "rustc" )
79
- . arg ( "--print" )
80
- . arg ( "sysroot" )
81
- . output ( ) ?
82
- . stdout ;
83
-
84
- let toolchain = String :: from_utf8 ( toolchain) ?;
85
- let toolchain = toolchain. trim_end ( ) ;
86
-
87
- println ! ( "Determined toolchain: {toolchain}\n " ) ;
88
-
89
- let Ok ( path) = Path :: new ( toolchain)
90
- . join ( "lib" )
91
- . join ( "rustlib" )
92
- . join ( "src" )
93
- . join ( "rust" )
94
- . join ( "library" )
95
- . into_os_string ( )
96
- . into_string ( )
97
- else {
98
- return Err ( "The sysroot path is invalid UTF8" . into ( ) ) ;
99
- } ;
100
- self . sysroot_src = path;
101
-
102
- Ok ( ( ) )
103
- }
104
103
}
0 commit comments