From 98e42b4362c043d3305ee4bc608c1f40eab4a654 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Sat, 10 Sep 2022 12:02:22 -0700 Subject: [PATCH] Add a workaround for parsers leaving trailing \r in comments Fixes #364 --- src/parse/syntax.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/parse/syntax.rs b/src/parse/syntax.rs index 1cb364812..d40892f29 100644 --- a/src/parse/syntax.rs +++ b/src/parse/syntax.rs @@ -241,9 +241,15 @@ impl<'a> Syntax<'a> { pub fn new_atom( arena: &'a Arena>, position: Vec, - content: &str, + mut content: &str, kind: AtomKind, ) -> &'a Syntax<'a> { + // If a parser hasn't cleaned up \r on CRLF files with + // comments, discard it. + if content.ends_with("\r") { + content = &content[..content.len() - 1]; + } + arena.alloc(Atom { info: SyntaxInfo::default(), position, @@ -940,6 +946,22 @@ mod tests { assert_ne!(comment, atom); } + #[test] + fn test_new_atom_truncates_carriage_return() { + let arena = Arena::new(); + let position = vec![]; + let content = "foo\r"; + + let atom = Syntax::new_atom(&arena, position, content, AtomKind::Comment); + + match atom { + List { .. } => unreachable!(), + Atom { content, .. } => { + assert_eq!(content, "foo"); + } + } + } + /// Ignore the syntax highighting kind when comparing /// atoms. Sometimes changing delimiter wrapping can change /// whether a parser thinks that a node is e.g. a type.