@@ -1052,17 +1052,17 @@ $white+ { \s -> pure (Space Whitespace s) }
1052
1052
1053
1053
@lit_byte { \c - > literal (ByteTok (drop 2 (init c))) }
1054
1054
@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) ))) }
1057
1057
1058
1058
@lit_raw_str { \s - > let n = length s - 2
1059
1059
in do
1060
- str < - rawString n
1060
+ str < - cleanWindowsNewlines `fmap` rawString n
1061
1061
literal (StrRawTok str (fromIntegral n))
1062
1062
}
1063
1063
@lit_raw_bstr { \s - > let n = length s - 3
1064
1064
in do
1065
- str < - rawString n
1065
+ str < - cleanWindowsNewlines `fmap` rawString n
1066
1066
literal (ByteStrRawTok str (fromIntegral n))
1067
1067
}
1068
1068
@@ -1075,7 +1075,8 @@ $white+ { \s -> pure (Space Whitespace s) }
1075
1075
@lifetime { \s - > (pure (LifetimeTok (mkIdent (tail s))) :: P Token ) }
1076
1076
1077
1077
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 ) }
1079
1080
@outer_doc_inline / ( [^ \* ] | \r | \n )
1080
1081
{ \_ - > Doc < $> nestedComment < * > pure Outer < * > pure True }
1081
1082
@@ -1281,5 +1282,10 @@ lexShebangLine = do
1281
1282
_ <- nextChar
1282
1283
(c' : ) < $> toNewline
1283
1284
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
1285
1291
}
0 commit comments