Skip to content

Commit 48d7c61

Browse files
committed
add support of feature flag for runnables #4464
Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com>
1 parent 4333905 commit 48d7c61

File tree

6 files changed

+145
-99
lines changed

6 files changed

+145
-99
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/ra_cfg/src/cfg_expr.rs

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,6 @@ impl CfgExpr {
3333
CfgExpr::Not(pred) => pred.fold(query).map(|s| !s),
3434
}
3535
}
36-
37-
/// Return minimal features needed
38-
pub fn minimal_features_needed(&self) -> Vec<SmolStr> {
39-
let mut features = vec![];
40-
self.collect_minimal_features_needed(&mut features);
41-
42-
features
43-
}
44-
45-
fn collect_minimal_features_needed(&self, features: &mut Vec<SmolStr>) {
46-
match self {
47-
CfgExpr::KeyValue { key, value } if key == "feature" => features.push(value.clone()),
48-
CfgExpr::All(preds) => {
49-
preds.iter().for_each(|cfg| cfg.collect_minimal_features_needed(features));
50-
}
51-
CfgExpr::Any(preds) => {
52-
for cfg in preds {
53-
let len_features = features.len();
54-
cfg.collect_minimal_features_needed(features);
55-
if len_features != features.len() {
56-
break;
57-
}
58-
}
59-
}
60-
_ => {}
61-
}
62-
}
6336
}
6437

6538
pub fn parse_cfg(tt: &Subtree) -> CfgExpr {
@@ -160,32 +133,4 @@ mod tests {
160133
]),
161134
);
162135
}
163-
164-
#[test]
165-
fn test_cfg_expr_minimal_features_needed() {
166-
let (subtree, _) = get_token_tree_generated(r#"#![cfg(feature = "baz")]"#);
167-
let cfg_expr = parse_cfg(&subtree);
168-
169-
assert_eq!(cfg_expr.minimal_features_needed(), vec![SmolStr::new("baz")]);
170-
171-
let (subtree, _) =
172-
get_token_tree_generated(r#"#![cfg(all(feature = "baz", feature = "foo"))]"#);
173-
let cfg_expr = parse_cfg(&subtree);
174-
175-
assert_eq!(
176-
cfg_expr.minimal_features_needed(),
177-
vec![SmolStr::new("baz"), SmolStr::new("foo")]
178-
);
179-
180-
let (subtree, _) =
181-
get_token_tree_generated(r#"#![cfg(any(feature = "baz", feature = "foo", unix))]"#);
182-
let cfg_expr = parse_cfg(&subtree);
183-
184-
assert_eq!(cfg_expr.minimal_features_needed(), vec![SmolStr::new("baz")]);
185-
186-
let (subtree, _) = get_token_tree_generated(r#"#![cfg(foo)]"#);
187-
let cfg_expr = parse_cfg(&subtree);
188-
189-
assert!(cfg_expr.minimal_features_needed().is_empty());
190-
}
191136
}

crates/ra_ide/src/runnables.rs

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ use ra_syntax::{
1010

1111
use crate::FileId;
1212
use ast::DocCommentsOwner;
13+
use ra_cfg::CfgExpr;
1314
use std::fmt::Display;
1415

1516
#[derive(Debug)]
1617
pub struct Runnable {
1718
pub range: TextRange,
1819
pub kind: RunnableKind,
19-
pub features_needed: Option<Vec<SmolStr>>,
20+
pub cfg_exprs: Vec<CfgExpr>,
2021
}
2122

2223
#[derive(Debug)]
@@ -118,9 +119,10 @@ fn runnable_fn(
118119
};
119120

120121
let attrs = Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &fn_def));
121-
let features_needed = get_features_needed(attrs);
122+
let cfg_exprs =
123+
attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)).collect();
122124

123-
Some(Runnable { range: fn_def.syntax().text_range(), kind, features_needed })
125+
Some(Runnable { range: fn_def.syntax().text_range(), kind, cfg_exprs })
124126
}
125127

126128
#[derive(Debug)]
@@ -183,15 +185,10 @@ fn runnable_mod(
183185
.join("::");
184186

185187
let attrs = Attrs::from_attrs_owner(sema.db, InFile::new(HirFileId::from(file_id), &module));
186-
let features_needed = get_features_needed(attrs);
188+
let cfg_exprs =
189+
attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree)).collect();
187190

188-
Some(Runnable { range, kind: RunnableKind::TestMod { path }, features_needed })
189-
}
190-
191-
fn get_features_needed(attrs: Attrs) -> Option<Vec<SmolStr>> {
192-
let cfg_expr = attrs.by_key("cfg").tt_values().map(|subtree| ra_cfg::parse_cfg(subtree));
193-
let features_needed = cfg_expr.map(|cfg| cfg.minimal_features_needed()).flatten().collect();
194-
Some(features_needed).filter(|it: &Vec<SmolStr>| !it.is_empty())
191+
Some(Runnable { range, kind: RunnableKind::TestMod { path }, cfg_exprs })
195192
}
196193

