@@ -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