Skip to content

Commit c4dd601

Browse files
authored
Merge pull request harpocrates#32 from acw/windows
Windows Support
2 parents d32e57f + 60c93b5 commit c4dd601

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
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
}

test/rustc-tests/Diff.hs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -604,12 +604,18 @@ instance Diffable LitTok where
604604
("Char", CharTok s) | fromString s == (val ! "fields" ! 0) -> pure ()
605605
("Integer", IntegerTok s) | fromString s == (val ! "fields" ! 0) -> pure ()
606606
("Float", FloatTok s) | fromString s == (val ! "fields" ! 0) -> pure ()
607-
("Str_", StrTok s) | fromString s == (val ! "fields" ! 0) -> pure ()
608-
("StrRaw", StrRawTok s i) | fromString s == (val ! "fields" ! 0) -> i === (val ! "fields" ! 1)
609-
("ByteStr", ByteStrTok s) | fromString s == (val ! "fields" ! 0) -> pure ()
610-
("ByteStrRaw", ByteStrRawTok s i) | fromString s == (val ! "fields" ! 0) -> i === (val ! "fields" ! 1)
607+
("Str_", StrTok s) | fromString s == clean (val ! "fields" ! 0) -> pure ()
608+
("StrRaw", StrRawTok s i) | fromString s == clean (val ! "fields" ! 0) -> i === (val ! "fields" ! 1)
609+
("ByteStr", ByteStrTok s) | fromString s == clean (val ! "fields" ! 0) -> pure ()
610+
("ByteStrRaw", ByteStrRawTok s i) | fromString s == clean (val ! "fields" ! 0) -> i === (val ! "fields" ! 1)
611611
_ -> diff "different literal token" l val
612612

613+
clean :: Value -> Value
614+
clean x =
615+
case x of
616+
String s -> String (T.replace "\r\n" "\n" s)
617+
_ -> x
618+
613619
instance Show a => Diffable (FieldPat a) where
614620
f@(FieldPat mi p _) === val = do
615621
-- Extract the identifier and whether the pattern is shorthand

0 commit comments

Comments
 (0)