@@ -15,6 +15,7 @@ import Control.Exception
15import Control.Monad
15import Control.Monad
16import Control.Monad.IO.Class
16import Control.Monad.IO.Class
17import Data.List ((\\), foldl', isPrefixOf)
17import Data.List ((\\), foldl', isPrefixOf)
18+import qualified Data.List.NonEmpty as NE
18import Data.Maybe (catMaybes)
19import Data.Maybe (catMaybes)
19import qualified DynFlags as GHC
20import qualified DynFlags as GHC
20import DynFlags as GHC
21import DynFlags as GHC
@@ -57,8 +58,9 @@ parseModule Config {..} path input' = liftIO $ do
57 GHC.setGeneralFlag'
58 GHC.setGeneralFlag'
58 GHC.Opt_Haddock
59 GHC.Opt_Haddock
59 (setDefaultExts baseDynFlags)
60 (setDefaultExts baseDynFlags)
61+ extraOpts = dynOptionToLocatedStr <$> cfgDynOptions
60 (warnings, dynFlags) <-
62 (warnings, dynFlags) <-
61− parsePragmasIntoDynFlags baseFlags path input' >>= \case
63+ parsePragmasIntoDynFlags baseFlags extraOpts path input' >>= \case
62 Right res -> pure res
64 Right res -> pure res
63 Left err ->
65 Left err ->
@@ -170,14 +172,24 @@ setDefaultExts flags = foldl' GHC.xopt_set flags autoExts
170-- More helpers (taken from HLint)
172-- More helpers (taken from HLint)
172parsePragmasIntoDynFlags ::
174parsePragmasIntoDynFlags ::
175+ -- | Pre-set 'DynFlags'
173 DynFlags ->
176 DynFlags ->
177+ -- | Extra options (provided by user)
179+ -- | File name (only for source location annotations)
174 FilePath ->
180 FilePath ->
181+ -- | Input for parser
175 String ->
182 String ->
176 IO (Either String ([GHC.Warn], DynFlags))
183 IO (Either String ([GHC.Warn], DynFlags))
177−parsePragmasIntoDynFlags flags filepath str =
184+parsePragmasIntoDynFlags flags extraOpts filepath str =
178 catchErrors $ do
185 catchErrors $ do
179 let opts = GHC.getOptions flags (GHC.stringToStringBuffer str) filepath
186 let opts = GHC.getOptions flags (GHC.stringToStringBuffer str) filepath
187+ (flags', leftovers, warnings) <-
180− (flags', _, warnings) <- parseDynamicFilePragma flags opts
188+ parseDynamicFilePragma flags (opts <> extraOpts)
189+ case NE.nonEmpty leftovers of
190+ Nothing -> return ()
191+ Just unrecognizedOpts ->
192+ throwIO (OrmoluUnrecognizedOpts (unLoc <$> unrecognizedOpts))
181 let flags'' = flags' `gopt_set` Opt_KeepRawTokenStream
193 let flags'' = flags' `gopt_set` Opt_KeepRawTokenStream
182 return $ Right (warnings, flags'')
194 return $ Right (warnings, flags'')