hsdev 0.3.2.0 → 0.3.2.1
raw patch · 5 files changed
+42/−26 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ HsDev.Scan.Browse: uniqueModuleLocations :: [ModuleLocation] -> [ModuleLocation]
+ System.Directory.Paths: normalize :: Paths a => a -> a
- HsDev.Project.Types: entity :: forall a_a1hOG a_a1jc6. Lens (Extensions a_a1hOG) (Extensions a_a1jc6) a_a1hOG a_a1jc6
+ HsDev.Project.Types: entity :: forall a_a1hUl a_a1jhL. Lens (Extensions a_a1hUl) (Extensions a_a1jhL) a_a1hUl a_a1jhL
- HsDev.Project.Types: extensions :: forall a_a1hOG. Lens' (Extensions a_a1hOG) [Extension]
+ HsDev.Project.Types: extensions :: forall a_a1hUl. Lens' (Extensions a_a1hUl) [Extension]
- HsDev.Project.Types: ghcOptions :: forall a_a1hOG. Lens' (Extensions a_a1hOG) [Text]
+ HsDev.Project.Types: ghcOptions :: forall a_a1hUl. Lens' (Extensions a_a1hUl) [Text]
- HsDev.Scan.Browse: ghcModuleLocation :: MonadIO m => PackageConfig -> Module -> Bool -> m ModuleLocation
+ HsDev.Scan.Browse: ghcModuleLocation :: PackageConfig -> Module -> Bool -> ModuleLocation
- HsDev.Server.Message: message :: forall a_a1HpJ a_a1HuY. Lens (Message a_a1HpJ) (Message a_a1HuY) a_a1HpJ a_a1HuY
+ HsDev.Server.Message: message :: forall a_a1Hvo a_a1HAD. Lens (Message a_a1Hvo) (Message a_a1HAD) a_a1Hvo a_a1HAD
- HsDev.Server.Message: messageId :: forall a_a1HpJ. Lens' (Message a_a1HpJ) (Maybe String)
+ HsDev.Server.Message: messageId :: forall a_a1Hvo. Lens' (Message a_a1Hvo) (Maybe String)
- HsDev.Symbols.Types: inspectedKey :: forall k_a2hPF t_a2hPG a_a2hPH k_a2kOc. Lens (Inspected k_a2hPF t_a2hPG a_a2hPH) (Inspected k_a2kOc t_a2hPG a_a2hPH) k_a2hPF k_a2kOc
+ HsDev.Symbols.Types: inspectedKey :: forall k_a2hVk t_a2hVl a_a2hVm k_a2kTR. Lens (Inspected k_a2hVk t_a2hVl a_a2hVm) (Inspected k_a2kTR t_a2hVl a_a2hVm) k_a2hVk k_a2kTR
- HsDev.Symbols.Types: inspection :: forall k_a2hPF t_a2hPG a_a2hPH. Lens' (Inspected k_a2hPF t_a2hPG a_a2hPH) Inspection
+ HsDev.Symbols.Types: inspection :: forall k_a2hVk t_a2hVl a_a2hVm. Lens' (Inspected k_a2hVk t_a2hVl a_a2hVm) Inspection
- HsDev.Symbols.Types: inspectionResult :: forall k_a2hPF t_a2hPG a_a2hPH a_a2kOd. Lens (Inspected k_a2hPF t_a2hPG a_a2hPH) (Inspected k_a2hPF t_a2hPG a_a2kOd) (Either HsDevError a_a2hPH) (Either HsDevError a_a2kOd)
+ HsDev.Symbols.Types: inspectionResult :: forall k_a2hVk t_a2hVl a_a2hVm a_a2kTS. Lens (Inspected k_a2hVk t_a2hVl a_a2hVm) (Inspected k_a2hVk t_a2hVl a_a2kTS) (Either HsDevError a_a2hVm) (Either HsDevError a_a2kTS)
- HsDev.Symbols.Types: inspectionTags :: forall k_a2hPF t_a2hPG a_a2hPH t_a2kOe. Lens (Inspected k_a2hPF t_a2hPG a_a2hPH) (Inspected k_a2hPF t_a2kOe a_a2hPH) (Set t_a2hPG) (Set t_a2kOe)
+ HsDev.Symbols.Types: inspectionTags :: forall k_a2hVk t_a2hVl a_a2hVm t_a2kTT. Lens (Inspected k_a2hVk t_a2hVl a_a2hVm) (Inspected k_a2hVk t_a2kTT a_a2hVm) (Set t_a2hVl) (Set t_a2kTT)
- HsDev.Symbols.Types: scopeQualifier :: forall a_a2hPI. Lens' (Scoped a_a2hPI) (Maybe Text)
+ HsDev.Symbols.Types: scopeQualifier :: forall a_a2hVn. Lens' (Scoped a_a2hVn) (Maybe Text)
- HsDev.Symbols.Types: scoped :: forall a_a2hPI a_a2kJk. Lens (Scoped a_a2hPI) (Scoped a_a2kJk) a_a2hPI a_a2kJk
+ HsDev.Symbols.Types: scoped :: forall a_a2hVn a_a2kOZ. Lens (Scoped a_a2hVn) (Scoped a_a2kOZ) a_a2hVn a_a2kOZ
- HsDev.Tools.Types: note :: forall a_a1Kx0 a_a1KIi. Lens (Note a_a1Kx0) (Note a_a1KIi) a_a1Kx0 a_a1KIi
+ HsDev.Tools.Types: note :: forall a_a1KCF a_a1KNX. Lens (Note a_a1KCF) (Note a_a1KNX) a_a1KCF a_a1KNX
- HsDev.Tools.Types: noteLevel :: forall a_a1Kx0. Lens' (Note a_a1Kx0) (Maybe Severity)
+ HsDev.Tools.Types: noteLevel :: forall a_a1KCF. Lens' (Note a_a1KCF) (Maybe Severity)
- HsDev.Tools.Types: noteRegion :: forall a_a1Kx0. Lens' (Note a_a1Kx0) Region
+ HsDev.Tools.Types: noteRegion :: forall a_a1KCF. Lens' (Note a_a1KCF) Region
- HsDev.Tools.Types: noteSource :: forall a_a1Kx0. Lens' (Note a_a1Kx0) ModuleLocation
+ HsDev.Tools.Types: noteSource :: forall a_a1KCF. Lens' (Note a_a1KCF) ModuleLocation
Files
- hsdev.cabal +1/−1
- src/HsDev/Database/Update.hs +8/−4
- src/HsDev/Scan/Browse.hs +19/−16
- src/HsDev/Symbols/Location.hs +4/−4
- src/System/Directory/Paths.hs +10/−1
hsdev.cabal view
@@ -1,5 +1,5 @@ name: hsdev-version: 0.3.2.0+version: 0.3.2.1 synopsis: Haskell development library description: Haskell development library and tool with support of autocompletion, symbol info, go to declaration, find references, hayoo search etc.
src/HsDev/Database/Update.hs view
@@ -344,10 +344,12 @@ mlocs <- liftM (filter (`S.member` packageDbMods)) $ (inSessionGhc $ listModules opts pdbs packages')- Log.sendLog Log.Trace $ "{} modules found" ~~ length mlocs let+ umlocs = uniqueModuleLocations mlocs+ Log.sendLog Log.Trace $ "{} modules found, {} unique" ~~ length mlocs ~~ length umlocs+ let packageDbMods' = SQLite.query "select m.id, m.file, m.cabal, m.install_dirs, m.package_name, m.package_version, m.installed_name, m.exposed, m.other_location, m.inspection_time, m.inspection_opts from modules as m, package_dbs as ps where m.package_name == ps.package_name and m.package_version == ps.package_version and ps.package_db == ?;" (SQLite.Only (topPackageDb pdbs))- scan packageDbMods' ((,,) <$> mlocs <*> pure [] <*> pure Nothing) opts $ \mlocs' -> do+ scan packageDbMods' ((,,) <$> umlocs <*> pure [] <*> pure Nothing) opts $ \mlocs' -> do ms <- inSessionGhc $ browseModules opts pdbs (mlocs' ^.. each . _1) Log.sendLog Log.Trace $ "scanned {} modules" ~~ length ms sendUpdateAction $ timer "updated package-db modules" $ do@@ -375,10 +377,12 @@ mlocs <- liftM (filter (`S.member` packageDbMods)) $ (inSessionGhc $ listModules opts pdbs packages')- Log.sendLog Log.Trace $ "{} modules found" ~~ length mlocs let+ umlocs = uniqueModuleLocations mlocs+ Log.sendLog Log.Trace $ "{} modules found, {} unique" ~~ length mlocs ~~ length umlocs+ let packageDbStackMods = liftM concat $ forM (packageDbs pdbs) $ \pdb -> SQLite.query "select m.id, m.file, m.cabal, m.install_dirs, m.package_name, m.package_version, m.installed_name, m.exposed, m.other_location, m.inspection_time, m.inspection_opts from modules as m, package_dbs as ps where m.package_name == ps.package_name and m.package_version == ps.package_version and ps.package_db == ?;" (SQLite.Only pdb)- scan packageDbStackMods ((,,) <$> mlocs <*> pure [] <*> pure Nothing) opts $ \mlocs' -> do+ scan packageDbStackMods ((,,) <$> umlocs <*> pure [] <*> pure Nothing) opts $ \mlocs' -> do ms <- inSessionGhc $ browseModules opts pdbs (mlocs' ^.. each . _1) Log.sendLog Log.Trace $ "scanned {} modules" ~~ length ms sendUpdateAction $ timer "updated package-db-stack modules" $ do
src/HsDev/Scan/Browse.hs view
@@ -5,6 +5,7 @@ listModules, browseModules, browseModules', -- * Helpers+ uniqueModuleLocations, readPackage, readPackageConfig, ghcModuleLocation, packageConfigs, packageDbModules, lookupModule_, modulesPackages, modulesPackagesGroups, withEachPackage,@@ -32,8 +33,8 @@ import HsDev.Error import HsDev.Tools.Ghc.Worker (GhcM, tmpSession, formatType) import HsDev.Tools.Ghc.Compat as Compat-import HsDev.Util (ordNub)-import System.Directory.Paths (canonicalize)+import HsDev.Util (ordNub, uniqueBy)+import System.Directory.Paths (fromFilePath, normalize) import qualified ConLike as GHC import qualified DataCon as GHC@@ -72,7 +73,7 @@ listModules opts dbs pkgs = do tmpSession dbs (opts ++ packagesOpts) ms <- packageDbModules- sequence [ghcModuleLocation p m e | (p, m, e) <- ms]+ return $ ordNub [ghcModuleLocation p m e | (p, m, e) <- ms] where packagesOpts = ["-package " ++ show p | p <- pkgs] @@ -82,24 +83,20 @@ browseModules :: [String] -> PackageDbStack -> [ModuleLocation] -> GhcM [InspectedModule] browseModules opts dbs mlocs = do tmpSession dbs opts- liftM concat . withEachPackage (const $ browseModules' opts) $ mlocs+ liftM concat . withEachPackage (const $ browseModules' opts) $ ordNub mlocs -- | Inspect installed modules, doesn't set session and package flags! browseModules' :: [String] -> [ModuleLocation] -> GhcM [InspectedModule] browseModules' opts mlocs = do ms <- packageDbModules- mlocsDb <- sequence [ghcModuleLocation p m e | (p, m, e) <- ms] midTbl <- newLookupTable sidTbl <- newLookupTable let- lookupModuleId p' m' e' = do- mloc' <- ghcModuleLocation p' m' e'- modId' <- ghcModuleId p' m' e'- lookupTable mloc' modId' midTbl- liftM catMaybes $ sequence [browseModule' mloc lookupModuleId (cacheInTableM sidTbl) p m e | ((p, m, e), mloc) <- zip ms mlocsDb, mloc `S.member` mlocs']+ lookupModuleId p' m' e' = lookupTable (ghcModuleLocation p' m' e') (ghcModuleId p' m' e') midTbl+ liftM catMaybes $ sequence [browseModule' lookupModuleId (cacheInTableM sidTbl) p m e | (p, m, e) <- ms, ghcModuleLocation p m e `S.member` mlocs'] where- browseModule' :: ModuleLocation -> (GHC.PackageConfig -> GHC.Module -> Bool -> GhcM ModuleId) -> (GHC.Name -> GhcM Symbol -> GhcM Symbol) -> GHC.PackageConfig -> GHC.Module -> Bool -> GhcM (Maybe InspectedModule)- browseModule' mloc modId' sym' p m e = tryT $ runInspect mloc $ inspect_ (return $ InspectionAt 0 (map fromString opts)) (browseModule modId' sym' p m e)+ browseModule' :: (GHC.PackageConfig -> GHC.Module -> Bool -> GhcM ModuleId) -> (GHC.Name -> GhcM Symbol -> GhcM Symbol) -> GHC.PackageConfig -> GHC.Module -> Bool -> GhcM (Maybe InspectedModule)+ browseModule' modId' sym' p m e = tryT $ runInspect (ghcModuleLocation p m e) $ inspect_ (return $ InspectionAt 0 (map fromString opts)) (browseModule modId' sym' p m e) mlocs' = S.fromList mlocs browseModule :: (GHC.PackageConfig -> GHC.Module -> Bool -> GhcM ModuleId) -> (GHC.Name -> GhcM Symbol -> GhcM Symbol) -> GHC.PackageConfig -> GHC.Module -> Bool -> GhcM Module@@ -170,6 +167,12 @@ tryT :: MonadCatch m => m a -> m (Maybe a) tryT act = catch (fmap Just act) (const (return Nothing) . (id :: SomeException -> SomeException)) +-- | There can be same modules (same package name, version and module name) installed in different locations+-- Select first one of such modules+uniqueModuleLocations :: [ModuleLocation] -> [ModuleLocation]+uniqueModuleLocations = uniqueBy nameId' where+ nameId' mloc = (,) <$> (preview modulePackage mloc) <*> (preview installedModuleName mloc)+ readPackage :: GHC.PackageConfig -> ModulePackage readPackage pc = ModulePackage (fromString $ GHC.packageNameString pc) (fromString $ showVersion (GHC.packageVersion pc)) @@ -179,11 +182,11 @@ (map (fromString . GHC.moduleNameString . Compat.exposedModuleName) $ GHC.exposedModules pc) (GHC.exposed pc) -ghcModuleLocation :: MonadIO m => GHC.PackageConfig -> GHC.Module -> Bool -> m ModuleLocation-ghcModuleLocation p m = liftIO . canonicalize . InstalledModule (map fromString $ GHC.libraryDirs p) (readPackage p) (fromString $ GHC.moduleNameString $ GHC.moduleName m)+ghcModuleLocation :: GHC.PackageConfig -> GHC.Module -> Bool -> ModuleLocation+ghcModuleLocation p m = InstalledModule (map (normalize . fromFilePath) $ GHC.libraryDirs p) (readPackage p) (fromString $ GHC.moduleNameString $ GHC.moduleName m) -ghcModuleId :: MonadIO m => GHC.PackageConfig -> GHC.Module -> Bool -> m ModuleId-ghcModuleId p m e = ModuleId (fromString mname') <$> (ghcModuleLocation p m e) where+ghcModuleId :: GHC.PackageConfig -> GHC.Module -> Bool -> ModuleId+ghcModuleId p m e = ModuleId (fromString mname') (ghcModuleLocation p m e) where mname' = GHC.moduleNameString $ GHC.moduleName m packageConfigs :: GhcM [GHC.PackageConfig]
src/HsDev/Symbols/Location.hs view
@@ -119,12 +119,12 @@ instance Ord ModuleLocation where compare l r = compare (locType l, locNames l) (locType r, locNames r) where locType :: ModuleLocation -> Int- locType (FileModule _ _) = 0- locType (InstalledModule _ _ _ _) = 1- locType (OtherLocation _) = 2+ locType FileModule{} = 0+ locType InstalledModule{} = 1+ locType OtherLocation{} = 2 locType NoLocation = 3 locNames (FileModule f _) = [f]- locNames (InstalledModule dirs _ nm _) = nm : dirs+ locNames (InstalledModule dirs _ nm _) = nm : dirs -- dirs already includes name of package locNames (OtherLocation n) = [n] locNames NoLocation = []
src/System/Directory/Paths.hs view
@@ -8,7 +8,8 @@ Paths(..), canonicalize, absolutise,- relativise+ relativise,+ normalize ) where import Control.Lens@@ -83,3 +84,11 @@ -- | Relativise paths relativise :: Paths a => Path -> a -> a relativise parent = over paths (makeRelative (parent ^. path))++-- | Normalize paths, with workaround for Windows drives+normalize :: Paths a => a -> a+normalize = over paths normalizePath' where+ normalizePath' :: FilePath -> FilePath+ normalizePath' = fixDrive . normalise+ fixDrive :: FilePath -> FilePath+ fixDrive = uncurry joinDrive . over _1 (addTrailingPathSeparator . dropWhileEnd isPathSeparator) . splitDrive