Skip to content

Commit 5c3fa2c

Browse files
committed
Make the lexer tolerant of \r\n patterns in Windows.
1 parent d32e57f commit 5c3fa2c

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

src/Language/Rust/Parser/Lexer.x

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,17 +1052,17 @@ $white+ { \s -> pure (Space Whitespace s) }
10521052

10531053
@lit_byte { \c -> literal (ByteTok (drop 2 (init c))) }
10541054
@lit_char { \c -> literal (CharTok (drop 1 (init c))) }
1055-
@lit_str { \s -> literal (StrTok (drop 1 (init s))) }
1056-
@lit_byte_str { \s -> literal (ByteStrTok (drop 2 (init s))) }
1055+
@lit_str { \s -> literal (StrTok (cleanWindowsNewlines (drop 1 (init s)))) }
1056+
@lit_byte_str { \s -> literal (ByteStrTok (cleanWindowsNewlines (drop 2 (init s)))) }
10571057

10581058
@lit_raw_str { \s -> let n = length s - 2
10591059
in do
1060-
str <- rawString n
1060+
str <- cleanWindowsNewlines `fmap` rawString n
10611061
literal (StrRawTok str (fromIntegral n))
10621062
}
10631063
@lit_raw_bstr { \s -> let n = length s - 3
10641064
in do
1065-
str <- rawString n
1065+
str <- cleanWindowsNewlines `fmap` rawString n
10661066
literal (ByteStrRawTok str (fromIntegral n))
10671067
}
10681068

@@ -1075,7 +1075,8 @@ $white+ { \s -> pure (Space Whitespace s) }
10751075
@lifetime { \s -> (pure (LifetimeTok (mkIdent (tail s))) :: P Token) }
10761076

10771077

1078-
@outer_doc_line { \c -> pure (Doc (drop 3 c) Outer False) }
1078+
@outer_doc_line { \c -> pure (Doc (drop 3 c) Outer False) }
1079+
@outer_doc_line \r { \c -> pure (Doc (drop 3 (init c)) Outer False) }
10791080
@outer_doc_inline / ( [^\*] | \r | \n )
10801081
{ \_ -> Doc <$> nestedComment <*> pure Outer <*> pure True }
10811082

@@ -1281,5 +1282,10 @@ lexShebangLine = do
12811282
_ <- nextChar
12821283
(c' :) <$> toNewline
12831284

1284-
1285+
-- | If we're running on Windows, we need to normalize to "\n" instead of "\r\n", to match Rust's
1286+
-- handling of newlines in strings.
1287+
cleanWindowsNewlines :: String -> String
1288+
cleanWindowsNewlines "" = ""
1289+
cleanWindowsNewlines ('\r':'\n':rest) = '\n' : cleanWindowsNewlines rest
1290+
cleanWindowsNewlines (x:rest) = x : cleanWindowsNewlines rest
12851291
}

0 commit comments

Comments
 (0)