use instructions_template::generate_instructions_rs;
use static_string_indexing::index_static_strings;
+use std::collections::BTreeMap;
use std::env;
use std::fs::File;
use std::io::Write;
use std::process::{Command, Stdio};
fn find_prolog_files(path_prefix: &str, current_dir: &Path) -> Vec<(String, PathBuf)> {
- let mut libraries = vec![];
+ // use a BTreeMap to get a stable order independent of fs enumeration order
+ let mut libraries = BTreeMap::new();
let entries = match current_dir.read_dir() {
Ok(entries) => entries,
- Err(_) => return libraries,
+ Err(_) => return vec![],
};
for entry in entries.filter_map(Result::ok).map(|e| e.path()) {
let name = entry.file_stem().unwrap().to_str().unwrap();
let lib_name = format!("{path_prefix}{name}");
- libraries.push((lib_name, entry));
+ libraries.insert(lib_name, entry);
}
}
}
- libraries
+ libraries.into_iter().collect()
}
fn main() {
+use std::collections::BTreeSet;
+
use proc_macro2::TokenStream;
use syn::parse::*;
use syn::visit::*;
use syn::*;
-use indexmap::IndexSet;
-
struct StaticStrVisitor {
- static_strs: IndexSet<String>,
+ static_strs: BTreeSet<String>,
}
impl StaticStrVisitor {
fn new() -> Self {
Self {
- static_strs: IndexSet::new(),
+ static_strs: BTreeSet::new(),
}
}
}
visitor.visit_file(&syntax)
}
- let mut static_str_keys = vec![];
- let mut static_strs = vec![];
- let mut static_str_indices = vec![];
+ let static_str_keys: Vec<_> = visitor.static_strs.iter().collect();
+ let mut static_strs = Vec::with_capacity(static_str_keys.len());
+ let mut static_str_indices = Vec::with_capacity(static_str_keys.len());
let indices: Vec<u64> = visitor
.static_strs
.map(|string| {
let index = static_string_index(string, static_strs.len());
- static_str_keys.push(string);
-
if index & 1 == 1 {
index
} else {