@@ -251,29 +251,42 @@ impl HighlightingAssets {
251251 }
252252
253253 fn get_extension_syntax(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
254+ self.find_syntax_by_file_name(file_name).or_else(|| {
255+ self.find_syntax_by_file_name_extension(file_name)
256+ .or_else(|| self.get_extension_syntax_with_stripped_suffix(file_name))
257+ })
258+ }
259+
260+ fn find_syntax_by_file_name(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
254261 self.get_syntax_set()
255262 .find_syntax_by_extension(file_name.to_str().unwrap_or_default())
256− .or_else(|| {
257− let file_path = Path::new(file_name);
258− self.get_syntax_set()
259− .find_syntax_by_extension(
260− file_path
261− .extension()
262− .and_then(|x| x.to_str())
263− .unwrap_or_default(),
264− )
265− .or_else(|| {
266− if let Some(file_str) = file_path.to_str() {
267− for suffix in IGNORED_SUFFIXES.iter() {
268− if let Some(stripped_filename) = file_str.strip_suffix(suffix) {
269− return self
270− .get_extension_syntax(OsStr::new(stripped_filename));
271− }
272− }
273− }
274− None
275− })
276− })
263+ }
264+
265+ fn find_syntax_by_file_name_extension(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
266+ let file_path = Path::new(file_name);
267+ self.get_syntax_set().find_syntax_by_extension(
268+ file_path
269+ .extension()
270+ .and_then(|x| x.to_str())
271+ .unwrap_or_default(),
272+ )
273+ }
274+
275+ /// If we find an ignored suffix on the file name, e.g. '~', we strip it and
276+ /// then try again to find a syntax without it. Note that we do this recursively.
277+ fn get_extension_syntax_with_stripped_suffix(
278+ &self,
279+ file_name: &OsStr,
280+ ) -> Option<&SyntaxReference> {
281+ let file_path = Path::new(file_name);
282+ if let Some(file_str) = file_path.to_str() {
283+ for suffix in IGNORED_SUFFIXES.iter() {
284+ if let Some(stripped_filename) = file_str.strip_suffix(suffix) {
285+ return self.get_extension_syntax(OsStr::new(stripped_filename));
286+ }
287+ }
288+ }
289+ None
277290 }
278291
279292 fn get_first_line_syntax(&self, reader: &mut InputReader) -> Option<&SyntaxReference> {