summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcyqsimon <28627918+cyqsimon@users.noreply.github.com>2023-11-05 12:22:26 +0800
committercyqsimon <28627918+cyqsimon@users.noreply.github.com>2023-12-11 10:21:05 +0800
commit0c1b80faabd1d06e883fecc7c85847005ef3c55c (patch)
treeb49cd1c001573a7ed51d1840e2f19ed8ddca7696
parent2c9bf229e1ac200d93c78b7b0e38c9f6e8bf3f41 (diff)
Impl per-target syntax mappings
-rw-r--r--build/syntax_mapping.rs64
-rw-r--r--src/syntax_mapping/builtins/README.md6
-rw-r--r--src/syntax_mapping/builtins/bsd-family/.gitkeep0
-rw-r--r--src/syntax_mapping/builtins/common/.gitkeep0
-rw-r--r--src/syntax_mapping/builtins/common/99-unset-ambiguous-extensions.toml (renamed from src/syntax_mapping/builtins/99-unset-ambiguous-extensions.toml)0
-rw-r--r--src/syntax_mapping/builtins/linux/.gitkeep0
-rw-r--r--src/syntax_mapping/builtins/linux/50-git-config.toml (renamed from src/syntax_mapping/builtins/50-git-config.toml)0
-rw-r--r--src/syntax_mapping/builtins/macos/.gitkeep0
-rw-r--r--src/syntax_mapping/builtins/unix-family/.gitkeep0
-rw-r--r--src/syntax_mapping/builtins/windows/.gitkeep0
10 files changed, 57 insertions, 13 deletions
diff --git a/build/syntax_mapping.rs b/build/syntax_mapping.rs
index bab38f16..c8882301 100644
--- a/build/syntax_mapping.rs
+++ b/build/syntax_mapping.rs
@@ -1,4 +1,9 @@
-use std::{convert::Infallible, env, fs, path::Path, str::FromStr};
+use std::{
+ convert::Infallible,
+ env, fs,
+ path::{Path, PathBuf},
+ str::FromStr,
+};
use anyhow::{anyhow, bail};
use indexmap::IndexMap;
@@ -181,19 +186,56 @@ impl MappingList {
}
}
+/// Get the list of paths to all mapping definition files that should be
+/// included for the current target platform.
+fn get_def_paths() -> anyhow::Result<Vec<PathBuf>> {
+ let source_subdirs = [
+ "common",
+ #[cfg(target_family = "unix")]
+ "unix-family",
+ #[cfg(any(
+ target_os = "freebsd",
+ target_os = "netbsd",
+ target_os = "openbsd",
+ target_os = "macos"
+ ))]
+ "bsd-family",
+ #[cfg(target_os = "linux")]
+ "linux",
+ #[cfg(target_os = "macos")]
+ "macos",
+ #[cfg(target_os = "windows")]
+ "windows",
+ ];
+
+ let mut toml_paths = vec![];
+ for subdir in source_subdirs {
+ let wd = WalkDir::new(Path::new("src/syntax_mapping/builtins").join(subdir));
+ let paths = wd
+ .into_iter()
+ .filter_map_ok(|entry| {
+ let path = entry.path();
+ (path.is_file() && path.extension().map(|ext| ext == "toml").unwrap_or(false))
+ .then(|| path.to_owned())
+ })
+ .collect::<Result<Vec<_>, _>>()?;
+ toml_paths.extend(paths);
+ }
+
+ toml_paths.sort_by_key(|path| {
+ path.file_name()
+ .expect("file name should not terminate in ..")
+ .to_owned()
+ });
+
+ Ok(toml_paths)
+}
+
fn read_all_mappings() -> anyhow::Result<MappingList> {
let mut all_mappings = vec![];
- for entry in WalkDir::new("src/syntax_mapping/builtins")
- .sort_by_file_name()
- .into_iter()
- .map(|entry| entry.unwrap_or_else(|err| panic!("failed to visit a file: {err}")))
- .filter(|entry| {
- let path = entry.path();
- path.is_file() && path.extension().map(|ext| ext == "toml").unwrap_or(false)
- })
- {
- let toml_string = fs::read_to_string(entry.path())?;
+ for path in get_def_paths()? {
+ let toml_string = fs::read_to_string(path)?;
let mappings = toml::from_str::<MappingDefModel>(&toml_string)?.into_mapping_list();
all_mappings.extend(mappings.0);
}
diff --git a/src/syntax_mapping/builtins/README.md b/src/syntax_mapping/builtins/README.md
index c6208b25..47a7a9e3 100644
--- a/src/syntax_mapping/builtins/README.md
+++ b/src/syntax_mapping/builtins/README.md
@@ -13,8 +13,10 @@ What defines "a single application" here is deliberately vague, since the
file-splitting is purely for maintainability reasons. (Technically, we could
just as well use a single TOML file.) So just use common sense.
-At compile time, the build script will collect all the syntax mappings defined
-by the TOML files within this directory, and embed them into the binary.
+TOML files should reside in the corresponding subdirectory of the platform(s)
+that they intend to target. At compile time, the build script will go through
+each subdirectory that is applicable to the compilation target, collect the
+syntax mappings defined by all TOML files, and embed them into the binary.
## File syntax
diff --git a/src/syntax_mapping/builtins/bsd-family/.gitkeep b/src/syntax_mapping/builtins/bsd-family/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/syntax_mapping/builtins/bsd-family/.gitkeep
diff --git a/src/syntax_mapping/builtins/common/.gitkeep b/src/syntax_mapping/builtins/common/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/syntax_mapping/builtins/common/.gitkeep
diff --git a/src/syntax_mapping/builtins/99-unset-ambiguous-extensions.toml b/src/syntax_mapping/builtins/common/99-unset-ambiguous-extensions.toml
index 53800211..53800211 100644
--- a/src/syntax_mapping/builtins/99-unset-ambiguous-extensions.toml
+++ b/src/syntax_mapping/builtins/common/99-unset-ambiguous-extensions.toml
diff --git a/src/syntax_mapping/builtins/linux/.gitkeep b/src/syntax_mapping/builtins/linux/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/syntax_mapping/builtins/linux/.gitkeep
diff --git a/src/syntax_mapping/builtins/50-git-config.toml b/src/syntax_mapping/builtins/linux/50-git-config.toml
index 44a49a25..44a49a25 100644
--- a/src/syntax_mapping/builtins/50-git-config.toml
+++ b/src/syntax_mapping/builtins/linux/50-git-config.toml
diff --git a/src/syntax_mapping/builtins/macos/.gitkeep b/src/syntax_mapping/builtins/macos/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/syntax_mapping/builtins/macos/.gitkeep
diff --git a/src/syntax_mapping/builtins/unix-family/.gitkeep b/src/syntax_mapping/builtins/unix-family/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/syntax_mapping/builtins/unix-family/.gitkeep
diff --git a/src/syntax_mapping/builtins/windows/.gitkeep b/src/syntax_mapping/builtins/windows/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/syntax_mapping/builtins/windows/.gitkeep