module UHC.Light.Compiler.Base.FileSearchLocation
( mkDirFileLoc
, StringPath, FileLocPath
, FileLocKind (..)
, FileLoc (..), emptyFileLoc, fileLocPkgDb
, mkPkgFileLoc
, filelocIsPkg
, FileSearchLoc
, PkgKey, PkgKey1, PkgKey2
, showPkgKey
, PackageSearchFilter (..)
, pkgSearchFilter
, PackageCfgKeyVals, PackageInfo (..), PackageMp, Module2PackageMp, PackageDatabase (..), emptyPackageMp, emptyPackageDatabase
, mkInternalPkgFileBase )
where
import UHC.Light.Compiler.Base.Common
import qualified Data.Set as Set
import qualified Data.Map as Map
import Data.Maybe
import Data.Version
import Data.List
import UU.Parsing
import UHC.Util.ParseUtils
import UHC.Util.ScanUtils
import UHC.Light.Compiler.Base.HsName
import UHC.Light.Compiler.Base.Target
import qualified UHC.Light.Compiler.ConfigInstall as Cfg
import UHC.Util.Hashable
import GHC.Generics
data FileLocKind
= FileLocKind_Dir
| FileLocKind_Pkg PkgKey
String
| FileLocKind_PkgDb
deriving (Eq,Ord,Generic)
instance Hashable FileLocKind
instance Show FileLocKind where
show FileLocKind_Dir = "directory"
show (FileLocKind_Pkg p d) = "package: " ++ showPkgKey p ++ "(in: " ++ d ++ ")"
show FileLocKind_PkgDb = "package database"
data FileLoc
= FileLoc
{ filelocKind :: FileLocKind
, filelocDir :: String
}
deriving (Eq,Ord,Generic)
instance Hashable FileLoc
instance Show FileLoc where
show (FileLoc k d) = d ++ " (" ++ show k ++ ")"
emptyFileLoc :: FileLoc
emptyFileLoc = FileLoc FileLocKind_Dir ""
fileLocPkgDb :: FileLoc
fileLocPkgDb = FileLoc FileLocKind_PkgDb ""
mkDirFileLoc
= FileLoc FileLocKind_Dir
mkPkgFileLoc :: PkgKey -> String -> FileLoc
mkPkgFileLoc p d = FileLoc (FileLocKind_Pkg p d) d
filelocIsPkg :: FileLoc -> Bool
filelocIsPkg (FileLoc (FileLocKind_Pkg _ _) _) = True
filelocIsPkg (FileLoc FileLocKind_PkgDb _) = True
filelocIsPkg _ = False
type StringPath = [String]
type FileLocPath = [FileLoc]
type FileSearchLoc = FileLoc
type PkgKey1 = PkgName
type PkgKey2 = Maybe Version
type PkgKey = (PkgKey1,PkgKey2)
instance HSNM PkgKey where
mkHNm (n,Just v) = mkHNmBase (n ++ "-" ++ (concat $ intersperse "." $ map show $ versionBranch v))
mkHNm (n,_ ) = mkHNm n
showPkgKey :: PkgKey -> String
showPkgKey = show . mkHNm
data PackageSearchFilter
= PackageSearchFilter_HideAll
| PackageSearchFilter_HidePkg [PkgKey]
| PackageSearchFilter_ExposePkg [PkgKey]
deriving (Show, Eq, Ord)
pkgSearchFilter :: (x -> Maybe PkgKey) -> ([PkgKey] -> PackageSearchFilter) -> [x] -> [PackageSearchFilter]
pkgSearchFilter mkKey mk ss
= if null ps then [] else [mk ps]
where ps = catMaybes $ map mkKey ss
type PackageCfgKeyVals = Map.Map String String
data PackageInfo
= PackageInfo
{ pkginfoLoc :: !FileLoc
, pkginfoOrder :: !Int
, pkginfoExposedModules :: !HsNameS
, pkginfoBuildDepends :: !(Set.Set PkgKey)
, pkginfoIsExposed :: !Bool
}
deriving Show
type PackageMp = Map.Map PkgKey1 (Map.Map PkgKey2 [PackageInfo])
emptyPackageMp :: PackageMp
emptyPackageMp = Map.empty
type Module2PackageMp = Map.Map HsName [PkgKey]
data PackageDatabase
= PackageDatabase
{ pkgDbPkgMp :: PackageMp
, pkgDbMod2PkgMp :: Module2PackageMp
}
deriving Show
emptyPackageDatabase :: PackageDatabase
emptyPackageDatabase = PackageDatabase emptyPackageMp Map.empty
mkInternalPkgFileBase :: PkgKey -> String -> Target -> TargetFlavor -> FilePath
mkInternalPkgFileBase pkgKey compversion tgt tgtv =
Cfg.mkInternalPkgFileBase (showPkgKey pkgKey) compversion (show tgt) (show tgtv)