1- use clap::Args;
2- use std::path::PathBuf;
3-
41use crate::languages;
2+ use clap::Args;
53use codeql_extractor::extractor::desugaring;
64use codeql_extractor::trap;
7-
5+ use std::path::Path;
6+ use std::path::PathBuf;
7+ use std::{env, fs};
88#[derive(Args)]
99pub struct Options {
1010 /// Sets a custom source archive folder
@@ -31,6 +31,33 @@ pub fn run(options: Options) -> std::io::Result<()> {
3131 lang.prefix = "unified";
3232 }
3333
34+ let scratch_dir = std::env::var("CODEQL_EXTRACTOR_UNIFIED_SCRATCH_DIR")
35+ .expect("failed to read CODEQL_EXTRACTOR_UNIFIED_SCRATCH_DIR environment variable");
36+ let builtins_path = env::var("CODEQL_EXTRACTOR_UNIFIED_ROOT")
37+ .map(|path| Path::new(&path).join("tools").join("builtins"))
38+ .expect("failed to read CODEQL_EXTRACTOR_UNIFIED_ROOT environment variable");
39+ let builtins_dir = fs::read_dir(builtins_path).expect("failed to read builtins directory");
40+ let mut builtins_list = PathBuf::new();
41+ builtins_list.push(scratch_dir.clone());
42+ builtins_list.push("builtins");
43+ builtins_list.set_extension("list");
44+
45+ let mut builtins_list_file = fs::OpenOptions::new()
46+ .create_new(true)
47+ .write(true)
48+ .open(&builtins_list)
49+ .expect("failed to open file list");
50+ for entry in builtins_dir {
51+ let entry = entry.expect("failed to read builtins directory");
52+ let path = entry.path();
53+ if path.extension().is_some_and(|ext| ext == "swift") {
54+ use std::io::Write;
55+ writeln!(builtins_list_file, "{}", path.display())
56+ .expect("failed to write to file list");
57+ }
58+ }
59+ drop(builtins_list_file);
60+
3461 let extractor = desugaring::Extractor {
3562 prefix: "unified".to_string(),
3663 languages,
@@ -39,7 +66,7 @@ pub fn run(options: Options) -> std::io::Result<()> {
3966 "CODEQL_EXTRACTOR_UNIFIED_OPTION_TRAP_COMPRESSION",
4067 ),
4168 source_archive_dir: options.source_archive_dir,
42- file_lists: vec![options.file_list],
69+ file_lists: vec![options.file_list, builtins_list ],
4370 };
4471
4572 extractor.run()
0 commit comments