Skip to content

Commit c95f8d7

Browse files
authored
Merge pull request #18347 from github/redsun82/rust-include-test-code-again
Rust: reinstate extraction of test code
2 parents f06ad7c + f13d03b commit c95f8d7

File tree

8 files changed

+46
-30
lines changed

8 files changed

+46
-30
lines changed

rust/autobuild/src/main.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
use std::path::PathBuf;
21
use codeql_extractor::autobuilder;
2+
use std::path::PathBuf;
33

44
fn main() -> std::io::Result<()> {
55
let database = std::env::var("CODEQL_EXTRACTOR_RUST_WIP_DATABASE")
66
.expect("CODEQL_EXTRACTOR_RUST_WIP_DATABASE not set");
77

88
autobuilder::Autobuilder::new("rust", PathBuf::from(database))
99
.include_extensions(&[".rs"])
10-
.exclude_globs(&["**/.git", "**/tests/**"])
10+
.exclude_globs(&["**/.git"])
1111
.size_limit("5m")
1212
.run()
1313
}

rust/extractor/src/config.rs

+17-24
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ use figment::{
1010
Figment,
1111
};
1212
use itertools::Itertools;
13-
use log::warn;
1413
use num_traits::Zero;
1514
use ra_ap_cfg::{CfgAtom, CfgDiff};
1615
use ra_ap_intern::Symbol;
1716
use ra_ap_paths::Utf8PathBuf;
1817
use ra_ap_project_model::{CargoConfig, CargoFeatures, CfgOverrides, RustLibSource};
1918
use rust_extractor_macros::extractor_cli_config;
2019
use serde::{Deserialize, Serialize};
20+
use std::collections::HashSet;
2121
use std::fmt::Debug;
2222
use std::ops::Not;
2323
use std::path::PathBuf;
@@ -132,33 +132,26 @@ fn to_cfg_override(spec: &str) -> CfgAtom {
132132
}
133133

134134
fn to_cfg_overrides(specs: &Vec<String>) -> CfgOverrides {
135-
let mut enabled_cfgs = Vec::new();
136-
let mut disabled_cfgs = Vec::new();
137-
let mut has_test_explicitly_enabled = false;
135+
let mut enabled_cfgs = HashSet::new();
136+
enabled_cfgs.insert(to_cfg_override("test"));
137+
let mut disabled_cfgs = HashSet::new();
138138
for spec in specs {
139139
if let Some(spec) = spec.strip_prefix("-") {
140-
disabled_cfgs.push(to_cfg_override(spec));
140+
let cfg = to_cfg_override(spec);
141+
enabled_cfgs.remove(&cfg);
142+
disabled_cfgs.insert(cfg);
141143
} else {
142-
enabled_cfgs.push(to_cfg_override(spec));
143-
if spec == "test" {
144-
has_test_explicitly_enabled = true;
145-
}
144+
let cfg = to_cfg_override(spec);
145+
disabled_cfgs.remove(&cfg);
146+
enabled_cfgs.insert(cfg);
146147
}
147148
}
148-
if !has_test_explicitly_enabled {
149-
disabled_cfgs.push(to_cfg_override("test"));
150-
}
151-
if let Some(global) = CfgDiff::new(enabled_cfgs, disabled_cfgs) {
152-
CfgOverrides {
153-
global,
154-
..Default::default()
155-
}
156-
} else {
157-
warn!("non-disjoint cfg overrides, ignoring: {}", specs.join(", "));
158-
CfgOverrides {
159-
global: CfgDiff::new(Vec::new(), vec![to_cfg_override("test")])
160-
.expect("disabling one cfg should always succeed"),
161-
..Default::default()
162-
}
149+
let enabled_cfgs = enabled_cfgs.into_iter().collect();
150+
let disabled_cfgs = disabled_cfgs.into_iter().collect();
151+
let global = CfgDiff::new(enabled_cfgs, disabled_cfgs)
152+
.expect("There should be no duplicate cfgs by construction");
153+
CfgOverrides {
154+
global,
155+
..Default::default()
163156
}
164157
}
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
paths-ignore:
22
- '/src/maybe_ignore'
3+
- '**/tests'
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
src/lib.rs
22
src/maybe_ignore/a_source.rs
33
src/maybe_ignore/mod.rs
4+
tests/integration.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
| src/lib.rs:7:1:8:19 | fn cfg_no_flag |
22
| src/lib.rs:10:1:11:18 | fn cfg_no_key |
3-
| src/lib.rs:16:1:17:24 | fn pointer_width_64 |
3+
| src/lib.rs:15:5:16:16 | fn test |
4+
| src/lib.rs:19:1:20:24 | fn pointer_width_64 |
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
| src/lib.rs:1:1:2:16 | fn cfg_flag |
22
| src/lib.rs:4:1:5:15 | fn cfg_key |
3-
| src/lib.rs:13:1:14:12 | fn test |
4-
| src/lib.rs:19:1:20:24 | fn pointer_width_32 |
3+
| src/lib.rs:22:1:23:24 | fn pointer_width_32 |

rust/ql/integration-tests/options/cfg/src/lib.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ fn cfg_no_flag() {}
1111
fn cfg_no_key() {}
1212

1313
#[cfg(test)]
14-
fn test() {}
14+
mod tests {
15+
#[test]
16+
fn test() {}
17+
}
1518

1619
#[cfg(target_pointer_width = "64")]
1720
fn pointer_width_64() {}

rust/ql/integration-tests/options/cfg/test_cfg_overrides_option.py

+18
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,24 @@ def test_cfg_overrides(codeql, rust):
1414
"cfg_key=value",
1515
"-target_pointer_width=64",
1616
"target_pointer_width=32",
17+
"-test",
18+
))
19+
codeql.database.create(extractor_option=f"cargo_cfg_overrides={overrides}")
20+
21+
@pytest.mark.ql_test(expected=".override.expected")
22+
def test_duplicate_cfg_overrides(codeql, rust):
23+
overrides = ",".join((
24+
"cfg_flag",
25+
"cfg_key=value",
26+
"-cfg_flag",
27+
"target_pointer_width=32",
28+
"-target_pointer_width=64",
29+
"cfg_flag",
30+
"cfg_flag",
31+
"target_pointer_width=32",
32+
"-test",
33+
"-test",
1734
"test",
35+
"-test",
1836
))
1937
codeql.database.create(extractor_option=f"cargo_cfg_overrides={overrides}")

0 commit comments

Comments
 (0)