@@ -5,13 +5,11 @@ module Language.Haskell.Stylish.Parse
5
5
6
6
7
7
--------------------------------------------------------------------------------
8
- import Control.Monad ((>=>) )
9
8
import Data.List (foldl' ,
10
9
stripPrefix )
11
10
import Data.Maybe (fromMaybe ,
12
11
listToMaybe ,
13
12
mapMaybe )
14
- import Data.Traversable (for )
15
13
import qualified GHC.Data.StringBuffer as GHC
16
14
import GHC.Driver.Ppr as GHC
17
15
import qualified GHC.Driver.Session as GHC
@@ -35,6 +33,15 @@ import Language.Haskell.Stylish.Module
35
33
type Extensions = [String ]
36
34
37
35
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
+
38
45
--------------------------------------------------------------------------------
39
46
-- | Filter out lines which use CPP macros
40
47
unCpp :: String -> String
@@ -60,23 +67,24 @@ dropBom str = str
60
67
parseModule :: Extensions -> Maybe FilePath -> String -> Either String Module
61
68
parseModule externalExts0 fp string = do
62
69
-- 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
66
71
67
72
-- Build first dynflags.
68
- let dynFlags0 = foldl' turnOn baseDynFlags externalExts1
73
+ let dynFlags0 = foldl' toggleExt baseDynFlags externalExts1
69
74
70
75
-- Parse options from file
71
76
let fileOptions = fmap GHC. unLoc $ GHC. getOptions dynFlags0
72
77
(GHC. stringToStringBuffer string)
73
78
(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)
76
84
fileOptions
77
85
78
86
-- Set further dynflags.
79
- let dynFlags1 = foldl' turnOn dynFlags0 fileExtensions
87
+ let dynFlags1 = foldl' toggleExt dynFlags0 fileExtensions
80
88
`GHC.gopt_set` GHC. Opt_KeepRawTokenStream
81
89
82
90
-- Possibly strip CPP.
@@ -92,7 +100,7 @@ parseModule externalExts0 fp string = do
92
100
where
93
101
withFileName x = maybe " " (<> " : " ) fp <> x
94
102
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