module GHC.Driver.Config.Parser
  ( initParserOpts
  )
where

import GHC.Prelude
import GHC.Platform

import GHC.Driver.Session
import GHC.Driver.Config.Diagnostic

import GHC.Parser.Lexer

-- | Extracts the flags needed for parsing
initParserOpts :: DynFlags -> ParserOpts
initParserOpts :: DynFlags -> ParserOpts
initParserOpts =
  EnumSet Extension
-> DiagOpts
-> [String]
-> Bool
-> Bool
-> Bool
-> Bool
-> ParserOpts
mkParserOpts
    (EnumSet Extension
 -> DiagOpts
 -> [String]
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> ParserOpts)
-> (DynFlags -> EnumSet Extension)
-> DynFlags
-> DiagOpts
-> [String]
-> Bool
-> Bool
-> Bool
-> Bool
-> ParserOpts
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DynFlags -> EnumSet Extension
extensionFlags
    (DynFlags
 -> DiagOpts
 -> [String]
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> ParserOpts)
-> (DynFlags -> DiagOpts)
-> DynFlags
-> [String]
-> Bool
-> Bool
-> Bool
-> Bool
-> ParserOpts
forall a b.
(DynFlags -> a -> b) -> (DynFlags -> a) -> DynFlags -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> DynFlags -> DiagOpts
initDiagOpts
    (DynFlags
 -> [String] -> Bool -> Bool -> Bool -> Bool -> ParserOpts)
-> (DynFlags -> [String])
-> DynFlags
-> Bool
-> Bool
-> Bool
-> Bool
-> ParserOpts
forall a b.
(DynFlags -> a -> b) -> (DynFlags -> a) -> DynFlags -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ArchOS -> [String]
supportedLanguagesAndExtensions (ArchOS -> [String])
-> (DynFlags -> ArchOS) -> DynFlags -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Platform -> ArchOS
platformArchOS (Platform -> ArchOS)
-> (DynFlags -> Platform) -> DynFlags -> ArchOS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DynFlags -> Platform
targetPlatform)
    (DynFlags -> Bool -> Bool -> Bool -> Bool -> ParserOpts)
-> (DynFlags -> Bool)
-> DynFlags
-> Bool
-> Bool
-> Bool
-> ParserOpts
forall a b.
(DynFlags -> a -> b) -> (DynFlags -> a) -> DynFlags -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> DynFlags -> Bool
safeImportsOn
    (DynFlags -> Bool -> Bool -> Bool -> ParserOpts)
-> (DynFlags -> Bool) -> DynFlags -> Bool -> Bool -> ParserOpts
forall a b.
(DynFlags -> a -> b) -> (DynFlags -> a) -> DynFlags -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_Haddock
    (DynFlags -> Bool -> Bool -> ParserOpts)
-> (DynFlags -> Bool) -> DynFlags -> Bool -> ParserOpts
forall a b.
(DynFlags -> a -> b) -> (DynFlags -> a) -> DynFlags -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_KeepRawTokenStream
    (DynFlags -> Bool -> ParserOpts)
-> (DynFlags -> Bool) -> DynFlags -> ParserOpts
forall a b.
(DynFlags -> a -> b) -> (DynFlags -> a) -> DynFlags -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> DynFlags -> Bool
forall a b. a -> b -> a
const Bool
True -- use LINE/COLUMN to update the internal location