@@ -5,11 +5,14 @@ module Language.Haskell.Stylish.Parse
55
66
77--------------------------------------------------------------------------------
8+ import Data.Char (toLower )
89import Data.List (foldl' ,
910 stripPrefix )
10- import Data.Maybe (fromMaybe ,
11+ import Data.Maybe (catMaybes ,
12+ fromMaybe ,
1113 listToMaybe ,
1214 mapMaybe )
15+ import Data.Traversable (for )
1316import qualified GHC.Data.StringBuffer as GHC
1417import GHC.Driver.Ppr as GHC
1518import qualified GHC.Driver.Session as GHC
@@ -34,12 +37,27 @@ type Extensions = [String]
3437
3538
3639--------------------------------------------------------------------------------
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
40+ data ParseExtensionResult
41+ -- | Actual extension, and whether we want to turn it on or off.
42+ = ExtensionOk LangExt. Extension Bool
43+ -- | Failed to parse extension.
44+ | ExtensionError String
45+ -- | Other LANGUAGE things that aren't really extensions, like 'Safe'.
46+ | ExtensionIgnore
47+
48+
49+ --------------------------------------------------------------------------------
50+ parseExtension :: String -> ParseExtensionResult
51+ parseExtension str
52+ | Just x <- GHCEx. readExtension str = ExtensionOk x True
53+ | ' N' : ' o' : str' <- str = case parseExtension str' of
54+ ExtensionOk x onOff -> ExtensionOk x (not onOff)
55+ result -> result
56+ | map toLower str `elem` ignores = ExtensionIgnore
57+ | otherwise = ExtensionError $
58+ " Unknown extension: " ++ show str
59+ where
60+ ignores = [" unsafe" , " trustworthy" , " safe" ]
4361
4462
4563--------------------------------------------------------------------------------
@@ -67,7 +85,10 @@ dropBom str = str
6785parseModule :: Extensions -> Maybe FilePath -> String -> Either String Module
6886parseModule externalExts0 fp string = do
6987 -- Parse extensions.
70- externalExts1 <- traverse parseExtension externalExts0
88+ externalExts1 <- fmap catMaybes . for externalExts0 $ \ str -> case parseExtension str of
89+ ExtensionError err -> Left err
90+ ExtensionIgnore -> pure Nothing
91+ ExtensionOk x onOff -> pure $ Just (x, onOff)
7192
7293 -- Build first dynflags.
7394 let dynFlags0 = foldl' toggleExt baseDynFlags externalExts1
@@ -79,8 +100,8 @@ parseModule externalExts0 fp string = do
79100 fileExtensions = mapMaybe (\ str -> do
80101 str' <- stripPrefix " -X" str
81102 case parseExtension str' of
82- Left _ -> Nothing
83- Right x -> pure x )
103+ ExtensionOk x onOff -> Just (x, onOff)
104+ _ -> Nothing )
84105 fileOptions
85106
86107 -- Set further dynflags.
0 commit comments