module Hhp.Flag where

import GHC.Driver.Session (fFlags, fLangFlags, flagSpecName, wWarningFlags)

import Hhp.Types

-- | Listing GHC flags. (e.g -Wno-orphans)
listFlags :: Options -> IO String
listFlags :: Options -> IO [Char]
listFlags Options
opt = [Char] -> IO [Char]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Char] -> IO [Char]) -> [Char] -> IO [Char]
forall a b. (a -> b) -> a -> b
$ Options -> [[Char]] -> [Char]
forall a. ToString a => Options -> a -> [Char]
convert Options
opt [[Char]]
options
  where
    options :: [[Char]]
options = [Char] -> [[Char]] -> [[Char]]
expand [Char]
"-f" [[Char]]
fOptions [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [Char] -> [[Char]] -> [[Char]]
expand [Char]
"-W" [[Char]]
wOptions
    fOptions :: [[Char]]
fOptions = (FlagSpec GeneralFlag -> [Char])
-> [FlagSpec GeneralFlag] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map FlagSpec GeneralFlag -> [Char]
forall flag. FlagSpec flag -> [Char]
flagSpecName [FlagSpec GeneralFlag]
fFlags [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ (FlagSpec Extension -> [Char]) -> [FlagSpec Extension] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map FlagSpec Extension -> [Char]
forall flag. FlagSpec flag -> [Char]
flagSpecName [FlagSpec Extension]
fLangFlags
    wOptions :: [[Char]]
wOptions = (FlagSpec WarningFlag -> [Char])
-> [FlagSpec WarningFlag] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map FlagSpec WarningFlag -> [Char]
forall flag. FlagSpec flag -> [Char]
flagSpecName [FlagSpec WarningFlag]
wWarningFlags
    expand :: [Char] -> [[Char]] -> [[Char]]
expand [Char]
prefix [[Char]]
lst =
        [ [Char]
prefix [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
no [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
option
        | [Char]
option <- [[Char]]
lst
        , [Char]
no <- [[Char]
"", [Char]
"no-"]
        ]