Handle file extension conflicts in --list-languages (#1076)

This commit is contained in:
Kienyew 2020-08-08 12:01:02 +08:00
parent b3657aef2b
commit 2bad4df14e
2 changed files with 27 additions and 6 deletions

View file

@ -86,6 +86,19 @@ pub fn list_languages(config: &Config) -> Result<()> {
.filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
.cloned()
.collect::<Vec<_>>();
for lang in languages.iter_mut() {
let lang_name = lang.name.clone();
lang.file_extensions.retain(|extension| {
let test_file = Path::new("test").with_extension(extension);
match config.syntax_mapping.get_syntax_for(test_file) {
Some(MappingTarget::MapTo(primary_lang)) => lang_name == primary_lang,
Some(MappingTarget::MapToUnknown) => true,
None => true,
}
});
}
languages.sort_by_key(|lang| lang.name.to_uppercase());
let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());

View file

@ -24,6 +24,12 @@ impl<'a> SyntaxMapping<'a> {
let mut mapping = Self::empty();
mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
mapping
.insert("*.js", MappingTarget::MapTo("JavaScript (Babel)"))
.unwrap();
mapping
.insert("*.sass", MappingTarget::MapTo("Sass"))
.unwrap();
mapping
.insert("build", MappingTarget::MapToUnknown)
.unwrap();
@ -67,14 +73,16 @@ impl<'a> SyntaxMapping<'a> {
"*.swap",
"*.target",
"*.timer",
].iter() {
mapping
.insert(glob, MappingTarget::MapTo("INI"))
.unwrap();
]
.iter()
{
mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
}
// pacman hooks
mapping.insert("*.hook", MappingTarget::MapTo("INI")).unwrap();
mapping
.insert("*.hook", MappingTarget::MapTo("INI"))
.unwrap();
mapping
}
@ -92,7 +100,7 @@ impl<'a> SyntaxMapping<'a> {
&self.mappings
}
pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
pub fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
let candidate = Candidate::new(path.as_ref());
let canddidate_filename = path.as_ref().file_name().map(Candidate::new);
for (ref glob, ref syntax) in self.mappings.iter().rev() {