@@ -5,13 +5,11 @@ module Language.Haskell.Stylish.Parse
55
66
77--------------------------------------------------------------------------------
8- import Control.Monad ((>=>) )
98import Data.List (foldl' ,
109 stripPrefix )
1110import Data.Maybe (fromMaybe ,
1211 listToMaybe ,
1312 mapMaybe )
14- import Data.Traversable (for )
1513import qualified GHC.Data.StringBuffer as GHC
1614import GHC.Driver.Ppr as GHC
1715import qualified GHC.Driver.Session as GHC
@@ -35,6 +33,15 @@ import Language.Haskell.Stylish.Module
3533type Extensions = [String ]
3634
3735
36+ --------------------------------------------------------------------------------
37+ parseExtension :: String -> Either String (LangExt. Extension , Bool )
38+ parseExtension str = case GHCEx. readExtension str of
39+ Just e -> Right (e, True )
40+ Nothing -> case str of
41+ ' N' : ' o' : str' -> fmap not <$> parseExtension str'
42+ _ -> Left $ " Unknown extension: " ++ show str
43+
44+
3845--------------------------------------------------------------------------------
3946-- | Filter out lines which use CPP macros
4047unCpp :: String -> String
@@ -60,23 +67,24 @@ dropBom str = str
6067parseModule :: Extensions -> Maybe FilePath -> String -> Either String Module
6168parseModule externalExts0 fp string = do
6269 -- Parse extensions.
63- externalExts1 <- for externalExts0 $ \ s -> case GHCEx. readExtension s of
64- Nothing -> Left $ " Unknown extension: " ++ show s
65- Just e -> Right e
70+ externalExts1 <- traverse parseExtension externalExts0
6671
6772 -- Build first dynflags.
68- let dynFlags0 = foldl' turnOn baseDynFlags externalExts1
73+ let dynFlags0 = foldl' toggleExt baseDynFlags externalExts1
6974
7075 -- Parse options from file
7176 let fileOptions = fmap GHC. unLoc $ GHC. getOptions dynFlags0
7277 (GHC. stringToStringBuffer string)
7378 (fromMaybe " -" fp)
74- fileExtensions = mapMaybe
75- (stripPrefix " -X" >=> GHCEx. readExtension)
79+ fileExtensions = mapMaybe (\ str -> do
80+ str' <- stripPrefix " -X" str
81+ case parseExtension str' of
82+ Left _ -> Nothing
83+ Right x -> pure x)
7684 fileOptions
7785
7886 -- Set further dynflags.
79- let dynFlags1 = foldl' turnOn dynFlags0 fileExtensions
87+ let dynFlags1 = foldl' toggleExt dynFlags0 fileExtensions
8088 `GHC.gopt_set` GHC. Opt_KeepRawTokenStream
8189
8290 -- Possibly strip CPP.
@@ -92,7 +100,7 @@ parseModule externalExts0 fp string = do
92100 where
93101 withFileName x = maybe " " (<> " : " ) fp <> x
94102
95- turnOn dynFlags ext = foldl'
96- turnOn
97- (GHC. xopt_set dynFlags ext)
98- [rhs | (lhs, True , rhs) <- GHC. impliedXFlags, lhs == ext]
103+ toggleExt dynFlags ( ext, onOff) = foldl'
104+ toggleExt
105+ (( if onOff then GHC. xopt_set else GHC. xopt_unset) dynFlags ext)
106+ [( rhs, onOff') | (lhs, onOff' , rhs) <- GHC. impliedXFlags, lhs == ext]
0 commit comments