@@ -86,6 +86,29 @@ pub fn list_languages(config: &Config) -> Result<()> {
8686 .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
8787 .cloned()
8888 .collect::<Vec<_>>();
89+
90+ // Handling of file-extension conflicts, see issue #1076
91+ for lang in languages.iter_mut() {
92+ let lang_name = lang.name.clone();
93+ lang.file_extensions.retain(|extension| {
94+ // The 'extension' variable is not certainly a real extension.
95+ //
96+ // Skip if 'extension' starts with '.', likely a hidden file like '.vimrc'
97+ // Also skip if the 'extension' contains another real extension, likely
98+ // that is a full match file name like 'CMakeLists.txt' and 'Cargo.lock'
99+ if extension.starts_with('.') || Path::new(extension).extension().is_some() {
100+ true
101+ } else {
102+ let test_file = Path::new("test").with_extension(extension);
103+ if let Some(syntax) = assets.syntax_for_file_name(test_file, &config.syntax_mapping) {
104+ syntax.name == lang_name
105+ } else {
106+ false
107+ }
108+ }
109+ });
110+ }
111+
89112 languages.sort_by_key(|lang| lang.name.to_uppercase());
90113
91114 let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());