Skip to content

Commit 53b2e97

Browse files
committed
Rust: extract declarations of builtin types
1 parent 254789c commit 53b2e97

File tree

4 files changed

+59
-11
lines changed

4 files changed

+59
-11
lines changed

rust/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ pkg_filegroup(
3636
srcs = [
3737
":tools-arch",
3838
"//rust/tools",
39+
"//rust/tools/builtins",
3940
],
4041
prefix = "tools",
4142
)

rust/extractor/src/main.rs

+25-11
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use std::{
1717
collections::HashMap,
1818
path::{Path, PathBuf},
1919
};
20+
use std::{env, fs};
2021
use tracing::{error, info, warn};
2122
use tracing_subscriber::layer::SubscriberExt;
2223
use tracing_subscriber::util::SubscriberInitExt;
@@ -77,17 +78,19 @@ impl<'a> Extractor<'a> {
7778
}
7879
let no_location = (LineCol { line: 0, col: 0 }, LineCol { line: 0, col: 0 });
7980
if let Err(reason) = semantics_info {
80-
let message = format!("semantic analyzer unavailable ({reason})");
81-
let full_message = format!(
82-
"{message}: macro expansion, call graph, and type inference will be skipped."
83-
);
84-
translator.emit_diagnostic(
85-
trap::DiagnosticSeverity::Warning,
86-
"semantics".to_owned(),
87-
message,
88-
full_message,
89-
no_location,
90-
);
81+
if !reason.is_empty() {
82+
let message = format!("semantic analyzer unavailable ({reason})");
83+
let full_message = format!(
84+
"{message}: macro expansion, call graph, and type inference will be skipped."
85+
);
86+
translator.emit_diagnostic(
87+
trap::DiagnosticSeverity::Warning,
88+
"semantics".to_owned(),
89+
message,
90+
full_message,
91+
no_location,
92+
);
93+
}
9194
}
9295
translator.emit_source_file(ast);
9396
translator.trap.commit().unwrap_or_else(|err| {
@@ -276,5 +279,16 @@ fn main() -> anyhow::Result<()> {
276279
}
277280
}
278281
}
282+
let builtins_dir = env::var("CODEQL_EXTRACTOR_RUST_ROOT")
283+
.map(|path| Path::new(&path).join("tools").join("builtins"))?;
284+
let builtins = fs::read_dir(builtins_dir).context("failed to read builtins directory")?;
285+
for entry in builtins {
286+
let entry = entry.context("failed to read builtins directory")?;
287+
let path = entry.path();
288+
if path.extension().is_some_and(|ext| ext == "rs") {
289+
extractor.extract_without_semantics(&path, "");
290+
}
291+
}
292+
279293
extractor.emit_extraction_diagnostics(start, &cfg)
280294
}

rust/tools/builtins/BUILD.bazel

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
load("//misc/bazel:pkg.bzl", "codeql_pkg_files")
2+
3+
codeql_pkg_files(
4+
name = "builtins",
5+
srcs = glob(["*.rs"]),
6+
prefix = "builtins",
7+
visibility = ["//rust:__subpackages__"],
8+
)

rust/tools/builtins/types.rs

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// The Language Prelude: https://doc.rust-lang.org/reference/names/preludes.html#language-prelude
2+
3+
// Type namespace
4+
// Boolean type
5+
pub struct bool;
6+
// Textual types
7+
pub struct char;
8+
pub struct str;
9+
// Integer types
10+
pub struct i8;
11+
pub struct i16;
12+
pub struct i32;
13+
pub struct i64;
14+
pub struct i128;
15+
pub struct u8;
16+
pub struct u16;
17+
pub struct u32;
18+
pub struct u64;
19+
pub struct u128;
20+
// Machine-dependent integer types
21+
pub struct usize;
22+
pub struct isize;
23+
// floating-point types
24+
pub struct f32;
25+
pub struct f64;

0 commit comments

Comments
 (0)