1
- /// This module represents the RLS view of the Cargo project model:
2
- /// a graph of interdependent packages.
1
+ //! This module represents the RLS view of the Cargo project model:
2
+ //! a graph of interdependent packages.
3
3
use std:: {
4
4
collections:: HashMap ,
5
5
sync:: Arc ,
@@ -20,6 +20,7 @@ use racer;
20
20
21
21
#[ derive( Debug ) ]
22
22
pub struct ProjectModel {
23
+ manifest_to_id : HashMap < PathBuf , Package > ,
23
24
packages : Vec < PackageData > ,
24
25
}
25
26
@@ -28,8 +29,7 @@ pub struct Package(usize);
28
29
29
30
#[ derive( Debug ) ]
30
31
struct PackageData {
31
- manifest : PathBuf ,
32
- lib : Option < PathBuf > ,
32
+ lib : Option < ( PathBuf , String ) > ,
33
33
deps : Vec < Dep > ,
34
34
}
35
35
@@ -40,12 +40,12 @@ pub struct Dep {
40
40
}
41
41
42
42
impl ProjectModel {
43
- pub fn load ( manifest : & Path , vfs : & Vfs ) -> Result < ProjectModel , failure:: Error > {
44
- assert ! ( manifest . ends_with( "Cargo.toml" ) ) ;
43
+ pub fn load ( ws_manifest : & Path , vfs : & Vfs ) -> Result < ProjectModel , failure:: Error > {
44
+ assert ! ( ws_manifest . ends_with( "Cargo.toml" ) ) ;
45
45
let mut config = Config :: default ( ) ?;
46
- // frozen=true , locked=true
47
- config. configure ( 0 , Some ( true ) , & None , true , true , & None , & [ ] ) ?;
48
- let ws = Workspace :: new ( & manifest , & config) ?;
46
+ // frozen = false , locked = false
47
+ config. configure ( 0 , Some ( true ) , & None , false , false , & None , & [ ] ) ?;
48
+ let ws = Workspace :: new ( & ws_manifest , & config) ?;
49
49
// get resolve from lock file
50
50
let prev = {
51
51
let lock_path = ws. root ( ) . to_owned ( ) . join ( "Cargo.lock" ) ;
@@ -55,30 +55,33 @@ impl ProjectModel {
55
55
let v: EncodableResolve = resolve. try_into ( ) ?;
56
56
Some ( v. into_resolve ( & ws) ?)
57
57
}
58
- _ => None
58
+ _ => None ,
59
59
}
60
60
} ;
61
- // then resolve precisely and add overrides
62
61
let mut registry = PackageRegistry :: new ( ws. config ( ) ) ?;
63
62
let resolve = resolve_with_prev ( & mut registry, & ws, prev. as_ref ( ) ) ?;
64
63
let cargo_packages = {
65
64
let ids: Vec < PackageId > = resolve. iter ( ) . cloned ( ) . collect ( ) ;
66
65
registry. get ( & ids)
67
66
} ;
68
-
69
67
let mut pkg_id_to_pkg = HashMap :: new ( ) ;
68
+ let mut manifest_to_id = HashMap :: new ( ) ;
70
69
let mut packages = Vec :: new ( ) ;
71
70
for ( idx, pkg_id) in resolve. iter ( ) . enumerate ( ) {
72
71
let pkg = Package ( idx) ;
73
72
pkg_id_to_pkg. insert ( pkg_id. clone ( ) , pkg) ;
74
73
let cargo_pkg = cargo_packages. get ( pkg_id) ?;
74
+ let manifest = cargo_pkg. manifest_path ( ) . to_owned ( ) ;
75
75
packages. push ( PackageData {
76
- manifest : cargo_pkg. manifest_path ( ) . to_owned ( ) ,
77
- lib : cargo_pkg. targets ( ) . iter ( )
76
+ lib : cargo_pkg
77
+ . targets ( )
78
+ . iter ( )
78
79
. find ( |t| t. is_lib ( ) )
79
- . map ( |t| t. src_path ( ) . to_owned ( ) ) ,
80
+ // racer expect name 'underscored'(crate) name
81
+ . map ( |t| ( t. src_path ( ) . to_owned ( ) , t. name ( ) . replace ( '-' , "_" ) ) ) ,
80
82
deps : Vec :: new ( ) ,
81
- } )
83
+ } ) ;
84
+ manifest_to_id. insert ( manifest, pkg) ;
82
85
}
83
86
for pkg_id in resolve. iter ( ) {
84
87
for ( dep_id, _) in resolve. deps ( & pkg_id) {
@@ -99,28 +102,31 @@ impl ProjectModel {
99
102
}
100
103
}
101
104
}
102
- Ok ( ProjectModel { packages } )
105
+ Ok ( ProjectModel {
106
+ manifest_to_id,
107
+ packages,
108
+ } )
103
109
}
104
110
105
111
pub fn package_for_manifest ( & self , manifest_path : & Path ) -> Option < Package > {
106
- self . packages . iter ( )
107
- . enumerate ( )
108
- . find ( |( _idx, p) | p. manifest == manifest_path)
109
- . map ( |( idx, _p) | Package ( idx) )
112
+ self . manifest_to_id . get ( manifest_path) . map ( |& x| x)
110
113
}
111
114
112
115
fn get ( & self , pkg : Package ) -> & PackageData {
113
116
& self . packages [ pkg. 0 ]
114
117
}
115
118
119
+ fn get_lib ( & self , pkg : Package ) -> Option < & ( PathBuf , String ) > {
120
+ self . packages [ pkg. 0 ] . lib . as_ref ( )
121
+ }
116
122
}
117
123
118
124
impl Package {
119
125
pub fn deps ( self , project : & ProjectModel ) -> & [ Dep ] {
120
126
& project. get ( self ) . deps
121
127
}
122
128
pub fn lib_root ( self , project : & ProjectModel ) -> Option < & Path > {
123
- project. get ( self ) . lib . as_ref ( ) . map ( |p| p. as_path ( ) )
129
+ project. get ( self ) . lib . as_ref ( ) . map ( |p| p. 0 . as_path ( ) )
124
130
}
125
131
}
126
132
@@ -141,6 +147,13 @@ impl racer::ProjectModelProvider for RacerProjectModel {
141
147
}
142
148
fn resolve_dependency ( & self , manifest : & Path , libname : & str ) -> Option < PathBuf > {
143
149
let pkg = self . 0 . package_for_manifest ( manifest) ?;
150
+ // if current package has a library target, we have to provide its own name
151
+ // in examples/tests/benches directory
152
+ if let Some ( lib) = self . 0 . get_lib ( pkg) {
153
+ if lib. 1 == libname {
154
+ return Some ( lib. 0 . clone ( ) ) ;
155
+ }
156
+ }
144
157
let dep = pkg. deps ( & self . 0 )
145
158
. iter ( )
146
159
. find ( |dep| dep. crate_name == libname) ?
0 commit comments