use std::sync::OnceLock;
use syntect::parsing::{SyntaxReference, SyntaxSet};
pub(crate) fn syntax_set() -> &'static SyntaxSet {
static SET: OnceLock<SyntaxSet> = OnceLock::new();
SET.get_or_init(two_face::syntax::extra_newlines)
}
pub(crate) fn syntax_for_paths(
new_path: Option<&str>,
old_path: Option<&str>,
) -> Option<&'static SyntaxReference> {
let ss = syntax_set();
for path in [new_path, old_path].into_iter().flatten() {
let p = std::path::Path::new(path);
if let Some(ext) = p.extension().and_then(|e| e.to_str())
&& let Some(syntax) = ss.find_syntax_by_extension(ext)
{
return Some(syntax);
}
if let Some(name) = p.file_name().and_then(|n| n.to_str())
&& let Some(syntax) = ss.find_syntax_by_extension(name)
{
return Some(syntax);
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn detects_known_extension() {
assert!(syntax_for_paths(Some("src/main.rs"), None).is_some());
assert!(syntax_for_paths(Some("a.py"), None).is_some());
}
#[test]
fn unknown_or_missing_extension_is_none() {
assert!(syntax_for_paths(Some("a.xyzzy"), None).is_none());
assert!(syntax_for_paths(None, None).is_none());
}
#[test]
fn detects_typescript_and_tsx() {
assert!(syntax_for_paths(Some("app.ts"), None).is_some());
assert!(syntax_for_paths(Some("component.tsx"), None).is_some());
}
#[test]
fn prefers_new_path_then_old_path() {
assert!(syntax_for_paths(None, Some("old.rs")).is_some());
}
}