-- | Conversions between GHC's types and our types module Conv ( -- * Conversions from ghc's types to our types importPackageId , importMainPackage , importModuleId , importModuleId' , findExposedModule -- * Conversions from our types to ghc's types , exportPackageId , exportModuleId ) where import Prelude hiding (mod) import qualified Data.Text as Text import GHC (DynFlags) import qualified Module as GHC import GhcShim import qualified IdeSession.Types.Private as Private import qualified IdeSession.Types.Public as Public import qualified IdeSession.Strict.Maybe as Maybe {------------------------------------------------------------------------------ Conversions from ghc's types to our types ------------------------------------------------------------------------------} -- | PackageId of the main package importMainPackage :: Private.PackageId importMainPackage = Private.PackageId { Private.packageName = Text.pack "main" , Private.packageVersion = Maybe.nothing -- the only case of no version , Private.packageKey = Text.pack $ packageKeyString mainPackageKey } -- | Find out the version of a package importPackageId :: DynFlags -> PackageKey -> Private.PackageId importPackageId _ p | p == mainPackageKey = importMainPackage importPackageId dflags p = let (pkgName, pkgVersion) = packageKeyToSourceId dflags p in Private.PackageId { Private.packageName = Text.pack pkgName , Private.packageVersion = Maybe.just $ Text.pack pkgVersion , Private.packageKey = Text.pack $ packageKeyString p } importModuleId :: DynFlags -> GHC.Module -> Private.ModuleId importModuleId dflags mod = Private.ModuleId { Private.moduleName = Text.pack $ GHC.moduleNameString $ GHC.moduleName mod , Private.modulePackage = importPackageId dflags $ modulePackageKey mod } importModuleId' :: DynFlags -> PackageQualifier -> GHC.ModuleName -> Private.ModuleId importModuleId' dflags pkgQual impMod = Private.ModuleId { Private.moduleName = Text.pack $ GHC.moduleNameString impMod , Private.modulePackage = case findExposedModule dflags pkgQual impMod of Just pkg -> importPackageId dflags pkg Nothing -> importMainPackage } {------------------------------------------------------------------------------ Conversions from our types to ghc's types ------------------------------------------------------------------------------} exportPackageId :: Public.PackageId -> PackageKey exportPackageId = stringToPackageKey . Text.unpack . Public.packageKey exportModuleId :: Public.ModuleId -> GHC.Module exportModuleId (Public.ModuleId {..}) = GHC.mkModule (exportPackageId modulePackage) (GHC.mkModuleName . Text.unpack $ moduleName)