{-# LANGUAGE LambdaCase #-}
module Distribution.Client.Init.NonInteractive.Command
( genPkgDescription
, genLibTarget
, genExeTarget
, genTestTarget
, createProject
, packageTypeHeuristics
, authorHeuristics
, emailHeuristics
, cabalVersionHeuristics
, packageNameHeuristics
, versionHeuristics
, mainFileHeuristics
, testDirsHeuristics
, initializeTestSuiteHeuristics
, exposedModulesHeuristics
, libOtherModulesHeuristics
, exeOtherModulesHeuristics
, testOtherModulesHeuristics
, buildToolsHeuristics
, dependenciesHeuristics
, otherExtsHeuristics
, licenseHeuristics
, homepageHeuristics
, synopsisHeuristics
, categoryHeuristics
, extraDocFileHeuristics
, appDirsHeuristics
, srcDirsHeuristics
, languageHeuristics
, noCommentsHeuristics
, minimalHeuristics
, overwriteHeuristics
) where
import Distribution.Client.Init.Types
import Prelude ()
import Distribution.Client.Compat.Prelude hiding (putStr, putStrLn, getLine, last, head)
import Data.List (last, head)
import qualified Data.List.NonEmpty as NEL
import Distribution.CabalSpecVersion (CabalSpecVersion(..))
import Distribution.Version (Version)
import Distribution.ModuleName (ModuleName, components)
import Distribution.Types.Dependency (Dependency(..))
import Distribution.Types.PackageName (PackageName, unPackageName)
import Distribution.Client.Init.Defaults
import Distribution.Client.Init.NonInteractive.Heuristics
import Distribution.Client.Init.Utils
import Distribution.Client.Init.FlagExtractors
import Distribution.Simple.Setup (Flag(..), fromFlagOrDefault)
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
import Distribution.Client.Types (SourcePackageDb(..))
import Distribution.Solver.Types.PackageIndex (elemByPackageName)
import Distribution.Utils.Generic (safeHead)
import Distribution.Verbosity
import Language.Haskell.Extension (Language(..), Extension(..))
import System.FilePath (splitDirectories, (</>))
import Distribution.Simple.Compiler
import qualified Data.Set as Set
import Distribution.FieldGrammar.Newtypes
createProject
:: Interactive m
=> Compiler
-> Verbosity
-> InstalledPackageIndex
-> SourcePackageDb
-> InitFlags
-> m ProjectSettings
createProject :: forall (m :: * -> *).
Interactive m =>
Compiler
-> Verbosity
-> InstalledPackageIndex
-> SourcePackageDb
-> InitFlags
-> m ProjectSettings
createProject Compiler
comp Verbosity
v InstalledPackageIndex
pkgIx SourcePackageDb
srcDb InitFlags
initFlags = do
PackageType
pkgType <- forall (m :: * -> *). Interactive m => InitFlags -> m PackageType
packageTypeHeuristics InitFlags
initFlags
Bool
isMinimal <- forall (m :: * -> *). Interactive m => InitFlags -> m Bool
getMinimal InitFlags
initFlags
Bool
doOverwrite <- forall (m :: * -> *). Interactive m => InitFlags -> m Bool
getOverwrite InitFlags
initFlags
FilePath
pkgDir <- forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
packageDirHeuristics InitFlags
initFlags
PkgDescription
pkgDesc <- forall (m :: * -> *).
Interactive m =>
Verbosity -> PkgDescription -> m PkgDescription
fixupDocFiles Verbosity
v forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> *).
Interactive m =>
InitFlags -> SourcePackageDb -> m PkgDescription
genPkgDescription InitFlags
initFlags SourcePackageDb
srcDb
Bool
comments <- forall (m :: * -> *). Interactive m => InitFlags -> m Bool
noCommentsHeuristics InitFlags
initFlags
let pkgName :: PackageName
pkgName = PkgDescription -> PackageName
_pkgName PkgDescription
pkgDesc
cabalSpec :: CabalSpecVersion
cabalSpec = PkgDescription -> CabalSpecVersion
_pkgCabalVersion PkgDescription
pkgDesc
mkOpts :: Bool -> CabalSpecVersion -> WriteOpts
mkOpts Bool
cs = Bool
-> Bool
-> Bool
-> Verbosity
-> FilePath
-> PackageType
-> PackageName
-> CabalSpecVersion
-> WriteOpts
WriteOpts
Bool
doOverwrite Bool
isMinimal Bool
cs
Verbosity
v FilePath
pkgDir PackageType
pkgType PackageName
pkgName
case PackageType
pkgType of
PackageType
Library -> do
LibTarget
libTarget <- forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m LibTarget
genLibTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
Maybe TestTarget
testTarget <- PackageName -> Maybe TestTarget -> Maybe TestTarget
addLibDepToTest PackageName
pkgName forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m (Maybe TestTarget)
genTestTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ WriteOpts
-> PkgDescription
-> Maybe LibTarget
-> Maybe ExeTarget
-> Maybe TestTarget
-> ProjectSettings
ProjectSettings
(Bool -> CabalSpecVersion -> WriteOpts
mkOpts Bool
comments CabalSpecVersion
cabalSpec) PkgDescription
pkgDesc
(forall a. a -> Maybe a
Just LibTarget
libTarget) forall a. Maybe a
Nothing Maybe TestTarget
testTarget
PackageType
Executable -> do
ExeTarget
exeTarget <- forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m ExeTarget
genExeTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ WriteOpts
-> PkgDescription
-> Maybe LibTarget
-> Maybe ExeTarget
-> Maybe TestTarget
-> ProjectSettings
ProjectSettings
(Bool -> CabalSpecVersion -> WriteOpts
mkOpts Bool
comments CabalSpecVersion
cabalSpec) PkgDescription
pkgDesc forall a. Maybe a
Nothing
(forall a. a -> Maybe a
Just ExeTarget
exeTarget) forall a. Maybe a
Nothing
PackageType
LibraryAndExecutable -> do
LibTarget
libTarget <- forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m LibTarget
genLibTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
ExeTarget
exeTarget <- PackageName -> ExeTarget -> ExeTarget
addLibDepToExe PackageName
pkgName forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m ExeTarget
genExeTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
Maybe TestTarget
testTarget <- PackageName -> Maybe TestTarget -> Maybe TestTarget
addLibDepToTest PackageName
pkgName forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m (Maybe TestTarget)
genTestTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ WriteOpts
-> PkgDescription
-> Maybe LibTarget
-> Maybe ExeTarget
-> Maybe TestTarget
-> ProjectSettings
ProjectSettings
(Bool -> CabalSpecVersion -> WriteOpts
mkOpts Bool
comments CabalSpecVersion
cabalSpec) PkgDescription
pkgDesc (forall a. a -> Maybe a
Just LibTarget
libTarget)
(forall a. a -> Maybe a
Just ExeTarget
exeTarget) Maybe TestTarget
testTarget
PackageType
TestSuite -> do
Maybe TestTarget
testTarget <- forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m (Maybe TestTarget)
genTestTarget InitFlags
initFlags Compiler
comp InstalledPackageIndex
pkgIx CabalSpecVersion
cabalSpec
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ WriteOpts
-> PkgDescription
-> Maybe LibTarget
-> Maybe ExeTarget
-> Maybe TestTarget
-> ProjectSettings
ProjectSettings
(Bool -> CabalSpecVersion -> WriteOpts
mkOpts Bool
comments CabalSpecVersion
cabalSpec) PkgDescription
pkgDesc
forall a. Maybe a
Nothing forall a. Maybe a
Nothing Maybe TestTarget
testTarget
genPkgDescription
:: Interactive m
=> InitFlags
-> SourcePackageDb
-> m PkgDescription
genPkgDescription :: forall (m :: * -> *).
Interactive m =>
InitFlags -> SourcePackageDb -> m PkgDescription
genPkgDescription InitFlags
flags SourcePackageDb
srcDb = CabalSpecVersion
-> PackageName
-> Version
-> SpecLicense
-> FilePath
-> FilePath
-> FilePath
-> FilePath
-> FilePath
-> Set FilePath
-> Maybe (Set FilePath)
-> PkgDescription
PkgDescription
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *).
Interactive m =>
InitFlags -> m CabalSpecVersion
cabalVersionHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
SourcePackageDb -> InitFlags -> m PackageName
packageNameHeuristics SourcePackageDb
srcDb InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m Version
versionHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m SpecLicense
licenseHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
authorHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
emailHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
homepageHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
synopsisHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
categoryHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> m (Set FilePath)
getExtraSrcFiles InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> m (Maybe (Set FilePath))
extraDocFileHeuristics InitFlags
flags
genLibTarget
:: Interactive m
=> InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m LibTarget
genLibTarget :: forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m LibTarget
genLibTarget InitFlags
flags Compiler
comp InstalledPackageIndex
pkgs CabalSpecVersion
v = do
[FilePath]
srcDirs <- forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
srcDirsHeuristics InitFlags
flags
let srcDir :: FilePath
srcDir = forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultSourceDir forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
safeHead [FilePath]
srcDirs
[FilePath]
-> Language
-> NonEmpty ModuleName
-> [ModuleName]
-> [Extension]
-> [Dependency]
-> [Dependency]
-> LibTarget
LibTarget [FilePath]
srcDirs
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *).
Interactive m =>
InitFlags -> Compiler -> m Language
languageHeuristics InitFlags
flags Compiler
comp
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> m (NonEmpty ModuleName)
exposedModulesHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
libOtherModulesHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> m [Extension]
otherExtsHeuristics InitFlags
flags FilePath
srcDir
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> InstalledPackageIndex -> m [Dependency]
dependenciesHeuristics InitFlags
flags FilePath
srcDir InstalledPackageIndex
pkgs
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> CabalSpecVersion -> m [Dependency]
buildToolsHeuristics InitFlags
flags FilePath
srcDir CabalSpecVersion
v
genExeTarget
:: Interactive m
=> InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m ExeTarget
genExeTarget :: forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m ExeTarget
genExeTarget InitFlags
flags Compiler
comp InstalledPackageIndex
pkgs CabalSpecVersion
v = do
[FilePath]
appDirs <- forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
appDirsHeuristics InitFlags
flags
let appDir :: FilePath
appDir = forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultApplicationDir forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
safeHead [FilePath]
appDirs
HsFilePath
-> [FilePath]
-> Language
-> [ModuleName]
-> [Extension]
-> [Dependency]
-> [Dependency]
-> ExeTarget
ExeTarget
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => InitFlags -> m HsFilePath
mainFileHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure [FilePath]
appDirs
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> Compiler -> m Language
languageHeuristics InitFlags
flags Compiler
comp
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
exeOtherModulesHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> m [Extension]
otherExtsHeuristics InitFlags
flags FilePath
appDir
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> InstalledPackageIndex -> m [Dependency]
dependenciesHeuristics InitFlags
flags FilePath
appDir InstalledPackageIndex
pkgs
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> CabalSpecVersion -> m [Dependency]
buildToolsHeuristics InitFlags
flags FilePath
appDir CabalSpecVersion
v
genTestTarget
:: Interactive m
=> InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m (Maybe TestTarget)
genTestTarget :: forall (m :: * -> *).
Interactive m =>
InitFlags
-> Compiler
-> InstalledPackageIndex
-> CabalSpecVersion
-> m (Maybe TestTarget)
genTestTarget InitFlags
flags Compiler
comp InstalledPackageIndex
pkgs CabalSpecVersion
v = do
Bool
initialized <- forall (m :: * -> *). Interactive m => InitFlags -> m Bool
initializeTestSuiteHeuristics InitFlags
flags
[FilePath]
testDirs' <- forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
testDirsHeuristics InitFlags
flags
let testDir :: FilePath
testDir = forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultTestDir forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
safeHead [FilePath]
testDirs'
if Bool -> Bool
not Bool
initialized
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
else forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ HsFilePath
-> [FilePath]
-> Language
-> [ModuleName]
-> [Extension]
-> [Dependency]
-> [Dependency]
-> TestTarget
TestTarget
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => InitFlags -> m HsFilePath
testMainHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure [FilePath]
testDirs'
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> Compiler -> m Language
languageHeuristics InitFlags
flags Compiler
comp
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
testOtherModulesHeuristics InitFlags
flags
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> m [Extension]
otherExtsHeuristics InitFlags
flags FilePath
testDir
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> InstalledPackageIndex -> m [Dependency]
dependenciesHeuristics InitFlags
flags FilePath
testDir InstalledPackageIndex
pkgs
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> CabalSpecVersion -> m [Dependency]
buildToolsHeuristics InitFlags
flags FilePath
testDir CabalSpecVersion
v
minimalHeuristics :: Interactive m => InitFlags -> m Bool
minimalHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m Bool
minimalHeuristics = forall (m :: * -> *). Interactive m => InitFlags -> m Bool
getMinimal
overwriteHeuristics :: Interactive m => InitFlags -> m Bool
overwriteHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m Bool
overwriteHeuristics = forall (m :: * -> *). Interactive m => InitFlags -> m Bool
getOverwrite
packageDirHeuristics :: Interactive m => InitFlags -> m FilePath
packageDirHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
packageDirHeuristics = forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
getPackageDir
cabalVersionHeuristics :: Interactive m => InitFlags -> m CabalSpecVersion
cabalVersionHeuristics :: forall (m :: * -> *).
Interactive m =>
InitFlags -> m CabalSpecVersion
cabalVersionHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m CabalSpecVersion -> m CabalSpecVersion
getCabalVersion InitFlags
flags forall (m :: * -> *). Interactive m => m CabalSpecVersion
guessCabalSpecVersion
packageNameHeuristics :: Interactive m => SourcePackageDb -> InitFlags -> m PackageName
packageNameHeuristics :: forall (m :: * -> *).
Interactive m =>
SourcePackageDb -> InitFlags -> m PackageName
packageNameHeuristics SourcePackageDb
sourcePkgDb InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m PackageName -> m PackageName
getPackageName InitFlags
flags forall a b. (a -> b) -> a -> b
$ do
PackageName
defName <- forall (m :: * -> *). Interactive m => FilePath -> m PackageName
guessPackageName forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< case InitFlags -> Flag FilePath
packageDir InitFlags
flags of
Flag FilePath
a -> forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
a
Flag FilePath
NoFlag -> forall a. [a] -> a
last forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> [FilePath]
splitDirectories forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => m FilePath
getCurrentDirectory
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (PackageName -> Bool
isPkgRegistered PackageName
defName)
forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). Interactive m => FilePath -> m ()
putStrLn (PackageName -> FilePath
inUseMsg PackageName
defName)
forall (m :: * -> *) a. Monad m => a -> m a
return PackageName
defName
where
isPkgRegistered :: PackageName -> Bool
isPkgRegistered = forall pkg. Package pkg => PackageIndex pkg -> PackageName -> Bool
elemByPackageName (SourcePackageDb -> PackageIndex UnresolvedSourcePackage
packageIndex SourcePackageDb
sourcePkgDb)
inUseMsg :: PackageName -> FilePath
inUseMsg PackageName
pn = FilePath
"The name "
forall a. [a] -> [a] -> [a]
++ PackageName -> FilePath
unPackageName PackageName
pn
forall a. [a] -> [a] -> [a]
++ FilePath
" is already in use by another package on Hackage."
versionHeuristics :: Interactive m => InitFlags -> m Version
versionHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m Version
versionHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m Version -> m Version
getVersion InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return Version
defaultVersion
licenseHeuristics :: Interactive m => InitFlags -> m SpecLicense
licenseHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m SpecLicense
licenseHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m SpecLicense -> m SpecLicense
getLicense InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). Interactive m => InitFlags -> m SpecLicense
guessLicense InitFlags
flags
authorHeuristics :: Interactive m => InitFlags -> m String
authorHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
authorHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m FilePath -> m FilePath
getAuthor InitFlags
flags forall (m :: * -> *). Interactive m => m FilePath
guessAuthorEmail
emailHeuristics :: Interactive m => InitFlags -> m String
emailHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
emailHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m FilePath -> m FilePath
getEmail InitFlags
flags forall (m :: * -> *). Interactive m => m FilePath
guessAuthorName
homepageHeuristics :: Interactive m => InitFlags -> m String
homepageHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
homepageHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m FilePath -> m FilePath
getHomepage InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
""
synopsisHeuristics :: Interactive m => InitFlags -> m String
synopsisHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
synopsisHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m FilePath -> m FilePath
getSynopsis InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
""
categoryHeuristics :: Interactive m => InitFlags -> m String
categoryHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m FilePath
categoryHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m FilePath -> m FilePath
getCategory InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
""
extraDocFileHeuristics :: Interactive m => InitFlags -> m (Maybe (Set FilePath))
InitFlags
flags = case InitFlags -> Flag [FilePath]
extraDoc InitFlags
flags of
Flag [FilePath]
x -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> Set a
Set.fromList [FilePath]
x
Flag [FilePath]
_ -> forall (m :: * -> *).
Interactive m =>
InitFlags -> m (Maybe (Set FilePath))
guessExtraDocFiles InitFlags
flags
packageTypeHeuristics :: Interactive m => InitFlags -> m PackageType
packageTypeHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m PackageType
packageTypeHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m PackageType -> m PackageType
getPackageType InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). Interactive m => InitFlags -> m PackageType
guessPackageType InitFlags
flags
mainFileHeuristics :: Interactive m => InitFlags -> m HsFilePath
mainFileHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m HsFilePath
mainFileHeuristics InitFlags
flags = do
FilePath
appDir <- forall a. [a] -> a
head forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
appDirsHeuristics InitFlags
flags
forall (m :: * -> *).
Interactive m =>
InitFlags -> m HsFilePath -> m HsFilePath
getMainFile InitFlags
flags forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *). Interactive m => FilePath -> m HsFilePath
guessMainFile forall a b. (a -> b) -> a -> b
$ FilePath
appDir
testMainHeuristics :: Interactive m => InitFlags -> m HsFilePath
testMainHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m HsFilePath
testMainHeuristics InitFlags
flags = do
FilePath
testDir <- forall a. [a] -> a
head forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
testDirsHeuristics InitFlags
flags
forall (m :: * -> *). Interactive m => FilePath -> m HsFilePath
guessMainFile FilePath
testDir
initializeTestSuiteHeuristics :: Interactive m => InitFlags -> m Bool
initializeTestSuiteHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m Bool
initializeTestSuiteHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m Bool -> m Bool
getInitializeTestSuite InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
testDirsHeuristics :: Interactive m => InitFlags -> m [String]
testDirsHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
testDirsHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m [FilePath] -> m [FilePath]
getTestDirs InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return [FilePath
defaultTestDir]
languageHeuristics :: Interactive m => InitFlags -> Compiler -> m Language
languageHeuristics :: forall (m :: * -> *).
Interactive m =>
InitFlags -> Compiler -> m Language
languageHeuristics InitFlags
flags Compiler
comp = forall (m :: * -> *).
Interactive m =>
InitFlags -> m Language -> m Language
getLanguage InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). Interactive m => Compiler -> m Language
guessLanguage Compiler
comp
noCommentsHeuristics :: Interactive m => InitFlags -> m Bool
InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m Bool -> m Bool
getNoComments InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
appDirsHeuristics :: Interactive m => InitFlags -> m [String]
appDirsHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
appDirsHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m [FilePath] -> m [FilePath]
getAppDirs InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
guessApplicationDirectories InitFlags
flags
srcDirsHeuristics :: Interactive m => InitFlags -> m [String]
srcDirsHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
srcDirsHeuristics InitFlags
flags = forall (m :: * -> *).
Interactive m =>
InitFlags -> m [FilePath] -> m [FilePath]
getSrcDirs InitFlags
flags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
guessSourceDirectories InitFlags
flags
exposedModulesHeuristics :: Interactive m => InitFlags -> m (NonEmpty ModuleName)
exposedModulesHeuristics :: forall (m :: * -> *).
Interactive m =>
InitFlags -> m (NonEmpty ModuleName)
exposedModulesHeuristics InitFlags
flags = do
[ModuleName]
mods <- case InitFlags -> Flag [ModuleName]
exposedModules InitFlags
flags of
Flag [ModuleName]
x -> forall (m :: * -> *) a. Monad m => a -> m a
return [ModuleName]
x
Flag [ModuleName]
NoFlag -> do
FilePath
srcDir <- forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultSourceDir forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
safeHead forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => InitFlags -> m [FilePath]
srcDirsHeuristics InitFlags
flags
Bool
exists <- forall (m :: * -> *). Interactive m => FilePath -> m Bool
doesDirectoryExist FilePath
srcDir
if Bool
exists
then do
[FilePath]
modules <- forall a. (a -> Bool) -> [a] -> [a]
filter FilePath -> Bool
isHaskell forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => FilePath -> m [FilePath]
listFilesRecursive FilePath
srcDir
[ModuleName]
modulesNames <- forall a. [Maybe a] -> [a]
catMaybes forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (m :: * -> *).
Interactive m =>
FilePath -> m (Maybe ModuleName)
retrieveModuleName [FilePath]
modules
[ModuleName]
otherModules' <- forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
libOtherModulesHeuristics InitFlags
flags
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [ModuleName]
otherModules') [ModuleName]
modulesNames
else
forall (m :: * -> *) a. Monad m => a -> m a
return []
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ModuleName]
mods
then ModuleName
myLibModule forall a. a -> [a] -> NonEmpty a
NEL.:| []
else forall a. [a] -> NonEmpty a
NEL.fromList [ModuleName]
mods
libOtherModulesHeuristics :: Interactive m => InitFlags -> m [ModuleName]
libOtherModulesHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
libOtherModulesHeuristics InitFlags
flags = case InitFlags -> Flag [ModuleName]
otherModules InitFlags
flags of
Flag [ModuleName]
x -> forall (m :: * -> *) a. Monad m => a -> m a
return [ModuleName]
x
Flag [ModuleName]
NoFlag -> do
let otherCandidates :: [FilePath]
otherCandidates = [FilePath
"Internal", FilePath
"Utils"]
srcDir :: FilePath
srcDir = case InitFlags -> Flag [FilePath]
sourceDirs InitFlags
flags of
Flag [FilePath]
x -> forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultSourceDir forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
safeHead [FilePath]
x
Flag [FilePath]
NoFlag -> FilePath
defaultSourceDir
FilePath
libDir <- (FilePath -> FilePath -> FilePath
</> FilePath
srcDir) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case InitFlags -> Flag FilePath
packageDir InitFlags
flags of
Flag FilePath
x -> forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
x
Flag FilePath
NoFlag -> forall (m :: * -> *). Interactive m => m FilePath
getCurrentDirectory
Bool
exists <- forall (m :: * -> *). Interactive m => FilePath -> m Bool
doesDirectoryExist FilePath
libDir
if Bool
exists
then do
[FilePath]
otherModules' <- forall a. (a -> Bool) -> [a] -> [a]
filter FilePath -> Bool
isHaskell forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => FilePath -> m [FilePath]
listFilesRecursive FilePath
libDir
forall a. (a -> Bool) -> [a] -> [a]
filter ((forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [FilePath]
otherCandidates) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
last forall b c a. (b -> c) -> (a -> b) -> a -> c
. ModuleName -> [FilePath]
components)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [Maybe a] -> [a]
catMaybes forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (m :: * -> *).
Interactive m =>
FilePath -> m (Maybe ModuleName)
retrieveModuleName [FilePath]
otherModules'
else forall (m :: * -> *) a. Monad m => a -> m a
return []
exeOtherModulesHeuristics :: Interactive m => InitFlags -> m [ModuleName]
exeOtherModulesHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
exeOtherModulesHeuristics InitFlags
flags = case InitFlags -> Flag [ModuleName]
otherModules InitFlags
flags of
Flag [ModuleName]
x -> forall (m :: * -> *) a. Monad m => a -> m a
return [ModuleName]
x
Flag [ModuleName]
NoFlag -> do
let appDir :: FilePath
appDir = case InitFlags -> Flag [FilePath]
applicationDirs InitFlags
flags of
Flag [FilePath]
x -> forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultApplicationDir forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
safeHead [FilePath]
x
Flag [FilePath]
NoFlag -> FilePath
defaultApplicationDir
FilePath
exeDir <- (FilePath -> FilePath -> FilePath
</> FilePath
appDir) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case InitFlags -> Flag FilePath
packageDir InitFlags
flags of
Flag FilePath
x -> forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
x
Flag FilePath
NoFlag -> forall (m :: * -> *). Interactive m => m FilePath
getCurrentDirectory
Bool
exists <- forall (m :: * -> *). Interactive m => FilePath -> m Bool
doesDirectoryExist FilePath
exeDir
if Bool
exists
then do
[FilePath]
otherModules' <- forall a. (a -> Bool) -> [a] -> [a]
filter (\FilePath
f -> Bool -> Bool
not (FilePath -> Bool
isMain FilePath
f) Bool -> Bool -> Bool
&& FilePath -> Bool
isHaskell FilePath
f)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => FilePath -> m [FilePath]
listFilesRecursive FilePath
exeDir
forall a. [Maybe a] -> [a]
catMaybes forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (m :: * -> *).
Interactive m =>
FilePath -> m (Maybe ModuleName)
retrieveModuleName [FilePath]
otherModules'
else forall (m :: * -> *) a. Monad m => a -> m a
return []
testOtherModulesHeuristics :: Interactive m => InitFlags -> m [ModuleName]
testOtherModulesHeuristics :: forall (m :: * -> *). Interactive m => InitFlags -> m [ModuleName]
testOtherModulesHeuristics InitFlags
flags = case InitFlags -> Flag [ModuleName]
otherModules InitFlags
flags of
Flag [ModuleName]
x -> forall (m :: * -> *) a. Monad m => a -> m a
return [ModuleName]
x
Flag [ModuleName]
NoFlag -> do
let testDir :: FilePath
testDir = case InitFlags -> Flag [FilePath]
testDirs InitFlags
flags of
Flag [FilePath]
x -> forall a. a -> Maybe a -> a
fromMaybe FilePath
defaultTestDir forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
safeHead [FilePath]
x
Flag [FilePath]
NoFlag -> FilePath
defaultTestDir
FilePath
testDir' <- (FilePath -> FilePath -> FilePath
</> FilePath
testDir) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case InitFlags -> Flag FilePath
packageDir InitFlags
flags of
Flag FilePath
x -> forall (m :: * -> *) a. Monad m => a -> m a
return FilePath
x
Flag FilePath
NoFlag -> forall (m :: * -> *). Interactive m => m FilePath
getCurrentDirectory
Bool
exists <- forall (m :: * -> *). Interactive m => FilePath -> m Bool
doesDirectoryExist FilePath
testDir'
if Bool
exists
then do
[FilePath]
otherModules' <- forall a. (a -> Bool) -> [a] -> [a]
filter (\FilePath
f -> Bool -> Bool
not (FilePath -> Bool
isMain FilePath
f) Bool -> Bool -> Bool
&& FilePath -> Bool
isHaskell FilePath
f)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). Interactive m => FilePath -> m [FilePath]
listFilesRecursive FilePath
testDir'
forall a. [Maybe a] -> [a]
catMaybes forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (m :: * -> *).
Interactive m =>
FilePath -> m (Maybe ModuleName)
retrieveModuleName [FilePath]
otherModules'
else forall (m :: * -> *) a. Monad m => a -> m a
return []
buildToolsHeuristics
:: Interactive m
=> InitFlags
-> FilePath
-> CabalSpecVersion
-> m [Dependency]
buildToolsHeuristics :: forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> CabalSpecVersion -> m [Dependency]
buildToolsHeuristics InitFlags
flags FilePath
fp CabalSpecVersion
v = case InitFlags -> Flag [FilePath]
buildTools InitFlags
flags of
Flag{} -> forall (m :: * -> *). Interactive m => InitFlags -> m [Dependency]
getBuildTools InitFlags
flags
Flag [FilePath]
NoFlag -> forall (m :: * -> *).
Interactive m =>
CabalSpecVersion -> FilePath -> m [Dependency]
retrieveBuildTools CabalSpecVersion
v FilePath
fp
dependenciesHeuristics :: Interactive m => InitFlags -> FilePath -> InstalledPackageIndex -> m [Dependency]
dependenciesHeuristics :: forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> InstalledPackageIndex -> m [Dependency]
dependenciesHeuristics InitFlags
flags FilePath
fp InstalledPackageIndex
pkgIx = forall (m :: * -> *).
Interactive m =>
InitFlags -> m [Dependency] -> m [Dependency]
getDependencies InitFlags
flags forall a b. (a -> b) -> a -> b
$ do
[SourceFileEntry]
sources <- forall (m :: * -> *).
Interactive m =>
FilePath -> m [SourceFileEntry]
retrieveSourceFiles FilePath
fp
let mods :: [ModuleName]
mods = case InitFlags -> Flag [ModuleName]
exposedModules InitFlags
flags of
Flag [ModuleName]
x -> [ModuleName]
x
Flag [ModuleName]
NoFlag -> forall a b. (a -> b) -> [a] -> [b]
map SourceFileEntry -> ModuleName
moduleName [SourceFileEntry]
sources
groupedDeps :: [(ModuleName, ModuleName)]
groupedDeps = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\SourceFileEntry
s -> forall a b. (a -> b) -> [a] -> [b]
map (\ModuleName
i -> (SourceFileEntry -> ModuleName
moduleName SourceFileEntry
s, ModuleName
i)) (SourceFileEntry -> [ModuleName]
imports SourceFileEntry
s)) [SourceFileEntry]
sources
filteredDeps :: [(ModuleName, ModuleName)]
filteredDeps = forall a. (a -> Bool) -> [a] -> [a]
filter ((forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [ModuleName]
mods) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd) [(ModuleName, ModuleName)]
groupedDeps
preludeNub :: [(ModuleName, ModuleName)]
preludeNub = forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy (\(ModuleName, ModuleName)
a (ModuleName, ModuleName)
b -> forall a b. (a, b) -> b
snd (ModuleName, ModuleName)
a forall a. Eq a => a -> a -> Bool
== forall a b. (a, b) -> b
snd (ModuleName, ModuleName)
b) forall a b. (a -> b) -> a -> b
$ (forall a. IsString a => FilePath -> a
fromString FilePath
"Prelude", forall a. IsString a => FilePath -> a
fromString FilePath
"Prelude") forall a. a -> [a] -> [a]
: [(ModuleName, ModuleName)]
filteredDeps
forall (m :: * -> *).
Interactive m =>
Verbosity
-> InitFlags
-> [(ModuleName, ModuleName)]
-> InstalledPackageIndex
-> m [Dependency]
retrieveDependencies (forall a. a -> Flag a -> a
fromFlagOrDefault Verbosity
normal forall a b. (a -> b) -> a -> b
$ InitFlags -> Flag Verbosity
initVerbosity InitFlags
flags) InitFlags
flags [(ModuleName, ModuleName)]
preludeNub InstalledPackageIndex
pkgIx
otherExtsHeuristics :: Interactive m => InitFlags -> FilePath -> m [Extension]
otherExtsHeuristics :: forall (m :: * -> *).
Interactive m =>
InitFlags -> FilePath -> m [Extension]
otherExtsHeuristics InitFlags
flags FilePath
fp = case InitFlags -> Flag [Extension]
otherExts InitFlags
flags of
Flag [Extension]
x -> forall (m :: * -> *) a. Monad m => a -> m a
return [Extension]
x
Flag [Extension]
NoFlag -> do
Bool
exists <- forall (m :: * -> *). Interactive m => FilePath -> m Bool
doesDirectoryExist FilePath
fp
if Bool
exists
then do
[FilePath]
sources <- forall (m :: * -> *). Interactive m => FilePath -> m [FilePath]
listFilesRecursive FilePath
fp
[[Extension]]
extensions' <- forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (m :: * -> *). Interactive m => FilePath -> m [Extension]
retrieveModuleExtensions forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter FilePath -> Bool
isHaskell forall a b. (a -> b) -> a -> b
$ [FilePath]
sources
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. Eq a => [a] -> [a]
nub forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => m (m a) -> m a
join forall a b. (a -> b) -> a -> b
$ [[Extension]]
extensions'
else
forall (m :: * -> *) a. Monad m => a -> m a
return []