@@ -15,6 +15,7 @@ import Control.Exception
1515import Control.Monad
1616import Control.Monad.IO.Class
1717import Data.List ((\\), foldl', isPrefixOf)
18+import qualified Data.List.NonEmpty as NE
1819import Data.Maybe (catMaybes)
1920import qualified DynFlags as GHC
2021import DynFlags as GHC
@@ -57,8 +58,9 @@ parseModule Config {..} path input' = liftIO $ do
5758 GHC.setGeneralFlag'
5859 GHC.Opt_Haddock
5960 (setDefaultExts baseDynFlags)
61+ extraOpts = dynOptionToLocatedStr <$> cfgDynOptions
6062 (warnings, dynFlags) <-
61− parsePragmasIntoDynFlags baseFlags path input' >>= \case
63+ parsePragmasIntoDynFlags baseFlags extraOpts path input' >>= \case
6264 Right res -> pure res
6365 Left err ->
6466 let loc =
@@ -170,14 +172,24 @@ setDefaultExts flags = foldl' GHC.xopt_set flags autoExts
170172-- More helpers (taken from HLint)
171173
172174parsePragmasIntoDynFlags ::
175+ -- | Pre-set 'DynFlags'
173176 DynFlags ->
177+ -- | Extra options (provided by user)
178+ [Located String] ->
179+ -- | File name (only for source location annotations)
174180 FilePath ->
181+ -- | Input for parser
175182 String ->
176183 IO (Either String ([GHC.Warn], DynFlags))
177−parsePragmasIntoDynFlags flags filepath str =
184+parsePragmasIntoDynFlags flags extraOpts filepath str =
178185 catchErrors $ do
179186 let opts = GHC.getOptions flags (GHC.stringToStringBuffer str) filepath
180− (flags', _, warnings) <- parseDynamicFilePragma flags opts
187+ (flags', leftovers, warnings) <-
188+ parseDynamicFilePragma flags (opts <> extraOpts)
189+ case NE.nonEmpty leftovers of
190+ Nothing -> return ()
191+ Just unrecognizedOpts ->
192+ throwIO (OrmoluUnrecognizedOpts (unLoc <$> unrecognizedOpts))
181193 let flags'' = flags' `gopt_set` Opt_KeepRawTokenStream
182194 return $ Right (warnings, flags'')
183195 where