{-# LANGUAGE RecordWildCards, NamedFieldPuns, DeriveGeneric, ConstraintKinds, FlexibleInstances #-}

-- | Project configuration, implementation in terms of legacy types.
--
module Distribution.Client.ProjectConfig.Legacy (

   -- Project config skeletons
    ProjectConfigSkeleton,
    parseProjectSkeleton,
    instantiateProjectConfigSkeleton,
    singletonProjectConfigSkeleton,
    projectSkeletonImports,

    -- * Project config in terms of legacy types
    LegacyProjectConfig,
    parseLegacyProjectConfig,
    showLegacyProjectConfig,

    -- * Conversion to and from legacy config types
    commandLineFlagsToProjectConfig,
    convertLegacyProjectConfig,
    convertLegacyGlobalConfig,
    convertToLegacyProjectConfig,

    -- * Internals, just for tests
    parsePackageLocationTokenQ,
    renderPackageLocationToken
  ) where

import Distribution.Client.Compat.Prelude

import Distribution.Types.Flag (parsecFlagAssignment, FlagName)

import Distribution.Client.ProjectConfig.Types
import Distribution.Client.Types.RepoName (RepoName (..), unRepoName)
import Distribution.Client.Types.Repo (RemoteRepo(..), LocalRepo (..), emptyRemoteRepo)
import Distribution.Client.Types.AllowNewer (AllowNewer(..), AllowOlder(..))
import Distribution.Client.Types.SourceRepo (sourceRepositoryPackageGrammar, SourceRepoList)

import Distribution.Client.Config
         ( SavedConfig(..), remoteRepoFields, postProcessRepo )

import Distribution.Client.CmdInstall.ClientInstallFlags
         ( ClientInstallFlags(..), defaultClientInstallFlags
         , clientInstallOptions )

import Distribution.Compat.Lens (view)

import Distribution.Solver.Types.ConstraintSource

import Distribution.FieldGrammar
import Distribution.Package
import Distribution.Types.SourceRepo (RepoType)
import Distribution.Types.CondTree
         ( CondTree (..), CondBranch (..), mapTreeConds, traverseCondTreeC )
import Distribution.PackageDescription
         ( dispFlagAssignment, Condition (..), ConfVar (..), FlagAssignment )
import Distribution.PackageDescription.Configuration (simplifyWithSysParams)
import Distribution.Simple.Compiler
         ( OptimisationLevel(..), DebugInfoLevel(..), CompilerInfo(..) )
import Distribution.Simple.InstallDirs ( CopyDest (NoCopyDest) )
import Distribution.Simple.Setup
         ( Flag(..), toFlag, fromFlagOrDefault
         , ConfigFlags(..), configureOptions
         , HaddockFlags(..), haddockOptions, defaultHaddockFlags
         , TestFlags(..), testOptions', defaultTestFlags
         , BenchmarkFlags(..), benchmarkOptions', defaultBenchmarkFlags
         , programDbPaths', splitArgs, DumpBuildInfo (NoDumpBuildInfo, DumpBuildInfo)
         , readPackageDb, showPackageDb
         )
import Distribution.Client.NixStyleOptions (NixStyleFlags (..))
import Distribution.Client.ProjectFlags (ProjectFlags (..), projectFlagsOptions, defaultProjectFlags)
import Distribution.Client.Setup
         ( GlobalFlags(..), globalCommand
         , ConfigExFlags(..), configureExOptions, defaultConfigExFlags
         , InstallFlags(..), installOptions, defaultInstallFlags )
import Distribution.Simple.Program
         ( programName, knownPrograms )
import Distribution.Simple.Program.Db
         ( ProgramDb, defaultProgramDb )
import Distribution.Simple.Utils
         ( lowercase )
import Distribution.Utils.NubList
         ( toNubList, fromNubList, overNubList )
import Distribution.Simple.LocalBuildInfo
         ( toPathTemplate, fromPathTemplate )

import qualified Distribution.Deprecated.ReadP as Parse
import Distribution.Deprecated.ReadP
         ( ReadP, (+++) )
import qualified Text.PrettyPrint as Disp
import Text.PrettyPrint
         ( Doc, ($+$) )
import qualified Distribution.Deprecated.ParseUtils as ParseUtils
import Distribution.Deprecated.ParseUtils
         ( ParseResult(..), PError(..), syntaxError, PWarning(..)
         , commaNewLineListFieldParsec, newLineListField, parseTokenQ
         , parseHaskellString, showToken
         , simpleFieldParsec, parseFail
         )
import Distribution.Client.ParseUtils
import Distribution.Simple.Command
         ( CommandUI(commandOptions), ShowOrParseArgs(..)
         , OptionField, option, reqArg' )
import Distribution.Types.PackageVersionConstraint
         ( PackageVersionConstraint )
import Distribution.Parsec (ParsecParser, parsecToken)
import Distribution.System (OS, Arch)

import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.ByteString.Char8 as BS

import Network.URI (URI (..), parseURI)

import Distribution.Fields.ConfVar (parseConditionConfVarFromClause)

import Distribution.Client.HttpUtils
import System.FilePath ((</>), isPathSeparator, makeValid)
import System.Directory (createDirectoryIfMissing)




------------------------------------------------------------------
-- Handle extended project config files with conditionals and imports.
--

-- | ProjectConfigSkeleton is a tree of conditional blocks and imports wrapping a config. It can be finalized by providing the conditional resolution info
-- and then resolving and downloading the imports
type ProjectConfigSkeleton = CondTree ConfVar [ProjectConfigImport] ProjectConfig
type ProjectConfigImport = String


singletonProjectConfigSkeleton :: ProjectConfig -> ProjectConfigSkeleton
singletonProjectConfigSkeleton :: ProjectConfig -> ProjectConfigSkeleton
singletonProjectConfigSkeleton ProjectConfig
x = ProjectConfig
-> [ProjectConfigImport]
-> [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
-> ProjectConfigSkeleton
forall v c a. a -> c -> [CondBranch v c a] -> CondTree v c a
CondNode ProjectConfig
x [ProjectConfigImport]
forall a. Monoid a => a
mempty [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
forall a. Monoid a => a
mempty

instantiateProjectConfigSkeleton :: OS -> Arch -> CompilerInfo -> FlagAssignment -> ProjectConfigSkeleton -> ProjectConfig
instantiateProjectConfigSkeleton :: OS
-> Arch
-> CompilerInfo
-> FlagAssignment
-> ProjectConfigSkeleton
-> ProjectConfig
instantiateProjectConfigSkeleton OS
os Arch
arch CompilerInfo
impl FlagAssignment
_flags ProjectConfigSkeleton
skel = CondTree FlagName [ProjectConfigImport] ProjectConfig
-> ProjectConfig
go (CondTree FlagName [ProjectConfigImport] ProjectConfig
 -> ProjectConfig)
-> CondTree FlagName [ProjectConfigImport] ProjectConfig
-> ProjectConfig
forall a b. (a -> b) -> a -> b
$ (Condition ConfVar -> Condition FlagName)
-> ProjectConfigSkeleton
-> CondTree FlagName [ProjectConfigImport] ProjectConfig
forall v w c a.
(Condition v -> Condition w) -> CondTree v c a -> CondTree w c a
mapTreeConds ((Condition FlagName, [FlagName]) -> Condition FlagName
forall a b. (a, b) -> a
fst ((Condition FlagName, [FlagName]) -> Condition FlagName)
-> (Condition ConfVar -> (Condition FlagName, [FlagName]))
-> Condition ConfVar
-> Condition FlagName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OS
-> Arch
-> CompilerInfo
-> Condition ConfVar
-> (Condition FlagName, [FlagName])
simplifyWithSysParams OS
os Arch
arch CompilerInfo
impl) ProjectConfigSkeleton
skel
    where
        go :: CondTree
               FlagName
               [ProjectConfigImport]
               ProjectConfig
             -> ProjectConfig
        go :: CondTree FlagName [ProjectConfigImport] ProjectConfig
-> ProjectConfig
go (CondNode ProjectConfig
l [ProjectConfigImport]
_imps [CondBranch FlagName [ProjectConfigImport] ProjectConfig]
ts) =
           let branches :: [ProjectConfig]
branches = (CondBranch FlagName [ProjectConfigImport] ProjectConfig
 -> [ProjectConfig])
-> [CondBranch FlagName [ProjectConfigImport] ProjectConfig]
-> [ProjectConfig]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CondBranch FlagName [ProjectConfigImport] ProjectConfig
-> [ProjectConfig]
processBranch [CondBranch FlagName [ProjectConfigImport] ProjectConfig]
ts
           in ProjectConfig
l ProjectConfig -> ProjectConfig -> ProjectConfig
forall a. Semigroup a => a -> a -> a
<> [ProjectConfig] -> ProjectConfig
forall a. Monoid a => [a] -> a
mconcat [ProjectConfig]
branches
        processBranch :: CondBranch FlagName [ProjectConfigImport] ProjectConfig
-> [ProjectConfig]
processBranch (CondBranch Condition FlagName
cnd CondTree FlagName [ProjectConfigImport] ProjectConfig
t Maybe (CondTree FlagName [ProjectConfigImport] ProjectConfig)
mf) = case Condition FlagName
cnd of
           (Lit Bool
True) ->  [CondTree FlagName [ProjectConfigImport] ProjectConfig
-> ProjectConfig
go CondTree FlagName [ProjectConfigImport] ProjectConfig
t]
           (Lit Bool
False) -> [ProjectConfig]
-> (CondTree FlagName [ProjectConfigImport] ProjectConfig
    -> [ProjectConfig])
-> Maybe (CondTree FlagName [ProjectConfigImport] ProjectConfig)
-> [ProjectConfig]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([]) ((ProjectConfig -> [ProjectConfig] -> [ProjectConfig]
forall a. a -> [a] -> [a]
:[]) (ProjectConfig -> [ProjectConfig])
-> (CondTree FlagName [ProjectConfigImport] ProjectConfig
    -> ProjectConfig)
-> CondTree FlagName [ProjectConfigImport] ProjectConfig
-> [ProjectConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CondTree FlagName [ProjectConfigImport] ProjectConfig
-> ProjectConfig
go) Maybe (CondTree FlagName [ProjectConfigImport] ProjectConfig)
mf
           Condition FlagName
_ -> ProjectConfigImport -> [ProjectConfig]
forall a. HasCallStack => ProjectConfigImport -> a
error (ProjectConfigImport -> [ProjectConfig])
-> ProjectConfigImport -> [ProjectConfig]
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport
"unable to process condition: " ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ Condition FlagName -> ProjectConfigImport
forall a. Show a => a -> ProjectConfigImport
show Condition FlagName
cnd -- TODO it would be nice if there were a pretty printer

projectSkeletonImports :: ProjectConfigSkeleton -> [ProjectConfigImport]
projectSkeletonImports :: ProjectConfigSkeleton -> [ProjectConfigImport]
projectSkeletonImports = Getting
  [ProjectConfigImport] ProjectConfigSkeleton [ProjectConfigImport]
-> ProjectConfigSkeleton -> [ProjectConfigImport]
forall a s. Getting a s a -> s -> a
view Getting
  [ProjectConfigImport] ProjectConfigSkeleton [ProjectConfigImport]
forall v c a d. Traversal (CondTree v c a) (CondTree v d a) c d
traverseCondTreeC

parseProjectSkeleton :: FilePath -> HttpTransport -> Verbosity -> [ProjectConfigImport] -> FilePath -> BS.ByteString -> IO (ParseResult ProjectConfigSkeleton)
parseProjectSkeleton :: ProjectConfigImport
-> HttpTransport
-> Verbosity
-> [ProjectConfigImport]
-> ProjectConfigImport
-> ByteString
-> IO (ParseResult ProjectConfigSkeleton)
parseProjectSkeleton ProjectConfigImport
cacheDir HttpTransport
httpTransport Verbosity
verbosity [ProjectConfigImport]
seenImports ProjectConfigImport
source ByteString
bs = (Bool -> ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton
sanityWalkPCS Bool
False (ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
-> ParseResult ProjectConfigSkeleton
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (ParseResult ProjectConfigSkeleton
 -> ParseResult ProjectConfigSkeleton)
-> IO (ParseResult ProjectConfigSkeleton)
-> IO (ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Field] -> IO (ParseResult ProjectConfigSkeleton))
-> ParseResult [Field] -> IO (ParseResult ProjectConfigSkeleton)
forall a b.
(a -> IO (ParseResult b)) -> ParseResult a -> IO (ParseResult b)
liftPR ([Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go []) (ByteString -> ParseResult [Field]
ParseUtils.readFields ByteString
bs)
  where
    go :: [ParseUtils.Field] -> [ParseUtils.Field] -> IO (ParseResult ProjectConfigSkeleton)
    go :: [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [Field]
acc (Field
x:[Field]
xs) = case Field
x of
         (ParseUtils.F LineNo
l ProjectConfigImport
"import" ProjectConfigImport
importLoc) ->
            if ProjectConfigImport
importLoc ProjectConfigImport -> [ProjectConfigImport] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [ProjectConfigImport]
seenImports
              then ParseResult ProjectConfigSkeleton
-> IO (ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParseResult ProjectConfigSkeleton
 -> IO (ParseResult ProjectConfigSkeleton))
-> (PError -> ParseResult ProjectConfigSkeleton)
-> PError
-> IO (ParseResult ProjectConfigSkeleton)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PError -> ParseResult ProjectConfigSkeleton
forall a. PError -> ParseResult a
parseFail (PError -> IO (ParseResult ProjectConfigSkeleton))
-> PError -> IO (ParseResult ProjectConfigSkeleton)
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport -> Maybe LineNo -> PError
ParseUtils.FromString (ProjectConfigImport
"cyclical import of " ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
importLoc) (LineNo -> Maybe LineNo
forall a. a -> Maybe a
Just LineNo
l)
              else do
                let fs :: ParseResult (CondTree v [ProjectConfigImport] ProjectConfig)
fs = (ProjectConfig -> CondTree v [ProjectConfigImport] ProjectConfig)
-> ParseResult ProjectConfig
-> ParseResult (CondTree v [ProjectConfigImport] ProjectConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\ProjectConfig
z -> ProjectConfig
-> [ProjectConfigImport]
-> [CondBranch v [ProjectConfigImport] ProjectConfig]
-> CondTree v [ProjectConfigImport] ProjectConfig
forall v c a. a -> c -> [CondBranch v c a] -> CondTree v c a
CondNode ProjectConfig
z [ProjectConfigImport
importLoc] [CondBranch v [ProjectConfigImport] ProjectConfig]
forall a. Monoid a => a
mempty) (ParseResult ProjectConfig
 -> ParseResult (CondTree v [ProjectConfigImport] ProjectConfig))
-> ParseResult ProjectConfig
-> ParseResult (CondTree v [ProjectConfigImport] ProjectConfig)
forall a b. (a -> b) -> a -> b
$ [Field] -> ParseResult ProjectConfig
fieldsToConfig ([Field] -> [Field]
forall a. [a] -> [a]
reverse [Field]
acc)
                ParseResult ProjectConfigSkeleton
res <- ProjectConfigImport
-> HttpTransport
-> Verbosity
-> [ProjectConfigImport]
-> ProjectConfigImport
-> ByteString
-> IO (ParseResult ProjectConfigSkeleton)
parseProjectSkeleton ProjectConfigImport
cacheDir HttpTransport
httpTransport Verbosity
verbosity (ProjectConfigImport
importLoc ProjectConfigImport
-> [ProjectConfigImport] -> [ProjectConfigImport]
forall a. a -> [a] -> [a]
: [ProjectConfigImport]
seenImports) ProjectConfigImport
importLoc (ByteString -> IO (ParseResult ProjectConfigSkeleton))
-> IO ByteString -> IO (ParseResult ProjectConfigSkeleton)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ProjectConfigImport -> IO ByteString
fetchImportConfig ProjectConfigImport
importLoc
                ParseResult ProjectConfigSkeleton
rest <- [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [] [Field]
xs
                ParseResult ProjectConfigSkeleton
-> IO (ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParseResult ProjectConfigSkeleton
 -> IO (ParseResult ProjectConfigSkeleton))
-> ([ParseResult ProjectConfigSkeleton]
    -> ParseResult ProjectConfigSkeleton)
-> [ParseResult ProjectConfigSkeleton]
-> IO (ParseResult ProjectConfigSkeleton)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([ProjectConfigSkeleton] -> ProjectConfigSkeleton)
-> ParseResult [ProjectConfigSkeleton]
-> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [ProjectConfigSkeleton] -> ProjectConfigSkeleton
forall a. Monoid a => [a] -> a
mconcat (ParseResult [ProjectConfigSkeleton]
 -> ParseResult ProjectConfigSkeleton)
-> ([ParseResult ProjectConfigSkeleton]
    -> ParseResult [ProjectConfigSkeleton])
-> [ParseResult ProjectConfigSkeleton]
-> ParseResult ProjectConfigSkeleton
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ParseResult ProjectConfigSkeleton]
-> ParseResult [ProjectConfigSkeleton]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([ParseResult ProjectConfigSkeleton]
 -> IO (ParseResult ProjectConfigSkeleton))
-> [ParseResult ProjectConfigSkeleton]
-> IO (ParseResult ProjectConfigSkeleton)
forall a b. (a -> b) -> a -> b
$ [ParseResult ProjectConfigSkeleton
forall v.
ParseResult (CondTree v [ProjectConfigImport] ProjectConfig)
fs, ParseResult ProjectConfigSkeleton
res, ParseResult ProjectConfigSkeleton
rest]
         (ParseUtils.Section LineNo
l ProjectConfigImport
"if" ProjectConfigImport
p [Field]
xs') -> do
                ParseResult ProjectConfigSkeleton
subpcs <- [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [] [Field]
xs'
                let fs :: ParseResult ProjectConfigSkeleton
fs = (ProjectConfig -> ProjectConfigSkeleton)
-> ParseResult ProjectConfig -> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProjectConfig -> ProjectConfigSkeleton
singletonProjectConfigSkeleton (ParseResult ProjectConfig -> ParseResult ProjectConfigSkeleton)
-> ParseResult ProjectConfig -> ParseResult ProjectConfigSkeleton
forall a b. (a -> b) -> a -> b
$ [Field] -> ParseResult ProjectConfig
fieldsToConfig ([Field] -> [Field]
forall a. [a] -> [a]
reverse [Field]
acc)
                (ParseResult (Maybe ProjectConfigSkeleton)
elseClauses, ParseResult ProjectConfigSkeleton
rest) <- [Field]
-> IO
     (ParseResult (Maybe ProjectConfigSkeleton),
      ParseResult ProjectConfigSkeleton)
parseElseClauses [Field]
xs
                let condNode :: ParseResult ProjectConfigSkeleton
condNode =  (\Condition ConfVar
c ProjectConfigSkeleton
pcs Maybe ProjectConfigSkeleton
e -> ProjectConfig
-> [ProjectConfigImport]
-> [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
-> ProjectConfigSkeleton
forall v c a. a -> c -> [CondBranch v c a] -> CondTree v c a
CondNode ProjectConfig
forall a. Monoid a => a
mempty [ProjectConfigImport]
forall a. Monoid a => a
mempty [Condition ConfVar
-> ProjectConfigSkeleton
-> Maybe ProjectConfigSkeleton
-> CondBranch ConfVar [ProjectConfigImport] ProjectConfig
forall v c a.
Condition v
-> CondTree v c a -> Maybe (CondTree v c a) -> CondBranch v c a
CondBranch Condition ConfVar
c ProjectConfigSkeleton
pcs Maybe ProjectConfigSkeleton
e]) (Condition ConfVar
 -> ProjectConfigSkeleton
 -> Maybe ProjectConfigSkeleton
 -> ProjectConfigSkeleton)
-> ParseResult (Condition ConfVar)
-> ParseResult
     (ProjectConfigSkeleton
      -> Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                      -- we rewrap as as a section so the readFields lexer of the conditional parser doesn't get confused
                      LineNo
-> Either ParseError (Condition ConfVar)
-> ParseResult (Condition ConfVar)
forall a a. Show a => LineNo -> Either a a -> ParseResult a
adaptParseError LineNo
l (ByteString -> Either ParseError (Condition ConfVar)
parseConditionConfVarFromClause (ByteString -> Either ParseError (Condition ConfVar))
-> (ProjectConfigImport -> ByteString)
-> ProjectConfigImport
-> Either ParseError (Condition ConfVar)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProjectConfigImport -> ByteString
BS.pack (ProjectConfigImport -> Either ParseError (Condition ConfVar))
-> ProjectConfigImport -> Either ParseError (Condition ConfVar)
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport
"if(" ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. Semigroup a => a -> a -> a
<> ProjectConfigImport
p ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. Semigroup a => a -> a -> a
<> ProjectConfigImport
")") ParseResult
  (ProjectConfigSkeleton
   -> Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
-> ParseResult
     (Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                      ParseResult ProjectConfigSkeleton
subpcs ParseResult (Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
-> ParseResult (Maybe ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                      ParseResult (Maybe ProjectConfigSkeleton)
elseClauses
                ParseResult ProjectConfigSkeleton
-> IO (ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParseResult ProjectConfigSkeleton
 -> IO (ParseResult ProjectConfigSkeleton))
-> ([ParseResult ProjectConfigSkeleton]
    -> ParseResult ProjectConfigSkeleton)
-> [ParseResult ProjectConfigSkeleton]
-> IO (ParseResult ProjectConfigSkeleton)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([ProjectConfigSkeleton] -> ProjectConfigSkeleton)
-> ParseResult [ProjectConfigSkeleton]
-> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [ProjectConfigSkeleton] -> ProjectConfigSkeleton
forall a. Monoid a => [a] -> a
mconcat (ParseResult [ProjectConfigSkeleton]
 -> ParseResult ProjectConfigSkeleton)
-> ([ParseResult ProjectConfigSkeleton]
    -> ParseResult [ProjectConfigSkeleton])
-> [ParseResult ProjectConfigSkeleton]
-> ParseResult ProjectConfigSkeleton
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ParseResult ProjectConfigSkeleton]
-> ParseResult [ProjectConfigSkeleton]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([ParseResult ProjectConfigSkeleton]
 -> IO (ParseResult ProjectConfigSkeleton))
-> [ParseResult ProjectConfigSkeleton]
-> IO (ParseResult ProjectConfigSkeleton)
forall a b. (a -> b) -> a -> b
$ [ParseResult ProjectConfigSkeleton
fs, ParseResult ProjectConfigSkeleton
condNode, ParseResult ProjectConfigSkeleton
rest]
         Field
_ -> [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go (Field
xField -> [Field] -> [Field]
forall a. a -> [a] -> [a]
:[Field]
acc) [Field]
xs
    go [Field]
acc [] = ParseResult ProjectConfigSkeleton
-> IO (ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParseResult ProjectConfigSkeleton
 -> IO (ParseResult ProjectConfigSkeleton))
-> ([Field] -> ParseResult ProjectConfigSkeleton)
-> [Field]
-> IO (ParseResult ProjectConfigSkeleton)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProjectConfig -> ProjectConfigSkeleton)
-> ParseResult ProjectConfig -> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProjectConfig -> ProjectConfigSkeleton
singletonProjectConfigSkeleton (ParseResult ProjectConfig -> ParseResult ProjectConfigSkeleton)
-> ([Field] -> ParseResult ProjectConfig)
-> [Field]
-> ParseResult ProjectConfigSkeleton
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Field] -> ParseResult ProjectConfig
fieldsToConfig ([Field] -> IO (ParseResult ProjectConfigSkeleton))
-> [Field] -> IO (ParseResult ProjectConfigSkeleton)
forall a b. (a -> b) -> a -> b
$ [Field] -> [Field]
forall a. [a] -> [a]
reverse [Field]
acc

    parseElseClauses :: [ParseUtils.Field] -> IO (ParseResult (Maybe ProjectConfigSkeleton), ParseResult ProjectConfigSkeleton)
    parseElseClauses :: [Field]
-> IO
     (ParseResult (Maybe ProjectConfigSkeleton),
      ParseResult ProjectConfigSkeleton)
parseElseClauses [Field]
x = case [Field]
x of
         (ParseUtils.Section LineNo
_l ProjectConfigImport
"else" ProjectConfigImport
_p [Field]
xs':[Field]
xs) -> do
               ParseResult ProjectConfigSkeleton
subpcs <- [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [] [Field]
xs'
               ParseResult ProjectConfigSkeleton
rest <- [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [] [Field]
xs
               (ParseResult (Maybe ProjectConfigSkeleton),
 ParseResult ProjectConfigSkeleton)
-> IO
     (ParseResult (Maybe ProjectConfigSkeleton),
      ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ProjectConfigSkeleton -> Maybe ProjectConfigSkeleton
forall a. a -> Maybe a
Just (ProjectConfigSkeleton -> Maybe ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
-> ParseResult (Maybe ProjectConfigSkeleton)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParseResult ProjectConfigSkeleton
subpcs, ParseResult ProjectConfigSkeleton
rest)
         (ParseUtils.Section LineNo
l ProjectConfigImport
"elif" ProjectConfigImport
p [Field]
xs':[Field]
xs) -> do
               ParseResult ProjectConfigSkeleton
subpcs <- [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [] [Field]
xs'
               (ParseResult (Maybe ProjectConfigSkeleton)
elseClauses, ParseResult ProjectConfigSkeleton
rest) <- [Field]
-> IO
     (ParseResult (Maybe ProjectConfigSkeleton),
      ParseResult ProjectConfigSkeleton)
parseElseClauses [Field]
xs
               let condNode :: ParseResult ProjectConfigSkeleton
condNode = (\Condition ConfVar
c ProjectConfigSkeleton
pcs Maybe ProjectConfigSkeleton
e -> ProjectConfig
-> [ProjectConfigImport]
-> [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
-> ProjectConfigSkeleton
forall v c a. a -> c -> [CondBranch v c a] -> CondTree v c a
CondNode ProjectConfig
forall a. Monoid a => a
mempty [ProjectConfigImport]
forall a. Monoid a => a
mempty [Condition ConfVar
-> ProjectConfigSkeleton
-> Maybe ProjectConfigSkeleton
-> CondBranch ConfVar [ProjectConfigImport] ProjectConfig
forall v c a.
Condition v
-> CondTree v c a -> Maybe (CondTree v c a) -> CondBranch v c a
CondBranch Condition ConfVar
c ProjectConfigSkeleton
pcs Maybe ProjectConfigSkeleton
e]) (Condition ConfVar
 -> ProjectConfigSkeleton
 -> Maybe ProjectConfigSkeleton
 -> ProjectConfigSkeleton)
-> ParseResult (Condition ConfVar)
-> ParseResult
     (ProjectConfigSkeleton
      -> Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                  LineNo
-> Either ParseError (Condition ConfVar)
-> ParseResult (Condition ConfVar)
forall a a. Show a => LineNo -> Either a a -> ParseResult a
adaptParseError LineNo
l (ByteString -> Either ParseError (Condition ConfVar)
parseConditionConfVarFromClause (ByteString -> Either ParseError (Condition ConfVar))
-> (ProjectConfigImport -> ByteString)
-> ProjectConfigImport
-> Either ParseError (Condition ConfVar)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProjectConfigImport -> ByteString
BS.pack (ProjectConfigImport -> Either ParseError (Condition ConfVar))
-> ProjectConfigImport -> Either ParseError (Condition ConfVar)
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport
"else("ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. Semigroup a => a -> a -> a
<> ProjectConfigImport
p ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. Semigroup a => a -> a -> a
<> ProjectConfigImport
")") ParseResult
  (ProjectConfigSkeleton
   -> Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
-> ParseResult
     (Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                  ParseResult ProjectConfigSkeleton
subpcs ParseResult (Maybe ProjectConfigSkeleton -> ProjectConfigSkeleton)
-> ParseResult (Maybe ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                  ParseResult (Maybe ProjectConfigSkeleton)
elseClauses
               (ParseResult (Maybe ProjectConfigSkeleton),
 ParseResult ProjectConfigSkeleton)
-> IO
     (ParseResult (Maybe ProjectConfigSkeleton),
      ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ProjectConfigSkeleton -> Maybe ProjectConfigSkeleton
forall a. a -> Maybe a
Just (ProjectConfigSkeleton -> Maybe ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
-> ParseResult (Maybe ProjectConfigSkeleton)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParseResult ProjectConfigSkeleton
condNode, ParseResult ProjectConfigSkeleton
rest)
         [Field]
_ -> (\ParseResult ProjectConfigSkeleton
r -> (Maybe ProjectConfigSkeleton
-> ParseResult (Maybe ProjectConfigSkeleton)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ProjectConfigSkeleton
forall a. Maybe a
Nothing,ParseResult ProjectConfigSkeleton
r)) (ParseResult ProjectConfigSkeleton
 -> (ParseResult (Maybe ProjectConfigSkeleton),
     ParseResult ProjectConfigSkeleton))
-> IO (ParseResult ProjectConfigSkeleton)
-> IO
     (ParseResult (Maybe ProjectConfigSkeleton),
      ParseResult ProjectConfigSkeleton)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Field] -> [Field] -> IO (ParseResult ProjectConfigSkeleton)
go [] [Field]
x

    fieldsToConfig :: [Field] -> ParseResult ProjectConfig
fieldsToConfig [Field]
xs = (LegacyProjectConfig -> ProjectConfig)
-> ParseResult LegacyProjectConfig -> ParseResult ProjectConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ProjectConfig -> ProjectConfig
addProvenance (ProjectConfig -> ProjectConfig)
-> (LegacyProjectConfig -> ProjectConfig)
-> LegacyProjectConfig
-> ProjectConfig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LegacyProjectConfig -> ProjectConfig
convertLegacyProjectConfig) (ParseResult LegacyProjectConfig -> ParseResult ProjectConfig)
-> ParseResult LegacyProjectConfig -> ParseResult ProjectConfig
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport -> [Field] -> ParseResult LegacyProjectConfig
parseLegacyProjectConfigFields ProjectConfigImport
source [Field]
xs
    addProvenance :: ProjectConfig -> ProjectConfig
addProvenance ProjectConfig
x = ProjectConfig
x {projectConfigProvenance :: Set ProjectConfigProvenance
projectConfigProvenance = ProjectConfigProvenance -> Set ProjectConfigProvenance
forall a. a -> Set a
Set.singleton (ProjectConfigImport -> ProjectConfigProvenance
Explicit ProjectConfigImport
source)}

    adaptParseError :: LineNo -> Either a a -> ParseResult a
adaptParseError LineNo
_ (Right a
x) = a -> ParseResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
    adaptParseError LineNo
l (Left a
e) = PError -> ParseResult a
forall a. PError -> ParseResult a
parseFail (PError -> ParseResult a) -> PError -> ParseResult a
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport -> Maybe LineNo -> PError
ParseUtils.FromString (a -> ProjectConfigImport
forall a. Show a => a -> ProjectConfigImport
show a
e) (LineNo -> Maybe LineNo
forall a. a -> Maybe a
Just LineNo
l)

    liftPR :: (a -> IO (ParseResult b)) -> ParseResult a -> IO (ParseResult b)
    liftPR :: (a -> IO (ParseResult b)) -> ParseResult a -> IO (ParseResult b)
liftPR a -> IO (ParseResult b)
f (ParseOk [PWarning]
ws a
x) = ParseResult b -> ParseResult b
forall a. ParseResult a -> ParseResult a
addWarnings (ParseResult b -> ParseResult b)
-> IO (ParseResult b) -> IO (ParseResult b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> IO (ParseResult b)
f a
x
       where addWarnings :: ParseResult a -> ParseResult a
addWarnings (ParseOk [PWarning]
ws' a
x') = [PWarning] -> a -> ParseResult a
forall a. [PWarning] -> a -> ParseResult a
ParseOk ([PWarning]
ws' [PWarning] -> [PWarning] -> [PWarning]
forall a. [a] -> [a] -> [a]
++ [PWarning]
ws) a
x'
             addWarnings ParseResult a
x' = ParseResult a
x'
    liftPR a -> IO (ParseResult b)
_ (ParseFailed PError
e) = ParseResult b -> IO (ParseResult b)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParseResult b -> IO (ParseResult b))
-> ParseResult b -> IO (ParseResult b)
forall a b. (a -> b) -> a -> b
$ PError -> ParseResult b
forall a. PError -> ParseResult a
ParseFailed PError
e

    fetchImportConfig :: ProjectConfigImport -> IO BS.ByteString
    fetchImportConfig :: ProjectConfigImport -> IO ByteString
fetchImportConfig ProjectConfigImport
pci = case ProjectConfigImport -> Maybe URI
parseURI ProjectConfigImport
pci of
         Just URI
uri -> do
            let fp :: ProjectConfigImport
fp = ProjectConfigImport
cacheDir ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
</> (Char -> Char) -> ProjectConfigImport -> ProjectConfigImport
forall a b. (a -> b) -> [a] -> [b]
map (\Char
x -> if Char -> Bool
isPathSeparator Char
x then Char
'_' else Char
x) (ProjectConfigImport -> ProjectConfigImport
makeValid (ProjectConfigImport -> ProjectConfigImport)
-> ProjectConfigImport -> ProjectConfigImport
forall a b. (a -> b) -> a -> b
$ URI -> ProjectConfigImport
forall a. Show a => a -> ProjectConfigImport
show URI
uri)
            Bool -> ProjectConfigImport -> IO ()
createDirectoryIfMissing Bool
True ProjectConfigImport
cacheDir
            DownloadResult
_ <- HttpTransport
-> Verbosity -> URI -> ProjectConfigImport -> IO DownloadResult
downloadURI HttpTransport
httpTransport Verbosity
verbosity URI
uri ProjectConfigImport
fp
            ProjectConfigImport -> IO ByteString
BS.readFile ProjectConfigImport
fp
         Maybe URI
Nothing -> ProjectConfigImport -> IO ByteString
BS.readFile ProjectConfigImport
pci

    modifiesCompiler :: ProjectConfig -> Bool
    modifiesCompiler :: ProjectConfig -> Bool
modifiesCompiler ProjectConfig
pc = (ProjectConfigShared -> Flag CompilerFlavor) -> Bool
forall a. Eq a => (ProjectConfigShared -> Flag a) -> Bool
isSet ProjectConfigShared -> Flag CompilerFlavor
projectConfigHcFlavor Bool -> Bool -> Bool
|| (ProjectConfigShared -> Flag ProjectConfigImport) -> Bool
forall a. Eq a => (ProjectConfigShared -> Flag a) -> Bool
isSet ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcPath Bool -> Bool -> Bool
|| (ProjectConfigShared -> Flag ProjectConfigImport) -> Bool
forall a. Eq a => (ProjectConfigShared -> Flag a) -> Bool
isSet ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcPkg
      where
         isSet :: (ProjectConfigShared -> Flag a) -> Bool
isSet ProjectConfigShared -> Flag a
f = ProjectConfigShared -> Flag a
f (ProjectConfig -> ProjectConfigShared
projectConfigShared ProjectConfig
pc) Flag a -> Flag a -> Bool
forall a. Eq a => a -> a -> Bool
/= Flag a
forall a. Flag a
NoFlag

    sanityWalkPCS :: Bool -> ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton
    sanityWalkPCS :: Bool -> ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton
sanityWalkPCS Bool
underConditional t :: ProjectConfigSkeleton
t@(CondNode ProjectConfig
d [ProjectConfigImport]
_c [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
comps)
           | Bool
underConditional Bool -> Bool -> Bool
&& ProjectConfig -> Bool
modifiesCompiler ProjectConfig
d = PError -> ParseResult ProjectConfigSkeleton
forall a. PError -> ParseResult a
parseFail (PError -> ParseResult ProjectConfigSkeleton)
-> PError -> ParseResult ProjectConfigSkeleton
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport -> Maybe LineNo -> PError
ParseUtils.FromString ProjectConfigImport
"Cannot set compiler in a conditional clause of a cabal project file" Maybe LineNo
forall a. Maybe a
Nothing
           | Bool
otherwise = (CondBranch ConfVar [ProjectConfigImport] ProjectConfig
 -> ParseResult ())
-> [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
-> ParseResult ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ CondBranch ConfVar [ProjectConfigImport] ProjectConfig
-> ParseResult ()
sanityWalkBranch [CondBranch ConfVar [ProjectConfigImport] ProjectConfig]
comps ParseResult ()
-> ParseResult ProjectConfigSkeleton
-> ParseResult ProjectConfigSkeleton
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton
forall (f :: * -> *) a. Applicative f => a -> f a
pure ProjectConfigSkeleton
t

    sanityWalkBranch:: CondBranch ConfVar [ProjectConfigImport] ProjectConfig -> ParseResult ()
    sanityWalkBranch :: CondBranch ConfVar [ProjectConfigImport] ProjectConfig
-> ParseResult ()
sanityWalkBranch (CondBranch Condition ConfVar
_c ProjectConfigSkeleton
t Maybe ProjectConfigSkeleton
f) = (ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton)
-> Maybe ProjectConfigSkeleton
-> ParseResult (Maybe ProjectConfigSkeleton)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Bool -> ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton
sanityWalkPCS Bool
True) Maybe ProjectConfigSkeleton
f ParseResult (Maybe ProjectConfigSkeleton)
-> ParseResult ProjectConfigSkeleton
-> ParseResult ProjectConfigSkeleton
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> ProjectConfigSkeleton -> ParseResult ProjectConfigSkeleton
sanityWalkPCS Bool
True ProjectConfigSkeleton
t ParseResult ProjectConfigSkeleton
-> ParseResult () -> ParseResult ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParseResult ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

------------------------------------------------------------------
-- Representing the project config file in terms of legacy types
--

-- | We already have parsers\/pretty-printers for almost all the fields in the
-- project config file, but they're in terms of the types used for the command
-- line flags for Setup.hs or cabal commands. We don't want to redefine them
-- all, at least not yet so for the moment we use the parsers at the old types
-- and use conversion functions.
--
-- Ultimately if\/when this project-based approach becomes the default then we
-- can redefine the parsers directly for the new types.
--
data LegacyProjectConfig = LegacyProjectConfig {
       LegacyProjectConfig -> [ProjectConfigImport]
legacyPackages          :: [String],
       LegacyProjectConfig -> [ProjectConfigImport]
legacyPackagesOptional  :: [String],
       LegacyProjectConfig -> [SourceRepoList]
legacyPackagesRepo      :: [SourceRepoList],
       LegacyProjectConfig -> [PackageVersionConstraint]
legacyPackagesNamed     :: [PackageVersionConstraint],

       LegacyProjectConfig -> LegacySharedConfig
legacySharedConfig      :: LegacySharedConfig,
       LegacyProjectConfig -> LegacyPackageConfig
legacyAllConfig         :: LegacyPackageConfig,
       LegacyProjectConfig -> LegacyPackageConfig
legacyLocalConfig       :: LegacyPackageConfig,
       LegacyProjectConfig -> MapMappend PackageName LegacyPackageConfig
legacySpecificConfig    :: MapMappend PackageName LegacyPackageConfig
     } deriving (LineNo
-> LegacyProjectConfig
-> ProjectConfigImport
-> ProjectConfigImport
[LegacyProjectConfig] -> ProjectConfigImport -> ProjectConfigImport
LegacyProjectConfig -> ProjectConfigImport
(LineNo
 -> LegacyProjectConfig
 -> ProjectConfigImport
 -> ProjectConfigImport)
-> (LegacyProjectConfig -> ProjectConfigImport)
-> ([LegacyProjectConfig]
    -> ProjectConfigImport -> ProjectConfigImport)
-> Show LegacyProjectConfig
forall a.
(LineNo -> a -> ProjectConfigImport -> ProjectConfigImport)
-> (a -> ProjectConfigImport)
-> ([a] -> ProjectConfigImport -> ProjectConfigImport)
-> Show a
showList :: [LegacyProjectConfig] -> ProjectConfigImport -> ProjectConfigImport
$cshowList :: [LegacyProjectConfig] -> ProjectConfigImport -> ProjectConfigImport
show :: LegacyProjectConfig -> ProjectConfigImport
$cshow :: LegacyProjectConfig -> ProjectConfigImport
showsPrec :: LineNo
-> LegacyProjectConfig
-> ProjectConfigImport
-> ProjectConfigImport
$cshowsPrec :: LineNo
-> LegacyProjectConfig
-> ProjectConfigImport
-> ProjectConfigImport
Show, (forall x. LegacyProjectConfig -> Rep LegacyProjectConfig x)
-> (forall x. Rep LegacyProjectConfig x -> LegacyProjectConfig)
-> Generic LegacyProjectConfig
forall x. Rep LegacyProjectConfig x -> LegacyProjectConfig
forall x. LegacyProjectConfig -> Rep LegacyProjectConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep LegacyProjectConfig x -> LegacyProjectConfig
$cfrom :: forall x. LegacyProjectConfig -> Rep LegacyProjectConfig x
Generic)

instance Monoid LegacyProjectConfig where
  mempty :: LegacyProjectConfig
mempty  = LegacyProjectConfig
forall a. (Generic a, GMonoid (Rep a)) => a
gmempty
  mappend :: LegacyProjectConfig -> LegacyProjectConfig -> LegacyProjectConfig
mappend = LegacyProjectConfig -> LegacyProjectConfig -> LegacyProjectConfig
forall a. Semigroup a => a -> a -> a
(<>)

instance Semigroup LegacyProjectConfig where
  <> :: LegacyProjectConfig -> LegacyProjectConfig -> LegacyProjectConfig
(<>) = LegacyProjectConfig -> LegacyProjectConfig -> LegacyProjectConfig
forall a. (Generic a, GSemigroup (Rep a)) => a -> a -> a
gmappend

data LegacyPackageConfig = LegacyPackageConfig {
       LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags    :: ConfigFlags,
       LegacyPackageConfig -> InstallFlags
legacyInstallPkgFlags   :: InstallFlags,
       LegacyPackageConfig -> HaddockFlags
legacyHaddockFlags      :: HaddockFlags,
       LegacyPackageConfig -> TestFlags
legacyTestFlags         :: TestFlags,
       LegacyPackageConfig -> BenchmarkFlags
legacyBenchmarkFlags    :: BenchmarkFlags
     } deriving (LineNo
-> LegacyPackageConfig
-> ProjectConfigImport
-> ProjectConfigImport
[LegacyPackageConfig] -> ProjectConfigImport -> ProjectConfigImport
LegacyPackageConfig -> ProjectConfigImport
(LineNo
 -> LegacyPackageConfig
 -> ProjectConfigImport
 -> ProjectConfigImport)
-> (LegacyPackageConfig -> ProjectConfigImport)
-> ([LegacyPackageConfig]
    -> ProjectConfigImport -> ProjectConfigImport)
-> Show LegacyPackageConfig
forall a.
(LineNo -> a -> ProjectConfigImport -> ProjectConfigImport)
-> (a -> ProjectConfigImport)
-> ([a] -> ProjectConfigImport -> ProjectConfigImport)
-> Show a
showList :: [LegacyPackageConfig] -> ProjectConfigImport -> ProjectConfigImport
$cshowList :: [LegacyPackageConfig] -> ProjectConfigImport -> ProjectConfigImport
show :: LegacyPackageConfig -> ProjectConfigImport
$cshow :: LegacyPackageConfig -> ProjectConfigImport
showsPrec :: LineNo
-> LegacyPackageConfig
-> ProjectConfigImport
-> ProjectConfigImport
$cshowsPrec :: LineNo
-> LegacyPackageConfig
-> ProjectConfigImport
-> ProjectConfigImport
Show, (forall x. LegacyPackageConfig -> Rep LegacyPackageConfig x)
-> (forall x. Rep LegacyPackageConfig x -> LegacyPackageConfig)
-> Generic LegacyPackageConfig
forall x. Rep LegacyPackageConfig x -> LegacyPackageConfig
forall x. LegacyPackageConfig -> Rep LegacyPackageConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep LegacyPackageConfig x -> LegacyPackageConfig
$cfrom :: forall x. LegacyPackageConfig -> Rep LegacyPackageConfig x
Generic)

instance Monoid LegacyPackageConfig where
  mempty :: LegacyPackageConfig
mempty  = LegacyPackageConfig
forall a. (Generic a, GMonoid (Rep a)) => a
gmempty
  mappend :: LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
mappend = LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
forall a. Semigroup a => a -> a -> a
(<>)

instance Semigroup LegacyPackageConfig where
  <> :: LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
(<>) = LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
forall a. (Generic a, GSemigroup (Rep a)) => a -> a -> a
gmappend

data LegacySharedConfig = LegacySharedConfig {
       LegacySharedConfig -> GlobalFlags
legacyGlobalFlags       :: GlobalFlags,
       LegacySharedConfig -> ConfigFlags
legacyConfigureShFlags  :: ConfigFlags,
       LegacySharedConfig -> ConfigExFlags
legacyConfigureExFlags  :: ConfigExFlags,
       LegacySharedConfig -> InstallFlags
legacyInstallFlags      :: InstallFlags,
       LegacySharedConfig -> ClientInstallFlags
legacyClientInstallFlags:: ClientInstallFlags,
       LegacySharedConfig -> ProjectFlags
legacyProjectFlags      :: ProjectFlags
     } deriving (LineNo
-> LegacySharedConfig -> ProjectConfigImport -> ProjectConfigImport
[LegacySharedConfig] -> ProjectConfigImport -> ProjectConfigImport
LegacySharedConfig -> ProjectConfigImport
(LineNo
 -> LegacySharedConfig
 -> ProjectConfigImport
 -> ProjectConfigImport)
-> (LegacySharedConfig -> ProjectConfigImport)
-> ([LegacySharedConfig]
    -> ProjectConfigImport -> ProjectConfigImport)
-> Show LegacySharedConfig
forall a.
(LineNo -> a -> ProjectConfigImport -> ProjectConfigImport)
-> (a -> ProjectConfigImport)
-> ([a] -> ProjectConfigImport -> ProjectConfigImport)
-> Show a
showList :: [LegacySharedConfig] -> ProjectConfigImport -> ProjectConfigImport
$cshowList :: [LegacySharedConfig] -> ProjectConfigImport -> ProjectConfigImport
show :: LegacySharedConfig -> ProjectConfigImport
$cshow :: LegacySharedConfig -> ProjectConfigImport
showsPrec :: LineNo
-> LegacySharedConfig -> ProjectConfigImport -> ProjectConfigImport
$cshowsPrec :: LineNo
-> LegacySharedConfig -> ProjectConfigImport -> ProjectConfigImport
Show, (forall x. LegacySharedConfig -> Rep LegacySharedConfig x)
-> (forall x. Rep LegacySharedConfig x -> LegacySharedConfig)
-> Generic LegacySharedConfig
forall x. Rep LegacySharedConfig x -> LegacySharedConfig
forall x. LegacySharedConfig -> Rep LegacySharedConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep LegacySharedConfig x -> LegacySharedConfig
$cfrom :: forall x. LegacySharedConfig -> Rep LegacySharedConfig x
Generic)

instance Monoid LegacySharedConfig where
  mempty :: LegacySharedConfig
mempty  = LegacySharedConfig
forall a. (Generic a, GMonoid (Rep a)) => a
gmempty
  mappend :: LegacySharedConfig -> LegacySharedConfig -> LegacySharedConfig
mappend = LegacySharedConfig -> LegacySharedConfig -> LegacySharedConfig
forall a. Semigroup a => a -> a -> a
(<>)

instance Semigroup LegacySharedConfig where
  <> :: LegacySharedConfig -> LegacySharedConfig -> LegacySharedConfig
(<>) = LegacySharedConfig -> LegacySharedConfig -> LegacySharedConfig
forall a. (Generic a, GSemigroup (Rep a)) => a -> a -> a
gmappend


------------------------------------------------------------------
-- Converting from and to the legacy types
--

-- | Convert configuration from the @cabal configure@ or @cabal build@ command
-- line into a 'ProjectConfig' value that can combined with configuration from
-- other sources.
--
-- At the moment this uses the legacy command line flag types. See
-- 'LegacyProjectConfig' for an explanation.
--
commandLineFlagsToProjectConfig :: GlobalFlags
                                -> NixStyleFlags a
                                -> ClientInstallFlags
                                -> ProjectConfig
commandLineFlagsToProjectConfig :: GlobalFlags
-> NixStyleFlags a -> ClientInstallFlags -> ProjectConfig
commandLineFlagsToProjectConfig GlobalFlags
globalFlags NixStyleFlags {a
ConfigFlags
HaddockFlags
TestFlags
BenchmarkFlags
ProjectFlags
InstallFlags
ConfigExFlags
extraFlags :: forall a. NixStyleFlags a -> a
projectFlags :: forall a. NixStyleFlags a -> ProjectFlags
benchmarkFlags :: forall a. NixStyleFlags a -> BenchmarkFlags
testFlags :: forall a. NixStyleFlags a -> TestFlags
haddockFlags :: forall a. NixStyleFlags a -> HaddockFlags
installFlags :: forall a. NixStyleFlags a -> InstallFlags
configExFlags :: forall a. NixStyleFlags a -> ConfigExFlags
configFlags :: forall a. NixStyleFlags a -> ConfigFlags
extraFlags :: a
projectFlags :: ProjectFlags
benchmarkFlags :: BenchmarkFlags
testFlags :: TestFlags
haddockFlags :: HaddockFlags
installFlags :: InstallFlags
configExFlags :: ConfigExFlags
configFlags :: ConfigFlags
..} ClientInstallFlags
clientInstallFlags =
    ProjectConfig
forall a. Monoid a => a
mempty {
      projectConfigBuildOnly :: ProjectConfigBuildOnly
projectConfigBuildOnly     = GlobalFlags
-> ConfigFlags
-> InstallFlags
-> ClientInstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> ProjectConfigBuildOnly
convertLegacyBuildOnlyFlags
                                     GlobalFlags
globalFlags ConfigFlags
configFlags
                                     InstallFlags
installFlags ClientInstallFlags
clientInstallFlags
                                     HaddockFlags
haddockFlags TestFlags
testFlags BenchmarkFlags
benchmarkFlags,
      projectConfigShared :: ProjectConfigShared
projectConfigShared        = GlobalFlags
-> ConfigFlags
-> ConfigExFlags
-> InstallFlags
-> ProjectFlags
-> ProjectConfigShared
convertLegacyAllPackageFlags
                                     GlobalFlags
globalFlags ConfigFlags
configFlags
                                     ConfigExFlags
configExFlags InstallFlags
installFlags ProjectFlags
projectFlags,
      projectConfigLocalPackages :: PackageConfig
projectConfigLocalPackages = PackageConfig
localConfig,
      projectConfigAllPackages :: PackageConfig
projectConfigAllPackages   = PackageConfig
allConfig
    }
  where (PackageConfig
localConfig, PackageConfig
allConfig) = PackageConfig -> (PackageConfig, PackageConfig)
splitConfig
                                 (ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> PackageConfig
convertLegacyPerPackageFlags
                                    ConfigFlags
configFlags InstallFlags
installFlags
                                    HaddockFlags
haddockFlags TestFlags
testFlags BenchmarkFlags
benchmarkFlags)
        -- split the package config (from command line arguments) into
        -- those applied to all packages and those to local only.
        --
        -- for now we will just copy over the ProgramPaths/Extra into
        -- the AllPackages.  The LocalPackages do not inherit them from
        -- AllPackages, and as such need to retain them.
        --
        -- The general decision rule for what to put into allConfig
        -- into localConfig is the following:
        --
        -- - anything that is host/toolchain/env specific should be applied
        --   to all packages, as packagesets have to be host/toolchain/env
        --   consistent.
        -- - anything else should be in the local config and could potentially
        --   be lifted into all-packages vial the `package *` cabal.project
        --   section.
        --
        splitConfig :: PackageConfig -> (PackageConfig, PackageConfig)
        splitConfig :: PackageConfig -> (PackageConfig, PackageConfig)
splitConfig PackageConfig
pc = (PackageConfig
pc
                         , PackageConfig
forall a. Monoid a => a
mempty { packageConfigProgramPaths :: MapLast ProjectConfigImport ProjectConfigImport
packageConfigProgramPaths = PackageConfig -> MapLast ProjectConfigImport ProjectConfigImport
packageConfigProgramPaths PackageConfig
pc
                                  , packageConfigProgramPathExtra :: NubList ProjectConfigImport
packageConfigProgramPathExtra = PackageConfig -> NubList ProjectConfigImport
packageConfigProgramPathExtra PackageConfig
pc
                                  , packageConfigDocumentation :: Flag Bool
packageConfigDocumentation = PackageConfig -> Flag Bool
packageConfigDocumentation PackageConfig
pc })

-- | Convert from the types currently used for the user-wide @~/.cabal/config@
-- file into the 'ProjectConfig' type.
--
-- Only a subset of the 'ProjectConfig' can be represented in the user-wide
-- config. In particular it does not include packages that are in the project,
-- and it also doesn't support package-specific configuration (only
-- configuration that applies to all packages).
--
convertLegacyGlobalConfig :: SavedConfig -> ProjectConfig
convertLegacyGlobalConfig :: SavedConfig -> ProjectConfig
convertLegacyGlobalConfig
    SavedConfig {
      savedGlobalFlags :: SavedConfig -> GlobalFlags
savedGlobalFlags       = GlobalFlags
globalFlags,
      savedInstallFlags :: SavedConfig -> InstallFlags
savedInstallFlags      = InstallFlags
installFlags,
      savedClientInstallFlags :: SavedConfig -> ClientInstallFlags
savedClientInstallFlags= ClientInstallFlags
clientInstallFlags,
      savedConfigureFlags :: SavedConfig -> ConfigFlags
savedConfigureFlags    = ConfigFlags
configFlags,
      savedConfigureExFlags :: SavedConfig -> ConfigExFlags
savedConfigureExFlags  = ConfigExFlags
configExFlags,
      savedUserInstallDirs :: SavedConfig -> InstallDirs (Flag PathTemplate)
savedUserInstallDirs   = InstallDirs (Flag PathTemplate)
_,
      savedGlobalInstallDirs :: SavedConfig -> InstallDirs (Flag PathTemplate)
savedGlobalInstallDirs = InstallDirs (Flag PathTemplate)
_,
      savedUploadFlags :: SavedConfig -> UploadFlags
savedUploadFlags       = UploadFlags
_,
      savedReportFlags :: SavedConfig -> ReportFlags
savedReportFlags       = ReportFlags
_,
      savedHaddockFlags :: SavedConfig -> HaddockFlags
savedHaddockFlags      = HaddockFlags
haddockFlags,
      savedTestFlags :: SavedConfig -> TestFlags
savedTestFlags         = TestFlags
testFlags,
      savedBenchmarkFlags :: SavedConfig -> BenchmarkFlags
savedBenchmarkFlags    = BenchmarkFlags
benchmarkFlags,
      savedProjectFlags :: SavedConfig -> ProjectFlags
savedProjectFlags      = ProjectFlags
projectFlags
    } =
    ProjectConfig
forall a. Monoid a => a
mempty {
      projectConfigBuildOnly :: ProjectConfigBuildOnly
projectConfigBuildOnly   = ProjectConfigBuildOnly
configBuildOnly,
      projectConfigShared :: ProjectConfigShared
projectConfigShared      = ProjectConfigShared
configShared,
      projectConfigAllPackages :: PackageConfig
projectConfigAllPackages = PackageConfig
configAllPackages
    }
  where
    --TODO: [code cleanup] eliminate use of default*Flags here and specify the
    -- defaults in the various resolve functions in terms of the new types.
    configExFlags' :: ConfigExFlags
configExFlags'      = ConfigExFlags
defaultConfigExFlags      ConfigExFlags -> ConfigExFlags -> ConfigExFlags
forall a. Semigroup a => a -> a -> a
<> ConfigExFlags
configExFlags
    installFlags' :: InstallFlags
installFlags'       = InstallFlags
defaultInstallFlags       InstallFlags -> InstallFlags -> InstallFlags
forall a. Semigroup a => a -> a -> a
<> InstallFlags
installFlags
    clientInstallFlags' :: ClientInstallFlags
clientInstallFlags' = ClientInstallFlags
defaultClientInstallFlags ClientInstallFlags -> ClientInstallFlags -> ClientInstallFlags
forall a. Semigroup a => a -> a -> a
<> ClientInstallFlags
clientInstallFlags
    haddockFlags' :: HaddockFlags
haddockFlags'       = HaddockFlags
defaultHaddockFlags       HaddockFlags -> HaddockFlags -> HaddockFlags
forall a. Semigroup a => a -> a -> a
<> HaddockFlags
haddockFlags
    testFlags' :: TestFlags
testFlags'          = TestFlags
defaultTestFlags          TestFlags -> TestFlags -> TestFlags
forall a. Semigroup a => a -> a -> a
<> TestFlags
testFlags
    benchmarkFlags' :: BenchmarkFlags
benchmarkFlags'     = BenchmarkFlags
defaultBenchmarkFlags     BenchmarkFlags -> BenchmarkFlags -> BenchmarkFlags
forall a. Semigroup a => a -> a -> a
<> BenchmarkFlags
benchmarkFlags
    projectFlags' :: ProjectFlags
projectFlags'       = ProjectFlags
defaultProjectFlags       ProjectFlags -> ProjectFlags -> ProjectFlags
forall a. Semigroup a => a -> a -> a
<> ProjectFlags
projectFlags

    configAllPackages :: PackageConfig
configAllPackages   = ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> PackageConfig
convertLegacyPerPackageFlags
                            ConfigFlags
configFlags InstallFlags
installFlags'
                            HaddockFlags
haddockFlags' TestFlags
testFlags' BenchmarkFlags
benchmarkFlags'
    configShared :: ProjectConfigShared
configShared        = GlobalFlags
-> ConfigFlags
-> ConfigExFlags
-> InstallFlags
-> ProjectFlags
-> ProjectConfigShared
convertLegacyAllPackageFlags
                            GlobalFlags
globalFlags ConfigFlags
configFlags
                            ConfigExFlags
configExFlags' InstallFlags
installFlags' ProjectFlags
projectFlags'
    configBuildOnly :: ProjectConfigBuildOnly
configBuildOnly     = GlobalFlags
-> ConfigFlags
-> InstallFlags
-> ClientInstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> ProjectConfigBuildOnly
convertLegacyBuildOnlyFlags
                            GlobalFlags
globalFlags ConfigFlags
configFlags
                            InstallFlags
installFlags' ClientInstallFlags
clientInstallFlags'
                            HaddockFlags
haddockFlags' TestFlags
testFlags' BenchmarkFlags
benchmarkFlags'


-- | Convert the project config from the legacy types to the 'ProjectConfig'
-- and associated types. See 'LegacyProjectConfig' for an explanation of the
-- approach.
--
convertLegacyProjectConfig :: LegacyProjectConfig -> ProjectConfig
convertLegacyProjectConfig :: LegacyProjectConfig -> ProjectConfig
convertLegacyProjectConfig
  LegacyProjectConfig {
    [ProjectConfigImport]
legacyPackages :: [ProjectConfigImport]
legacyPackages :: LegacyProjectConfig -> [ProjectConfigImport]
legacyPackages,
    [ProjectConfigImport]
legacyPackagesOptional :: [ProjectConfigImport]
legacyPackagesOptional :: LegacyProjectConfig -> [ProjectConfigImport]
legacyPackagesOptional,
    [SourceRepoList]
legacyPackagesRepo :: [SourceRepoList]
legacyPackagesRepo :: LegacyProjectConfig -> [SourceRepoList]
legacyPackagesRepo,
    [PackageVersionConstraint]
legacyPackagesNamed :: [PackageVersionConstraint]
legacyPackagesNamed :: LegacyProjectConfig -> [PackageVersionConstraint]
legacyPackagesNamed,
    legacySharedConfig :: LegacyProjectConfig -> LegacySharedConfig
legacySharedConfig = LegacySharedConfig GlobalFlags
globalFlags ConfigFlags
configShFlags
                                            ConfigExFlags
configExFlags InstallFlags
installSharedFlags
                                            ClientInstallFlags
clientInstallFlags ProjectFlags
projectFlags,
    LegacyPackageConfig
legacyAllConfig :: LegacyPackageConfig
legacyAllConfig :: LegacyProjectConfig -> LegacyPackageConfig
legacyAllConfig,
    legacyLocalConfig :: LegacyProjectConfig -> LegacyPackageConfig
legacyLocalConfig  = LegacyPackageConfig ConfigFlags
configFlags InstallFlags
installPerPkgFlags
                                             HaddockFlags
haddockFlags TestFlags
testFlags BenchmarkFlags
benchmarkFlags,
    MapMappend PackageName LegacyPackageConfig
legacySpecificConfig :: MapMappend PackageName LegacyPackageConfig
legacySpecificConfig :: LegacyProjectConfig -> MapMappend PackageName LegacyPackageConfig
legacySpecificConfig
  } =

    ProjectConfig :: [ProjectConfigImport]
-> [ProjectConfigImport]
-> [SourceRepoList]
-> [PackageVersionConstraint]
-> ProjectConfigBuildOnly
-> ProjectConfigShared
-> Set ProjectConfigProvenance
-> PackageConfig
-> PackageConfig
-> MapMappend PackageName PackageConfig
-> ProjectConfig
ProjectConfig {
      projectPackages :: [ProjectConfigImport]
projectPackages              = [ProjectConfigImport]
legacyPackages,
      projectPackagesOptional :: [ProjectConfigImport]
projectPackagesOptional      = [ProjectConfigImport]
legacyPackagesOptional,
      projectPackagesRepo :: [SourceRepoList]
projectPackagesRepo          = [SourceRepoList]
legacyPackagesRepo,
      projectPackagesNamed :: [PackageVersionConstraint]
projectPackagesNamed         = [PackageVersionConstraint]
legacyPackagesNamed,

      projectConfigBuildOnly :: ProjectConfigBuildOnly
projectConfigBuildOnly       = ProjectConfigBuildOnly
configBuildOnly,
      projectConfigShared :: ProjectConfigShared
projectConfigShared          = ProjectConfigShared
configPackagesShared,
      projectConfigProvenance :: Set ProjectConfigProvenance
projectConfigProvenance      = Set ProjectConfigProvenance
forall a. Monoid a => a
mempty,
      projectConfigAllPackages :: PackageConfig
projectConfigAllPackages     = PackageConfig
configAllPackages,
      projectConfigLocalPackages :: PackageConfig
projectConfigLocalPackages   = PackageConfig
configLocalPackages,
      projectConfigSpecificPackage :: MapMappend PackageName PackageConfig
projectConfigSpecificPackage = (LegacyPackageConfig -> PackageConfig)
-> MapMappend PackageName LegacyPackageConfig
-> MapMappend PackageName PackageConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LegacyPackageConfig -> PackageConfig
perPackage MapMappend PackageName LegacyPackageConfig
legacySpecificConfig
    }
  where
    configAllPackages :: PackageConfig
configAllPackages   = ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> PackageConfig
convertLegacyPerPackageFlags ConfigFlags
g InstallFlags
i HaddockFlags
h TestFlags
t BenchmarkFlags
b
                            where LegacyPackageConfig ConfigFlags
g InstallFlags
i HaddockFlags
h TestFlags
t BenchmarkFlags
b = LegacyPackageConfig
legacyAllConfig
    configLocalPackages :: PackageConfig
configLocalPackages = ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> PackageConfig
convertLegacyPerPackageFlags
                            ConfigFlags
configFlags InstallFlags
installPerPkgFlags HaddockFlags
haddockFlags
                            TestFlags
testFlags BenchmarkFlags
benchmarkFlags
    configPackagesShared :: ProjectConfigShared
configPackagesShared= GlobalFlags
-> ConfigFlags
-> ConfigExFlags
-> InstallFlags
-> ProjectFlags
-> ProjectConfigShared
convertLegacyAllPackageFlags
                            GlobalFlags
globalFlags (ConfigFlags
configFlags ConfigFlags -> ConfigFlags -> ConfigFlags
forall a. Semigroup a => a -> a -> a
<> ConfigFlags
configShFlags)
                            ConfigExFlags
configExFlags InstallFlags
installSharedFlags ProjectFlags
projectFlags
    configBuildOnly :: ProjectConfigBuildOnly
configBuildOnly     = GlobalFlags
-> ConfigFlags
-> InstallFlags
-> ClientInstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> ProjectConfigBuildOnly
convertLegacyBuildOnlyFlags
                            GlobalFlags
globalFlags ConfigFlags
configShFlags
                            InstallFlags
installSharedFlags ClientInstallFlags
clientInstallFlags
                            HaddockFlags
haddockFlags TestFlags
testFlags BenchmarkFlags
benchmarkFlags

    perPackage :: LegacyPackageConfig -> PackageConfig
perPackage (LegacyPackageConfig ConfigFlags
perPkgConfigFlags InstallFlags
perPkgInstallFlags
                                    HaddockFlags
perPkgHaddockFlags TestFlags
perPkgTestFlags
                                    BenchmarkFlags
perPkgBenchmarkFlags) =
      ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> PackageConfig
convertLegacyPerPackageFlags
        ConfigFlags
perPkgConfigFlags InstallFlags
perPkgInstallFlags HaddockFlags
perPkgHaddockFlags
                          TestFlags
perPkgTestFlags BenchmarkFlags
perPkgBenchmarkFlags


-- | Helper used by other conversion functions that returns the
-- 'ProjectConfigShared' subset of the 'ProjectConfig'.
--
convertLegacyAllPackageFlags
    :: GlobalFlags
    -> ConfigFlags
    -> ConfigExFlags
    -> InstallFlags
    -> ProjectFlags
    -> ProjectConfigShared
convertLegacyAllPackageFlags :: GlobalFlags
-> ConfigFlags
-> ConfigExFlags
-> InstallFlags
-> ProjectFlags
-> ProjectConfigShared
convertLegacyAllPackageFlags GlobalFlags
globalFlags ConfigFlags
configFlags ConfigExFlags
configExFlags InstallFlags
installFlags ProjectFlags
projectFlags =
    ProjectConfigShared :: Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag CompilerFlavor
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag PathTemplate
-> [Maybe PackageDB]
-> NubList RemoteRepo
-> NubList LocalRepo
-> Flag ActiveRepos
-> Flag TotalIndexState
-> Flag ProjectConfigImport
-> [(UserConstraint, ConstraintSource)]
-> [PackageVersionConstraint]
-> Flag Version
-> Flag PreSolver
-> Maybe AllowOlder
-> Maybe AllowNewer
-> Flag WriteGhcEnvironmentFilesPolicy
-> Flag LineNo
-> Flag ReorderGoals
-> Flag CountConflicts
-> Flag FineGrainedConflicts
-> Flag MinimizeConflictSet
-> Flag StrongFlags
-> Flag AllowBootLibInstalls
-> Flag OnlyConstrained
-> Flag Bool
-> Flag IndependentGoals
-> NubList ProjectConfigImport
-> ProjectConfigShared
ProjectConfigShared{[Maybe PackageDB]
[(UserConstraint, ConstraintSource)]
[PackageVersionConstraint]
Maybe AllowOlder
Maybe AllowNewer
NubList ProjectConfigImport
NubList LocalRepo
NubList RemoteRepo
Flag Bool
Flag LineNo
Flag ProjectConfigImport
Flag CompilerFlavor
Flag PathTemplate
Flag Version
Flag ReorderGoals
Flag CountConflicts
Flag FineGrainedConflicts
Flag MinimizeConflictSet
Flag IndependentGoals
Flag StrongFlags
Flag AllowBootLibInstalls
Flag OnlyConstrained
Flag PreSolver
Flag TotalIndexState
Flag ActiveRepos
Flag WriteGhcEnvironmentFilesPolicy
projectConfigProgPathExtra :: NubList ProjectConfigImport
projectConfigIndependentGoals :: Flag IndependentGoals
projectConfigPerComponent :: Flag Bool
projectConfigOnlyConstrained :: Flag OnlyConstrained
projectConfigAllowBootLibInstalls :: Flag AllowBootLibInstalls
projectConfigStrongFlags :: Flag StrongFlags
projectConfigMinimizeConflictSet :: Flag MinimizeConflictSet
projectConfigFineGrainedConflicts :: Flag FineGrainedConflicts
projectConfigCountConflicts :: Flag CountConflicts
projectConfigReorderGoals :: Flag ReorderGoals
projectConfigMaxBackjumps :: Flag LineNo
projectConfigWriteGhcEnvironmentFilesPolicy :: Flag WriteGhcEnvironmentFilesPolicy
projectConfigAllowNewer :: Maybe AllowNewer
projectConfigAllowOlder :: Maybe AllowOlder
projectConfigSolver :: Flag PreSolver
projectConfigCabalVersion :: Flag Version
projectConfigPreferences :: [PackageVersionConstraint]
projectConfigConstraints :: [(UserConstraint, ConstraintSource)]
projectConfigStoreDir :: Flag ProjectConfigImport
projectConfigIndexState :: Flag TotalIndexState
projectConfigActiveRepos :: Flag ActiveRepos
projectConfigLocalNoIndexRepos :: NubList LocalRepo
projectConfigRemoteRepos :: NubList RemoteRepo
projectConfigPackageDBs :: [Maybe PackageDB]
projectConfigHaddockIndex :: Flag PathTemplate
projectConfigIgnoreProject :: Flag Bool
projectConfigProjectFile :: Flag ProjectConfigImport
projectConfigConfigFile :: Flag ProjectConfigImport
projectConfigDistDir :: Flag ProjectConfigImport
projectConfigIgnoreProject :: Flag Bool
projectConfigProjectFile :: Flag ProjectConfigImport
projectConfigOnlyConstrained :: Flag OnlyConstrained
projectConfigAllowBootLibInstalls :: Flag AllowBootLibInstalls
projectConfigStrongFlags :: Flag StrongFlags
projectConfigIndependentGoals :: Flag IndependentGoals
projectConfigPerComponent :: Flag Bool
projectConfigMinimizeConflictSet :: Flag MinimizeConflictSet
projectConfigFineGrainedConflicts :: Flag FineGrainedConflicts
projectConfigCountConflicts :: Flag CountConflicts
projectConfigReorderGoals :: Flag ReorderGoals
projectConfigMaxBackjumps :: Flag LineNo
projectConfigIndexState :: Flag TotalIndexState
projectConfigHaddockIndex :: Flag PathTemplate
projectConfigWriteGhcEnvironmentFilesPolicy :: Flag WriteGhcEnvironmentFilesPolicy
projectConfigAllowNewer :: Maybe AllowNewer
projectConfigAllowOlder :: Maybe AllowOlder
projectConfigSolver :: Flag PreSolver
projectConfigPreferences :: [PackageVersionConstraint]
projectConfigConstraints :: [(UserConstraint, ConstraintSource)]
projectConfigCabalVersion :: Flag Version
projectConfigPackageDBs :: [Maybe PackageDB]
projectConfigHcPkg :: Flag ProjectConfigImport
projectConfigHcPath :: Flag ProjectConfigImport
projectConfigHcFlavor :: Flag CompilerFlavor
projectConfigDistDir :: Flag ProjectConfigImport
projectConfigStoreDir :: Flag ProjectConfigImport
projectConfigProgPathExtra :: NubList ProjectConfigImport
projectConfigActiveRepos :: Flag ActiveRepos
projectConfigLocalNoIndexRepos :: NubList LocalRepo
projectConfigRemoteRepos :: NubList RemoteRepo
projectConfigConfigFile :: Flag ProjectConfigImport
projectConfigHcPkg :: Flag ProjectConfigImport
projectConfigHcPath :: Flag ProjectConfigImport
projectConfigHcFlavor :: Flag CompilerFlavor
..}
  where
    GlobalFlags {
      globalConfigFile :: GlobalFlags -> Flag ProjectConfigImport
globalConfigFile        = Flag ProjectConfigImport
projectConfigConfigFile,
      globalRemoteRepos :: GlobalFlags -> NubList RemoteRepo
globalRemoteRepos       = NubList RemoteRepo
projectConfigRemoteRepos,
      globalLocalNoIndexRepos :: GlobalFlags -> NubList LocalRepo
globalLocalNoIndexRepos = NubList LocalRepo
projectConfigLocalNoIndexRepos,
      globalActiveRepos :: GlobalFlags -> Flag ActiveRepos
globalActiveRepos       = Flag ActiveRepos
projectConfigActiveRepos,
      globalProgPathExtra :: GlobalFlags -> NubList ProjectConfigImport
globalProgPathExtra     = NubList ProjectConfigImport
projectConfigProgPathExtra,
      globalStoreDir :: GlobalFlags -> Flag ProjectConfigImport
globalStoreDir          = Flag ProjectConfigImport
projectConfigStoreDir
    } = GlobalFlags
globalFlags

    ConfigFlags {
      configDistPref :: ConfigFlags -> Flag ProjectConfigImport
configDistPref            = Flag ProjectConfigImport
projectConfigDistDir,
      configHcFlavor :: ConfigFlags -> Flag CompilerFlavor
configHcFlavor            = Flag CompilerFlavor
projectConfigHcFlavor,
      configHcPath :: ConfigFlags -> Flag ProjectConfigImport
configHcPath              = Flag ProjectConfigImport
projectConfigHcPath,
      configHcPkg :: ConfigFlags -> Flag ProjectConfigImport
configHcPkg               = Flag ProjectConfigImport
projectConfigHcPkg,
    --configProgramPathExtra    = projectConfigProgPathExtra DELETE ME
    --configInstallDirs         = projectConfigInstallDirs,
    --configUserInstall         = projectConfigUserInstall,
      configPackageDBs :: ConfigFlags -> [Maybe PackageDB]
configPackageDBs          = [Maybe PackageDB]
projectConfigPackageDBs
    } = ConfigFlags
configFlags

    ConfigExFlags {
      configCabalVersion :: ConfigExFlags -> Flag Version
configCabalVersion        = Flag Version
projectConfigCabalVersion,
      configExConstraints :: ConfigExFlags -> [(UserConstraint, ConstraintSource)]
configExConstraints       = [(UserConstraint, ConstraintSource)]
projectConfigConstraints,
      configPreferences :: ConfigExFlags -> [PackageVersionConstraint]
configPreferences         = [PackageVersionConstraint]
projectConfigPreferences,
      configSolver :: ConfigExFlags -> Flag PreSolver
configSolver              = Flag PreSolver
projectConfigSolver,
      configAllowOlder :: ConfigExFlags -> Maybe AllowOlder
configAllowOlder          = Maybe AllowOlder
projectConfigAllowOlder,
      configAllowNewer :: ConfigExFlags -> Maybe AllowNewer
configAllowNewer          = Maybe AllowNewer
projectConfigAllowNewer,
      configWriteGhcEnvironmentFilesPolicy :: ConfigExFlags -> Flag WriteGhcEnvironmentFilesPolicy
configWriteGhcEnvironmentFilesPolicy
                                = Flag WriteGhcEnvironmentFilesPolicy
projectConfigWriteGhcEnvironmentFilesPolicy
    } = ConfigExFlags
configExFlags

    InstallFlags {
      installHaddockIndex :: InstallFlags -> Flag PathTemplate
installHaddockIndex       = Flag PathTemplate
projectConfigHaddockIndex,
    --installReinstall          = projectConfigReinstall,
    --installAvoidReinstalls    = projectConfigAvoidReinstalls,
    --installOverrideReinstall  = projectConfigOverrideReinstall,
      installIndexState :: InstallFlags -> Flag TotalIndexState
installIndexState         = Flag TotalIndexState
projectConfigIndexState,
      installMaxBackjumps :: InstallFlags -> Flag LineNo
installMaxBackjumps       = Flag LineNo
projectConfigMaxBackjumps,
    --installUpgradeDeps        = projectConfigUpgradeDeps,
      installReorderGoals :: InstallFlags -> Flag ReorderGoals
installReorderGoals       = Flag ReorderGoals
projectConfigReorderGoals,
      installCountConflicts :: InstallFlags -> Flag CountConflicts
installCountConflicts     = Flag CountConflicts
projectConfigCountConflicts,
      installFineGrainedConflicts :: InstallFlags -> Flag FineGrainedConflicts
installFineGrainedConflicts = Flag FineGrainedConflicts
projectConfigFineGrainedConflicts,
      installMinimizeConflictSet :: InstallFlags -> Flag MinimizeConflictSet
installMinimizeConflictSet = Flag MinimizeConflictSet
projectConfigMinimizeConflictSet,
      installPerComponent :: InstallFlags -> Flag Bool
installPerComponent       = Flag Bool
projectConfigPerComponent,
      installIndependentGoals :: InstallFlags -> Flag IndependentGoals
installIndependentGoals   = Flag IndependentGoals
projectConfigIndependentGoals,
    --installShadowPkgs         = projectConfigShadowPkgs,
      installStrongFlags :: InstallFlags -> Flag StrongFlags
installStrongFlags        = Flag StrongFlags
projectConfigStrongFlags,
      installAllowBootLibInstalls :: InstallFlags -> Flag AllowBootLibInstalls
installAllowBootLibInstalls = Flag AllowBootLibInstalls
projectConfigAllowBootLibInstalls,
      installOnlyConstrained :: InstallFlags -> Flag OnlyConstrained
installOnlyConstrained    = Flag OnlyConstrained
projectConfigOnlyConstrained
    } = InstallFlags
installFlags

    ProjectFlags
        { flagProjectFileName :: ProjectFlags -> Flag ProjectConfigImport
flagProjectFileName = Flag ProjectConfigImport
projectConfigProjectFile
        , flagIgnoreProject :: ProjectFlags -> Flag Bool
flagIgnoreProject   = Flag Bool
projectConfigIgnoreProject
        } = ProjectFlags
projectFlags

-- | Helper used by other conversion functions that returns the
-- 'PackageConfig' subset of the 'ProjectConfig'.
--
convertLegacyPerPackageFlags :: ConfigFlags -> InstallFlags -> HaddockFlags
                             -> TestFlags -> BenchmarkFlags -> PackageConfig
convertLegacyPerPackageFlags :: ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> PackageConfig
convertLegacyPerPackageFlags ConfigFlags
configFlags InstallFlags
installFlags
                             HaddockFlags
haddockFlags TestFlags
testFlags BenchmarkFlags
benchmarkFlags =
    PackageConfig :: MapLast ProjectConfigImport ProjectConfigImport
-> MapMappend ProjectConfigImport [ProjectConfigImport]
-> NubList ProjectConfigImport
-> FlagAssignment
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProfDetailLevel
-> Flag ProfDetailLevel
-> [ProjectConfigImport]
-> Flag OptimisationLevel
-> Flag PathTemplate
-> Flag PathTemplate
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag DebugInfoLevel
-> Flag DumpBuildInfo
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag PathTemplate
-> Flag HaddockTarget
-> Flag PathTemplate
-> Flag PathTemplate
-> Flag TestShowDetails
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> [PathTemplate]
-> [PathTemplate]
-> PackageConfig
PackageConfig{[ProjectConfigImport]
[PathTemplate]
NubList ProjectConfigImport
Flag Bool
Flag ProjectConfigImport
Flag HaddockTarget
Flag TestShowDetails
Flag OptimisationLevel
Flag DebugInfoLevel
Flag ProfDetailLevel
Flag DumpBuildInfo
Flag PathTemplate
FlagAssignment
MapMappend ProjectConfigImport [ProjectConfigImport]
MapLast ProjectConfigImport ProjectConfigImport
packageConfigBenchmarkOptions :: [PathTemplate]
packageConfigTestTestOptions :: [PathTemplate]
packageConfigTestFailWhenNoTestSuites :: Flag Bool
packageConfigTestWrapper :: Flag ProjectConfigImport
packageConfigTestKeepTix :: Flag Bool
packageConfigTestShowDetails :: Flag TestShowDetails
packageConfigTestMachineLog :: Flag PathTemplate
packageConfigTestHumanLog :: Flag PathTemplate
packageConfigHaddockForHackage :: Flag HaddockTarget
packageConfigHaddockContents :: Flag PathTemplate
packageConfigHaddockHscolourCss :: Flag ProjectConfigImport
packageConfigHaddockQuickJump :: Flag Bool
packageConfigHaddockLinkedSource :: Flag Bool
packageConfigHaddockCss :: Flag ProjectConfigImport
packageConfigHaddockInternal :: Flag Bool
packageConfigHaddockBenchmarks :: Flag Bool
packageConfigHaddockTestSuites :: Flag Bool
packageConfigHaddockExecutables :: Flag Bool
packageConfigHaddockForeignLibs :: Flag Bool
packageConfigHaddockHtmlLocation :: Flag ProjectConfigImport
packageConfigHaddockHtml :: Flag Bool
packageConfigHaddockHoogle :: Flag Bool
packageConfigRunTests :: Flag Bool
packageConfigDumpBuildInfo :: Flag DumpBuildInfo
packageConfigDebugInfo :: Flag DebugInfoLevel
packageConfigRelocatable :: Flag Bool
packageConfigCoverage :: Flag Bool
packageConfigBenchmarks :: Flag Bool
packageConfigTests :: Flag Bool
packageConfigStripLibs :: Flag Bool
packageConfigStripExes :: Flag Bool
packageConfigSplitObjs :: Flag Bool
packageConfigSplitSections :: Flag Bool
packageConfigGHCiLib :: Flag Bool
packageConfigExtraIncludeDirs :: [ProjectConfigImport]
packageConfigExtraFrameworkDirs :: [ProjectConfigImport]
packageConfigExtraLibDirsStatic :: [ProjectConfigImport]
packageConfigExtraLibDirs :: [ProjectConfigImport]
packageConfigProgSuffix :: Flag PathTemplate
packageConfigProgPrefix :: Flag PathTemplate
packageConfigOptimization :: Flag OptimisationLevel
packageConfigConfigureArgs :: [ProjectConfigImport]
packageConfigProfLibDetail :: Flag ProfDetailLevel
packageConfigProfDetail :: Flag ProfDetailLevel
packageConfigProfExe :: Flag Bool
packageConfigProfLib :: Flag Bool
packageConfigProf :: Flag Bool
packageConfigFullyStaticExe :: Flag Bool
packageConfigDynExe :: Flag Bool
packageConfigStaticLib :: Flag Bool
packageConfigSharedLib :: Flag Bool
packageConfigVanillaLib :: Flag Bool
packageConfigFlagAssignment :: FlagAssignment
packageConfigProgramArgs :: MapMappend ProjectConfigImport [ProjectConfigImport]
packageConfigBenchmarkOptions :: [PathTemplate]
packageConfigTestTestOptions :: [PathTemplate]
packageConfigTestFailWhenNoTestSuites :: Flag Bool
packageConfigTestWrapper :: Flag ProjectConfigImport
packageConfigTestKeepTix :: Flag Bool
packageConfigTestShowDetails :: Flag TestShowDetails
packageConfigTestMachineLog :: Flag PathTemplate
packageConfigTestHumanLog :: Flag PathTemplate
packageConfigHaddockContents :: Flag PathTemplate
packageConfigHaddockHscolourCss :: Flag ProjectConfigImport
packageConfigHaddockQuickJump :: Flag Bool
packageConfigHaddockLinkedSource :: Flag Bool
packageConfigHaddockCss :: Flag ProjectConfigImport
packageConfigHaddockInternal :: Flag Bool
packageConfigHaddockBenchmarks :: Flag Bool
packageConfigHaddockTestSuites :: Flag Bool
packageConfigHaddockExecutables :: Flag Bool
packageConfigHaddockForHackage :: Flag HaddockTarget
packageConfigHaddockForeignLibs :: Flag Bool
packageConfigHaddockHtmlLocation :: Flag ProjectConfigImport
packageConfigHaddockHtml :: Flag Bool
packageConfigHaddockHoogle :: Flag Bool
packageConfigRunTests :: Flag Bool
packageConfigDocumentation :: Flag Bool
packageConfigCoverage :: Flag Bool
packageConfigProgramArgs :: MapMappend ProjectConfigImport [ProjectConfigImport]
packageConfigProgramPaths :: MapLast ProjectConfigImport ProjectConfigImport
packageConfigRelocatable :: Flag Bool
packageConfigDumpBuildInfo :: Flag DumpBuildInfo
packageConfigDebugInfo :: Flag DebugInfoLevel
packageConfigBenchmarks :: Flag Bool
packageConfigTests :: Flag Bool
packageConfigFlagAssignment :: FlagAssignment
packageConfigExtraIncludeDirs :: [ProjectConfigImport]
packageConfigExtraFrameworkDirs :: [ProjectConfigImport]
packageConfigExtraLibDirsStatic :: [ProjectConfigImport]
packageConfigExtraLibDirs :: [ProjectConfigImport]
packageConfigStripLibs :: Flag Bool
packageConfigStripExes :: Flag Bool
packageConfigSplitObjs :: Flag Bool
packageConfigSplitSections :: Flag Bool
packageConfigGHCiLib :: Flag Bool
packageConfigProgSuffix :: Flag PathTemplate
packageConfigProgPrefix :: Flag PathTemplate
packageConfigOptimization :: Flag OptimisationLevel
packageConfigConfigureArgs :: [ProjectConfigImport]
packageConfigProfLibDetail :: Flag ProfDetailLevel
packageConfigProfDetail :: Flag ProfDetailLevel
packageConfigProf :: Flag Bool
packageConfigProfExe :: Flag Bool
packageConfigFullyStaticExe :: Flag Bool
packageConfigDynExe :: Flag Bool
packageConfigStaticLib :: Flag Bool
packageConfigSharedLib :: Flag Bool
packageConfigProfLib :: Flag Bool
packageConfigVanillaLib :: Flag Bool
packageConfigProgramPathExtra :: NubList ProjectConfigImport
packageConfigDocumentation :: Flag Bool
packageConfigProgramPathExtra :: NubList ProjectConfigImport
packageConfigProgramPaths :: MapLast ProjectConfigImport ProjectConfigImport
..}
  where
    ConfigFlags {
      [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths :: ConfigFlags -> [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths :: [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths,
      [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs :: ConfigFlags -> [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs :: [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs,
      configProgramPathExtra :: ConfigFlags -> NubList ProjectConfigImport
configProgramPathExtra    = NubList ProjectConfigImport
packageConfigProgramPathExtra,
      configVanillaLib :: ConfigFlags -> Flag Bool
configVanillaLib          = Flag Bool
packageConfigVanillaLib,
      configProfLib :: ConfigFlags -> Flag Bool
configProfLib             = Flag Bool
packageConfigProfLib,
      configSharedLib :: ConfigFlags -> Flag Bool
configSharedLib           = Flag Bool
packageConfigSharedLib,
      configStaticLib :: ConfigFlags -> Flag Bool
configStaticLib           = Flag Bool
packageConfigStaticLib,
      configDynExe :: ConfigFlags -> Flag Bool
configDynExe              = Flag Bool
packageConfigDynExe,
      configFullyStaticExe :: ConfigFlags -> Flag Bool
configFullyStaticExe      = Flag Bool
packageConfigFullyStaticExe,
      configProfExe :: ConfigFlags -> Flag Bool
configProfExe             = Flag Bool
packageConfigProfExe,
      configProf :: ConfigFlags -> Flag Bool
configProf                = Flag Bool
packageConfigProf,
      configProfDetail :: ConfigFlags -> Flag ProfDetailLevel
configProfDetail          = Flag ProfDetailLevel
packageConfigProfDetail,
      configProfLibDetail :: ConfigFlags -> Flag ProfDetailLevel
configProfLibDetail       = Flag ProfDetailLevel
packageConfigProfLibDetail,
      configConfigureArgs :: ConfigFlags -> [ProjectConfigImport]
configConfigureArgs       = [ProjectConfigImport]
packageConfigConfigureArgs,
      configOptimization :: ConfigFlags -> Flag OptimisationLevel
configOptimization        = Flag OptimisationLevel
packageConfigOptimization,
      configProgPrefix :: ConfigFlags -> Flag PathTemplate
configProgPrefix          = Flag PathTemplate
packageConfigProgPrefix,
      configProgSuffix :: ConfigFlags -> Flag PathTemplate
configProgSuffix          = Flag PathTemplate
packageConfigProgSuffix,
      configGHCiLib :: ConfigFlags -> Flag Bool
configGHCiLib             = Flag Bool
packageConfigGHCiLib,
      configSplitSections :: ConfigFlags -> Flag Bool
configSplitSections       = Flag Bool
packageConfigSplitSections,
      configSplitObjs :: ConfigFlags -> Flag Bool
configSplitObjs           = Flag Bool
packageConfigSplitObjs,
      configStripExes :: ConfigFlags -> Flag Bool
configStripExes           = Flag Bool
packageConfigStripExes,
      configStripLibs :: ConfigFlags -> Flag Bool
configStripLibs           = Flag Bool
packageConfigStripLibs,
      configExtraLibDirs :: ConfigFlags -> [ProjectConfigImport]
configExtraLibDirs        = [ProjectConfigImport]
packageConfigExtraLibDirs,
      configExtraLibDirsStatic :: ConfigFlags -> [ProjectConfigImport]
configExtraLibDirsStatic  = [ProjectConfigImport]
packageConfigExtraLibDirsStatic,
      configExtraFrameworkDirs :: ConfigFlags -> [ProjectConfigImport]
configExtraFrameworkDirs  = [ProjectConfigImport]
packageConfigExtraFrameworkDirs,
      configExtraIncludeDirs :: ConfigFlags -> [ProjectConfigImport]
configExtraIncludeDirs    = [ProjectConfigImport]
packageConfigExtraIncludeDirs,
      configConfigurationsFlags :: ConfigFlags -> FlagAssignment
configConfigurationsFlags = FlagAssignment
packageConfigFlagAssignment,
      configTests :: ConfigFlags -> Flag Bool
configTests               = Flag Bool
packageConfigTests,
      configBenchmarks :: ConfigFlags -> Flag Bool
configBenchmarks          = Flag Bool
packageConfigBenchmarks,
      configCoverage :: ConfigFlags -> Flag Bool
configCoverage            = Flag Bool
coverage,
      configLibCoverage :: ConfigFlags -> Flag Bool
configLibCoverage         = Flag Bool
libcoverage, --deprecated
      configDebugInfo :: ConfigFlags -> Flag DebugInfoLevel
configDebugInfo           = Flag DebugInfoLevel
packageConfigDebugInfo,
      configDumpBuildInfo :: ConfigFlags -> Flag DumpBuildInfo
configDumpBuildInfo       = Flag DumpBuildInfo
packageConfigDumpBuildInfo,
      configRelocatable :: ConfigFlags -> Flag Bool
configRelocatable         = Flag Bool
packageConfigRelocatable
    } = ConfigFlags
configFlags
    packageConfigProgramPaths :: MapLast ProjectConfigImport ProjectConfigImport
packageConfigProgramPaths   = Map ProjectConfigImport ProjectConfigImport
-> MapLast ProjectConfigImport ProjectConfigImport
forall k v. Map k v -> MapLast k v
MapLast    ([(ProjectConfigImport, ProjectConfigImport)]
-> Map ProjectConfigImport ProjectConfigImport
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths)
    packageConfigProgramArgs :: MapMappend ProjectConfigImport [ProjectConfigImport]
packageConfigProgramArgs    = Map ProjectConfigImport [ProjectConfigImport]
-> MapMappend ProjectConfigImport [ProjectConfigImport]
forall k v. Map k v -> MapMappend k v
MapMappend (([ProjectConfigImport]
 -> [ProjectConfigImport] -> [ProjectConfigImport])
-> [(ProjectConfigImport, [ProjectConfigImport])]
-> Map ProjectConfigImport [ProjectConfigImport]
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith [ProjectConfigImport]
-> [ProjectConfigImport] -> [ProjectConfigImport]
forall a. [a] -> [a] -> [a]
(++) [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs)

    packageConfigCoverage :: Flag Bool
packageConfigCoverage       = Flag Bool
coverage Flag Bool -> Flag Bool -> Flag Bool
forall a. Semigroup a => a -> a -> a
<> Flag Bool
libcoverage
    --TODO: defer this merging to the resolve phase

    InstallFlags {
      installDocumentation :: InstallFlags -> Flag Bool
installDocumentation      = Flag Bool
packageConfigDocumentation,
      installRunTests :: InstallFlags -> Flag Bool
installRunTests           = Flag Bool
packageConfigRunTests
    } = InstallFlags
installFlags

    HaddockFlags {
      haddockHoogle :: HaddockFlags -> Flag Bool
haddockHoogle             = Flag Bool
packageConfigHaddockHoogle,
      haddockHtml :: HaddockFlags -> Flag Bool
haddockHtml               = Flag Bool
packageConfigHaddockHtml,
      haddockHtmlLocation :: HaddockFlags -> Flag ProjectConfigImport
haddockHtmlLocation       = Flag ProjectConfigImport
packageConfigHaddockHtmlLocation,
      haddockForeignLibs :: HaddockFlags -> Flag Bool
haddockForeignLibs        = Flag Bool
packageConfigHaddockForeignLibs,
      haddockForHackage :: HaddockFlags -> Flag HaddockTarget
haddockForHackage         = Flag HaddockTarget
packageConfigHaddockForHackage,
      haddockExecutables :: HaddockFlags -> Flag Bool
haddockExecutables        = Flag Bool
packageConfigHaddockExecutables,
      haddockTestSuites :: HaddockFlags -> Flag Bool
haddockTestSuites         = Flag Bool
packageConfigHaddockTestSuites,
      haddockBenchmarks :: HaddockFlags -> Flag Bool
haddockBenchmarks         = Flag Bool
packageConfigHaddockBenchmarks,
      haddockInternal :: HaddockFlags -> Flag Bool
haddockInternal           = Flag Bool
packageConfigHaddockInternal,
      haddockCss :: HaddockFlags -> Flag ProjectConfigImport
haddockCss                = Flag ProjectConfigImport
packageConfigHaddockCss,
      haddockLinkedSource :: HaddockFlags -> Flag Bool
haddockLinkedSource       = Flag Bool
packageConfigHaddockLinkedSource,
      haddockQuickJump :: HaddockFlags -> Flag Bool
haddockQuickJump          = Flag Bool
packageConfigHaddockQuickJump,
      haddockHscolourCss :: HaddockFlags -> Flag ProjectConfigImport
haddockHscolourCss        = Flag ProjectConfigImport
packageConfigHaddockHscolourCss,
      haddockContents :: HaddockFlags -> Flag PathTemplate
haddockContents           = Flag PathTemplate
packageConfigHaddockContents
    } = HaddockFlags
haddockFlags

    TestFlags {
      testHumanLog :: TestFlags -> Flag PathTemplate
testHumanLog              = Flag PathTemplate
packageConfigTestHumanLog,
      testMachineLog :: TestFlags -> Flag PathTemplate
testMachineLog            = Flag PathTemplate
packageConfigTestMachineLog,
      testShowDetails :: TestFlags -> Flag TestShowDetails
testShowDetails           = Flag TestShowDetails
packageConfigTestShowDetails,
      testKeepTix :: TestFlags -> Flag Bool
testKeepTix               = Flag Bool
packageConfigTestKeepTix,
      testWrapper :: TestFlags -> Flag ProjectConfigImport
testWrapper               = Flag ProjectConfigImport
packageConfigTestWrapper,
      testFailWhenNoTestSuites :: TestFlags -> Flag Bool
testFailWhenNoTestSuites  = Flag Bool
packageConfigTestFailWhenNoTestSuites,
      testOptions :: TestFlags -> [PathTemplate]
testOptions               = [PathTemplate]
packageConfigTestTestOptions
    } = TestFlags
testFlags

    BenchmarkFlags {
      benchmarkOptions :: BenchmarkFlags -> [PathTemplate]
benchmarkOptions          = [PathTemplate]
packageConfigBenchmarkOptions
    } = BenchmarkFlags
benchmarkFlags


-- | Helper used by other conversion functions that returns the
-- 'ProjectConfigBuildOnly' subset of the 'ProjectConfig'.
--
convertLegacyBuildOnlyFlags :: GlobalFlags -> ConfigFlags
                            -> InstallFlags -> ClientInstallFlags
                            -> HaddockFlags -> TestFlags
                            -> BenchmarkFlags
                            -> ProjectConfigBuildOnly
convertLegacyBuildOnlyFlags :: GlobalFlags
-> ConfigFlags
-> InstallFlags
-> ClientInstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> ProjectConfigBuildOnly
convertLegacyBuildOnlyFlags GlobalFlags
globalFlags ConfigFlags
configFlags
                              InstallFlags
installFlags ClientInstallFlags
clientInstallFlags
                              HaddockFlags
haddockFlags TestFlags
_ BenchmarkFlags
_ =
    ProjectConfigBuildOnly :: Flag Verbosity
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> NubList PathTemplate
-> Flag PathTemplate
-> Flag ReportLevel
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag (Maybe LineNo)
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> ClientInstallFlags
-> ProjectConfigBuildOnly
ProjectConfigBuildOnly{NubList PathTemplate
Flag Bool
Flag ProjectConfigImport
Flag (Maybe LineNo)
Flag Verbosity
Flag PathTemplate
Flag ReportLevel
ClientInstallFlags
projectConfigClientInstallFlags :: ClientInstallFlags
projectConfigLogsDir :: Flag ProjectConfigImport
projectConfigCacheDir :: Flag ProjectConfigImport
projectConfigIgnoreExpiry :: Flag Bool
projectConfigHttpTransport :: Flag ProjectConfigImport
projectConfigKeepTempFiles :: Flag Bool
projectConfigOfflineMode :: Flag Bool
projectConfigKeepGoing :: Flag Bool
projectConfigNumJobs :: Flag (Maybe LineNo)
projectConfigSymlinkBinDir :: Flag ProjectConfigImport
projectConfigReportPlanningFailure :: Flag Bool
projectConfigBuildReports :: Flag ReportLevel
projectConfigLogFile :: Flag PathTemplate
projectConfigSummaryFile :: NubList PathTemplate
projectConfigOnlyDownload :: Flag Bool
projectConfigOnlyDeps :: Flag Bool
projectConfigDryRun :: Flag Bool
projectConfigVerbosity :: Flag Verbosity
projectConfigKeepTempFiles :: Flag Bool
projectConfigOfflineMode :: Flag Bool
projectConfigKeepGoing :: Flag Bool
projectConfigNumJobs :: Flag (Maybe LineNo)
projectConfigSymlinkBinDir :: Flag ProjectConfigImport
projectConfigReportPlanningFailure :: Flag Bool
projectConfigBuildReports :: Flag ReportLevel
projectConfigLogFile :: Flag PathTemplate
projectConfigSummaryFile :: NubList PathTemplate
projectConfigOnlyDeps :: Flag Bool
projectConfigOnlyDownload :: Flag Bool
projectConfigDryRun :: Flag Bool
projectConfigVerbosity :: Flag Verbosity
projectConfigIgnoreExpiry :: Flag Bool
projectConfigHttpTransport :: Flag ProjectConfigImport
projectConfigLogsDir :: Flag ProjectConfigImport
projectConfigCacheDir :: Flag ProjectConfigImport
projectConfigClientInstallFlags :: ClientInstallFlags
..}
  where
    projectConfigClientInstallFlags :: ClientInstallFlags
projectConfigClientInstallFlags = ClientInstallFlags
clientInstallFlags
    GlobalFlags {
      globalCacheDir :: GlobalFlags -> Flag ProjectConfigImport
globalCacheDir          = Flag ProjectConfigImport
projectConfigCacheDir,
      globalLogsDir :: GlobalFlags -> Flag ProjectConfigImport
globalLogsDir           = Flag ProjectConfigImport
projectConfigLogsDir,
      globalHttpTransport :: GlobalFlags -> Flag ProjectConfigImport
globalHttpTransport     = Flag ProjectConfigImport
projectConfigHttpTransport,
      globalIgnoreExpiry :: GlobalFlags -> Flag Bool
globalIgnoreExpiry      = Flag Bool
projectConfigIgnoreExpiry
    } = GlobalFlags
globalFlags

    ConfigFlags {
      configVerbosity :: ConfigFlags -> Flag Verbosity
configVerbosity           = Flag Verbosity
projectConfigVerbosity
    } = ConfigFlags
configFlags

    InstallFlags {
      installDryRun :: InstallFlags -> Flag Bool
installDryRun             = Flag Bool
projectConfigDryRun,
      installOnlyDownload :: InstallFlags -> Flag Bool
installOnlyDownload       = Flag Bool
projectConfigOnlyDownload,
      installOnly :: InstallFlags -> Flag Bool
installOnly               = Flag Bool
_,
      installOnlyDeps :: InstallFlags -> Flag Bool
installOnlyDeps           = Flag Bool
projectConfigOnlyDeps,
      installRootCmd :: InstallFlags -> Flag ProjectConfigImport
installRootCmd            = Flag ProjectConfigImport
_,
      installSummaryFile :: InstallFlags -> NubList PathTemplate
installSummaryFile        = NubList PathTemplate
projectConfigSummaryFile,
      installLogFile :: InstallFlags -> Flag PathTemplate
installLogFile            = Flag PathTemplate
projectConfigLogFile,
      installBuildReports :: InstallFlags -> Flag ReportLevel
installBuildReports       = Flag ReportLevel
projectConfigBuildReports,
      installReportPlanningFailure :: InstallFlags -> Flag Bool
installReportPlanningFailure = Flag Bool
projectConfigReportPlanningFailure,
      installSymlinkBinDir :: InstallFlags -> Flag ProjectConfigImport
installSymlinkBinDir      = Flag ProjectConfigImport
projectConfigSymlinkBinDir,
      installNumJobs :: InstallFlags -> Flag (Maybe LineNo)
installNumJobs            = Flag (Maybe LineNo)
projectConfigNumJobs,
      installKeepGoing :: InstallFlags -> Flag Bool
installKeepGoing          = Flag Bool
projectConfigKeepGoing,
      installOfflineMode :: InstallFlags -> Flag Bool
installOfflineMode        = Flag Bool
projectConfigOfflineMode
    } = InstallFlags
installFlags

    HaddockFlags {
      haddockKeepTempFiles :: HaddockFlags -> Flag Bool
haddockKeepTempFiles      = Flag Bool
projectConfigKeepTempFiles --TODO: this ought to live elsewhere
    } = HaddockFlags
haddockFlags


convertToLegacyProjectConfig :: ProjectConfig -> LegacyProjectConfig
convertToLegacyProjectConfig :: ProjectConfig -> LegacyProjectConfig
convertToLegacyProjectConfig
    projectConfig :: ProjectConfig
projectConfig@ProjectConfig {
      [ProjectConfigImport]
projectPackages :: [ProjectConfigImport]
projectPackages :: ProjectConfig -> [ProjectConfigImport]
projectPackages,
      [ProjectConfigImport]
projectPackagesOptional :: [ProjectConfigImport]
projectPackagesOptional :: ProjectConfig -> [ProjectConfigImport]
projectPackagesOptional,
      [SourceRepoList]
projectPackagesRepo :: [SourceRepoList]
projectPackagesRepo :: ProjectConfig -> [SourceRepoList]
projectPackagesRepo,
      [PackageVersionConstraint]
projectPackagesNamed :: [PackageVersionConstraint]
projectPackagesNamed :: ProjectConfig -> [PackageVersionConstraint]
projectPackagesNamed,
      PackageConfig
projectConfigAllPackages :: PackageConfig
projectConfigAllPackages :: ProjectConfig -> PackageConfig
projectConfigAllPackages,
      PackageConfig
projectConfigLocalPackages :: PackageConfig
projectConfigLocalPackages :: ProjectConfig -> PackageConfig
projectConfigLocalPackages,
      MapMappend PackageName PackageConfig
projectConfigSpecificPackage :: MapMappend PackageName PackageConfig
projectConfigSpecificPackage :: ProjectConfig -> MapMappend PackageName PackageConfig
projectConfigSpecificPackage
    } =
    LegacyProjectConfig :: [ProjectConfigImport]
-> [ProjectConfigImport]
-> [SourceRepoList]
-> [PackageVersionConstraint]
-> LegacySharedConfig
-> LegacyPackageConfig
-> LegacyPackageConfig
-> MapMappend PackageName LegacyPackageConfig
-> LegacyProjectConfig
LegacyProjectConfig {
      legacyPackages :: [ProjectConfigImport]
legacyPackages         = [ProjectConfigImport]
projectPackages,
      legacyPackagesOptional :: [ProjectConfigImport]
legacyPackagesOptional = [ProjectConfigImport]
projectPackagesOptional,
      legacyPackagesRepo :: [SourceRepoList]
legacyPackagesRepo     = [SourceRepoList]
projectPackagesRepo,
      legacyPackagesNamed :: [PackageVersionConstraint]
legacyPackagesNamed    = [PackageVersionConstraint]
projectPackagesNamed,
      legacySharedConfig :: LegacySharedConfig
legacySharedConfig     = ProjectConfig -> LegacySharedConfig
convertToLegacySharedConfig ProjectConfig
projectConfig,
      legacyAllConfig :: LegacyPackageConfig
legacyAllConfig        = PackageConfig -> LegacyPackageConfig
convertToLegacyPerPackageConfig
                                 PackageConfig
projectConfigAllPackages,
      legacyLocalConfig :: LegacyPackageConfig
legacyLocalConfig      = ProjectConfig -> LegacyPackageConfig
convertToLegacyAllPackageConfig ProjectConfig
projectConfig
                            LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
forall a. Semigroup a => a -> a -> a
<> PackageConfig -> LegacyPackageConfig
convertToLegacyPerPackageConfig
                                 PackageConfig
projectConfigLocalPackages,
      legacySpecificConfig :: MapMappend PackageName LegacyPackageConfig
legacySpecificConfig   = (PackageConfig -> LegacyPackageConfig)
-> MapMappend PackageName PackageConfig
-> MapMappend PackageName LegacyPackageConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap PackageConfig -> LegacyPackageConfig
convertToLegacyPerPackageConfig
                                    MapMappend PackageName PackageConfig
projectConfigSpecificPackage
    }

convertToLegacySharedConfig :: ProjectConfig -> LegacySharedConfig
convertToLegacySharedConfig :: ProjectConfig -> LegacySharedConfig
convertToLegacySharedConfig
    ProjectConfig {
      projectConfigBuildOnly :: ProjectConfig -> ProjectConfigBuildOnly
projectConfigBuildOnly     = ProjectConfigBuildOnly {NubList PathTemplate
Flag Bool
Flag ProjectConfigImport
Flag (Maybe LineNo)
Flag Verbosity
Flag PathTemplate
Flag ReportLevel
ClientInstallFlags
projectConfigClientInstallFlags :: ClientInstallFlags
projectConfigLogsDir :: Flag ProjectConfigImport
projectConfigCacheDir :: Flag ProjectConfigImport
projectConfigIgnoreExpiry :: Flag Bool
projectConfigHttpTransport :: Flag ProjectConfigImport
projectConfigKeepTempFiles :: Flag Bool
projectConfigOfflineMode :: Flag Bool
projectConfigKeepGoing :: Flag Bool
projectConfigNumJobs :: Flag (Maybe LineNo)
projectConfigSymlinkBinDir :: Flag ProjectConfigImport
projectConfigReportPlanningFailure :: Flag Bool
projectConfigBuildReports :: Flag ReportLevel
projectConfigLogFile :: Flag PathTemplate
projectConfigSummaryFile :: NubList PathTemplate
projectConfigOnlyDownload :: Flag Bool
projectConfigOnlyDeps :: Flag Bool
projectConfigDryRun :: Flag Bool
projectConfigVerbosity :: Flag Verbosity
projectConfigClientInstallFlags :: ProjectConfigBuildOnly -> ClientInstallFlags
projectConfigLogsDir :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigCacheDir :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigIgnoreExpiry :: ProjectConfigBuildOnly -> Flag Bool
projectConfigHttpTransport :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigKeepTempFiles :: ProjectConfigBuildOnly -> Flag Bool
projectConfigOfflineMode :: ProjectConfigBuildOnly -> Flag Bool
projectConfigKeepGoing :: ProjectConfigBuildOnly -> Flag Bool
projectConfigNumJobs :: ProjectConfigBuildOnly -> Flag (Maybe LineNo)
projectConfigSymlinkBinDir :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigReportPlanningFailure :: ProjectConfigBuildOnly -> Flag Bool
projectConfigBuildReports :: ProjectConfigBuildOnly -> Flag ReportLevel
projectConfigLogFile :: ProjectConfigBuildOnly -> Flag PathTemplate
projectConfigSummaryFile :: ProjectConfigBuildOnly -> NubList PathTemplate
projectConfigOnlyDownload :: ProjectConfigBuildOnly -> Flag Bool
projectConfigOnlyDeps :: ProjectConfigBuildOnly -> Flag Bool
projectConfigDryRun :: ProjectConfigBuildOnly -> Flag Bool
projectConfigVerbosity :: ProjectConfigBuildOnly -> Flag Verbosity
..},
      projectConfigShared :: ProjectConfig -> ProjectConfigShared
projectConfigShared        = ProjectConfigShared {[Maybe PackageDB]
[(UserConstraint, ConstraintSource)]
[PackageVersionConstraint]
Maybe AllowOlder
Maybe AllowNewer
NubList ProjectConfigImport
NubList LocalRepo
NubList RemoteRepo
Flag Bool
Flag LineNo
Flag ProjectConfigImport
Flag CompilerFlavor
Flag PathTemplate
Flag Version
Flag ReorderGoals
Flag CountConflicts
Flag FineGrainedConflicts
Flag MinimizeConflictSet
Flag IndependentGoals
Flag StrongFlags
Flag AllowBootLibInstalls
Flag OnlyConstrained
Flag PreSolver
Flag TotalIndexState
Flag ActiveRepos
Flag WriteGhcEnvironmentFilesPolicy
projectConfigProgPathExtra :: NubList ProjectConfigImport
projectConfigIndependentGoals :: Flag IndependentGoals
projectConfigPerComponent :: Flag Bool
projectConfigOnlyConstrained :: Flag OnlyConstrained
projectConfigAllowBootLibInstalls :: Flag AllowBootLibInstalls
projectConfigStrongFlags :: Flag StrongFlags
projectConfigMinimizeConflictSet :: Flag MinimizeConflictSet
projectConfigFineGrainedConflicts :: Flag FineGrainedConflicts
projectConfigCountConflicts :: Flag CountConflicts
projectConfigReorderGoals :: Flag ReorderGoals
projectConfigMaxBackjumps :: Flag LineNo
projectConfigWriteGhcEnvironmentFilesPolicy :: Flag WriteGhcEnvironmentFilesPolicy
projectConfigAllowNewer :: Maybe AllowNewer
projectConfigAllowOlder :: Maybe AllowOlder
projectConfigSolver :: Flag PreSolver
projectConfigCabalVersion :: Flag Version
projectConfigPreferences :: [PackageVersionConstraint]
projectConfigConstraints :: [(UserConstraint, ConstraintSource)]
projectConfigStoreDir :: Flag ProjectConfigImport
projectConfigIndexState :: Flag TotalIndexState
projectConfigActiveRepos :: Flag ActiveRepos
projectConfigLocalNoIndexRepos :: NubList LocalRepo
projectConfigRemoteRepos :: NubList RemoteRepo
projectConfigPackageDBs :: [Maybe PackageDB]
projectConfigHaddockIndex :: Flag PathTemplate
projectConfigHcPkg :: Flag ProjectConfigImport
projectConfigHcPath :: Flag ProjectConfigImport
projectConfigHcFlavor :: Flag CompilerFlavor
projectConfigIgnoreProject :: Flag Bool
projectConfigProjectFile :: Flag ProjectConfigImport
projectConfigConfigFile :: Flag ProjectConfigImport
projectConfigDistDir :: Flag ProjectConfigImport
projectConfigProgPathExtra :: ProjectConfigShared -> NubList ProjectConfigImport
projectConfigIndependentGoals :: ProjectConfigShared -> Flag IndependentGoals
projectConfigPerComponent :: ProjectConfigShared -> Flag Bool
projectConfigOnlyConstrained :: ProjectConfigShared -> Flag OnlyConstrained
projectConfigAllowBootLibInstalls :: ProjectConfigShared -> Flag AllowBootLibInstalls
projectConfigStrongFlags :: ProjectConfigShared -> Flag StrongFlags
projectConfigMinimizeConflictSet :: ProjectConfigShared -> Flag MinimizeConflictSet
projectConfigFineGrainedConflicts :: ProjectConfigShared -> Flag FineGrainedConflicts
projectConfigCountConflicts :: ProjectConfigShared -> Flag CountConflicts
projectConfigReorderGoals :: ProjectConfigShared -> Flag ReorderGoals
projectConfigMaxBackjumps :: ProjectConfigShared -> Flag LineNo
projectConfigWriteGhcEnvironmentFilesPolicy :: ProjectConfigShared -> Flag WriteGhcEnvironmentFilesPolicy
projectConfigAllowNewer :: ProjectConfigShared -> Maybe AllowNewer
projectConfigAllowOlder :: ProjectConfigShared -> Maybe AllowOlder
projectConfigSolver :: ProjectConfigShared -> Flag PreSolver
projectConfigCabalVersion :: ProjectConfigShared -> Flag Version
projectConfigPreferences :: ProjectConfigShared -> [PackageVersionConstraint]
projectConfigConstraints :: ProjectConfigShared -> [(UserConstraint, ConstraintSource)]
projectConfigStoreDir :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigIndexState :: ProjectConfigShared -> Flag TotalIndexState
projectConfigActiveRepos :: ProjectConfigShared -> Flag ActiveRepos
projectConfigLocalNoIndexRepos :: ProjectConfigShared -> NubList LocalRepo
projectConfigRemoteRepos :: ProjectConfigShared -> NubList RemoteRepo
projectConfigPackageDBs :: ProjectConfigShared -> [Maybe PackageDB]
projectConfigHaddockIndex :: ProjectConfigShared -> Flag PathTemplate
projectConfigIgnoreProject :: ProjectConfigShared -> Flag Bool
projectConfigProjectFile :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigConfigFile :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigDistDir :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcPkg :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcPath :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcFlavor :: ProjectConfigShared -> Flag CompilerFlavor
..},
      projectConfigAllPackages :: ProjectConfig -> PackageConfig
projectConfigAllPackages   = PackageConfig {
        Flag Bool
packageConfigDocumentation :: Flag Bool
packageConfigDocumentation :: PackageConfig -> Flag Bool
packageConfigDocumentation
      }
    } =

    LegacySharedConfig :: GlobalFlags
-> ConfigFlags
-> ConfigExFlags
-> InstallFlags
-> ClientInstallFlags
-> ProjectFlags
-> LegacySharedConfig
LegacySharedConfig
      { legacyGlobalFlags :: GlobalFlags
legacyGlobalFlags        = GlobalFlags
globalFlags
      , legacyConfigureShFlags :: ConfigFlags
legacyConfigureShFlags   = ConfigFlags
configFlags
      , legacyConfigureExFlags :: ConfigExFlags
legacyConfigureExFlags   = ConfigExFlags
configExFlags
      , legacyInstallFlags :: InstallFlags
legacyInstallFlags       = InstallFlags
installFlags
      , legacyClientInstallFlags :: ClientInstallFlags
legacyClientInstallFlags = ClientInstallFlags
projectConfigClientInstallFlags
      , legacyProjectFlags :: ProjectFlags
legacyProjectFlags       = ProjectFlags
projectFlags
      }
  where
    globalFlags :: GlobalFlags
globalFlags = GlobalFlags :: Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> NubList RemoteRepo
-> Flag ProjectConfigImport
-> NubList LocalRepo
-> Flag ActiveRepos
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag ProjectConfigImport
-> NubList ProjectConfigImport
-> GlobalFlags
GlobalFlags {
      globalVersion :: Flag Bool
globalVersion           = Flag Bool
forall a. Monoid a => a
mempty,
      globalNumericVersion :: Flag Bool
globalNumericVersion    = Flag Bool
forall a. Monoid a => a
mempty,
      globalConfigFile :: Flag ProjectConfigImport
globalConfigFile        = Flag ProjectConfigImport
projectConfigConfigFile,
      globalConstraintsFile :: Flag ProjectConfigImport
globalConstraintsFile   = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      globalRemoteRepos :: NubList RemoteRepo
globalRemoteRepos       = NubList RemoteRepo
projectConfigRemoteRepos,
      globalCacheDir :: Flag ProjectConfigImport
globalCacheDir          = Flag ProjectConfigImport
projectConfigCacheDir,
      globalLocalNoIndexRepos :: NubList LocalRepo
globalLocalNoIndexRepos = NubList LocalRepo
projectConfigLocalNoIndexRepos,
      globalActiveRepos :: Flag ActiveRepos
globalActiveRepos       = Flag ActiveRepos
projectConfigActiveRepos,
      globalLogsDir :: Flag ProjectConfigImport
globalLogsDir           = Flag ProjectConfigImport
projectConfigLogsDir,
      globalIgnoreExpiry :: Flag Bool
globalIgnoreExpiry      = Flag Bool
projectConfigIgnoreExpiry,
      globalHttpTransport :: Flag ProjectConfigImport
globalHttpTransport     = Flag ProjectConfigImport
projectConfigHttpTransport,
      globalNix :: Flag Bool
globalNix               = Flag Bool
forall a. Monoid a => a
mempty,
      globalStoreDir :: Flag ProjectConfigImport
globalStoreDir          = Flag ProjectConfigImport
projectConfigStoreDir,
      globalProgPathExtra :: NubList ProjectConfigImport
globalProgPathExtra     = NubList ProjectConfigImport
projectConfigProgPathExtra
    }

    configFlags :: ConfigFlags
configFlags = ConfigFlags
forall a. Monoid a => a
mempty {
      configVerbosity :: Flag Verbosity
configVerbosity     = Flag Verbosity
projectConfigVerbosity,
      configDistPref :: Flag ProjectConfigImport
configDistPref      = Flag ProjectConfigImport
projectConfigDistDir,
      configPackageDBs :: [Maybe PackageDB]
configPackageDBs    = [Maybe PackageDB]
projectConfigPackageDBs
    }

    configExFlags :: ConfigExFlags
configExFlags = ConfigExFlags :: Flag Version
-> Flag Bool
-> Flag Bool
-> [(UserConstraint, ConstraintSource)]
-> [PackageVersionConstraint]
-> Flag PreSolver
-> Maybe AllowNewer
-> Maybe AllowOlder
-> Flag WriteGhcEnvironmentFilesPolicy
-> ConfigExFlags
ConfigExFlags {
      configCabalVersion :: Flag Version
configCabalVersion  = Flag Version
projectConfigCabalVersion,
      configAppend :: Flag Bool
configAppend        = Flag Bool
forall a. Monoid a => a
mempty,
      configBackup :: Flag Bool
configBackup        = Flag Bool
forall a. Monoid a => a
mempty,
      configExConstraints :: [(UserConstraint, ConstraintSource)]
configExConstraints = [(UserConstraint, ConstraintSource)]
projectConfigConstraints,
      configPreferences :: [PackageVersionConstraint]
configPreferences   = [PackageVersionConstraint]
projectConfigPreferences,
      configSolver :: Flag PreSolver
configSolver        = Flag PreSolver
projectConfigSolver,
      configAllowOlder :: Maybe AllowOlder
configAllowOlder    = Maybe AllowOlder
projectConfigAllowOlder,
      configAllowNewer :: Maybe AllowNewer
configAllowNewer    = Maybe AllowNewer
projectConfigAllowNewer,
      configWriteGhcEnvironmentFilesPolicy :: Flag WriteGhcEnvironmentFilesPolicy
configWriteGhcEnvironmentFilesPolicy
                          = Flag WriteGhcEnvironmentFilesPolicy
projectConfigWriteGhcEnvironmentFilesPolicy
    }

    installFlags :: InstallFlags
installFlags = InstallFlags :: Flag Bool
-> Flag PathTemplate
-> Flag CopyDest
-> Flag Bool
-> Flag Bool
-> Flag LineNo
-> Flag ReorderGoals
-> Flag CountConflicts
-> Flag FineGrainedConflicts
-> Flag MinimizeConflictSet
-> Flag IndependentGoals
-> Flag ShadowPkgs
-> Flag StrongFlags
-> Flag AllowBootLibInstalls
-> Flag OnlyConstrained
-> Flag Bool
-> Flag AvoidReinstalls
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag TotalIndexState
-> Flag ProjectConfigImport
-> NubList PathTemplate
-> Flag PathTemplate
-> Flag ReportLevel
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag (Maybe LineNo)
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> InstallFlags
InstallFlags {
      installDocumentation :: Flag Bool
installDocumentation     = Flag Bool
packageConfigDocumentation,
      installHaddockIndex :: Flag PathTemplate
installHaddockIndex      = Flag PathTemplate
projectConfigHaddockIndex,
      installDest :: Flag CopyDest
installDest              = CopyDest -> Flag CopyDest
forall a. a -> Flag a
Flag CopyDest
NoCopyDest,
      installDryRun :: Flag Bool
installDryRun            = Flag Bool
projectConfigDryRun,
      installOnlyDownload :: Flag Bool
installOnlyDownload      = Flag Bool
projectConfigOnlyDownload,
      installReinstall :: Flag Bool
installReinstall         = Flag Bool
forall a. Monoid a => a
mempty, --projectConfigReinstall,
      installAvoidReinstalls :: Flag AvoidReinstalls
installAvoidReinstalls   = Flag AvoidReinstalls
forall a. Monoid a => a
mempty, --projectConfigAvoidReinstalls,
      installOverrideReinstall :: Flag Bool
installOverrideReinstall = Flag Bool
forall a. Monoid a => a
mempty, --projectConfigOverrideReinstall,
      installMaxBackjumps :: Flag LineNo
installMaxBackjumps      = Flag LineNo
projectConfigMaxBackjumps,
      installUpgradeDeps :: Flag Bool
installUpgradeDeps       = Flag Bool
forall a. Monoid a => a
mempty, --projectConfigUpgradeDeps,
      installReorderGoals :: Flag ReorderGoals
installReorderGoals      = Flag ReorderGoals
projectConfigReorderGoals,
      installCountConflicts :: Flag CountConflicts
installCountConflicts    = Flag CountConflicts
projectConfigCountConflicts,
      installFineGrainedConflicts :: Flag FineGrainedConflicts
installFineGrainedConflicts = Flag FineGrainedConflicts
projectConfigFineGrainedConflicts,
      installMinimizeConflictSet :: Flag MinimizeConflictSet
installMinimizeConflictSet = Flag MinimizeConflictSet
projectConfigMinimizeConflictSet,
      installIndependentGoals :: Flag IndependentGoals
installIndependentGoals  = Flag IndependentGoals
projectConfigIndependentGoals,
      installShadowPkgs :: Flag ShadowPkgs
installShadowPkgs        = Flag ShadowPkgs
forall a. Monoid a => a
mempty, --projectConfigShadowPkgs,
      installStrongFlags :: Flag StrongFlags
installStrongFlags       = Flag StrongFlags
projectConfigStrongFlags,
      installAllowBootLibInstalls :: Flag AllowBootLibInstalls
installAllowBootLibInstalls = Flag AllowBootLibInstalls
projectConfigAllowBootLibInstalls,
      installOnlyConstrained :: Flag OnlyConstrained
installOnlyConstrained   = Flag OnlyConstrained
projectConfigOnlyConstrained,
      installOnly :: Flag Bool
installOnly              = Flag Bool
forall a. Monoid a => a
mempty,
      installOnlyDeps :: Flag Bool
installOnlyDeps          = Flag Bool
projectConfigOnlyDeps,
      installIndexState :: Flag TotalIndexState
installIndexState        = Flag TotalIndexState
projectConfigIndexState,
      installRootCmd :: Flag ProjectConfigImport
installRootCmd           = Flag ProjectConfigImport
forall a. Monoid a => a
mempty, --no longer supported
      installSummaryFile :: NubList PathTemplate
installSummaryFile       = NubList PathTemplate
projectConfigSummaryFile,
      installLogFile :: Flag PathTemplate
installLogFile           = Flag PathTemplate
projectConfigLogFile,
      installBuildReports :: Flag ReportLevel
installBuildReports      = Flag ReportLevel
projectConfigBuildReports,
      installReportPlanningFailure :: Flag Bool
installReportPlanningFailure = Flag Bool
projectConfigReportPlanningFailure,
      installSymlinkBinDir :: Flag ProjectConfigImport
installSymlinkBinDir     = Flag ProjectConfigImport
projectConfigSymlinkBinDir,
      installPerComponent :: Flag Bool
installPerComponent      = Flag Bool
projectConfigPerComponent,
      installNumJobs :: Flag (Maybe LineNo)
installNumJobs           = Flag (Maybe LineNo)
projectConfigNumJobs,
      installKeepGoing :: Flag Bool
installKeepGoing         = Flag Bool
projectConfigKeepGoing,
      installRunTests :: Flag Bool
installRunTests          = Flag Bool
forall a. Monoid a => a
mempty,
      installOfflineMode :: Flag Bool
installOfflineMode       = Flag Bool
projectConfigOfflineMode
    }

    projectFlags :: ProjectFlags
projectFlags = ProjectFlags :: Flag ProjectConfigImport -> Flag Bool -> ProjectFlags
ProjectFlags
        { flagProjectFileName :: Flag ProjectConfigImport
flagProjectFileName = Flag ProjectConfigImport
projectConfigProjectFile
        , flagIgnoreProject :: Flag Bool
flagIgnoreProject   = Flag Bool
projectConfigIgnoreProject
        }


convertToLegacyAllPackageConfig :: ProjectConfig -> LegacyPackageConfig
convertToLegacyAllPackageConfig :: ProjectConfig -> LegacyPackageConfig
convertToLegacyAllPackageConfig
    ProjectConfig {
      projectConfigBuildOnly :: ProjectConfig -> ProjectConfigBuildOnly
projectConfigBuildOnly = ProjectConfigBuildOnly {NubList PathTemplate
Flag Bool
Flag ProjectConfigImport
Flag (Maybe LineNo)
Flag Verbosity
Flag PathTemplate
Flag ReportLevel
ClientInstallFlags
projectConfigClientInstallFlags :: ClientInstallFlags
projectConfigLogsDir :: Flag ProjectConfigImport
projectConfigCacheDir :: Flag ProjectConfigImport
projectConfigIgnoreExpiry :: Flag Bool
projectConfigHttpTransport :: Flag ProjectConfigImport
projectConfigKeepTempFiles :: Flag Bool
projectConfigOfflineMode :: Flag Bool
projectConfigKeepGoing :: Flag Bool
projectConfigNumJobs :: Flag (Maybe LineNo)
projectConfigSymlinkBinDir :: Flag ProjectConfigImport
projectConfigReportPlanningFailure :: Flag Bool
projectConfigBuildReports :: Flag ReportLevel
projectConfigLogFile :: Flag PathTemplate
projectConfigSummaryFile :: NubList PathTemplate
projectConfigOnlyDownload :: Flag Bool
projectConfigOnlyDeps :: Flag Bool
projectConfigDryRun :: Flag Bool
projectConfigVerbosity :: Flag Verbosity
projectConfigClientInstallFlags :: ProjectConfigBuildOnly -> ClientInstallFlags
projectConfigLogsDir :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigCacheDir :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigIgnoreExpiry :: ProjectConfigBuildOnly -> Flag Bool
projectConfigHttpTransport :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigKeepTempFiles :: ProjectConfigBuildOnly -> Flag Bool
projectConfigOfflineMode :: ProjectConfigBuildOnly -> Flag Bool
projectConfigKeepGoing :: ProjectConfigBuildOnly -> Flag Bool
projectConfigNumJobs :: ProjectConfigBuildOnly -> Flag (Maybe LineNo)
projectConfigSymlinkBinDir :: ProjectConfigBuildOnly -> Flag ProjectConfigImport
projectConfigReportPlanningFailure :: ProjectConfigBuildOnly -> Flag Bool
projectConfigBuildReports :: ProjectConfigBuildOnly -> Flag ReportLevel
projectConfigLogFile :: ProjectConfigBuildOnly -> Flag PathTemplate
projectConfigSummaryFile :: ProjectConfigBuildOnly -> NubList PathTemplate
projectConfigOnlyDownload :: ProjectConfigBuildOnly -> Flag Bool
projectConfigOnlyDeps :: ProjectConfigBuildOnly -> Flag Bool
projectConfigDryRun :: ProjectConfigBuildOnly -> Flag Bool
projectConfigVerbosity :: ProjectConfigBuildOnly -> Flag Verbosity
..},
      projectConfigShared :: ProjectConfig -> ProjectConfigShared
projectConfigShared    = ProjectConfigShared {[Maybe PackageDB]
[(UserConstraint, ConstraintSource)]
[PackageVersionConstraint]
Maybe AllowOlder
Maybe AllowNewer
NubList ProjectConfigImport
NubList LocalRepo
NubList RemoteRepo
Flag Bool
Flag LineNo
Flag ProjectConfigImport
Flag CompilerFlavor
Flag PathTemplate
Flag Version
Flag ReorderGoals
Flag CountConflicts
Flag FineGrainedConflicts
Flag MinimizeConflictSet
Flag IndependentGoals
Flag StrongFlags
Flag AllowBootLibInstalls
Flag OnlyConstrained
Flag PreSolver
Flag TotalIndexState
Flag ActiveRepos
Flag WriteGhcEnvironmentFilesPolicy
projectConfigProgPathExtra :: NubList ProjectConfigImport
projectConfigIndependentGoals :: Flag IndependentGoals
projectConfigPerComponent :: Flag Bool
projectConfigOnlyConstrained :: Flag OnlyConstrained
projectConfigAllowBootLibInstalls :: Flag AllowBootLibInstalls
projectConfigStrongFlags :: Flag StrongFlags
projectConfigMinimizeConflictSet :: Flag MinimizeConflictSet
projectConfigFineGrainedConflicts :: Flag FineGrainedConflicts
projectConfigCountConflicts :: Flag CountConflicts
projectConfigReorderGoals :: Flag ReorderGoals
projectConfigMaxBackjumps :: Flag LineNo
projectConfigWriteGhcEnvironmentFilesPolicy :: Flag WriteGhcEnvironmentFilesPolicy
projectConfigAllowNewer :: Maybe AllowNewer
projectConfigAllowOlder :: Maybe AllowOlder
projectConfigSolver :: Flag PreSolver
projectConfigCabalVersion :: Flag Version
projectConfigPreferences :: [PackageVersionConstraint]
projectConfigConstraints :: [(UserConstraint, ConstraintSource)]
projectConfigStoreDir :: Flag ProjectConfigImport
projectConfigIndexState :: Flag TotalIndexState
projectConfigActiveRepos :: Flag ActiveRepos
projectConfigLocalNoIndexRepos :: NubList LocalRepo
projectConfigRemoteRepos :: NubList RemoteRepo
projectConfigPackageDBs :: [Maybe PackageDB]
projectConfigHaddockIndex :: Flag PathTemplate
projectConfigHcPkg :: Flag ProjectConfigImport
projectConfigHcPath :: Flag ProjectConfigImport
projectConfigHcFlavor :: Flag CompilerFlavor
projectConfigIgnoreProject :: Flag Bool
projectConfigProjectFile :: Flag ProjectConfigImport
projectConfigConfigFile :: Flag ProjectConfigImport
projectConfigDistDir :: Flag ProjectConfigImport
projectConfigProgPathExtra :: ProjectConfigShared -> NubList ProjectConfigImport
projectConfigIndependentGoals :: ProjectConfigShared -> Flag IndependentGoals
projectConfigPerComponent :: ProjectConfigShared -> Flag Bool
projectConfigOnlyConstrained :: ProjectConfigShared -> Flag OnlyConstrained
projectConfigAllowBootLibInstalls :: ProjectConfigShared -> Flag AllowBootLibInstalls
projectConfigStrongFlags :: ProjectConfigShared -> Flag StrongFlags
projectConfigMinimizeConflictSet :: ProjectConfigShared -> Flag MinimizeConflictSet
projectConfigFineGrainedConflicts :: ProjectConfigShared -> Flag FineGrainedConflicts
projectConfigCountConflicts :: ProjectConfigShared -> Flag CountConflicts
projectConfigReorderGoals :: ProjectConfigShared -> Flag ReorderGoals
projectConfigMaxBackjumps :: ProjectConfigShared -> Flag LineNo
projectConfigWriteGhcEnvironmentFilesPolicy :: ProjectConfigShared -> Flag WriteGhcEnvironmentFilesPolicy
projectConfigAllowNewer :: ProjectConfigShared -> Maybe AllowNewer
projectConfigAllowOlder :: ProjectConfigShared -> Maybe AllowOlder
projectConfigSolver :: ProjectConfigShared -> Flag PreSolver
projectConfigCabalVersion :: ProjectConfigShared -> Flag Version
projectConfigPreferences :: ProjectConfigShared -> [PackageVersionConstraint]
projectConfigConstraints :: ProjectConfigShared -> [(UserConstraint, ConstraintSource)]
projectConfigStoreDir :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigIndexState :: ProjectConfigShared -> Flag TotalIndexState
projectConfigActiveRepos :: ProjectConfigShared -> Flag ActiveRepos
projectConfigLocalNoIndexRepos :: ProjectConfigShared -> NubList LocalRepo
projectConfigRemoteRepos :: ProjectConfigShared -> NubList RemoteRepo
projectConfigPackageDBs :: ProjectConfigShared -> [Maybe PackageDB]
projectConfigHaddockIndex :: ProjectConfigShared -> Flag PathTemplate
projectConfigIgnoreProject :: ProjectConfigShared -> Flag Bool
projectConfigProjectFile :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigConfigFile :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigDistDir :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcPkg :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcPath :: ProjectConfigShared -> Flag ProjectConfigImport
projectConfigHcFlavor :: ProjectConfigShared -> Flag CompilerFlavor
..}
    } =

    LegacyPackageConfig :: ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> LegacyPackageConfig
LegacyPackageConfig {
      legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = ConfigFlags
configFlags,
      legacyInstallPkgFlags :: InstallFlags
legacyInstallPkgFlags= InstallFlags
forall a. Monoid a => a
mempty,
      legacyHaddockFlags :: HaddockFlags
legacyHaddockFlags   = HaddockFlags
haddockFlags,
      legacyTestFlags :: TestFlags
legacyTestFlags      = TestFlags
forall a. Monoid a => a
mempty,
      legacyBenchmarkFlags :: BenchmarkFlags
legacyBenchmarkFlags = BenchmarkFlags
forall a. Monoid a => a
mempty
    }
  where
    configFlags :: ConfigFlags
configFlags = ConfigFlags :: [ProjectConfigImport]
-> Option' (Last' ProgramDb)
-> [(ProjectConfigImport, ProjectConfigImport)]
-> [(ProjectConfigImport, [ProjectConfigImport])]
-> NubList ProjectConfigImport
-> Flag CompilerFlavor
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProfDetailLevel
-> Flag ProfDetailLevel
-> [ProjectConfigImport]
-> Flag OptimisationLevel
-> Flag PathTemplate
-> Flag PathTemplate
-> InstallDirs (Flag PathTemplate)
-> Flag ProjectConfigImport
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> Flag ProjectConfigImport
-> Flag ComponentId
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag Verbosity
-> Flag Bool
-> [Maybe PackageDB]
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> [PackageVersionConstraint]
-> [GivenComponent]
-> [(ModuleName, Module)]
-> FlagAssignment
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag DebugInfoLevel
-> Flag DumpBuildInfo
-> Flag Bool
-> Flag Bool
-> ConfigFlags
ConfigFlags {
      configArgs :: [ProjectConfigImport]
configArgs                = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configPrograms_ :: Option' (Last' ProgramDb)
configPrograms_           = Option' (Last' ProgramDb)
forall a. Monoid a => a
mempty,
      configProgramPaths :: [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths        = [(ProjectConfigImport, ProjectConfigImport)]
forall a. Monoid a => a
mempty,
      configProgramArgs :: [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs         = [(ProjectConfigImport, [ProjectConfigImport])]
forall a. Monoid a => a
mempty,
      configProgramPathExtra :: NubList ProjectConfigImport
configProgramPathExtra    = NubList ProjectConfigImport
forall a. Monoid a => a
mempty,
      configHcFlavor :: Flag CompilerFlavor
configHcFlavor            = Flag CompilerFlavor
projectConfigHcFlavor,
      configHcPath :: Flag ProjectConfigImport
configHcPath              = Flag ProjectConfigImport
projectConfigHcPath,
      configHcPkg :: Flag ProjectConfigImport
configHcPkg               = Flag ProjectConfigImport
projectConfigHcPkg,
      configInstantiateWith :: [(ModuleName, Module)]
configInstantiateWith     = [(ModuleName, Module)]
forall a. Monoid a => a
mempty,
      configVanillaLib :: Flag Bool
configVanillaLib          = Flag Bool
forall a. Monoid a => a
mempty,
      configProfLib :: Flag Bool
configProfLib             = Flag Bool
forall a. Monoid a => a
mempty,
      configSharedLib :: Flag Bool
configSharedLib           = Flag Bool
forall a. Monoid a => a
mempty,
      configStaticLib :: Flag Bool
configStaticLib           = Flag Bool
forall a. Monoid a => a
mempty,
      configDynExe :: Flag Bool
configDynExe              = Flag Bool
forall a. Monoid a => a
mempty,
      configFullyStaticExe :: Flag Bool
configFullyStaticExe      = Flag Bool
forall a. Monoid a => a
mempty,
      configProfExe :: Flag Bool
configProfExe             = Flag Bool
forall a. Monoid a => a
mempty,
      configProf :: Flag Bool
configProf                = Flag Bool
forall a. Monoid a => a
mempty,
      configProfDetail :: Flag ProfDetailLevel
configProfDetail          = Flag ProfDetailLevel
forall a. Monoid a => a
mempty,
      configProfLibDetail :: Flag ProfDetailLevel
configProfLibDetail       = Flag ProfDetailLevel
forall a. Monoid a => a
mempty,
      configConfigureArgs :: [ProjectConfigImport]
configConfigureArgs       = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configOptimization :: Flag OptimisationLevel
configOptimization        = Flag OptimisationLevel
forall a. Monoid a => a
mempty,
      configProgPrefix :: Flag PathTemplate
configProgPrefix          = Flag PathTemplate
forall a. Monoid a => a
mempty,
      configProgSuffix :: Flag PathTemplate
configProgSuffix          = Flag PathTemplate
forall a. Monoid a => a
mempty,
      configInstallDirs :: InstallDirs (Flag PathTemplate)
configInstallDirs         = InstallDirs (Flag PathTemplate)
forall a. Monoid a => a
mempty,
      configScratchDir :: Flag ProjectConfigImport
configScratchDir          = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configDistPref :: Flag ProjectConfigImport
configDistPref            = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configCabalFilePath :: Flag ProjectConfigImport
configCabalFilePath       = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configVerbosity :: Flag Verbosity
configVerbosity           = Flag Verbosity
forall a. Monoid a => a
mempty,
      configUserInstall :: Flag Bool
configUserInstall         = Flag Bool
forall a. Monoid a => a
mempty, --projectConfigUserInstall,
      configPackageDBs :: [Maybe PackageDB]
configPackageDBs          = [Maybe PackageDB]
forall a. Monoid a => a
mempty,
      configGHCiLib :: Flag Bool
configGHCiLib             = Flag Bool
forall a. Monoid a => a
mempty,
      configSplitSections :: Flag Bool
configSplitSections       = Flag Bool
forall a. Monoid a => a
mempty,
      configSplitObjs :: Flag Bool
configSplitObjs           = Flag Bool
forall a. Monoid a => a
mempty,
      configStripExes :: Flag Bool
configStripExes           = Flag Bool
forall a. Monoid a => a
mempty,
      configStripLibs :: Flag Bool
configStripLibs           = Flag Bool
forall a. Monoid a => a
mempty,
      configExtraLibDirs :: [ProjectConfigImport]
configExtraLibDirs        = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configExtraLibDirsStatic :: [ProjectConfigImport]
configExtraLibDirsStatic  = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configExtraFrameworkDirs :: [ProjectConfigImport]
configExtraFrameworkDirs  = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configConstraints :: [PackageVersionConstraint]
configConstraints         = [PackageVersionConstraint]
forall a. Monoid a => a
mempty,
      configDependencies :: [GivenComponent]
configDependencies        = [GivenComponent]
forall a. Monoid a => a
mempty,
      configExtraIncludeDirs :: [ProjectConfigImport]
configExtraIncludeDirs    = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configDeterministic :: Flag Bool
configDeterministic       = Flag Bool
forall a. Monoid a => a
mempty,
      configIPID :: Flag ProjectConfigImport
configIPID                = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configCID :: Flag ComponentId
configCID                 = Flag ComponentId
forall a. Monoid a => a
mempty,
      configConfigurationsFlags :: FlagAssignment
configConfigurationsFlags = FlagAssignment
forall a. Monoid a => a
mempty,
      configTests :: Flag Bool
configTests               = Flag Bool
forall a. Monoid a => a
mempty,
      configCoverage :: Flag Bool
configCoverage            = Flag Bool
forall a. Monoid a => a
mempty, --TODO: don't merge
      configLibCoverage :: Flag Bool
configLibCoverage         = Flag Bool
forall a. Monoid a => a
mempty, --TODO: don't merge
      configExactConfiguration :: Flag Bool
configExactConfiguration  = Flag Bool
forall a. Monoid a => a
mempty,
      configBenchmarks :: Flag Bool
configBenchmarks          = Flag Bool
forall a. Monoid a => a
mempty,
      configFlagError :: Flag ProjectConfigImport
configFlagError           = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,                --TODO: ???
      configRelocatable :: Flag Bool
configRelocatable         = Flag Bool
forall a. Monoid a => a
mempty,
      configDebugInfo :: Flag DebugInfoLevel
configDebugInfo           = Flag DebugInfoLevel
forall a. Monoid a => a
mempty,
      configUseResponseFiles :: Flag Bool
configUseResponseFiles    = Flag Bool
forall a. Monoid a => a
mempty,
      configDumpBuildInfo :: Flag DumpBuildInfo
configDumpBuildInfo       = Flag DumpBuildInfo
forall a. Monoid a => a
mempty,
      configAllowDependingOnPrivateLibs :: Flag Bool
configAllowDependingOnPrivateLibs = Flag Bool
forall a. Monoid a => a
mempty
    }

    haddockFlags :: HaddockFlags
haddockFlags = HaddockFlags
forall a. Monoid a => a
mempty {
      haddockKeepTempFiles :: Flag Bool
haddockKeepTempFiles = Flag Bool
projectConfigKeepTempFiles
    }


convertToLegacyPerPackageConfig :: PackageConfig -> LegacyPackageConfig
convertToLegacyPerPackageConfig :: PackageConfig -> LegacyPackageConfig
convertToLegacyPerPackageConfig PackageConfig {[ProjectConfigImport]
[PathTemplate]
NubList ProjectConfigImport
Flag Bool
Flag ProjectConfigImport
Flag HaddockTarget
Flag TestShowDetails
Flag OptimisationLevel
Flag DebugInfoLevel
Flag ProfDetailLevel
Flag DumpBuildInfo
Flag PathTemplate
FlagAssignment
MapMappend ProjectConfigImport [ProjectConfigImport]
MapLast ProjectConfigImport ProjectConfigImport
packageConfigBenchmarkOptions :: [PathTemplate]
packageConfigTestTestOptions :: [PathTemplate]
packageConfigTestFailWhenNoTestSuites :: Flag Bool
packageConfigTestWrapper :: Flag ProjectConfigImport
packageConfigTestKeepTix :: Flag Bool
packageConfigTestShowDetails :: Flag TestShowDetails
packageConfigTestMachineLog :: Flag PathTemplate
packageConfigTestHumanLog :: Flag PathTemplate
packageConfigHaddockForHackage :: Flag HaddockTarget
packageConfigHaddockContents :: Flag PathTemplate
packageConfigHaddockHscolourCss :: Flag ProjectConfigImport
packageConfigHaddockQuickJump :: Flag Bool
packageConfigHaddockLinkedSource :: Flag Bool
packageConfigHaddockCss :: Flag ProjectConfigImport
packageConfigHaddockInternal :: Flag Bool
packageConfigHaddockBenchmarks :: Flag Bool
packageConfigHaddockTestSuites :: Flag Bool
packageConfigHaddockExecutables :: Flag Bool
packageConfigHaddockForeignLibs :: Flag Bool
packageConfigHaddockHtmlLocation :: Flag ProjectConfigImport
packageConfigHaddockHtml :: Flag Bool
packageConfigHaddockHoogle :: Flag Bool
packageConfigDocumentation :: Flag Bool
packageConfigRunTests :: Flag Bool
packageConfigDumpBuildInfo :: Flag DumpBuildInfo
packageConfigDebugInfo :: Flag DebugInfoLevel
packageConfigRelocatable :: Flag Bool
packageConfigCoverage :: Flag Bool
packageConfigBenchmarks :: Flag Bool
packageConfigTests :: Flag Bool
packageConfigStripLibs :: Flag Bool
packageConfigStripExes :: Flag Bool
packageConfigSplitObjs :: Flag Bool
packageConfigSplitSections :: Flag Bool
packageConfigGHCiLib :: Flag Bool
packageConfigExtraIncludeDirs :: [ProjectConfigImport]
packageConfigExtraFrameworkDirs :: [ProjectConfigImport]
packageConfigExtraLibDirsStatic :: [ProjectConfigImport]
packageConfigExtraLibDirs :: [ProjectConfigImport]
packageConfigProgSuffix :: Flag PathTemplate
packageConfigProgPrefix :: Flag PathTemplate
packageConfigOptimization :: Flag OptimisationLevel
packageConfigConfigureArgs :: [ProjectConfigImport]
packageConfigProfLibDetail :: Flag ProfDetailLevel
packageConfigProfDetail :: Flag ProfDetailLevel
packageConfigProfExe :: Flag Bool
packageConfigProfLib :: Flag Bool
packageConfigProf :: Flag Bool
packageConfigFullyStaticExe :: Flag Bool
packageConfigDynExe :: Flag Bool
packageConfigStaticLib :: Flag Bool
packageConfigSharedLib :: Flag Bool
packageConfigVanillaLib :: Flag Bool
packageConfigFlagAssignment :: FlagAssignment
packageConfigProgramPathExtra :: NubList ProjectConfigImport
packageConfigProgramArgs :: MapMappend ProjectConfigImport [ProjectConfigImport]
packageConfigProgramPaths :: MapLast ProjectConfigImport ProjectConfigImport
packageConfigBenchmarkOptions :: PackageConfig -> [PathTemplate]
packageConfigTestTestOptions :: PackageConfig -> [PathTemplate]
packageConfigTestFailWhenNoTestSuites :: PackageConfig -> Flag Bool
packageConfigTestWrapper :: PackageConfig -> Flag ProjectConfigImport
packageConfigTestKeepTix :: PackageConfig -> Flag Bool
packageConfigTestShowDetails :: PackageConfig -> Flag TestShowDetails
packageConfigTestMachineLog :: PackageConfig -> Flag PathTemplate
packageConfigTestHumanLog :: PackageConfig -> Flag PathTemplate
packageConfigHaddockForHackage :: PackageConfig -> Flag HaddockTarget
packageConfigHaddockContents :: PackageConfig -> Flag PathTemplate
packageConfigHaddockHscolourCss :: PackageConfig -> Flag ProjectConfigImport
packageConfigHaddockQuickJump :: PackageConfig -> Flag Bool
packageConfigHaddockLinkedSource :: PackageConfig -> Flag Bool
packageConfigHaddockCss :: PackageConfig -> Flag ProjectConfigImport
packageConfigHaddockInternal :: PackageConfig -> Flag Bool
packageConfigHaddockBenchmarks :: PackageConfig -> Flag Bool
packageConfigHaddockTestSuites :: PackageConfig -> Flag Bool
packageConfigHaddockExecutables :: PackageConfig -> Flag Bool
packageConfigHaddockForeignLibs :: PackageConfig -> Flag Bool
packageConfigHaddockHtmlLocation :: PackageConfig -> Flag ProjectConfigImport
packageConfigHaddockHtml :: PackageConfig -> Flag Bool
packageConfigHaddockHoogle :: PackageConfig -> Flag Bool
packageConfigRunTests :: PackageConfig -> Flag Bool
packageConfigDumpBuildInfo :: PackageConfig -> Flag DumpBuildInfo
packageConfigDebugInfo :: PackageConfig -> Flag DebugInfoLevel
packageConfigRelocatable :: PackageConfig -> Flag Bool
packageConfigCoverage :: PackageConfig -> Flag Bool
packageConfigBenchmarks :: PackageConfig -> Flag Bool
packageConfigTests :: PackageConfig -> Flag Bool
packageConfigStripLibs :: PackageConfig -> Flag Bool
packageConfigStripExes :: PackageConfig -> Flag Bool
packageConfigSplitObjs :: PackageConfig -> Flag Bool
packageConfigSplitSections :: PackageConfig -> Flag Bool
packageConfigGHCiLib :: PackageConfig -> Flag Bool
packageConfigExtraIncludeDirs :: PackageConfig -> [ProjectConfigImport]
packageConfigExtraFrameworkDirs :: PackageConfig -> [ProjectConfigImport]
packageConfigExtraLibDirsStatic :: PackageConfig -> [ProjectConfigImport]
packageConfigExtraLibDirs :: PackageConfig -> [ProjectConfigImport]
packageConfigProgSuffix :: PackageConfig -> Flag PathTemplate
packageConfigProgPrefix :: PackageConfig -> Flag PathTemplate
packageConfigOptimization :: PackageConfig -> Flag OptimisationLevel
packageConfigConfigureArgs :: PackageConfig -> [ProjectConfigImport]
packageConfigProfLibDetail :: PackageConfig -> Flag ProfDetailLevel
packageConfigProfDetail :: PackageConfig -> Flag ProfDetailLevel
packageConfigProfExe :: PackageConfig -> Flag Bool
packageConfigProfLib :: PackageConfig -> Flag Bool
packageConfigProf :: PackageConfig -> Flag Bool
packageConfigFullyStaticExe :: PackageConfig -> Flag Bool
packageConfigDynExe :: PackageConfig -> Flag Bool
packageConfigStaticLib :: PackageConfig -> Flag Bool
packageConfigSharedLib :: PackageConfig -> Flag Bool
packageConfigVanillaLib :: PackageConfig -> Flag Bool
packageConfigFlagAssignment :: PackageConfig -> FlagAssignment
packageConfigProgramArgs :: PackageConfig
-> MapMappend ProjectConfigImport [ProjectConfigImport]
packageConfigDocumentation :: PackageConfig -> Flag Bool
packageConfigProgramPathExtra :: PackageConfig -> NubList ProjectConfigImport
packageConfigProgramPaths :: PackageConfig -> MapLast ProjectConfigImport ProjectConfigImport
..} =
    LegacyPackageConfig :: ConfigFlags
-> InstallFlags
-> HaddockFlags
-> TestFlags
-> BenchmarkFlags
-> LegacyPackageConfig
LegacyPackageConfig {
      legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags  = ConfigFlags
configFlags,
      legacyInstallPkgFlags :: InstallFlags
legacyInstallPkgFlags = InstallFlags
installFlags,
      legacyHaddockFlags :: HaddockFlags
legacyHaddockFlags    = HaddockFlags
haddockFlags,
      legacyTestFlags :: TestFlags
legacyTestFlags       = TestFlags
testFlags,
      legacyBenchmarkFlags :: BenchmarkFlags
legacyBenchmarkFlags  = BenchmarkFlags
benchmarkFlags
    }
  where
    configFlags :: ConfigFlags
configFlags = ConfigFlags :: [ProjectConfigImport]
-> Option' (Last' ProgramDb)
-> [(ProjectConfigImport, ProjectConfigImport)]
-> [(ProjectConfigImport, [ProjectConfigImport])]
-> NubList ProjectConfigImport
-> Flag CompilerFlavor
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProfDetailLevel
-> Flag ProfDetailLevel
-> [ProjectConfigImport]
-> Flag OptimisationLevel
-> Flag PathTemplate
-> Flag PathTemplate
-> InstallDirs (Flag PathTemplate)
-> Flag ProjectConfigImport
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> [ProjectConfigImport]
-> Flag ProjectConfigImport
-> Flag ComponentId
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag ProjectConfigImport
-> Flag Verbosity
-> Flag Bool
-> [Maybe PackageDB]
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> [PackageVersionConstraint]
-> [GivenComponent]
-> [(ModuleName, Module)]
-> FlagAssignment
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag DebugInfoLevel
-> Flag DumpBuildInfo
-> Flag Bool
-> Flag Bool
-> ConfigFlags
ConfigFlags {
      configArgs :: [ProjectConfigImport]
configArgs                = [ProjectConfigImport]
forall a. Monoid a => a
mempty,
      configPrograms_ :: Option' (Last' ProgramDb)
configPrograms_           = ConfigFlags -> Option' (Last' ProgramDb)
configPrograms_ ConfigFlags
forall a. Monoid a => a
mempty,
      configProgramPaths :: [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths        = Map ProjectConfigImport ProjectConfigImport
-> [(ProjectConfigImport, ProjectConfigImport)]
forall k a. Map k a -> [(k, a)]
Map.toList (MapLast ProjectConfigImport ProjectConfigImport
-> Map ProjectConfigImport ProjectConfigImport
forall k v. MapLast k v -> Map k v
getMapLast MapLast ProjectConfigImport ProjectConfigImport
packageConfigProgramPaths),
      configProgramArgs :: [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs         = Map ProjectConfigImport [ProjectConfigImport]
-> [(ProjectConfigImport, [ProjectConfigImport])]
forall k a. Map k a -> [(k, a)]
Map.toList (MapMappend ProjectConfigImport [ProjectConfigImport]
-> Map ProjectConfigImport [ProjectConfigImport]
forall k v. MapMappend k v -> Map k v
getMapMappend MapMappend ProjectConfigImport [ProjectConfigImport]
packageConfigProgramArgs),
      configProgramPathExtra :: NubList ProjectConfigImport
configProgramPathExtra    = NubList ProjectConfigImport
packageConfigProgramPathExtra,
      configHcFlavor :: Flag CompilerFlavor
configHcFlavor            = Flag CompilerFlavor
forall a. Monoid a => a
mempty,
      configHcPath :: Flag ProjectConfigImport
configHcPath              = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configHcPkg :: Flag ProjectConfigImport
configHcPkg               = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configInstantiateWith :: [(ModuleName, Module)]
configInstantiateWith     = [(ModuleName, Module)]
forall a. Monoid a => a
mempty,
      configVanillaLib :: Flag Bool
configVanillaLib          = Flag Bool
packageConfigVanillaLib,
      configProfLib :: Flag Bool
configProfLib             = Flag Bool
packageConfigProfLib,
      configSharedLib :: Flag Bool
configSharedLib           = Flag Bool
packageConfigSharedLib,
      configStaticLib :: Flag Bool
configStaticLib           = Flag Bool
packageConfigStaticLib,
      configDynExe :: Flag Bool
configDynExe              = Flag Bool
packageConfigDynExe,
      configFullyStaticExe :: Flag Bool
configFullyStaticExe      = Flag Bool
packageConfigFullyStaticExe,
      configProfExe :: Flag Bool
configProfExe             = Flag Bool
packageConfigProfExe,
      configProf :: Flag Bool
configProf                = Flag Bool
packageConfigProf,
      configProfDetail :: Flag ProfDetailLevel
configProfDetail          = Flag ProfDetailLevel
packageConfigProfDetail,
      configProfLibDetail :: Flag ProfDetailLevel
configProfLibDetail       = Flag ProfDetailLevel
packageConfigProfLibDetail,
      configConfigureArgs :: [ProjectConfigImport]
configConfigureArgs       = [ProjectConfigImport]
packageConfigConfigureArgs,
      configOptimization :: Flag OptimisationLevel
configOptimization        = Flag OptimisationLevel
packageConfigOptimization,
      configProgPrefix :: Flag PathTemplate
configProgPrefix          = Flag PathTemplate
packageConfigProgPrefix,
      configProgSuffix :: Flag PathTemplate
configProgSuffix          = Flag PathTemplate
packageConfigProgSuffix,
      configInstallDirs :: InstallDirs (Flag PathTemplate)
configInstallDirs         = InstallDirs (Flag PathTemplate)
forall a. Monoid a => a
mempty,
      configScratchDir :: Flag ProjectConfigImport
configScratchDir          = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configDistPref :: Flag ProjectConfigImport
configDistPref            = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configCabalFilePath :: Flag ProjectConfigImport
configCabalFilePath       = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configVerbosity :: Flag Verbosity
configVerbosity           = Flag Verbosity
forall a. Monoid a => a
mempty,
      configUserInstall :: Flag Bool
configUserInstall         = Flag Bool
forall a. Monoid a => a
mempty,
      configPackageDBs :: [Maybe PackageDB]
configPackageDBs          = [Maybe PackageDB]
forall a. Monoid a => a
mempty,
      configGHCiLib :: Flag Bool
configGHCiLib             = Flag Bool
packageConfigGHCiLib,
      configSplitSections :: Flag Bool
configSplitSections       = Flag Bool
packageConfigSplitSections,
      configSplitObjs :: Flag Bool
configSplitObjs           = Flag Bool
packageConfigSplitObjs,
      configStripExes :: Flag Bool
configStripExes           = Flag Bool
packageConfigStripExes,
      configStripLibs :: Flag Bool
configStripLibs           = Flag Bool
packageConfigStripLibs,
      configExtraLibDirs :: [ProjectConfigImport]
configExtraLibDirs        = [ProjectConfigImport]
packageConfigExtraLibDirs,
      configExtraLibDirsStatic :: [ProjectConfigImport]
configExtraLibDirsStatic  = [ProjectConfigImport]
packageConfigExtraLibDirsStatic,
      configExtraFrameworkDirs :: [ProjectConfigImport]
configExtraFrameworkDirs  = [ProjectConfigImport]
packageConfigExtraFrameworkDirs,
      configConstraints :: [PackageVersionConstraint]
configConstraints         = [PackageVersionConstraint]
forall a. Monoid a => a
mempty,
      configDependencies :: [GivenComponent]
configDependencies        = [GivenComponent]
forall a. Monoid a => a
mempty,
      configExtraIncludeDirs :: [ProjectConfigImport]
configExtraIncludeDirs    = [ProjectConfigImport]
packageConfigExtraIncludeDirs,
      configIPID :: Flag ProjectConfigImport
configIPID                = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      configCID :: Flag ComponentId
configCID                 = Flag ComponentId
forall a. Monoid a => a
mempty,
      configDeterministic :: Flag Bool
configDeterministic       = Flag Bool
forall a. Monoid a => a
mempty,
      configConfigurationsFlags :: FlagAssignment
configConfigurationsFlags = FlagAssignment
packageConfigFlagAssignment,
      configTests :: Flag Bool
configTests               = Flag Bool
packageConfigTests,
      configCoverage :: Flag Bool
configCoverage            = Flag Bool
packageConfigCoverage, --TODO: don't merge
      configLibCoverage :: Flag Bool
configLibCoverage         = Flag Bool
packageConfigCoverage, --TODO: don't merge
      configExactConfiguration :: Flag Bool
configExactConfiguration  = Flag Bool
forall a. Monoid a => a
mempty,
      configBenchmarks :: Flag Bool
configBenchmarks          = Flag Bool
packageConfigBenchmarks,
      configFlagError :: Flag ProjectConfigImport
configFlagError           = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,                --TODO: ???
      configRelocatable :: Flag Bool
configRelocatable         = Flag Bool
packageConfigRelocatable,
      configDebugInfo :: Flag DebugInfoLevel
configDebugInfo           = Flag DebugInfoLevel
packageConfigDebugInfo,
      configUseResponseFiles :: Flag Bool
configUseResponseFiles    = Flag Bool
forall a. Monoid a => a
mempty,
      configDumpBuildInfo :: Flag DumpBuildInfo
configDumpBuildInfo       = Flag DumpBuildInfo
packageConfigDumpBuildInfo,
      configAllowDependingOnPrivateLibs :: Flag Bool
configAllowDependingOnPrivateLibs = Flag Bool
forall a. Monoid a => a
mempty
    }

    installFlags :: InstallFlags
installFlags = InstallFlags
forall a. Monoid a => a
mempty {
      installDocumentation :: Flag Bool
installDocumentation      = Flag Bool
packageConfigDocumentation,
      installRunTests :: Flag Bool
installRunTests           = Flag Bool
packageConfigRunTests
    }

    haddockFlags :: HaddockFlags
haddockFlags = HaddockFlags :: [(ProjectConfigImport, ProjectConfigImport)]
-> [(ProjectConfigImport, [ProjectConfigImport])]
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag HaddockTarget
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag PathTemplate
-> Flag ProjectConfigImport
-> Flag Bool
-> Flag Verbosity
-> Flag ProjectConfigImport
-> [ProjectConfigImport]
-> HaddockFlags
HaddockFlags {
      haddockProgramPaths :: [(ProjectConfigImport, ProjectConfigImport)]
haddockProgramPaths  = [(ProjectConfigImport, ProjectConfigImport)]
forall a. Monoid a => a
mempty,
      haddockProgramArgs :: [(ProjectConfigImport, [ProjectConfigImport])]
haddockProgramArgs   = [(ProjectConfigImport, [ProjectConfigImport])]
forall a. Monoid a => a
mempty,
      haddockHoogle :: Flag Bool
haddockHoogle        = Flag Bool
packageConfigHaddockHoogle,
      haddockHtml :: Flag Bool
haddockHtml          = Flag Bool
packageConfigHaddockHtml,
      haddockHtmlLocation :: Flag ProjectConfigImport
haddockHtmlLocation  = Flag ProjectConfigImport
packageConfigHaddockHtmlLocation,
      haddockForHackage :: Flag HaddockTarget
haddockForHackage    = Flag HaddockTarget
packageConfigHaddockForHackage,
      haddockForeignLibs :: Flag Bool
haddockForeignLibs   = Flag Bool
packageConfigHaddockForeignLibs,
      haddockExecutables :: Flag Bool
haddockExecutables   = Flag Bool
packageConfigHaddockExecutables,
      haddockTestSuites :: Flag Bool
haddockTestSuites    = Flag Bool
packageConfigHaddockTestSuites,
      haddockBenchmarks :: Flag Bool
haddockBenchmarks    = Flag Bool
packageConfigHaddockBenchmarks,
      haddockInternal :: Flag Bool
haddockInternal      = Flag Bool
packageConfigHaddockInternal,
      haddockCss :: Flag ProjectConfigImport
haddockCss           = Flag ProjectConfigImport
packageConfigHaddockCss,
      haddockLinkedSource :: Flag Bool
haddockLinkedSource  = Flag Bool
packageConfigHaddockLinkedSource,
      haddockQuickJump :: Flag Bool
haddockQuickJump     = Flag Bool
packageConfigHaddockQuickJump,
      haddockHscolourCss :: Flag ProjectConfigImport
haddockHscolourCss   = Flag ProjectConfigImport
packageConfigHaddockHscolourCss,
      haddockContents :: Flag PathTemplate
haddockContents      = Flag PathTemplate
packageConfigHaddockContents,
      haddockDistPref :: Flag ProjectConfigImport
haddockDistPref      = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      haddockKeepTempFiles :: Flag Bool
haddockKeepTempFiles = Flag Bool
forall a. Monoid a => a
mempty,
      haddockVerbosity :: Flag Verbosity
haddockVerbosity     = Flag Verbosity
forall a. Monoid a => a
mempty,
      haddockCabalFilePath :: Flag ProjectConfigImport
haddockCabalFilePath = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      haddockArgs :: [ProjectConfigImport]
haddockArgs          = [ProjectConfigImport]
forall a. Monoid a => a
mempty
    }

    testFlags :: TestFlags
testFlags = TestFlags :: Flag ProjectConfigImport
-> Flag Verbosity
-> Flag PathTemplate
-> Flag PathTemplate
-> Flag TestShowDetails
-> Flag Bool
-> Flag ProjectConfigImport
-> Flag Bool
-> [PathTemplate]
-> TestFlags
TestFlags {
      testDistPref :: Flag ProjectConfigImport
testDistPref    = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      testVerbosity :: Flag Verbosity
testVerbosity   = Flag Verbosity
forall a. Monoid a => a
mempty,
      testHumanLog :: Flag PathTemplate
testHumanLog    = Flag PathTemplate
packageConfigTestHumanLog,
      testMachineLog :: Flag PathTemplate
testMachineLog  = Flag PathTemplate
packageConfigTestMachineLog,
      testShowDetails :: Flag TestShowDetails
testShowDetails = Flag TestShowDetails
packageConfigTestShowDetails,
      testKeepTix :: Flag Bool
testKeepTix     = Flag Bool
packageConfigTestKeepTix,
      testWrapper :: Flag ProjectConfigImport
testWrapper     = Flag ProjectConfigImport
packageConfigTestWrapper,
      testFailWhenNoTestSuites :: Flag Bool
testFailWhenNoTestSuites = Flag Bool
packageConfigTestFailWhenNoTestSuites,
      testOptions :: [PathTemplate]
testOptions     = [PathTemplate]
packageConfigTestTestOptions
    }

    benchmarkFlags :: BenchmarkFlags
benchmarkFlags = BenchmarkFlags :: Flag ProjectConfigImport
-> Flag Verbosity -> [PathTemplate] -> BenchmarkFlags
BenchmarkFlags {
      benchmarkDistPref :: Flag ProjectConfigImport
benchmarkDistPref  = Flag ProjectConfigImport
forall a. Monoid a => a
mempty,
      benchmarkVerbosity :: Flag Verbosity
benchmarkVerbosity = Flag Verbosity
forall a. Monoid a => a
mempty,
      benchmarkOptions :: [PathTemplate]
benchmarkOptions   = [PathTemplate]
packageConfigBenchmarkOptions
    }

------------------------------------------------
-- Parsing and showing the project config file
--

parseLegacyProjectConfigFields :: FilePath -> [ParseUtils.Field] -> ParseResult LegacyProjectConfig
parseLegacyProjectConfigFields :: ProjectConfigImport -> [Field] -> ParseResult LegacyProjectConfig
parseLegacyProjectConfigFields ProjectConfigImport
source =
    [FieldDescr LegacyProjectConfig]
-> [SectionDescr LegacyProjectConfig]
-> [FGSectionDescr ParsecFieldGrammar LegacyProjectConfig]
-> LegacyProjectConfig
-> [Field]
-> ParseResult LegacyProjectConfig
forall a.
[FieldDescr a]
-> [SectionDescr a]
-> [FGSectionDescr ParsecFieldGrammar a]
-> a
-> [Field]
-> ParseResult a
parseFieldsAndSections (ConstraintSource -> [FieldDescr LegacyProjectConfig]
legacyProjectConfigFieldDescrs ConstraintSource
constraintSrc)
                [SectionDescr LegacyProjectConfig]
legacyPackageConfigSectionDescrs
                [FGSectionDescr ParsecFieldGrammar LegacyProjectConfig]
forall (c :: * -> Constraint) (g :: * -> * -> *).
(FieldGrammar c g, Applicative (g SourceRepoList),
 c (Identity RepoType),
 c (List NoCommaFSep FilePathNT ProjectConfigImport),
 c (NonEmpty' NoCommaFSep Token ProjectConfigImport)) =>
[FGSectionDescr g LegacyProjectConfig]
legacyPackageConfigFGSectionDescrs
                LegacyProjectConfig
forall a. Monoid a => a
mempty
  where
    constraintSrc :: ConstraintSource
constraintSrc = ProjectConfigImport -> ConstraintSource
ConstraintSourceProjectConfig ProjectConfigImport
source

parseLegacyProjectConfig :: FilePath -> BS.ByteString -> ParseResult LegacyProjectConfig
parseLegacyProjectConfig :: ProjectConfigImport
-> ByteString -> ParseResult LegacyProjectConfig
parseLegacyProjectConfig ProjectConfigImport
source ByteString
bs = ProjectConfigImport -> [Field] -> ParseResult LegacyProjectConfig
parseLegacyProjectConfigFields ProjectConfigImport
source ([Field] -> ParseResult LegacyProjectConfig)
-> ParseResult [Field] -> ParseResult LegacyProjectConfig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ByteString -> ParseResult [Field]
ParseUtils.readFields ByteString
bs

showLegacyProjectConfig :: LegacyProjectConfig -> String
showLegacyProjectConfig :: LegacyProjectConfig -> ProjectConfigImport
showLegacyProjectConfig LegacyProjectConfig
config =
    Doc -> ProjectConfigImport
Disp.render (Doc -> ProjectConfigImport) -> Doc -> ProjectConfigImport
forall a b. (a -> b) -> a -> b
$
    [FieldDescr LegacyProjectConfig]
-> [SectionDescr LegacyProjectConfig]
-> [FGSectionDescr PrettyFieldGrammar LegacyProjectConfig]
-> LegacyProjectConfig
-> Doc
forall a.
[FieldDescr a]
-> [SectionDescr a]
-> [FGSectionDescr PrettyFieldGrammar a]
-> a
-> Doc
showConfig  (ConstraintSource -> [FieldDescr LegacyProjectConfig]
legacyProjectConfigFieldDescrs ConstraintSource
constraintSrc)
                [SectionDescr LegacyProjectConfig]
legacyPackageConfigSectionDescrs
                [FGSectionDescr PrettyFieldGrammar LegacyProjectConfig]
forall (c :: * -> Constraint) (g :: * -> * -> *).
(FieldGrammar c g, Applicative (g SourceRepoList),
 c (Identity RepoType),
 c (List NoCommaFSep FilePathNT ProjectConfigImport),
 c (NonEmpty' NoCommaFSep Token ProjectConfigImport)) =>
[FGSectionDescr g LegacyProjectConfig]
legacyPackageConfigFGSectionDescrs
                LegacyProjectConfig
config
  Doc -> Doc -> Doc
$+$
    ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
""
  where
    -- Note: ConstraintSource is unused when pretty-printing. We fake
    -- it here to avoid having to pass it on call-sites. It's not great
    -- but requires re-work of how we annotate provenance.
    constraintSrc :: ConstraintSource
constraintSrc = ProjectConfigImport -> ConstraintSource
ConstraintSourceProjectConfig ProjectConfigImport
"unused"


legacyProjectConfigFieldDescrs :: ConstraintSource -> [FieldDescr LegacyProjectConfig]
legacyProjectConfigFieldDescrs :: ConstraintSource -> [FieldDescr LegacyProjectConfig]
legacyProjectConfigFieldDescrs ConstraintSource
constraintSrc =

    [ ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (LegacyProjectConfig -> [ProjectConfigImport])
-> ([ProjectConfigImport]
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> FieldDescr LegacyProjectConfig
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"packages"
        (ProjectConfigImport -> Doc
Disp.text (ProjectConfigImport -> Doc)
-> (ProjectConfigImport -> ProjectConfigImport)
-> ProjectConfigImport
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProjectConfigImport -> ProjectConfigImport
renderPackageLocationToken) ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parsePackageLocationTokenQ
        LegacyProjectConfig -> [ProjectConfigImport]
legacyPackages
        (\[ProjectConfigImport]
v LegacyProjectConfig
flags -> LegacyProjectConfig
flags { legacyPackages :: [ProjectConfigImport]
legacyPackages = [ProjectConfigImport]
v })
    , ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (LegacyProjectConfig -> [ProjectConfigImport])
-> ([ProjectConfigImport]
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> FieldDescr LegacyProjectConfig
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"optional-packages"
        (ProjectConfigImport -> Doc
Disp.text (ProjectConfigImport -> Doc)
-> (ProjectConfigImport -> ProjectConfigImport)
-> ProjectConfigImport
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProjectConfigImport -> ProjectConfigImport
renderPackageLocationToken) ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parsePackageLocationTokenQ
        LegacyProjectConfig -> [ProjectConfigImport]
legacyPackagesOptional
        (\[ProjectConfigImport]
v LegacyProjectConfig
flags -> LegacyProjectConfig
flags { legacyPackagesOptional :: [ProjectConfigImport]
legacyPackagesOptional = [ProjectConfigImport]
v })
    , ProjectConfigImport
-> (PackageVersionConstraint -> Doc)
-> ParsecParser PackageVersionConstraint
-> (LegacyProjectConfig -> [PackageVersionConstraint])
-> ([PackageVersionConstraint]
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> FieldDescr LegacyProjectConfig
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
commaNewLineListFieldParsec ProjectConfigImport
"extra-packages"
        PackageVersionConstraint -> Doc
forall a. Pretty a => a -> Doc
pretty ParsecParser PackageVersionConstraint
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec
        LegacyProjectConfig -> [PackageVersionConstraint]
legacyPackagesNamed
        (\[PackageVersionConstraint]
v LegacyProjectConfig
flags -> LegacyProjectConfig
flags { legacyPackagesNamed :: [PackageVersionConstraint]
legacyPackagesNamed = [PackageVersionConstraint]
v })
    ]

 [FieldDescr LegacyProjectConfig]
-> [FieldDescr LegacyProjectConfig]
-> [FieldDescr LegacyProjectConfig]
forall a. [a] -> [a] -> [a]
++ (FieldDescr LegacySharedConfig -> FieldDescr LegacyProjectConfig)
-> [FieldDescr LegacySharedConfig]
-> [FieldDescr LegacyProjectConfig]
forall a b. (a -> b) -> [a] -> [b]
map ((LegacyProjectConfig -> LegacySharedConfig)
-> (LegacySharedConfig
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> FieldDescr LegacySharedConfig
-> FieldDescr LegacyProjectConfig
forall b a.
(b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
liftField
           LegacyProjectConfig -> LegacySharedConfig
legacySharedConfig
           (\LegacySharedConfig
flags LegacyProjectConfig
conf -> LegacyProjectConfig
conf { legacySharedConfig :: LegacySharedConfig
legacySharedConfig = LegacySharedConfig
flags }))
        (ConstraintSource -> [FieldDescr LegacySharedConfig]
legacySharedConfigFieldDescrs ConstraintSource
constraintSrc)

 [FieldDescr LegacyProjectConfig]
-> [FieldDescr LegacyProjectConfig]
-> [FieldDescr LegacyProjectConfig]
forall a. [a] -> [a] -> [a]
++ (FieldDescr LegacyPackageConfig -> FieldDescr LegacyProjectConfig)
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyProjectConfig]
forall a b. (a -> b) -> [a] -> [b]
map ((LegacyProjectConfig -> LegacyPackageConfig)
-> (LegacyPackageConfig
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> FieldDescr LegacyPackageConfig
-> FieldDescr LegacyProjectConfig
forall b a.
(b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
liftField
           LegacyProjectConfig -> LegacyPackageConfig
legacyLocalConfig
           (\LegacyPackageConfig
flags LegacyProjectConfig
conf -> LegacyProjectConfig
conf { legacyLocalConfig :: LegacyPackageConfig
legacyLocalConfig = LegacyPackageConfig
flags }))
        [FieldDescr LegacyPackageConfig]
legacyPackageConfigFieldDescrs

-- | This is a bit tricky since it has to cover globs which have embedded @,@
-- chars. But we don't just want to parse strictly as a glob since we want to
-- allow http urls which don't parse as globs, and possibly some
-- system-dependent file paths. So we parse fairly liberally as a token, but
-- we allow @,@ inside matched @{}@ braces.
--
parsePackageLocationTokenQ :: ReadP r String
parsePackageLocationTokenQ :: ReadP r ProjectConfigImport
parsePackageLocationTokenQ = ReadP ProjectConfigImport ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseHaskellString
                   ReadP ProjectConfigImport ProjectConfigImport
-> ReadP r ProjectConfigImport -> ReadP r ProjectConfigImport
forall a r. ReadP a a -> ReadP r a -> ReadP r a
Parse.<++ ReadP r ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parsePackageLocationToken
  where
    parsePackageLocationToken :: ReadP r String
    parsePackageLocationToken :: ReadP r ProjectConfigImport
parsePackageLocationToken = ((ProjectConfigImport, ()) -> ProjectConfigImport)
-> Parser r Char (ProjectConfigImport, ())
-> ReadP r ProjectConfigImport
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ProjectConfigImport, ()) -> ProjectConfigImport
forall a b. (a, b) -> a
fst (ReadP (ProjectConfigImport -> P Char r) ()
-> Parser r Char (ProjectConfigImport, ())
forall r a.
ReadP (ProjectConfigImport -> P Char r) a
-> ReadP r (ProjectConfigImport, a)
Parse.gather ReadP (ProjectConfigImport -> P Char r) ()
forall r. ReadP r ()
outerTerm)
      where
        outerTerm :: ReadP r ()
outerTerm   = ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternateEither1 ReadP r ()
forall r. ReadP r ()
outerToken (ReadP r () -> ReadP r ()
forall r a. ReadP r a -> ReadP r a
braces ReadP r ()
forall r. ReadP r ()
innerTerm)
        innerTerm :: ReadP r ()
innerTerm   = ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternateEither  ReadP r ()
forall r. ReadP r ()
innerToken (ReadP r () -> ReadP r ()
forall r a. ReadP r a -> ReadP r a
braces ReadP r ()
innerTerm)
        outerToken :: Parser r Char ()
outerToken  = (Char -> Bool) -> ReadP r ProjectConfigImport
forall r. (Char -> Bool) -> ReadP r ProjectConfigImport
Parse.munch1 Char -> Bool
outerChar ReadP r ProjectConfigImport -> Parser r Char () -> Parser r Char ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> Parser r Char ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        innerToken :: Parser r Char ()
innerToken  = (Char -> Bool) -> ReadP r ProjectConfigImport
forall r. (Char -> Bool) -> ReadP r ProjectConfigImport
Parse.munch1 Char -> Bool
innerChar ReadP r ProjectConfigImport -> Parser r Char () -> Parser r Char ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> Parser r Char ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        outerChar :: Char -> Bool
outerChar Char
c = Bool -> Bool
not (Char -> Bool
isSpace Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'{' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'}' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
',')
        innerChar :: Char -> Bool
innerChar Char
c = Bool -> Bool
not (Char -> Bool
isSpace Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'{' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'}')
        braces :: ReadP r a -> ReadP r a
braces      = ReadP r Char -> ReadP r Char -> ReadP r a -> ReadP r a
forall r open close a.
ReadP r open -> ReadP r close -> ReadP r a -> ReadP r a
Parse.between (Char -> ReadP r Char
forall r. Char -> ReadP r Char
Parse.char Char
'{') (Char -> ReadP r Char
forall r. Char -> ReadP r Char
Parse.char Char
'}')

    alternateEither, alternateEither1,
      alternatePQs, alternate1PQs, alternateQsP, alternate1QsP
      :: ReadP r () -> ReadP r () -> ReadP r ()

    alternateEither1 :: ReadP r () -> ReadP r () -> ReadP r ()
alternateEither1 ReadP r ()
p ReadP r ()
q = ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternate1PQs ReadP r ()
p ReadP r ()
q ReadP r () -> ReadP r () -> ReadP r ()
forall r a. ReadP r a -> ReadP r a -> ReadP r a
+++ ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternate1QsP ReadP r ()
q ReadP r ()
p
    alternateEither :: ReadP r () -> ReadP r () -> ReadP r ()
alternateEither  ReadP r ()
p ReadP r ()
q = ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternateEither1 ReadP r ()
p ReadP r ()
q ReadP r () -> ReadP r () -> ReadP r ()
forall r a. ReadP r a -> ReadP r a -> ReadP r a
+++ () -> ReadP r ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    alternate1PQs :: ReadP r () -> ReadP r () -> ReadP r ()
alternate1PQs    ReadP r ()
p ReadP r ()
q = ReadP r ()
p ReadP r () -> ReadP r () -> ReadP r ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternateQsP ReadP r ()
q ReadP r ()
p
    alternatePQs :: ReadP r () -> ReadP r () -> ReadP r ()
alternatePQs     ReadP r ()
p ReadP r ()
q = ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternate1PQs ReadP r ()
p ReadP r ()
q ReadP r () -> ReadP r () -> ReadP r ()
forall r a. ReadP r a -> ReadP r a -> ReadP r a
+++ () -> ReadP r ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    alternate1QsP :: ReadP r () -> ReadP r () -> ReadP r ()
alternate1QsP    ReadP r ()
q ReadP r ()
p = ReadP r () -> ReadP r [()]
forall r a. ReadP r a -> ReadP r [a]
Parse.many1 ReadP r ()
q ReadP r [()] -> ReadP r () -> ReadP r ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternatePQs ReadP r ()
p ReadP r ()
q
    alternateQsP :: ReadP r () -> ReadP r () -> ReadP r ()
alternateQsP     ReadP r ()
q ReadP r ()
p = ReadP r () -> ReadP r () -> ReadP r ()
forall r. ReadP r () -> ReadP r () -> ReadP r ()
alternate1QsP ReadP r ()
q ReadP r ()
p ReadP r () -> ReadP r () -> ReadP r ()
forall r a. ReadP r a -> ReadP r a -> ReadP r a
+++ () -> ReadP r ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

renderPackageLocationToken :: String -> String
renderPackageLocationToken :: ProjectConfigImport -> ProjectConfigImport
renderPackageLocationToken ProjectConfigImport
s | Bool
needsQuoting = ProjectConfigImport -> ProjectConfigImport
forall a. Show a => a -> ProjectConfigImport
show ProjectConfigImport
s
                             | Bool
otherwise    = ProjectConfigImport
s
  where
    needsQuoting :: Bool
needsQuoting  = Bool -> Bool
not (LineNo -> ProjectConfigImport -> Bool
ok LineNo
0 ProjectConfigImport
s)
                 Bool -> Bool -> Bool
|| ProjectConfigImport
s ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"." -- . on its own on a line has special meaning
                 Bool -> Bool -> Bool
|| LineNo -> ProjectConfigImport -> ProjectConfigImport
forall a. LineNo -> [a] -> [a]
take LineNo
2 ProjectConfigImport
s ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"--" -- on its own line is comment syntax
                 --TODO: [code cleanup] these "." and "--" escaping issues
                 -- ought to be dealt with systematically in ParseUtils.
    ok :: Int -> String -> Bool
    ok :: LineNo -> ProjectConfigImport -> Bool
ok LineNo
n []       = LineNo
n LineNo -> LineNo -> Bool
forall a. Eq a => a -> a -> Bool
== LineNo
0
    ok LineNo
_ (Char
'"':ProjectConfigImport
_)  = Bool
False
    ok LineNo
n (Char
'{':ProjectConfigImport
cs) = LineNo -> ProjectConfigImport -> Bool
ok (LineNo
nLineNo -> LineNo -> LineNo
forall a. Num a => a -> a -> a
+LineNo
1) ProjectConfigImport
cs
    ok LineNo
n (Char
'}':ProjectConfigImport
cs) = LineNo -> ProjectConfigImport -> Bool
ok (LineNo
nLineNo -> LineNo -> LineNo
forall a. Num a => a -> a -> a
-LineNo
1) ProjectConfigImport
cs
    ok LineNo
n (Char
',':ProjectConfigImport
cs) = (LineNo
n LineNo -> LineNo -> Bool
forall a. Ord a => a -> a -> Bool
> LineNo
0) Bool -> Bool -> Bool
&& LineNo -> ProjectConfigImport -> Bool
ok LineNo
n ProjectConfigImport
cs
    ok LineNo
_ (Char
c:ProjectConfigImport
_)
      | Char -> Bool
isSpace Char
c = Bool
False
    ok LineNo
n (Char
_  :ProjectConfigImport
cs) = LineNo -> ProjectConfigImport -> Bool
ok LineNo
n ProjectConfigImport
cs


legacySharedConfigFieldDescrs :: ConstraintSource -> [FieldDescr LegacySharedConfig]
legacySharedConfigFieldDescrs :: ConstraintSource -> [FieldDescr LegacySharedConfig]
legacySharedConfigFieldDescrs ConstraintSource
constraintSrc = [[FieldDescr LegacySharedConfig]]
-> [FieldDescr LegacySharedConfig]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
  [ (LegacySharedConfig -> GlobalFlags)
-> (GlobalFlags -> LegacySharedConfig -> LegacySharedConfig)
-> [FieldDescr GlobalFlags]
-> [FieldDescr LegacySharedConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacySharedConfig -> GlobalFlags
legacyGlobalFlags
      (\GlobalFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyGlobalFlags :: GlobalFlags
legacyGlobalFlags = GlobalFlags
flags })
  ([FieldDescr GlobalFlags] -> [FieldDescr LegacySharedConfig])
-> ([OptionField GlobalFlags] -> [FieldDescr GlobalFlags])
-> [OptionField GlobalFlags]
-> [FieldDescr LegacySharedConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr GlobalFlags]
-> [FieldDescr GlobalFlags] -> [FieldDescr GlobalFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (GlobalFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> GlobalFlags -> GlobalFlags)
-> FieldDescr GlobalFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"extra-prog-path-shared-only"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          (NubList ProjectConfigImport -> [ProjectConfigImport]
forall a. NubList a -> [a]
fromNubList (NubList ProjectConfigImport -> [ProjectConfigImport])
-> (GlobalFlags -> NubList ProjectConfigImport)
-> GlobalFlags
-> [ProjectConfigImport]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GlobalFlags -> NubList ProjectConfigImport
globalProgPathExtra)
          (\[ProjectConfigImport]
v GlobalFlags
conf -> GlobalFlags
conf { globalProgPathExtra :: NubList ProjectConfigImport
globalProgPathExtra = [ProjectConfigImport] -> NubList ProjectConfigImport
forall a. Ord a => [a] -> NubList a
toNubList [ProjectConfigImport]
v })
      ]
  ([FieldDescr GlobalFlags] -> [FieldDescr GlobalFlags])
-> ([OptionField GlobalFlags] -> [FieldDescr GlobalFlags])
-> [OptionField GlobalFlags]
-> [FieldDescr GlobalFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr GlobalFlags] -> [FieldDescr GlobalFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"remote-repo-cache"
      , ProjectConfigImport
"logs-dir", ProjectConfigImport
"store-dir", ProjectConfigImport
"ignore-expiry", ProjectConfigImport
"http-transport"
      , ProjectConfigImport
"active-repositories"
      ]
  ([FieldDescr GlobalFlags] -> [FieldDescr GlobalFlags])
-> ([OptionField GlobalFlags] -> [FieldDescr GlobalFlags])
-> [OptionField GlobalFlags]
-> [FieldDescr GlobalFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField GlobalFlags] -> [FieldDescr GlobalFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField GlobalFlags] -> [FieldDescr LegacySharedConfig])
-> [OptionField GlobalFlags] -> [FieldDescr LegacySharedConfig]
forall a b. (a -> b) -> a -> b
$ CommandUI GlobalFlags
-> ShowOrParseArgs -> [OptionField GlobalFlags]
forall flags.
CommandUI flags -> ShowOrParseArgs -> [OptionField flags]
commandOptions ([Command Any] -> CommandUI GlobalFlags
forall action. [Command action] -> CommandUI GlobalFlags
globalCommand []) ShowOrParseArgs
ParseArgs

  , (LegacySharedConfig -> ConfigFlags)
-> (ConfigFlags -> LegacySharedConfig -> LegacySharedConfig)
-> [FieldDescr ConfigFlags]
-> [FieldDescr LegacySharedConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacySharedConfig -> ConfigFlags
legacyConfigureShFlags
      (\ConfigFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyConfigureShFlags :: ConfigFlags
legacyConfigureShFlags = ConfigFlags
flags })
  ([FieldDescr ConfigFlags] -> [FieldDescr LegacySharedConfig])
-> ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags]
-> [FieldDescr LegacySharedConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr ConfigFlags]
-> [FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (Maybe PackageDB -> Doc)
-> ParsecParser (Maybe PackageDB)
-> (ConfigFlags -> [Maybe PackageDB])
-> ([Maybe PackageDB] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
commaNewLineListFieldParsec ProjectConfigImport
"package-dbs"
        (ProjectConfigImport -> Doc
Disp.text (ProjectConfigImport -> Doc)
-> (Maybe PackageDB -> ProjectConfigImport)
-> Maybe PackageDB
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe PackageDB -> ProjectConfigImport
showPackageDb) ((ProjectConfigImport -> Maybe PackageDB)
-> ParsecParser ProjectConfigImport
-> ParsecParser (Maybe PackageDB)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProjectConfigImport -> Maybe PackageDB
readPackageDb ParsecParser ProjectConfigImport
forall (m :: * -> *). CabalParsing m => m ProjectConfigImport
parsecToken)
        ConfigFlags -> [Maybe PackageDB]
configPackageDBs (\[Maybe PackageDB]
v ConfigFlags
conf -> ConfigFlags
conf { configPackageDBs :: [Maybe PackageDB]
configPackageDBs = [Maybe PackageDB]
v })
      ]
  ([FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags])
-> ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags]
-> [FieldDescr ConfigFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields [ProjectConfigImport
"verbose", ProjectConfigImport
"builddir" ]
  ([FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags])
-> ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags]
-> [FieldDescr ConfigFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField ConfigFlags] -> [FieldDescr LegacySharedConfig])
-> [OptionField ConfigFlags] -> [FieldDescr LegacySharedConfig]
forall a b. (a -> b) -> a -> b
$ ShowOrParseArgs -> [OptionField ConfigFlags]
configureOptions ShowOrParseArgs
ParseArgs

  , (LegacySharedConfig -> ConfigExFlags)
-> (ConfigExFlags -> LegacySharedConfig -> LegacySharedConfig)
-> [FieldDescr ConfigExFlags]
-> [FieldDescr LegacySharedConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacySharedConfig -> ConfigExFlags
legacyConfigureExFlags
      (\ConfigExFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyConfigureExFlags :: ConfigExFlags
legacyConfigureExFlags = ConfigExFlags
flags })
  ([FieldDescr ConfigExFlags] -> [FieldDescr LegacySharedConfig])
-> ([OptionField ConfigExFlags] -> [FieldDescr ConfigExFlags])
-> [OptionField ConfigExFlags]
-> [FieldDescr LegacySharedConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr ConfigExFlags]
-> [FieldDescr ConfigExFlags] -> [FieldDescr ConfigExFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> ((UserConstraint, ConstraintSource) -> Doc)
-> ParsecParser (UserConstraint, ConstraintSource)
-> (ConfigExFlags -> [(UserConstraint, ConstraintSource)])
-> ([(UserConstraint, ConstraintSource)]
    -> ConfigExFlags -> ConfigExFlags)
-> FieldDescr ConfigExFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
commaNewLineListFieldParsec ProjectConfigImport
"constraints"
        (UserConstraint -> Doc
forall a. Pretty a => a -> Doc
pretty (UserConstraint -> Doc)
-> ((UserConstraint, ConstraintSource) -> UserConstraint)
-> (UserConstraint, ConstraintSource)
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UserConstraint, ConstraintSource) -> UserConstraint
forall a b. (a, b) -> a
fst) ((UserConstraint -> (UserConstraint, ConstraintSource))
-> ParsecParser UserConstraint
-> ParsecParser (UserConstraint, ConstraintSource)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\UserConstraint
constraint -> (UserConstraint
constraint, ConstraintSource
constraintSrc)) ParsecParser UserConstraint
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec)
        ConfigExFlags -> [(UserConstraint, ConstraintSource)]
configExConstraints (\[(UserConstraint, ConstraintSource)]
v ConfigExFlags
conf -> ConfigExFlags
conf { configExConstraints :: [(UserConstraint, ConstraintSource)]
configExConstraints = [(UserConstraint, ConstraintSource)]
v })

      , ProjectConfigImport
-> (PackageVersionConstraint -> Doc)
-> ParsecParser PackageVersionConstraint
-> (ConfigExFlags -> [PackageVersionConstraint])
-> ([PackageVersionConstraint] -> ConfigExFlags -> ConfigExFlags)
-> FieldDescr ConfigExFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
commaNewLineListFieldParsec ProjectConfigImport
"preferences"
        PackageVersionConstraint -> Doc
forall a. Pretty a => a -> Doc
pretty ParsecParser PackageVersionConstraint
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec
        ConfigExFlags -> [PackageVersionConstraint]
configPreferences (\[PackageVersionConstraint]
v ConfigExFlags
conf -> ConfigExFlags
conf { configPreferences :: [PackageVersionConstraint]
configPreferences = [PackageVersionConstraint]
v })

      , ProjectConfigImport
-> (Maybe RelaxDeps -> Doc)
-> ParsecParser (Maybe RelaxDeps)
-> (ConfigExFlags -> Maybe RelaxDeps)
-> (Maybe RelaxDeps -> ConfigExFlags -> ConfigExFlags)
-> FieldDescr ConfigExFlags
forall a b.
Monoid a =>
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> a)
-> (a -> b -> b)
-> FieldDescr b
monoidFieldParsec ProjectConfigImport
"allow-older"
        (Doc -> (RelaxDeps -> Doc) -> Maybe RelaxDeps -> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
forall a. Monoid a => a
mempty RelaxDeps -> Doc
forall a. Pretty a => a -> Doc
pretty) ((RelaxDeps -> Maybe RelaxDeps)
-> ParsecParser RelaxDeps -> ParsecParser (Maybe RelaxDeps)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RelaxDeps -> Maybe RelaxDeps
forall a. a -> Maybe a
Just ParsecParser RelaxDeps
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec)
        ((AllowOlder -> RelaxDeps) -> Maybe AllowOlder -> Maybe RelaxDeps
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AllowOlder -> RelaxDeps
unAllowOlder (Maybe AllowOlder -> Maybe RelaxDeps)
-> (ConfigExFlags -> Maybe AllowOlder)
-> ConfigExFlags
-> Maybe RelaxDeps
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConfigExFlags -> Maybe AllowOlder
configAllowOlder)
        (\Maybe RelaxDeps
v ConfigExFlags
conf -> ConfigExFlags
conf { configAllowOlder :: Maybe AllowOlder
configAllowOlder = (RelaxDeps -> AllowOlder) -> Maybe RelaxDeps -> Maybe AllowOlder
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RelaxDeps -> AllowOlder
AllowOlder Maybe RelaxDeps
v })

      , ProjectConfigImport
-> (Maybe RelaxDeps -> Doc)
-> ParsecParser (Maybe RelaxDeps)
-> (ConfigExFlags -> Maybe RelaxDeps)
-> (Maybe RelaxDeps -> ConfigExFlags -> ConfigExFlags)
-> FieldDescr ConfigExFlags
forall a b.
Monoid a =>
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> a)
-> (a -> b -> b)
-> FieldDescr b
monoidFieldParsec ProjectConfigImport
"allow-newer"
        (Doc -> (RelaxDeps -> Doc) -> Maybe RelaxDeps -> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
forall a. Monoid a => a
mempty RelaxDeps -> Doc
forall a. Pretty a => a -> Doc
pretty) ((RelaxDeps -> Maybe RelaxDeps)
-> ParsecParser RelaxDeps -> ParsecParser (Maybe RelaxDeps)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RelaxDeps -> Maybe RelaxDeps
forall a. a -> Maybe a
Just ParsecParser RelaxDeps
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec)
        ((AllowNewer -> RelaxDeps) -> Maybe AllowNewer -> Maybe RelaxDeps
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AllowNewer -> RelaxDeps
unAllowNewer (Maybe AllowNewer -> Maybe RelaxDeps)
-> (ConfigExFlags -> Maybe AllowNewer)
-> ConfigExFlags
-> Maybe RelaxDeps
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConfigExFlags -> Maybe AllowNewer
configAllowNewer)
        (\Maybe RelaxDeps
v ConfigExFlags
conf -> ConfigExFlags
conf { configAllowNewer :: Maybe AllowNewer
configAllowNewer = (RelaxDeps -> AllowNewer) -> Maybe RelaxDeps -> Maybe AllowNewer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RelaxDeps -> AllowNewer
AllowNewer Maybe RelaxDeps
v })
      ]
  ([FieldDescr ConfigExFlags] -> [FieldDescr ConfigExFlags])
-> ([OptionField ConfigExFlags] -> [FieldDescr ConfigExFlags])
-> [OptionField ConfigExFlags]
-> [FieldDescr ConfigExFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr ConfigExFlags] -> [FieldDescr ConfigExFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"cabal-lib-version", ProjectConfigImport
"solver", ProjectConfigImport
"write-ghc-environment-files"
        -- not "constraint" or "preference", we use our own plural ones above
      ]
  ([FieldDescr ConfigExFlags] -> [FieldDescr ConfigExFlags])
-> ([OptionField ConfigExFlags] -> [FieldDescr ConfigExFlags])
-> [OptionField ConfigExFlags]
-> [FieldDescr ConfigExFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField ConfigExFlags] -> [FieldDescr ConfigExFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField ConfigExFlags] -> [FieldDescr LegacySharedConfig])
-> [OptionField ConfigExFlags] -> [FieldDescr LegacySharedConfig]
forall a b. (a -> b) -> a -> b
$ ShowOrParseArgs -> ConstraintSource -> [OptionField ConfigExFlags]
configureExOptions ShowOrParseArgs
ParseArgs ConstraintSource
constraintSrc

  , (LegacySharedConfig -> InstallFlags)
-> (InstallFlags -> LegacySharedConfig -> LegacySharedConfig)
-> [FieldDescr InstallFlags]
-> [FieldDescr LegacySharedConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacySharedConfig -> InstallFlags
legacyInstallFlags
      (\InstallFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyInstallFlags :: InstallFlags
legacyInstallFlags = InstallFlags
flags })
  ([FieldDescr InstallFlags] -> [FieldDescr LegacySharedConfig])
-> ([OptionField InstallFlags] -> [FieldDescr InstallFlags])
-> [OptionField InstallFlags]
-> [FieldDescr LegacySharedConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr InstallFlags]
-> [FieldDescr InstallFlags] -> [FieldDescr InstallFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (PathTemplate -> Doc)
-> ReadP [PathTemplate] PathTemplate
-> (InstallFlags -> [PathTemplate])
-> ([PathTemplate] -> InstallFlags -> InstallFlags)
-> FieldDescr InstallFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"build-summary"
          (ProjectConfigImport -> Doc
showTokenQ (ProjectConfigImport -> Doc)
-> (PathTemplate -> ProjectConfigImport) -> PathTemplate -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PathTemplate -> ProjectConfigImport
fromPathTemplate) ((ProjectConfigImport -> PathTemplate)
-> Parser [PathTemplate] Char ProjectConfigImport
-> ReadP [PathTemplate] PathTemplate
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProjectConfigImport -> PathTemplate
toPathTemplate Parser [PathTemplate] Char ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ)
          (NubList PathTemplate -> [PathTemplate]
forall a. NubList a -> [a]
fromNubList (NubList PathTemplate -> [PathTemplate])
-> (InstallFlags -> NubList PathTemplate)
-> InstallFlags
-> [PathTemplate]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstallFlags -> NubList PathTemplate
installSummaryFile)
          (\[PathTemplate]
v InstallFlags
conf -> InstallFlags
conf { installSummaryFile :: NubList PathTemplate
installSummaryFile = [PathTemplate] -> NubList PathTemplate
forall a. Ord a => [a] -> NubList a
toNubList [PathTemplate]
v })
      ]
  ([FieldDescr InstallFlags] -> [FieldDescr InstallFlags])
-> ([OptionField InstallFlags] -> [FieldDescr InstallFlags])
-> [OptionField InstallFlags]
-> [FieldDescr InstallFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr InstallFlags] -> [FieldDescr InstallFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"doc-index-file"
      , ProjectConfigImport
"root-cmd", ProjectConfigImport
"symlink-bindir"
      , ProjectConfigImport
"build-log"
      , ProjectConfigImport
"remote-build-reporting", ProjectConfigImport
"report-planning-failure"
      , ProjectConfigImport
"jobs", ProjectConfigImport
"keep-going", ProjectConfigImport
"offline", ProjectConfigImport
"per-component"
        -- solver flags:
      , ProjectConfigImport
"max-backjumps", ProjectConfigImport
"reorder-goals", ProjectConfigImport
"count-conflicts"
      , ProjectConfigImport
"fine-grained-conflicts" , ProjectConfigImport
"minimize-conflict-set", ProjectConfigImport
"independent-goals"
      , ProjectConfigImport
"strong-flags" , ProjectConfigImport
"allow-boot-library-installs"
      , ProjectConfigImport
"reject-unconstrained-dependencies", ProjectConfigImport
"index-state"
      ]
  ([FieldDescr InstallFlags] -> [FieldDescr InstallFlags])
-> ([OptionField InstallFlags] -> [FieldDescr InstallFlags])
-> [OptionField InstallFlags]
-> [FieldDescr InstallFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField InstallFlags] -> [FieldDescr InstallFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField InstallFlags] -> [FieldDescr LegacySharedConfig])
-> [OptionField InstallFlags] -> [FieldDescr LegacySharedConfig]
forall a b. (a -> b) -> a -> b
$ ShowOrParseArgs -> [OptionField InstallFlags]
installOptions ShowOrParseArgs
ParseArgs

  , (LegacySharedConfig -> ClientInstallFlags)
-> (ClientInstallFlags -> LegacySharedConfig -> LegacySharedConfig)
-> [FieldDescr ClientInstallFlags]
-> [FieldDescr LegacySharedConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacySharedConfig -> ClientInstallFlags
legacyClientInstallFlags
      (\ClientInstallFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyClientInstallFlags :: ClientInstallFlags
legacyClientInstallFlags = ClientInstallFlags
flags })
  ([FieldDescr ClientInstallFlags]
 -> [FieldDescr LegacySharedConfig])
-> ([OptionField ClientInstallFlags]
    -> [FieldDescr ClientInstallFlags])
-> [OptionField ClientInstallFlags]
-> [FieldDescr LegacySharedConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField ClientInstallFlags] -> [FieldDescr ClientInstallFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField ClientInstallFlags]
 -> [FieldDescr LegacySharedConfig])
-> [OptionField ClientInstallFlags]
-> [FieldDescr LegacySharedConfig]
forall a b. (a -> b) -> a -> b
$ ShowOrParseArgs -> [OptionField ClientInstallFlags]
clientInstallOptions ShowOrParseArgs
ParseArgs

  , (LegacySharedConfig -> ProjectFlags)
-> (ProjectFlags -> LegacySharedConfig -> LegacySharedConfig)
-> [FieldDescr ProjectFlags]
-> [FieldDescr LegacySharedConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacySharedConfig -> ProjectFlags
legacyProjectFlags
      (\ProjectFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyProjectFlags :: ProjectFlags
legacyProjectFlags = ProjectFlags
flags })
  ([FieldDescr ProjectFlags] -> [FieldDescr LegacySharedConfig])
-> ([OptionField ProjectFlags] -> [FieldDescr ProjectFlags])
-> [OptionField ProjectFlags]
-> [FieldDescr LegacySharedConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField ProjectFlags] -> [FieldDescr ProjectFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField ProjectFlags] -> [FieldDescr LegacySharedConfig])
-> [OptionField ProjectFlags] -> [FieldDescr LegacySharedConfig]
forall a b. (a -> b) -> a -> b
$ ShowOrParseArgs -> [OptionField ProjectFlags]
projectFlagsOptions ShowOrParseArgs
ParseArgs

  ]


legacyPackageConfigFieldDescrs :: [FieldDescr LegacyPackageConfig]
legacyPackageConfigFieldDescrs :: [FieldDescr LegacyPackageConfig]
legacyPackageConfigFieldDescrs =
  ( (LegacyPackageConfig -> ConfigFlags)
-> (ConfigFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr ConfigFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags
      (\ConfigFlags
flags LegacyPackageConfig
conf -> LegacyPackageConfig
conf { legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = ConfigFlags
flags })
  ([FieldDescr ConfigFlags] -> [FieldDescr LegacyPackageConfig])
-> ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags]
-> [FieldDescr LegacyPackageConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr ConfigFlags]
-> [FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (ConfigFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"extra-include-dirs"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          ConfigFlags -> [ProjectConfigImport]
configExtraIncludeDirs
          (\[ProjectConfigImport]
v ConfigFlags
conf -> ConfigFlags
conf { configExtraIncludeDirs :: [ProjectConfigImport]
configExtraIncludeDirs = [ProjectConfigImport]
v })
      , ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (ConfigFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"extra-lib-dirs"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          ConfigFlags -> [ProjectConfigImport]
configExtraLibDirs
          (\[ProjectConfigImport]
v ConfigFlags
conf -> ConfigFlags
conf { configExtraLibDirs :: [ProjectConfigImport]
configExtraLibDirs = [ProjectConfigImport]
v })
      , ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (ConfigFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"extra-lib-dirs-static"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          ConfigFlags -> [ProjectConfigImport]
configExtraLibDirsStatic
          (\[ProjectConfigImport]
v ConfigFlags
conf -> ConfigFlags
conf { configExtraLibDirsStatic :: [ProjectConfigImport]
configExtraLibDirsStatic = [ProjectConfigImport]
v })
      , ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (ConfigFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"extra-framework-dirs"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          ConfigFlags -> [ProjectConfigImport]
configExtraFrameworkDirs
          (\[ProjectConfigImport]
v ConfigFlags
conf -> ConfigFlags
conf { configExtraFrameworkDirs :: [ProjectConfigImport]
configExtraFrameworkDirs = [ProjectConfigImport]
v })
      , ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (ConfigFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"extra-prog-path"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          (NubList ProjectConfigImport -> [ProjectConfigImport]
forall a. NubList a -> [a]
fromNubList (NubList ProjectConfigImport -> [ProjectConfigImport])
-> (ConfigFlags -> NubList ProjectConfigImport)
-> ConfigFlags
-> [ProjectConfigImport]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConfigFlags -> NubList ProjectConfigImport
configProgramPathExtra)
          (\[ProjectConfigImport]
v ConfigFlags
conf -> ConfigFlags
conf { configProgramPathExtra :: NubList ProjectConfigImport
configProgramPathExtra = [ProjectConfigImport] -> NubList ProjectConfigImport
forall a. Ord a => [a] -> NubList a
toNubList [ProjectConfigImport]
v })
      , ProjectConfigImport
-> (ProjectConfigImport -> Doc)
-> ReadP [ProjectConfigImport] ProjectConfigImport
-> (ConfigFlags -> [ProjectConfigImport])
-> ([ProjectConfigImport] -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"configure-options"
          ProjectConfigImport -> Doc
showTokenQ ReadP [ProjectConfigImport] ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ
          ConfigFlags -> [ProjectConfigImport]
configConfigureArgs
          (\[ProjectConfigImport]
v ConfigFlags
conf -> ConfigFlags
conf { configConfigureArgs :: [ProjectConfigImport]
configConfigureArgs = [ProjectConfigImport]
v })
      , ProjectConfigImport
-> (FlagAssignment -> Doc)
-> ParsecParser FlagAssignment
-> (ConfigFlags -> FlagAssignment)
-> (FlagAssignment -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> a)
-> (a -> b -> b)
-> FieldDescr b
simpleFieldParsec ProjectConfigImport
"flags"
          FlagAssignment -> Doc
dispFlagAssignment ParsecParser FlagAssignment
forall (m :: * -> *). CabalParsing m => m FlagAssignment
parsecFlagAssignment
          ConfigFlags -> FlagAssignment
configConfigurationsFlags
          (\FlagAssignment
v ConfigFlags
conf -> ConfigFlags
conf { configConfigurationsFlags :: FlagAssignment
configConfigurationsFlags = FlagAssignment
v })
      , FieldDescr ConfigFlags
overrideDumpBuildInfo
      ]
  ([FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags])
-> ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags]
-> [FieldDescr ConfigFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"with-compiler", ProjectConfigImport
"with-hc-pkg"
      , ProjectConfigImport
"program-prefix", ProjectConfigImport
"program-suffix"
      , ProjectConfigImport
"library-vanilla", ProjectConfigImport
"library-profiling"
      , ProjectConfigImport
"shared", ProjectConfigImport
"static", ProjectConfigImport
"executable-dynamic", ProjectConfigImport
"executable-static"
      , ProjectConfigImport
"profiling", ProjectConfigImport
"executable-profiling"
      , ProjectConfigImport
"profiling-detail", ProjectConfigImport
"library-profiling-detail"
      , ProjectConfigImport
"library-for-ghci", ProjectConfigImport
"split-objs", ProjectConfigImport
"split-sections"
      , ProjectConfigImport
"executable-stripping", ProjectConfigImport
"library-stripping"
      , ProjectConfigImport
"tests", ProjectConfigImport
"benchmarks"
      , ProjectConfigImport
"coverage", ProjectConfigImport
"library-coverage"
      , ProjectConfigImport
"relocatable"
        -- not "extra-include-dirs", "extra-lib-dirs", "extra-framework-dirs"
        -- or "extra-prog-path". We use corrected ones above that parse
        -- as list fields.
      ]
  ([FieldDescr ConfigFlags] -> [FieldDescr ConfigFlags])
-> ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags]
-> [FieldDescr ConfigFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ) (ShowOrParseArgs -> [OptionField ConfigFlags]
configureOptions ShowOrParseArgs
ParseArgs)
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++
    (LegacyPackageConfig -> ConfigFlags)
-> (ConfigFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr ConfigFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags
      (\ConfigFlags
flags LegacyPackageConfig
conf -> LegacyPackageConfig
conf { legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = ConfigFlags
flags })
    [ FieldDescr ConfigFlags
overrideFieldCompiler
    , FieldDescr ConfigFlags
overrideFieldOptimization
    , FieldDescr ConfigFlags
overrideFieldDebugInfo
    ]
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++
  ( (LegacyPackageConfig -> InstallFlags)
-> (InstallFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr InstallFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> InstallFlags
legacyInstallPkgFlags
      (\InstallFlags
flags LegacyPackageConfig
conf -> LegacyPackageConfig
conf { legacyInstallPkgFlags :: InstallFlags
legacyInstallPkgFlags = InstallFlags
flags })
  ([FieldDescr InstallFlags] -> [FieldDescr LegacyPackageConfig])
-> ([OptionField InstallFlags] -> [FieldDescr InstallFlags])
-> [OptionField InstallFlags]
-> [FieldDescr LegacyPackageConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr InstallFlags] -> [FieldDescr InstallFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"documentation", ProjectConfigImport
"run-tests"
      ]
  ([FieldDescr InstallFlags] -> [FieldDescr InstallFlags])
-> ([OptionField InstallFlags] -> [FieldDescr InstallFlags])
-> [OptionField InstallFlags]
-> [FieldDescr InstallFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField InstallFlags] -> [FieldDescr InstallFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ) (ShowOrParseArgs -> [OptionField InstallFlags]
installOptions ShowOrParseArgs
ParseArgs)
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++
  ( (LegacyPackageConfig -> HaddockFlags)
-> (HaddockFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr HaddockFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> HaddockFlags
legacyHaddockFlags
      (\HaddockFlags
flags LegacyPackageConfig
conf -> LegacyPackageConfig
conf { legacyHaddockFlags :: HaddockFlags
legacyHaddockFlags = HaddockFlags
flags })
  ([FieldDescr HaddockFlags] -> [FieldDescr LegacyPackageConfig])
-> ([OptionField HaddockFlags] -> [FieldDescr HaddockFlags])
-> [OptionField HaddockFlags]
-> [FieldDescr LegacyPackageConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProjectConfigImport -> ProjectConfigImport)
-> [FieldDescr HaddockFlags] -> [FieldDescr HaddockFlags]
forall a.
(ProjectConfigImport -> ProjectConfigImport)
-> [FieldDescr a] -> [FieldDescr a]
mapFieldNames
      (ProjectConfigImport
"haddock-"ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++)
  ([FieldDescr HaddockFlags] -> [FieldDescr HaddockFlags])
-> ([OptionField HaddockFlags] -> [FieldDescr HaddockFlags])
-> [OptionField HaddockFlags]
-> [FieldDescr HaddockFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr HaddockFlags]
-> [FieldDescr HaddockFlags] -> [FieldDescr HaddockFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (Flag HaddockTarget -> Doc)
-> ParsecParser (Flag HaddockTarget)
-> (HaddockFlags -> Flag HaddockTarget)
-> (Flag HaddockTarget -> HaddockFlags -> HaddockFlags)
-> FieldDescr HaddockFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> a)
-> (a -> b -> b)
-> FieldDescr b
simpleFieldParsec ProjectConfigImport
"for-hackage"
          -- TODO: turn this into a library function
          (Doc -> Flag Doc -> Doc
forall a. a -> Flag a -> a
fromFlagOrDefault Doc
Disp.empty (Flag Doc -> Doc)
-> (Flag HaddockTarget -> Flag Doc) -> Flag HaddockTarget -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HaddockTarget -> Doc) -> Flag HaddockTarget -> Flag Doc
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap HaddockTarget -> Doc
forall a. Pretty a => a -> Doc
pretty) (HaddockTarget -> Flag HaddockTarget
forall a. a -> Flag a
toFlag (HaddockTarget -> Flag HaddockTarget)
-> ParsecParser HaddockTarget -> ParsecParser (Flag HaddockTarget)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecParser HaddockTarget
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec ParsecParser (Flag HaddockTarget)
-> ParsecParser (Flag HaddockTarget)
-> ParsecParser (Flag HaddockTarget)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Flag HaddockTarget -> ParsecParser (Flag HaddockTarget)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Flag HaddockTarget
forall a. Monoid a => a
mempty)
          HaddockFlags -> Flag HaddockTarget
haddockForHackage (\Flag HaddockTarget
v HaddockFlags
conf -> HaddockFlags
conf { haddockForHackage :: Flag HaddockTarget
haddockForHackage = Flag HaddockTarget
v })
      ]
  ([FieldDescr HaddockFlags] -> [FieldDescr HaddockFlags])
-> ([OptionField HaddockFlags] -> [FieldDescr HaddockFlags])
-> [OptionField HaddockFlags]
-> [FieldDescr HaddockFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr HaddockFlags] -> [FieldDescr HaddockFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"hoogle", ProjectConfigImport
"html", ProjectConfigImport
"html-location"
      , ProjectConfigImport
"foreign-libraries"
      , ProjectConfigImport
"executables", ProjectConfigImport
"tests", ProjectConfigImport
"benchmarks", ProjectConfigImport
"all", ProjectConfigImport
"internal", ProjectConfigImport
"css"
      , ProjectConfigImport
"hyperlink-source", ProjectConfigImport
"quickjump", ProjectConfigImport
"hscolour-css"
      , ProjectConfigImport
"contents-location", ProjectConfigImport
"keep-temp-files"
      ]
  ([FieldDescr HaddockFlags] -> [FieldDescr HaddockFlags])
-> ([OptionField HaddockFlags] -> [FieldDescr HaddockFlags])
-> [OptionField HaddockFlags]
-> [FieldDescr HaddockFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField HaddockFlags] -> [FieldDescr HaddockFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ) (ShowOrParseArgs -> [OptionField HaddockFlags]
haddockOptions ShowOrParseArgs
ParseArgs)
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++
  ( (LegacyPackageConfig -> TestFlags)
-> (TestFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr TestFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> TestFlags
legacyTestFlags
      (\TestFlags
flags LegacyPackageConfig
conf -> LegacyPackageConfig
conf { legacyTestFlags :: TestFlags
legacyTestFlags = TestFlags
flags })
  ([FieldDescr TestFlags] -> [FieldDescr LegacyPackageConfig])
-> ([OptionField TestFlags] -> [FieldDescr TestFlags])
-> [OptionField TestFlags]
-> [FieldDescr LegacyPackageConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProjectConfigImport -> ProjectConfigImport)
-> [FieldDescr TestFlags] -> [FieldDescr TestFlags]
forall a.
(ProjectConfigImport -> ProjectConfigImport)
-> [FieldDescr a] -> [FieldDescr a]
mapFieldNames
      ProjectConfigImport -> ProjectConfigImport
prefixTest
  ([FieldDescr TestFlags] -> [FieldDescr TestFlags])
-> ([OptionField TestFlags] -> [FieldDescr TestFlags])
-> [OptionField TestFlags]
-> [FieldDescr TestFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr TestFlags]
-> [FieldDescr TestFlags] -> [FieldDescr TestFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (PathTemplate -> Doc)
-> ReadP [PathTemplate] PathTemplate
-> (TestFlags -> [PathTemplate])
-> ([PathTemplate] -> TestFlags -> TestFlags)
-> FieldDescr TestFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"test-options"
          (ProjectConfigImport -> Doc
showTokenQ (ProjectConfigImport -> Doc)
-> (PathTemplate -> ProjectConfigImport) -> PathTemplate -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PathTemplate -> ProjectConfigImport
fromPathTemplate) ((ProjectConfigImport -> PathTemplate)
-> Parser [PathTemplate] Char ProjectConfigImport
-> ReadP [PathTemplate] PathTemplate
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProjectConfigImport -> PathTemplate
toPathTemplate Parser [PathTemplate] Char ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ)
          TestFlags -> [PathTemplate]
testOptions
          (\[PathTemplate]
v TestFlags
conf -> TestFlags
conf { testOptions :: [PathTemplate]
testOptions = [PathTemplate]
v })
      ]
  ([FieldDescr TestFlags] -> [FieldDescr TestFlags])
-> ([OptionField TestFlags] -> [FieldDescr TestFlags])
-> [OptionField TestFlags]
-> [FieldDescr TestFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr TestFlags] -> [FieldDescr TestFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      [ ProjectConfigImport
"log", ProjectConfigImport
"machine-log", ProjectConfigImport
"show-details", ProjectConfigImport
"keep-tix-files"
      , ProjectConfigImport
"fail-when-no-test-suites", ProjectConfigImport
"test-wrapper" ]
  ([FieldDescr TestFlags] -> [FieldDescr TestFlags])
-> ([OptionField TestFlags] -> [FieldDescr TestFlags])
-> [OptionField TestFlags]
-> [FieldDescr TestFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField TestFlags] -> [FieldDescr TestFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ) (ShowOrParseArgs -> [OptionField TestFlags]
testOptions' ShowOrParseArgs
ParseArgs)
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++
  ( (LegacyPackageConfig -> BenchmarkFlags)
-> (BenchmarkFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr BenchmarkFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> BenchmarkFlags
legacyBenchmarkFlags
      (\BenchmarkFlags
flags LegacyPackageConfig
conf -> LegacyPackageConfig
conf { legacyBenchmarkFlags :: BenchmarkFlags
legacyBenchmarkFlags = BenchmarkFlags
flags })
  ([FieldDescr BenchmarkFlags] -> [FieldDescr LegacyPackageConfig])
-> ([OptionField BenchmarkFlags] -> [FieldDescr BenchmarkFlags])
-> [OptionField BenchmarkFlags]
-> [FieldDescr LegacyPackageConfig]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FieldDescr BenchmarkFlags]
-> [FieldDescr BenchmarkFlags] -> [FieldDescr BenchmarkFlags]
forall a. [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields
      [ ProjectConfigImport
-> (PathTemplate -> Doc)
-> ReadP [PathTemplate] PathTemplate
-> (BenchmarkFlags -> [PathTemplate])
-> ([PathTemplate] -> BenchmarkFlags -> BenchmarkFlags)
-> FieldDescr BenchmarkFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ReadP [a] a
-> (b -> [a])
-> ([a] -> b -> b)
-> FieldDescr b
newLineListField ProjectConfigImport
"benchmark-options"
          (ProjectConfigImport -> Doc
showTokenQ (ProjectConfigImport -> Doc)
-> (PathTemplate -> ProjectConfigImport) -> PathTemplate -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PathTemplate -> ProjectConfigImport
fromPathTemplate) ((ProjectConfigImport -> PathTemplate)
-> Parser [PathTemplate] Char ProjectConfigImport
-> ReadP [PathTemplate] PathTemplate
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProjectConfigImport -> PathTemplate
toPathTemplate Parser [PathTemplate] Char ProjectConfigImport
forall r. ReadP r ProjectConfigImport
parseTokenQ)
          BenchmarkFlags -> [PathTemplate]
benchmarkOptions
          (\[PathTemplate]
v BenchmarkFlags
conf -> BenchmarkFlags
conf { benchmarkOptions :: [PathTemplate]
benchmarkOptions = [PathTemplate]
v })
      ]
  ([FieldDescr BenchmarkFlags] -> [FieldDescr BenchmarkFlags])
-> ([OptionField BenchmarkFlags] -> [FieldDescr BenchmarkFlags])
-> [OptionField BenchmarkFlags]
-> [FieldDescr BenchmarkFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ProjectConfigImport]
-> [FieldDescr BenchmarkFlags] -> [FieldDescr BenchmarkFlags]
forall a. [ProjectConfigImport] -> [FieldDescr a] -> [FieldDescr a]
filterFields
      []
  ([FieldDescr BenchmarkFlags] -> [FieldDescr BenchmarkFlags])
-> ([OptionField BenchmarkFlags] -> [FieldDescr BenchmarkFlags])
-> [OptionField BenchmarkFlags]
-> [FieldDescr BenchmarkFlags]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OptionField BenchmarkFlags] -> [FieldDescr BenchmarkFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ) (ShowOrParseArgs -> [OptionField BenchmarkFlags]
benchmarkOptions' ShowOrParseArgs
ParseArgs)


  where
    overrideFieldCompiler :: FieldDescr ConfigFlags
overrideFieldCompiler =
      ProjectConfigImport
-> (Flag CompilerFlavor -> Doc)
-> ParsecParser (Flag CompilerFlavor)
-> (ConfigFlags -> Flag CompilerFlavor)
-> (Flag CompilerFlavor -> ConfigFlags -> ConfigFlags)
-> FieldDescr ConfigFlags
forall a b.
ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> a)
-> (a -> b -> b)
-> FieldDescr b
simpleFieldParsec ProjectConfigImport
"compiler"
        (Doc -> Flag Doc -> Doc
forall a. a -> Flag a -> a
fromFlagOrDefault Doc
Disp.empty (Flag Doc -> Doc)
-> (Flag CompilerFlavor -> Flag Doc) -> Flag CompilerFlavor -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CompilerFlavor -> Doc) -> Flag CompilerFlavor -> Flag Doc
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CompilerFlavor -> Doc
forall a. Pretty a => a -> Doc
pretty)
        (CompilerFlavor -> Flag CompilerFlavor
forall a. a -> Flag a
toFlag (CompilerFlavor -> Flag CompilerFlavor)
-> ParsecParser CompilerFlavor
-> ParsecParser (Flag CompilerFlavor)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecParser CompilerFlavor
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
parsec ParsecParser (Flag CompilerFlavor)
-> ParsecParser (Flag CompilerFlavor)
-> ParsecParser (Flag CompilerFlavor)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Flag CompilerFlavor -> ParsecParser (Flag CompilerFlavor)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Flag CompilerFlavor
forall a. Monoid a => a
mempty)
        ConfigFlags -> Flag CompilerFlavor
configHcFlavor (\Flag CompilerFlavor
v ConfigFlags
flags -> ConfigFlags
flags { configHcFlavor :: Flag CompilerFlavor
configHcFlavor = Flag CompilerFlavor
v })

    overrideDumpBuildInfo :: FieldDescr ConfigFlags
overrideDumpBuildInfo =
      (ConfigFlags -> Flag DumpBuildInfo)
-> (Flag DumpBuildInfo -> ConfigFlags -> ConfigFlags)
-> FieldDescr (Flag DumpBuildInfo)
-> FieldDescr ConfigFlags
forall b a.
(b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
liftField ConfigFlags -> Flag DumpBuildInfo
configDumpBuildInfo
                (\Flag DumpBuildInfo
v ConfigFlags
flags -> ConfigFlags
flags { configDumpBuildInfo :: Flag DumpBuildInfo
configDumpBuildInfo = Flag DumpBuildInfo
v }) (FieldDescr (Flag DumpBuildInfo) -> FieldDescr ConfigFlags)
-> FieldDescr (Flag DumpBuildInfo) -> FieldDescr ConfigFlags
forall a b. (a -> b) -> a -> b
$
      let name :: ProjectConfigImport
name = ProjectConfigImport
"build-info" in
      ProjectConfigImport
-> (Flag DumpBuildInfo -> Doc)
-> (LineNo
    -> ProjectConfigImport
    -> Flag DumpBuildInfo
    -> ParseResult (Flag DumpBuildInfo))
-> FieldDescr (Flag DumpBuildInfo)
forall a.
ProjectConfigImport
-> (a -> Doc)
-> (LineNo -> ProjectConfigImport -> a -> ParseResult a)
-> FieldDescr a
FieldDescr ProjectConfigImport
name
        (\Flag DumpBuildInfo
f -> case Flag DumpBuildInfo
f of
                 Flag DumpBuildInfo
NoDumpBuildInfo -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"False"
                 Flag DumpBuildInfo
DumpBuildInfo   -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"True"
                 Flag DumpBuildInfo
_                    -> Doc
Disp.empty)
        (\LineNo
line ProjectConfigImport
str Flag DumpBuildInfo
_ -> case () of
         ()
_ |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"False" -> [PWarning]
-> Flag DumpBuildInfo -> ParseResult (Flag DumpBuildInfo)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DumpBuildInfo -> Flag DumpBuildInfo
forall a. a -> Flag a
Flag DumpBuildInfo
NoDumpBuildInfo)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"True"  -> [PWarning]
-> Flag DumpBuildInfo -> ParseResult (Flag DumpBuildInfo)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DumpBuildInfo -> Flag DumpBuildInfo
forall a. a -> Flag a
Flag DumpBuildInfo
DumpBuildInfo)
           | ProjectConfigImport
lstr ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"false" -> [PWarning]
-> Flag DumpBuildInfo -> ParseResult (Flag DumpBuildInfo)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name] (DumpBuildInfo -> Flag DumpBuildInfo
forall a. a -> Flag a
Flag DumpBuildInfo
NoDumpBuildInfo)
           | ProjectConfigImport
lstr ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"true"  -> [PWarning]
-> Flag DumpBuildInfo -> ParseResult (Flag DumpBuildInfo)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name] (DumpBuildInfo -> Flag DumpBuildInfo
forall a. a -> Flag a
Flag DumpBuildInfo
DumpBuildInfo)
           | Bool
otherwise       -> PError -> ParseResult (Flag DumpBuildInfo)
forall a. PError -> ParseResult a
ParseFailed (ProjectConfigImport -> LineNo -> PError
NoParse ProjectConfigImport
name LineNo
line)
           where
             lstr :: ProjectConfigImport
lstr = ProjectConfigImport -> ProjectConfigImport
lowercase ProjectConfigImport
str)

    -- TODO: [code cleanup] The following is a hack. The "optimization" and
    -- "debug-info" fields are OptArg, and viewAsFieldDescr fails on that.
    -- Instead of a hand-written parser and printer, we should handle this case
    -- properly in the library.

    overrideFieldOptimization :: FieldDescr ConfigFlags
overrideFieldOptimization =
      (ConfigFlags -> Flag OptimisationLevel)
-> (Flag OptimisationLevel -> ConfigFlags -> ConfigFlags)
-> FieldDescr (Flag OptimisationLevel)
-> FieldDescr ConfigFlags
forall b a.
(b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
liftField ConfigFlags -> Flag OptimisationLevel
configOptimization
                (\Flag OptimisationLevel
v ConfigFlags
flags -> ConfigFlags
flags { configOptimization :: Flag OptimisationLevel
configOptimization = Flag OptimisationLevel
v }) (FieldDescr (Flag OptimisationLevel) -> FieldDescr ConfigFlags)
-> FieldDescr (Flag OptimisationLevel) -> FieldDescr ConfigFlags
forall a b. (a -> b) -> a -> b
$
      let name :: ProjectConfigImport
name = ProjectConfigImport
"optimization" in
      ProjectConfigImport
-> (Flag OptimisationLevel -> Doc)
-> (LineNo
    -> ProjectConfigImport
    -> Flag OptimisationLevel
    -> ParseResult (Flag OptimisationLevel))
-> FieldDescr (Flag OptimisationLevel)
forall a.
ProjectConfigImport
-> (a -> Doc)
-> (LineNo -> ProjectConfigImport -> a -> ParseResult a)
-> FieldDescr a
FieldDescr ProjectConfigImport
name
        (\Flag OptimisationLevel
f -> case Flag OptimisationLevel
f of
                 Flag OptimisationLevel
NoOptimisation      -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"False"
                 Flag OptimisationLevel
NormalOptimisation  -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"True"
                 Flag OptimisationLevel
MaximumOptimisation -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"2"
                 Flag OptimisationLevel
_                        -> Doc
Disp.empty)
        (\LineNo
line ProjectConfigImport
str Flag OptimisationLevel
_ -> case () of
         ()
_ |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"False" -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
NoOptimisation)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"True"  -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
NormalOptimisation)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"0"     -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
NoOptimisation)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"1"     -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
NormalOptimisation)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"2"     -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
MaximumOptimisation)
           | ProjectConfigImport
lstr ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"false" -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
NoOptimisation)
           | ProjectConfigImport
lstr ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"true"  -> [PWarning]
-> Flag OptimisationLevel -> ParseResult (Flag OptimisationLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name] (OptimisationLevel -> Flag OptimisationLevel
forall a. a -> Flag a
Flag OptimisationLevel
NormalOptimisation)
           | Bool
otherwise       -> PError -> ParseResult (Flag OptimisationLevel)
forall a. PError -> ParseResult a
ParseFailed (ProjectConfigImport -> LineNo -> PError
NoParse ProjectConfigImport
name LineNo
line)
           where
             lstr :: ProjectConfigImport
lstr = ProjectConfigImport -> ProjectConfigImport
lowercase ProjectConfigImport
str)

    overrideFieldDebugInfo :: FieldDescr ConfigFlags
overrideFieldDebugInfo =
      (ConfigFlags -> Flag DebugInfoLevel)
-> (Flag DebugInfoLevel -> ConfigFlags -> ConfigFlags)
-> FieldDescr (Flag DebugInfoLevel)
-> FieldDescr ConfigFlags
forall b a.
(b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
liftField ConfigFlags -> Flag DebugInfoLevel
configDebugInfo (\Flag DebugInfoLevel
v ConfigFlags
flags -> ConfigFlags
flags { configDebugInfo :: Flag DebugInfoLevel
configDebugInfo = Flag DebugInfoLevel
v }) (FieldDescr (Flag DebugInfoLevel) -> FieldDescr ConfigFlags)
-> FieldDescr (Flag DebugInfoLevel) -> FieldDescr ConfigFlags
forall a b. (a -> b) -> a -> b
$
      let name :: ProjectConfigImport
name = ProjectConfigImport
"debug-info" in
      ProjectConfigImport
-> (Flag DebugInfoLevel -> Doc)
-> (LineNo
    -> ProjectConfigImport
    -> Flag DebugInfoLevel
    -> ParseResult (Flag DebugInfoLevel))
-> FieldDescr (Flag DebugInfoLevel)
forall a.
ProjectConfigImport
-> (a -> Doc)
-> (LineNo -> ProjectConfigImport -> a -> ParseResult a)
-> FieldDescr a
FieldDescr ProjectConfigImport
name
        (\Flag DebugInfoLevel
f -> case Flag DebugInfoLevel
f of
                 Flag DebugInfoLevel
NoDebugInfo      -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"False"
                 Flag DebugInfoLevel
MinimalDebugInfo -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"1"
                 Flag DebugInfoLevel
NormalDebugInfo  -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"True"
                 Flag DebugInfoLevel
MaximalDebugInfo -> ProjectConfigImport -> Doc
Disp.text ProjectConfigImport
"3"
                 Flag DebugInfoLevel
_                     -> Doc
Disp.empty)
        (\LineNo
line ProjectConfigImport
str Flag DebugInfoLevel
_ -> case () of
         ()
_ |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"False" -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
NoDebugInfo)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"True"  -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
NormalDebugInfo)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"0"     -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
NoDebugInfo)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"1"     -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
MinimalDebugInfo)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"2"     -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
NormalDebugInfo)
           |  ProjectConfigImport
str ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"3"     -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
MaximalDebugInfo)
           | ProjectConfigImport
lstr ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"false" -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
NoDebugInfo)
           | ProjectConfigImport
lstr ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
== ProjectConfigImport
"true"  -> [PWarning]
-> Flag DebugInfoLevel -> ParseResult (Flag DebugInfoLevel)
forall a. [PWarning] -> a -> ParseResult a
ParseOk [ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name] (DebugInfoLevel -> Flag DebugInfoLevel
forall a. a -> Flag a
Flag DebugInfoLevel
NormalDebugInfo)
           | Bool
otherwise       -> PError -> ParseResult (Flag DebugInfoLevel)
forall a. PError -> ParseResult a
ParseFailed (ProjectConfigImport -> LineNo -> PError
NoParse ProjectConfigImport
name LineNo
line)
           where
             lstr :: ProjectConfigImport
lstr = ProjectConfigImport -> ProjectConfigImport
lowercase ProjectConfigImport
str)

    caseWarning :: ProjectConfigImport -> PWarning
caseWarning ProjectConfigImport
name = ProjectConfigImport -> PWarning
PWarning (ProjectConfigImport -> PWarning)
-> ProjectConfigImport -> PWarning
forall a b. (a -> b) -> a -> b
$
      ProjectConfigImport
"The '" ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
name ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
"' field is case sensitive, use 'True' or 'False'."

    prefixTest :: ProjectConfigImport -> ProjectConfigImport
prefixTest ProjectConfigImport
name | ProjectConfigImport
"test-" ProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` ProjectConfigImport
name = ProjectConfigImport
name
                    | Bool
otherwise = ProjectConfigImport
"test-" ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
name


legacyPackageConfigFGSectionDescrs
    :: ( FieldGrammar c g, Applicative (g SourceRepoList)
       , c (Identity RepoType)
       , c (List NoCommaFSep FilePathNT String)
       , c (NonEmpty' NoCommaFSep Token String)
       )
    => [FGSectionDescr g LegacyProjectConfig]
legacyPackageConfigFGSectionDescrs :: [FGSectionDescr g LegacyProjectConfig]
legacyPackageConfigFGSectionDescrs =
    [ FGSectionDescr g LegacyProjectConfig
forall (c :: * -> Constraint) (g :: * -> * -> *).
(FieldGrammar c g, Applicative (g SourceRepoList),
 c (Identity RepoType),
 c (List NoCommaFSep FilePathNT ProjectConfigImport),
 c (NonEmpty' NoCommaFSep Token ProjectConfigImport)) =>
FGSectionDescr g LegacyProjectConfig
packageRepoSectionDescr
    ]

legacyPackageConfigSectionDescrs :: [SectionDescr LegacyProjectConfig]
legacyPackageConfigSectionDescrs :: [SectionDescr LegacyProjectConfig]
legacyPackageConfigSectionDescrs =
    [ SectionDescr LegacyProjectConfig
packageSpecificOptionsSectionDescr
    , (LegacyProjectConfig -> LegacyPackageConfig)
-> (LegacyPackageConfig
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> SectionDescr LegacyPackageConfig
-> SectionDescr LegacyProjectConfig
forall b a.
(b -> a) -> (a -> b -> b) -> SectionDescr a -> SectionDescr b
liftSection
        LegacyProjectConfig -> LegacyPackageConfig
legacyLocalConfig
        (\LegacyPackageConfig
flags LegacyProjectConfig
conf -> LegacyProjectConfig
conf { legacyLocalConfig :: LegacyPackageConfig
legacyLocalConfig = LegacyPackageConfig
flags })
        SectionDescr LegacyPackageConfig
programOptionsSectionDescr
    , (LegacyProjectConfig -> LegacyPackageConfig)
-> (LegacyPackageConfig
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> SectionDescr LegacyPackageConfig
-> SectionDescr LegacyProjectConfig
forall b a.
(b -> a) -> (a -> b -> b) -> SectionDescr a -> SectionDescr b
liftSection
        LegacyProjectConfig -> LegacyPackageConfig
legacyLocalConfig
        (\LegacyPackageConfig
flags LegacyProjectConfig
conf -> LegacyProjectConfig
conf { legacyLocalConfig :: LegacyPackageConfig
legacyLocalConfig = LegacyPackageConfig
flags })
        SectionDescr LegacyPackageConfig
programLocationsSectionDescr
    , (LegacyProjectConfig -> LegacySharedConfig)
-> (LegacySharedConfig
    -> LegacyProjectConfig -> LegacyProjectConfig)
-> SectionDescr LegacySharedConfig
-> SectionDescr LegacyProjectConfig
forall b a.
(b -> a) -> (a -> b -> b) -> SectionDescr a -> SectionDescr b
liftSection
        LegacyProjectConfig -> LegacySharedConfig
legacySharedConfig
        (\LegacySharedConfig
flags LegacyProjectConfig
conf -> LegacyProjectConfig
conf { legacySharedConfig :: LegacySharedConfig
legacySharedConfig = LegacySharedConfig
flags }) (SectionDescr LegacySharedConfig
 -> SectionDescr LegacyProjectConfig)
-> SectionDescr LegacySharedConfig
-> SectionDescr LegacyProjectConfig
forall a b. (a -> b) -> a -> b
$
      (LegacySharedConfig -> GlobalFlags)
-> (GlobalFlags -> LegacySharedConfig -> LegacySharedConfig)
-> SectionDescr GlobalFlags
-> SectionDescr LegacySharedConfig
forall b a.
(b -> a) -> (a -> b -> b) -> SectionDescr a -> SectionDescr b
liftSection
        LegacySharedConfig -> GlobalFlags
legacyGlobalFlags
        (\GlobalFlags
flags LegacySharedConfig
conf -> LegacySharedConfig
conf { legacyGlobalFlags :: GlobalFlags
legacyGlobalFlags = GlobalFlags
flags })
        SectionDescr GlobalFlags
remoteRepoSectionDescr
    ]

packageRepoSectionDescr
    :: ( FieldGrammar c g, Applicative (g SourceRepoList)
       , c (Identity RepoType)
       , c (List NoCommaFSep FilePathNT String)
       , c (NonEmpty' NoCommaFSep Token String)
       )
    => FGSectionDescr g LegacyProjectConfig
packageRepoSectionDescr :: FGSectionDescr g LegacyProjectConfig
packageRepoSectionDescr = FGSectionDescr :: forall (g :: * -> * -> *) a s.
ProjectConfigImport
-> g s s
-> (a -> [(ProjectConfigImport, s)])
-> (LineNo -> ProjectConfigImport -> s -> a -> ParseResult a)
-> FGSectionDescr g a
FGSectionDescr
  { fgSectionName :: ProjectConfigImport
fgSectionName        = ProjectConfigImport
"source-repository-package"
  , fgSectionGrammar :: g SourceRepoList SourceRepoList
fgSectionGrammar     = g SourceRepoList SourceRepoList
forall (c :: * -> Constraint) (g :: * -> * -> *).
(FieldGrammar c g, Applicative (g SourceRepoList),
 c (Identity RepoType),
 c (List NoCommaFSep FilePathNT ProjectConfigImport),
 c (NonEmpty' NoCommaFSep Token ProjectConfigImport)) =>
g SourceRepoList SourceRepoList
sourceRepositoryPackageGrammar
  , fgSectionGet :: LegacyProjectConfig -> [(ProjectConfigImport, SourceRepoList)]
fgSectionGet         = (SourceRepoList -> (ProjectConfigImport, SourceRepoList))
-> [SourceRepoList] -> [(ProjectConfigImport, SourceRepoList)]
forall a b. (a -> b) -> [a] -> [b]
map (\SourceRepoList
x->(ProjectConfigImport
"", SourceRepoList
x)) ([SourceRepoList] -> [(ProjectConfigImport, SourceRepoList)])
-> (LegacyProjectConfig -> [SourceRepoList])
-> LegacyProjectConfig
-> [(ProjectConfigImport, SourceRepoList)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LegacyProjectConfig -> [SourceRepoList]
legacyPackagesRepo
  , fgSectionSet :: LineNo
-> ProjectConfigImport
-> SourceRepoList
-> LegacyProjectConfig
-> ParseResult LegacyProjectConfig
fgSectionSet         =
        \LineNo
lineno ProjectConfigImport
unused SourceRepoList
pkgrepo LegacyProjectConfig
projconf -> do
          Bool -> ParseResult () -> ParseResult ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (ProjectConfigImport -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ProjectConfigImport
unused) (ParseResult () -> ParseResult ())
-> ParseResult () -> ParseResult ()
forall a b. (a -> b) -> a -> b
$
            LineNo -> ProjectConfigImport -> ParseResult ()
forall a. LineNo -> ProjectConfigImport -> ParseResult a
syntaxError LineNo
lineno ProjectConfigImport
"the section 'source-repository-package' takes no arguments"
          LegacyProjectConfig -> ParseResult LegacyProjectConfig
forall (m :: * -> *) a. Monad m => a -> m a
return LegacyProjectConfig
projconf {
            legacyPackagesRepo :: [SourceRepoList]
legacyPackagesRepo = LegacyProjectConfig -> [SourceRepoList]
legacyPackagesRepo LegacyProjectConfig
projconf [SourceRepoList] -> [SourceRepoList] -> [SourceRepoList]
forall a. [a] -> [a] -> [a]
++ [SourceRepoList
pkgrepo]
          }
  }

-- | The definitions of all the fields that can appear in the @package pkgfoo@
-- and @package *@ sections of the @cabal.project@-format files.
--
packageSpecificOptionsFieldDescrs :: [FieldDescr LegacyPackageConfig]
packageSpecificOptionsFieldDescrs :: [FieldDescr LegacyPackageConfig]
packageSpecificOptionsFieldDescrs =
    [FieldDescr LegacyPackageConfig]
legacyPackageConfigFieldDescrs
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++ (LegacyPackageConfig
 -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])]
    -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr LegacyPackageConfig]
forall a.
(a -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])] -> a -> a)
-> [FieldDescr a]
programOptionsFieldDescrs
      (ConfigFlags -> [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs (ConfigFlags -> [(ProjectConfigImport, [ProjectConfigImport])])
-> (LegacyPackageConfig -> ConfigFlags)
-> LegacyPackageConfig
-> [(ProjectConfigImport, [ProjectConfigImport])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags)
      (\[(ProjectConfigImport, [ProjectConfigImport])]
args LegacyPackageConfig
pkgconf -> LegacyPackageConfig
pkgconf {
          legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = (LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags LegacyPackageConfig
pkgconf) {
            configProgramArgs :: [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs  = [(ProjectConfigImport, [ProjectConfigImport])]
args
          }
        }
      )
 [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
-> [FieldDescr LegacyPackageConfig]
forall a. [a] -> [a] -> [a]
++ (LegacyPackageConfig -> ConfigFlags)
-> (ConfigFlags -> LegacyPackageConfig -> LegacyPackageConfig)
-> [FieldDescr ConfigFlags]
-> [FieldDescr LegacyPackageConfig]
forall b a.
(b -> a) -> (a -> b -> b) -> [FieldDescr a] -> [FieldDescr b]
liftFields
      LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags
      (\ConfigFlags
flags LegacyPackageConfig
pkgconf -> LegacyPackageConfig
pkgconf {
          legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = ConfigFlags
flags
        }
      )
      [FieldDescr ConfigFlags]
programLocationsFieldDescrs

-- | The definition of the @package pkgfoo@ sections of the @cabal.project@-format
-- files. This section is per-package name. The special package @*@ applies to all
-- packages used anywhere by the project, locally or as dependencies.
--
packageSpecificOptionsSectionDescr :: SectionDescr LegacyProjectConfig
packageSpecificOptionsSectionDescr :: SectionDescr LegacyProjectConfig
packageSpecificOptionsSectionDescr =
    SectionDescr :: forall a b.
ProjectConfigImport
-> [FieldDescr b]
-> [SectionDescr b]
-> (a -> [(ProjectConfigImport, b)])
-> (LineNo -> ProjectConfigImport -> b -> a -> ParseResult a)
-> b
-> SectionDescr a
SectionDescr {
      sectionName :: ProjectConfigImport
sectionName        = ProjectConfigImport
"package",
      sectionFields :: [FieldDescr LegacyPackageConfig]
sectionFields      = [FieldDescr LegacyPackageConfig]
packageSpecificOptionsFieldDescrs,
      sectionSubsections :: [SectionDescr LegacyPackageConfig]
sectionSubsections = [],
      sectionGet :: LegacyProjectConfig -> [(ProjectConfigImport, LegacyPackageConfig)]
sectionGet         = \LegacyProjectConfig
projconf ->
                             [ (PackageName -> ProjectConfigImport
forall a. Pretty a => a -> ProjectConfigImport
prettyShow PackageName
pkgname, LegacyPackageConfig
pkgconf)
                             | (PackageName
pkgname, LegacyPackageConfig
pkgconf) <-
                                 Map PackageName LegacyPackageConfig
-> [(PackageName, LegacyPackageConfig)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map PackageName LegacyPackageConfig
 -> [(PackageName, LegacyPackageConfig)])
-> (LegacyProjectConfig -> Map PackageName LegacyPackageConfig)
-> LegacyProjectConfig
-> [(PackageName, LegacyPackageConfig)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MapMappend PackageName LegacyPackageConfig
-> Map PackageName LegacyPackageConfig
forall k v. MapMappend k v -> Map k v
getMapMappend
                               (MapMappend PackageName LegacyPackageConfig
 -> Map PackageName LegacyPackageConfig)
-> (LegacyProjectConfig
    -> MapMappend PackageName LegacyPackageConfig)
-> LegacyProjectConfig
-> Map PackageName LegacyPackageConfig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LegacyProjectConfig -> MapMappend PackageName LegacyPackageConfig
legacySpecificConfig (LegacyProjectConfig -> [(PackageName, LegacyPackageConfig)])
-> LegacyProjectConfig -> [(PackageName, LegacyPackageConfig)]
forall a b. (a -> b) -> a -> b
$ LegacyProjectConfig
projconf ]
                          [(ProjectConfigImport, LegacyPackageConfig)]
-> [(ProjectConfigImport, LegacyPackageConfig)]
-> [(ProjectConfigImport, LegacyPackageConfig)]
forall a. [a] -> [a] -> [a]
++ [ (ProjectConfigImport
"*", LegacyProjectConfig -> LegacyPackageConfig
legacyAllConfig LegacyProjectConfig
projconf) ],
      sectionSet :: LineNo
-> ProjectConfigImport
-> LegacyPackageConfig
-> LegacyProjectConfig
-> ParseResult LegacyProjectConfig
sectionSet         =
        \LineNo
lineno ProjectConfigImport
pkgnamestr LegacyPackageConfig
pkgconf LegacyProjectConfig
projconf -> case ProjectConfigImport
pkgnamestr of
          ProjectConfigImport
"*" -> LegacyProjectConfig -> ParseResult LegacyProjectConfig
forall (m :: * -> *) a. Monad m => a -> m a
return LegacyProjectConfig
projconf {
                   legacyAllConfig :: LegacyPackageConfig
legacyAllConfig = LegacyProjectConfig -> LegacyPackageConfig
legacyAllConfig LegacyProjectConfig
projconf LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
forall a. Semigroup a => a -> a -> a
<> LegacyPackageConfig
pkgconf
                 }
          ProjectConfigImport
_   -> do
            PackageName
pkgname <- case ProjectConfigImport -> Maybe PackageName
forall a. Parsec a => ProjectConfigImport -> Maybe a
simpleParsec ProjectConfigImport
pkgnamestr of
              Just PackageName
pkgname -> PackageName -> ParseResult PackageName
forall (m :: * -> *) a. Monad m => a -> m a
return PackageName
pkgname
              Maybe PackageName
Nothing      -> LineNo -> ProjectConfigImport -> ParseResult PackageName
forall a. LineNo -> ProjectConfigImport -> ParseResult a
syntaxError LineNo
lineno (ProjectConfigImport -> ParseResult PackageName)
-> ProjectConfigImport -> ParseResult PackageName
forall a b. (a -> b) -> a -> b
$
                                  ProjectConfigImport
"a 'package' section requires a package name "
                               ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
"as an argument"
            LegacyProjectConfig -> ParseResult LegacyProjectConfig
forall (m :: * -> *) a. Monad m => a -> m a
return LegacyProjectConfig
projconf {
              legacySpecificConfig :: MapMappend PackageName LegacyPackageConfig
legacySpecificConfig =
                Map PackageName LegacyPackageConfig
-> MapMappend PackageName LegacyPackageConfig
forall k v. Map k v -> MapMappend k v
MapMappend (Map PackageName LegacyPackageConfig
 -> MapMappend PackageName LegacyPackageConfig)
-> Map PackageName LegacyPackageConfig
-> MapMappend PackageName LegacyPackageConfig
forall a b. (a -> b) -> a -> b
$
                (LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig)
-> PackageName
-> LegacyPackageConfig
-> Map PackageName LegacyPackageConfig
-> Map PackageName LegacyPackageConfig
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith LegacyPackageConfig -> LegacyPackageConfig -> LegacyPackageConfig
forall a. Monoid a => a -> a -> a
mappend PackageName
pkgname LegacyPackageConfig
pkgconf
                               (MapMappend PackageName LegacyPackageConfig
-> Map PackageName LegacyPackageConfig
forall k v. MapMappend k v -> Map k v
getMapMappend (MapMappend PackageName LegacyPackageConfig
 -> Map PackageName LegacyPackageConfig)
-> MapMappend PackageName LegacyPackageConfig
-> Map PackageName LegacyPackageConfig
forall a b. (a -> b) -> a -> b
$ LegacyProjectConfig -> MapMappend PackageName LegacyPackageConfig
legacySpecificConfig LegacyProjectConfig
projconf)
            },
      sectionEmpty :: LegacyPackageConfig
sectionEmpty       = LegacyPackageConfig
forall a. Monoid a => a
mempty
    }

programOptionsFieldDescrs :: (a -> [(String, [String])])
                          -> ([(String, [String])] -> a -> a)
                          -> [FieldDescr a]
programOptionsFieldDescrs :: (a -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])] -> a -> a)
-> [FieldDescr a]
programOptionsFieldDescrs a -> [(ProjectConfigImport, [ProjectConfigImport])]
get' [(ProjectConfigImport, [ProjectConfigImport])] -> a -> a
set =
    [OptionField a] -> [FieldDescr a]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
  ([OptionField a] -> [FieldDescr a])
-> [OptionField a] -> [FieldDescr a]
forall a b. (a -> b) -> a -> b
$ ProgramDb
-> ShowOrParseArgs
-> (a -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])] -> a -> a)
-> [OptionField a]
forall flags.
ProgramDb
-> ShowOrParseArgs
-> (flags -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])]
    -> flags -> flags)
-> [OptionField flags]
programDbOptions
      ProgramDb
defaultProgramDb
      ShowOrParseArgs
ParseArgs a -> [(ProjectConfigImport, [ProjectConfigImport])]
get' [(ProjectConfigImport, [ProjectConfigImport])] -> a -> a
set

programOptionsSectionDescr :: SectionDescr LegacyPackageConfig
programOptionsSectionDescr :: SectionDescr LegacyPackageConfig
programOptionsSectionDescr =
    SectionDescr :: forall a b.
ProjectConfigImport
-> [FieldDescr b]
-> [SectionDescr b]
-> (a -> [(ProjectConfigImport, b)])
-> (LineNo -> ProjectConfigImport -> b -> a -> ParseResult a)
-> b
-> SectionDescr a
SectionDescr {
      sectionName :: ProjectConfigImport
sectionName        = ProjectConfigImport
"program-options",
      sectionFields :: [FieldDescr ConfigFlags]
sectionFields      = (ConfigFlags -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])]
    -> ConfigFlags -> ConfigFlags)
-> [FieldDescr ConfigFlags]
forall a.
(a -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])] -> a -> a)
-> [FieldDescr a]
programOptionsFieldDescrs
                             ConfigFlags -> [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs
                             (\[(ProjectConfigImport, [ProjectConfigImport])]
args ConfigFlags
conf -> ConfigFlags
conf { configProgramArgs :: [(ProjectConfigImport, [ProjectConfigImport])]
configProgramArgs = [(ProjectConfigImport, [ProjectConfigImport])]
args }),
      sectionSubsections :: [SectionDescr ConfigFlags]
sectionSubsections = [],
      sectionGet :: LegacyPackageConfig -> [(ProjectConfigImport, ConfigFlags)]
sectionGet         = (\ConfigFlags
x->[(ProjectConfigImport
"", ConfigFlags
x)])
                         (ConfigFlags -> [(ProjectConfigImport, ConfigFlags)])
-> (LegacyPackageConfig -> ConfigFlags)
-> LegacyPackageConfig
-> [(ProjectConfigImport, ConfigFlags)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags,
      sectionSet :: LineNo
-> ProjectConfigImport
-> ConfigFlags
-> LegacyPackageConfig
-> ParseResult LegacyPackageConfig
sectionSet         =
        \LineNo
lineno ProjectConfigImport
unused ConfigFlags
confflags LegacyPackageConfig
pkgconf -> do
          Bool -> ParseResult () -> ParseResult ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (ProjectConfigImport -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ProjectConfigImport
unused) (ParseResult () -> ParseResult ())
-> ParseResult () -> ParseResult ()
forall a b. (a -> b) -> a -> b
$
            LineNo -> ProjectConfigImport -> ParseResult ()
forall a. LineNo -> ProjectConfigImport -> ParseResult a
syntaxError LineNo
lineno ProjectConfigImport
"the section 'program-options' takes no arguments"
          LegacyPackageConfig -> ParseResult LegacyPackageConfig
forall (m :: * -> *) a. Monad m => a -> m a
return LegacyPackageConfig
pkgconf {
            legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags LegacyPackageConfig
pkgconf ConfigFlags -> ConfigFlags -> ConfigFlags
forall a. Semigroup a => a -> a -> a
<> ConfigFlags
confflags
          },
      sectionEmpty :: ConfigFlags
sectionEmpty       = ConfigFlags
forall a. Monoid a => a
mempty
    }

programLocationsFieldDescrs :: [FieldDescr ConfigFlags]
programLocationsFieldDescrs :: [FieldDescr ConfigFlags]
programLocationsFieldDescrs =
     [OptionField ConfigFlags] -> [FieldDescr ConfigFlags]
forall a. [OptionField a] -> [FieldDescr a]
commandOptionsToFields
   ([OptionField ConfigFlags] -> [FieldDescr ConfigFlags])
-> [OptionField ConfigFlags] -> [FieldDescr ConfigFlags]
forall a b. (a -> b) -> a -> b
$ (ProjectConfigImport -> ProjectConfigImport)
-> ProgramDb
-> ShowOrParseArgs
-> (ConfigFlags -> [(ProjectConfigImport, ProjectConfigImport)])
-> ([(ProjectConfigImport, ProjectConfigImport)]
    -> ConfigFlags -> ConfigFlags)
-> [OptionField ConfigFlags]
forall flags.
(ProjectConfigImport -> ProjectConfigImport)
-> ProgramDb
-> ShowOrParseArgs
-> (flags -> [(ProjectConfigImport, ProjectConfigImport)])
-> ([(ProjectConfigImport, ProjectConfigImport)] -> flags -> flags)
-> [OptionField flags]
programDbPaths'
       (ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
"-location")
       ProgramDb
defaultProgramDb
       ShowOrParseArgs
ParseArgs
       ConfigFlags -> [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths
       (\[(ProjectConfigImport, ProjectConfigImport)]
paths ConfigFlags
conf -> ConfigFlags
conf { configProgramPaths :: [(ProjectConfigImport, ProjectConfigImport)]
configProgramPaths = [(ProjectConfigImport, ProjectConfigImport)]
paths })

programLocationsSectionDescr :: SectionDescr LegacyPackageConfig
programLocationsSectionDescr :: SectionDescr LegacyPackageConfig
programLocationsSectionDescr =
    SectionDescr :: forall a b.
ProjectConfigImport
-> [FieldDescr b]
-> [SectionDescr b]
-> (a -> [(ProjectConfigImport, b)])
-> (LineNo -> ProjectConfigImport -> b -> a -> ParseResult a)
-> b
-> SectionDescr a
SectionDescr {
      sectionName :: ProjectConfigImport
sectionName        = ProjectConfigImport
"program-locations",
      sectionFields :: [FieldDescr ConfigFlags]
sectionFields      = [FieldDescr ConfigFlags]
programLocationsFieldDescrs,
      sectionSubsections :: [SectionDescr ConfigFlags]
sectionSubsections = [],
      sectionGet :: LegacyPackageConfig -> [(ProjectConfigImport, ConfigFlags)]
sectionGet         = (\ConfigFlags
x->[(ProjectConfigImport
"", ConfigFlags
x)])
                         (ConfigFlags -> [(ProjectConfigImport, ConfigFlags)])
-> (LegacyPackageConfig -> ConfigFlags)
-> LegacyPackageConfig
-> [(ProjectConfigImport, ConfigFlags)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags,
      sectionSet :: LineNo
-> ProjectConfigImport
-> ConfigFlags
-> LegacyPackageConfig
-> ParseResult LegacyPackageConfig
sectionSet         =
        \LineNo
lineno ProjectConfigImport
unused ConfigFlags
confflags LegacyPackageConfig
pkgconf -> do
          Bool -> ParseResult () -> ParseResult ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (ProjectConfigImport -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ProjectConfigImport
unused) (ParseResult () -> ParseResult ())
-> ParseResult () -> ParseResult ()
forall a b. (a -> b) -> a -> b
$
            LineNo -> ProjectConfigImport -> ParseResult ()
forall a. LineNo -> ProjectConfigImport -> ParseResult a
syntaxError LineNo
lineno ProjectConfigImport
"the section 'program-locations' takes no arguments"
          LegacyPackageConfig -> ParseResult LegacyPackageConfig
forall (m :: * -> *) a. Monad m => a -> m a
return LegacyPackageConfig
pkgconf {
            legacyConfigureFlags :: ConfigFlags
legacyConfigureFlags = LegacyPackageConfig -> ConfigFlags
legacyConfigureFlags LegacyPackageConfig
pkgconf ConfigFlags -> ConfigFlags -> ConfigFlags
forall a. Semigroup a => a -> a -> a
<> ConfigFlags
confflags
          },
      sectionEmpty :: ConfigFlags
sectionEmpty       = ConfigFlags
forall a. Monoid a => a
mempty
    }


-- | For each known program @PROG@ in 'progDb', produce a @PROG-options@
-- 'OptionField'.
programDbOptions
  :: ProgramDb
  -> ShowOrParseArgs
  -> (flags -> [(String, [String])])
  -> ([(String, [String])] -> (flags -> flags))
  -> [OptionField flags]
programDbOptions :: ProgramDb
-> ShowOrParseArgs
-> (flags -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])]
    -> flags -> flags)
-> [OptionField flags]
programDbOptions ProgramDb
progDb ShowOrParseArgs
showOrParseArgs flags -> [(ProjectConfigImport, [ProjectConfigImport])]
get' [(ProjectConfigImport, [ProjectConfigImport])] -> flags -> flags
set =
  case ShowOrParseArgs
showOrParseArgs of
    -- we don't want a verbose help text list so we just show a generic one:
    ShowOrParseArgs
ShowArgs  -> [ProjectConfigImport -> OptionField flags
programOptions  ProjectConfigImport
"PROG"]
    ShowOrParseArgs
ParseArgs -> ((Program, Maybe ConfiguredProgram) -> OptionField flags)
-> [(Program, Maybe ConfiguredProgram)] -> [OptionField flags]
forall a b. (a -> b) -> [a] -> [b]
map (ProjectConfigImport -> OptionField flags
programOptions (ProjectConfigImport -> OptionField flags)
-> ((Program, Maybe ConfiguredProgram) -> ProjectConfigImport)
-> (Program, Maybe ConfiguredProgram)
-> OptionField flags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Program -> ProjectConfigImport
programName (Program -> ProjectConfigImport)
-> ((Program, Maybe ConfiguredProgram) -> Program)
-> (Program, Maybe ConfiguredProgram)
-> ProjectConfigImport
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Program, Maybe ConfiguredProgram) -> Program
forall a b. (a, b) -> a
fst)
                 (ProgramDb -> [(Program, Maybe ConfiguredProgram)]
knownPrograms ProgramDb
progDb)
  where
    programOptions :: ProjectConfigImport -> OptionField flags
programOptions ProjectConfigImport
prog =
      ProjectConfigImport
-> [ProjectConfigImport]
-> ProjectConfigImport
-> (flags -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])]
    -> flags -> flags)
-> MkOptDescr
     (flags -> [(ProjectConfigImport, [ProjectConfigImport])])
     ([(ProjectConfigImport, [ProjectConfigImport])] -> flags -> flags)
     flags
-> OptionField flags
forall get set a.
ProjectConfigImport
-> [ProjectConfigImport]
-> ProjectConfigImport
-> get
-> set
-> MkOptDescr get set a
-> OptionField a
option ProjectConfigImport
"" [ProjectConfigImport
prog ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
"-options"]
        (ProjectConfigImport
"give extra options to " ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
prog)
        flags -> [(ProjectConfigImport, [ProjectConfigImport])]
get' [(ProjectConfigImport, [ProjectConfigImport])] -> flags -> flags
set
        (ProjectConfigImport
-> (ProjectConfigImport
    -> [(ProjectConfigImport, [ProjectConfigImport])])
-> ([(ProjectConfigImport, [ProjectConfigImport])]
    -> [ProjectConfigImport])
-> MkOptDescr
     (flags -> [(ProjectConfigImport, [ProjectConfigImport])])
     ([(ProjectConfigImport, [ProjectConfigImport])] -> flags -> flags)
     flags
forall b a.
Monoid b =>
ProjectConfigImport
-> (ProjectConfigImport -> b)
-> (b -> [ProjectConfigImport])
-> MkOptDescr (a -> b) (b -> a -> a) a
reqArg' ProjectConfigImport
"OPTS" (\ProjectConfigImport
args -> [(ProjectConfigImport
prog, ProjectConfigImport -> [ProjectConfigImport]
splitArgs ProjectConfigImport
args)])
           (\[(ProjectConfigImport, [ProjectConfigImport])]
progArgs -> [ [ProjectConfigImport] -> ProjectConfigImport
joinsArgs [ProjectConfigImport]
args
                         | (ProjectConfigImport
prog', [ProjectConfigImport]
args) <- [(ProjectConfigImport, [ProjectConfigImport])]
progArgs, ProjectConfigImport
progProjectConfigImport -> ProjectConfigImport -> Bool
forall a. Eq a => a -> a -> Bool
==ProjectConfigImport
prog' ]))


    joinsArgs :: [ProjectConfigImport] -> ProjectConfigImport
joinsArgs = [ProjectConfigImport] -> ProjectConfigImport
unwords ([ProjectConfigImport] -> ProjectConfigImport)
-> ([ProjectConfigImport] -> [ProjectConfigImport])
-> [ProjectConfigImport]
-> ProjectConfigImport
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProjectConfigImport -> ProjectConfigImport)
-> [ProjectConfigImport] -> [ProjectConfigImport]
forall a b. (a -> b) -> [a] -> [b]
map ProjectConfigImport -> ProjectConfigImport
escape
    escape :: ProjectConfigImport -> ProjectConfigImport
escape ProjectConfigImport
arg | (Char -> Bool) -> ProjectConfigImport -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Char -> Bool
isSpace ProjectConfigImport
arg = ProjectConfigImport
"\"" ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
arg ProjectConfigImport -> ProjectConfigImport -> ProjectConfigImport
forall a. [a] -> [a] -> [a]
++ ProjectConfigImport
"\""
               | Bool
otherwise       = ProjectConfigImport
arg


-- The implementation is slight hack: we parse all as remote repository
-- but if the url schema is file+noindex, we switch to local.
remoteRepoSectionDescr :: SectionDescr GlobalFlags
remoteRepoSectionDescr :: SectionDescr GlobalFlags
remoteRepoSectionDescr = SectionDescr :: forall a b.
ProjectConfigImport
-> [FieldDescr b]
-> [SectionDescr b]
-> (a -> [(ProjectConfigImport, b)])
-> (LineNo -> ProjectConfigImport -> b -> a -> ParseResult a)
-> b
-> SectionDescr a
SectionDescr
    { sectionName :: ProjectConfigImport
sectionName        = ProjectConfigImport
"repository"
    , sectionEmpty :: RemoteRepo
sectionEmpty       = RepoName -> RemoteRepo
emptyRemoteRepo (ProjectConfigImport -> RepoName
RepoName ProjectConfigImport
"")
    , sectionFields :: [FieldDescr RemoteRepo]
sectionFields      = [FieldDescr RemoteRepo]
remoteRepoFields
    , sectionSubsections :: [SectionDescr RemoteRepo]
sectionSubsections = []
    , sectionGet :: GlobalFlags -> [(ProjectConfigImport, RemoteRepo)]
sectionGet         = GlobalFlags -> [(ProjectConfigImport, RemoteRepo)]
getS
    , sectionSet :: LineNo
-> ProjectConfigImport
-> RemoteRepo
-> GlobalFlags
-> ParseResult GlobalFlags
sectionSet         = LineNo
-> ProjectConfigImport
-> RemoteRepo
-> GlobalFlags
-> ParseResult GlobalFlags
setS
    }
  where
    getS :: GlobalFlags -> [(String, RemoteRepo)]
    getS :: GlobalFlags -> [(ProjectConfigImport, RemoteRepo)]
getS GlobalFlags
gf =
        (RemoteRepo -> (ProjectConfigImport, RemoteRepo))
-> [RemoteRepo] -> [(ProjectConfigImport, RemoteRepo)]
forall a b. (a -> b) -> [a] -> [b]
map (\RemoteRepo
x->(RepoName -> ProjectConfigImport
unRepoName (RepoName -> ProjectConfigImport)
-> RepoName -> ProjectConfigImport
forall a b. (a -> b) -> a -> b
$ RemoteRepo -> RepoName
remoteRepoName RemoteRepo
x, RemoteRepo
x)) (NubList RemoteRepo -> [RemoteRepo]
forall a. NubList a -> [a]
fromNubList (GlobalFlags -> NubList RemoteRepo
globalRemoteRepos GlobalFlags
gf))
        [(ProjectConfigImport, RemoteRepo)]
-> [(ProjectConfigImport, RemoteRepo)]
-> [(ProjectConfigImport, RemoteRepo)]
forall a. [a] -> [a] -> [a]
++
        (LocalRepo -> (ProjectConfigImport, RemoteRepo))
-> [LocalRepo] -> [(ProjectConfigImport, RemoteRepo)]
forall a b. (a -> b) -> [a] -> [b]
map (\LocalRepo
x->(RepoName -> ProjectConfigImport
unRepoName (RepoName -> ProjectConfigImport)
-> RepoName -> ProjectConfigImport
forall a b. (a -> b) -> a -> b
$ LocalRepo -> RepoName
localRepoName LocalRepo
x, LocalRepo -> RemoteRepo
localToRemote LocalRepo
x)) (NubList LocalRepo -> [LocalRepo]
forall a. NubList a -> [a]
fromNubList (GlobalFlags -> NubList LocalRepo
globalLocalNoIndexRepos GlobalFlags
gf))

    setS :: Int -> String -> RemoteRepo -> GlobalFlags -> ParseResult GlobalFlags
    setS :: LineNo
-> ProjectConfigImport
-> RemoteRepo
-> GlobalFlags
-> ParseResult GlobalFlags
setS LineNo
lineno ProjectConfigImport
reponame RemoteRepo
repo0 GlobalFlags
conf = do
        Either LocalRepo RemoteRepo
repo1 <- LineNo
-> ProjectConfigImport
-> RemoteRepo
-> ParseResult (Either LocalRepo RemoteRepo)
postProcessRepo LineNo
lineno ProjectConfigImport
reponame RemoteRepo
repo0
        case Either LocalRepo RemoteRepo
repo1 of
            Left LocalRepo
repo -> GlobalFlags -> ParseResult GlobalFlags
forall (m :: * -> *) a. Monad m => a -> m a
return GlobalFlags
conf
                { globalLocalNoIndexRepos :: NubList LocalRepo
globalLocalNoIndexRepos  = ([LocalRepo] -> [LocalRepo])
-> NubList LocalRepo -> NubList LocalRepo
forall a. Ord a => ([a] -> [a]) -> NubList a -> NubList a
overNubList ([LocalRepo] -> [LocalRepo] -> [LocalRepo]
forall a. [a] -> [a] -> [a]
++[LocalRepo
repo]) (GlobalFlags -> NubList LocalRepo
globalLocalNoIndexRepos GlobalFlags
conf)
                }
            Right RemoteRepo
repo -> GlobalFlags -> ParseResult GlobalFlags
forall (m :: * -> *) a. Monad m => a -> m a
return GlobalFlags
conf
                { globalRemoteRepos :: NubList RemoteRepo
globalRemoteRepos = ([RemoteRepo] -> [RemoteRepo])
-> NubList RemoteRepo -> NubList RemoteRepo
forall a. Ord a => ([a] -> [a]) -> NubList a -> NubList a
overNubList ([RemoteRepo] -> [RemoteRepo] -> [RemoteRepo]
forall a. [a] -> [a] -> [a]
++[RemoteRepo
repo]) (GlobalFlags -> NubList RemoteRepo
globalRemoteRepos GlobalFlags
conf)
                }

    localToRemote :: LocalRepo -> RemoteRepo
    localToRemote :: LocalRepo -> RemoteRepo
localToRemote (LocalRepo RepoName
name ProjectConfigImport
path Bool
sharedCache) = (RepoName -> RemoteRepo
emptyRemoteRepo RepoName
name)
        { remoteRepoURI :: URI
remoteRepoURI = ProjectConfigImport
-> Maybe URIAuth
-> ProjectConfigImport
-> ProjectConfigImport
-> ProjectConfigImport
-> URI
URI ProjectConfigImport
"file+noindex:" Maybe URIAuth
forall a. Maybe a
Nothing ProjectConfigImport
path ProjectConfigImport
"" (if Bool
sharedCache then ProjectConfigImport
"#shared-cache" else ProjectConfigImport
"")
        }

-------------------------------
-- Local field utils
--

-- | Parser combinator for simple fields which uses the field type's
-- 'Monoid' instance for combining multiple occurrences of the field.
monoidFieldParsec
    :: Monoid a => String -> (a -> Doc) -> ParsecParser a
    -> (b -> a) -> (a -> b -> b) -> FieldDescr b
monoidFieldParsec :: ProjectConfigImport
-> (a -> Doc)
-> ParsecParser a
-> (b -> a)
-> (a -> b -> b)
-> FieldDescr b
monoidFieldParsec ProjectConfigImport
name a -> Doc
showF ParsecParser a
readF b -> a
get' a -> b -> b
set =
  (b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
forall b a.
(b -> a) -> (a -> b -> b) -> FieldDescr a -> FieldDescr b
liftField b -> a
get' a -> b -> b
set' (FieldDescr a -> FieldDescr b) -> FieldDescr a -> FieldDescr b
forall a b. (a -> b) -> a -> b
$ ProjectConfigImport -> (a -> Doc) -> ParsecParser a -> FieldDescr a
forall a.
ProjectConfigImport -> (a -> Doc) -> ParsecParser a -> FieldDescr a
ParseUtils.fieldParsec ProjectConfigImport
name a -> Doc
showF ParsecParser a
readF
  where
    set' :: a -> b -> b
set' a
xs b
b = a -> b -> b
set (b -> a
get' b
b a -> a -> a
forall a. Monoid a => a -> a -> a
`mappend` a
xs) b
b


--TODO: [code cleanup] local redefinition that should replace the version in
-- D.ParseUtils called showFilePath. This version escapes "." and "--" which
-- otherwise are special syntax.
showTokenQ :: String -> Doc
showTokenQ :: ProjectConfigImport -> Doc
showTokenQ ProjectConfigImport
""            = Doc
Disp.empty
showTokenQ x :: ProjectConfigImport
x@(Char
'-':Char
'-':ProjectConfigImport
_) = ProjectConfigImport -> Doc
Disp.text (ProjectConfigImport -> ProjectConfigImport
forall a. Show a => a -> ProjectConfigImport
show ProjectConfigImport
x)
showTokenQ x :: ProjectConfigImport
x@(Char
'.':[])    = ProjectConfigImport -> Doc
Disp.text (ProjectConfigImport -> ProjectConfigImport
forall a. Show a => a -> ProjectConfigImport
show ProjectConfigImport
x)
showTokenQ ProjectConfigImport
x             = ProjectConfigImport -> Doc
showToken ProjectConfigImport
x


-- Handy util
addFields :: [FieldDescr a]
          -> ([FieldDescr a] -> [FieldDescr a])
addFields :: [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
addFields = [FieldDescr a] -> [FieldDescr a] -> [FieldDescr a]
forall a. [a] -> [a] -> [a]
(++)