197194
#[cfg(test)]
@@ -223,7 +220,7 @@ mod tests {
223220
Runnable {
224221
range: 1..21,
225222
kind: Bin,
226-
features_needed: None,
223+
cfg_exprs: [],
227224
},
228225
Runnable {
229226
range: 22..46,
@@ -235,7 +232,7 @@ mod tests {
235232
ignore: false,
236233
},
237234
},
238-
features_needed: None,
235+
cfg_exprs: [],
239236
},
240237
Runnable {
241238
range: 47..81,
@@ -247,7 +244,7 @@ mod tests {
247244
ignore: true,
248245
},
249246
},
250-
features_needed: None,
247+
cfg_exprs: [],
251248
},
252249
]
253250
"###
@@ -275,7 +272,7 @@ mod tests {
275272
Runnable {
276273
range: 1..21,
277274
kind: Bin,
278-
features_needed: None,
275+
cfg_exprs: [],
279276
},
280277
Runnable {
281278
range: 22..64,
@@ -284,7 +281,7 @@ mod tests {
284281
"foo",
285282
),
286283
},
287-
features_needed: None,
284+
cfg_exprs: [],
288285
},
289286
]
290287
"###
@@ -315,7 +312,7 @@ mod tests {
315312
Runnable {
316313
range: 1..21,
317314
kind: Bin,
318-
features_needed: None,
315+
cfg_exprs: [],
319316
},
320317
Runnable {
321318
range: 51..105,
@@ -324,7 +321,7 @@ mod tests {
324321
"Data::foo",
325322
),
326323
},
327-
features_needed: None,
324+
cfg_exprs: [],
328325
},
329326
]
330327
"###
@@ -352,7 +349,7 @@ mod tests {
352349
kind: TestMod {
353350
path: "test_mod",
354351
},
355-
features_needed: None,
352+
cfg_exprs: [],
356353
},
357354
Runnable {
358355
range: 28..57,
@@ -364,7 +361,7 @@ mod tests {
364361
ignore: false,
365362
},
366363
},
367-
features_needed: None,
364+
cfg_exprs: [],
368365
},
369366
]
370367
"###
@@ -394,7 +391,7 @@ mod tests {
394391
kind: TestMod {
395392
path: "foo::test_mod",
396393
},
397-
features_needed: None,
394+
cfg_exprs: [],
398395
},
399396
Runnable {
400397
range: 46..79,
@@ -406,7 +403,7 @@ mod tests {
406403
ignore: false,
407404
},
408405
},
409-
features_needed: None,
406+
cfg_exprs: [],
410407
},
411408
]
412409
"###
@@ -438,7 +435,7 @@ mod tests {
438435
kind: TestMod {
439436
path: "foo::bar::test_mod",
440437
},
441-
features_needed: None,
438+
cfg_exprs: [],
442439
},
443440
Runnable {
444441
range: 68..105,
@@ -450,7 +447,7 @@ mod tests {
450447
ignore: false,
451448
},
452449
},
453-
features_needed: None,
450+
cfg_exprs: [],
454451
},
455452
]
456453
"###
@@ -482,11 +479,12 @@ mod tests {
482479
ignore: false,
483480
},
484481
},
485-
features_needed: Some(
486-
[
487-
"foo",
488-
],
489-
),
482+
cfg_exprs: [
483+
KeyValue {
484+
key: "feature",
485+
value: "foo",
486+
},
487+
],
490488
},
491489
]
492490
"###
@@ -518,12 +516,20 @@ mod tests {
518516
ignore: false,
519517
},
520518
},
521-
features_needed: Some(
522-
[
523-
"foo",
524-
"bar",
525-
],
526-
),
519+
cfg_exprs: [
520+
All(
521+
[
522+
KeyValue {
523+
key: "feature",
524+
value: "foo",
525+
},
526+
KeyValue {
527+
key: "feature",
528+
value: "bar",
529+
},
530+
],
531+
),
532+
],
527533
},
528534
]
529535
"###

crates/rust-analyzer/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ ra_project_model = { path = "../ra_project_model" }
4040
ra_syntax = { path = "../ra_syntax" }
4141
ra_text_edit = { path = "../ra_text_edit" }
4242
ra_vfs = "0.6.0"
43+
ra_cfg = { path = "../ra_cfg"}
4344

4445
# This should only be used in CLI
4546
ra_db = { path = "../ra_db" }
@@ -55,6 +56,8 @@ winapi = "0.3.8"
5556
tempfile = "3.1.0"
5657
insta = "0.16.0"
5758
test_utils = { path = "../test_utils" }
59+
mbe = { path = "../ra_mbe", package = "ra_mbe" }
60+
tt = { path = "../ra_tt", package = "ra_tt" }
5861

5962
[features]
6063
jemalloc = [ "ra_prof/jemalloc" ]

crates/rust-analyzer/src/cargo_target_spec.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ impl CargoTargetSpec {
2121
pub(crate) fn runnable_args(
2222
spec: Option<CargoTargetSpec>,
2323
kind: &RunnableKind,
24-
features_needed: &Option<Vec<SmolStr>>,
24+
features_needed: &Vec<SmolStr>,
2525
) -> Result<(Vec<String>, Vec<String>)> {
2626
let mut args = Vec::new();
2727
let mut extra_args = Vec::new();
@@ -76,12 +76,11 @@ impl CargoTargetSpec {
7676
}
7777
}
7878

79-
if let Some(features_needed) = features_needed {
80-
features_needed.iter().for_each(|feature| {
81-
args.push("--features".to_string());
82-
args.push(feature.to_string());
83-
});
84-
}
79+
features_needed.iter().for_each(|feature| {
80+
args.push("--features".to_string());
81+
args.push(feature.to_string());
82+
});
83+
8584
Ok((args, extra_args))
8685
}
8786

0 commit comments

Comments
 (0)