@@ -5,7 +5,7 @@ use std::sync::Arc;
5
5
6
6
use ra_cfg:: CfgOptions ;
7
7
use rustc_hash:: FxHashMap ;
8
- use test_utils:: { extract_offset, parse_fixture, CURSOR_MARKER } ;
8
+ use test_utils:: { extract_offset, parse_fixture, parse_single_fixture , CURSOR_MARKER } ;
9
9
10
10
use crate :: {
11
11
input:: CrateName , CrateGraph , CrateId , Edition , Env , FileId , FilePosition , RelativePathBuf ,
@@ -45,23 +45,37 @@ pub trait WithFixture: Default + SourceDatabaseExt + 'static {
45
45
46
46
impl < DB : SourceDatabaseExt + Default + ' static > WithFixture for DB { }
47
47
48
- fn with_single_file ( db : & mut dyn SourceDatabaseExt , text : & str ) -> FileId {
48
+ fn with_single_file ( db : & mut dyn SourceDatabaseExt , ra_fixture : & str ) -> FileId {
49
49
let file_id = FileId ( 0 ) ;
50
50
let rel_path: RelativePathBuf = "/main.rs" . into ( ) ;
51
51
52
52
let mut source_root = SourceRoot :: new_local ( ) ;
53
53
source_root. insert_file ( rel_path. clone ( ) , file_id) ;
54
54
55
- let mut crate_graph = CrateGraph :: default ( ) ;
56
- crate_graph. add_crate_root (
57
- file_id,
58
- Edition :: Edition2018 ,
59
- None ,
60
- CfgOptions :: default ( ) ,
61
- Env :: default ( ) ,
62
- ) ;
63
-
64
- db. set_file_text ( file_id, Arc :: new ( text. to_string ( ) ) ) ;
55
+ let fixture = parse_single_fixture ( ra_fixture) ;
56
+
57
+ let crate_graph = if let Some ( entry) = fixture {
58
+ let meta = match parse_meta ( & entry. meta ) {
59
+ ParsedMeta :: File ( it) => it,
60
+ _ => panic ! ( "with_single_file only support file meta" ) ,
61
+ } ;
62
+
63
+ let mut crate_graph = CrateGraph :: default ( ) ;
64
+ crate_graph. add_crate_root ( file_id, meta. edition , meta. krate , meta. cfg , meta. env ) ;
65
+ crate_graph
66
+ } else {
67
+ let mut crate_graph = CrateGraph :: default ( ) ;
68
+ crate_graph. add_crate_root (
69
+ file_id,
70
+ Edition :: Edition2018 ,
71
+ None ,
72
+ CfgOptions :: default ( ) ,
73
+ Env :: default ( ) ,
74
+ ) ;
75
+ crate_graph
76
+ } ;
77
+
78
+ db. set_file_text ( file_id, Arc :: new ( ra_fixture. to_string ( ) ) ) ;
65
79
db. set_file_relative_path ( file_id, rel_path) ;
66
80
db. set_file_source_root ( file_id, WORKSPACE ) ;
67
81
db. set_source_root ( WORKSPACE , Arc :: new ( source_root) ) ;
@@ -104,7 +118,7 @@ fn with_files(db: &mut dyn SourceDatabaseExt, fixture: &str) -> Option<FilePosit
104
118
meta. edition ,
105
119
Some ( krate. clone ( ) ) ,
106
120
meta. cfg ,
107
- Env :: default ( ) ,
121
+ meta . env ,
108
122
) ;
109
123
let prev = crates. insert ( krate. clone ( ) , crate_id) ;
110
124
assert ! ( prev. is_none( ) ) ;
@@ -167,9 +181,10 @@ struct FileMeta {
167
181
deps : Vec < String > ,
168
182
cfg : CfgOptions ,
169
183
edition : Edition ,
184
+ env : Env ,
170
185
}
171
186
172
- //- /lib.rs crate:foo deps:bar,baz
187
+ //- /lib.rs crate:foo deps:bar,baz cfg:foo=a,bar=b env:OUTDIR=path/to,OTHER=foo)
173
188
fn parse_meta ( meta : & str ) -> ParsedMeta {
174
189
let components = meta. split_ascii_whitespace ( ) . collect :: < Vec < _ > > ( ) ;
175
190
@@ -186,6 +201,7 @@ fn parse_meta(meta: &str) -> ParsedMeta {
186
201
let mut deps = Vec :: new ( ) ;
187
202
let mut edition = Edition :: Edition2018 ;
188
203
let mut cfg = CfgOptions :: default ( ) ;
204
+ let mut env = Env :: default ( ) ;
189
205
for component in components[ 1 ..] . iter ( ) {
190
206
let ( key, value) = split1 ( component, ':' ) . unwrap ( ) ;
191
207
match key {
@@ -200,11 +216,18 @@ fn parse_meta(meta: &str) -> ParsedMeta {
200
216
}
201
217
}
202
218
}
219
+ "env" => {
220
+ for key in value. split ( ',' ) {
221
+ if let Some ( ( k, v) ) = split1 ( key, '=' ) {
222
+ env. set ( k. into ( ) , v. into ( ) ) ;
223
+ }
224
+ }
225
+ }
203
226
_ => panic ! ( "bad component: {:?}" , component) ,
204
227
}
205
228
}
206
229
207
- ParsedMeta :: File ( FileMeta { path, krate, deps, edition, cfg } )
230
+ ParsedMeta :: File ( FileMeta { path, krate, deps, edition, cfg, env } )
208
231
}
209
232
210
233
fn split1 ( haystack : & str , delim : char ) -> Option < ( & str , & str ) > {
0 commit comments