From 1559a91a84de87be893239f18df6746bdad60dd1 Mon Sep 17 00:00:00 2001 From: Nikolay Yakimov Date: Sun, 10 Jan 2016 01:19:15 +0300 Subject: [PATCH] Cache non-interactive find results in distdir --- Language/Haskell/GhcMod/Find.hs | 20 ++++++++++++++++++-- Language/Haskell/GhcMod/PathsAndFiles.hs | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Language/Haskell/GhcMod/Find.hs b/Language/Haskell/GhcMod/Find.hs index 5f00138..bd51749 100644 --- a/Language/Haskell/GhcMod/Find.hs +++ b/Language/Haskell/GhcMod/Find.hs @@ -56,7 +56,8 @@ import Data.Map (Map) import qualified Data.Map as M import Data.Set (Set) import qualified Data.Set as S - +import Language.Haskell.GhcMod.PathsAndFiles +import System.Directory import Prelude ---------------------------------------------------------------- @@ -83,7 +84,7 @@ isOutdated db = -- | Looking up 'SymbolDb' with 'Symbol' to \['ModuleString'\] -- which will be concatenated. 'loadSymbolDb' is called internally. findSymbol :: IOish m => String -> GhcModT m String -findSymbol sym = loadSymbolDb >>= lookupSymbol sym +findSymbol sym = loadSymbolDb' >>= lookupSymbol sym -- | Looking up 'SymbolDb' with 'Symbol' to \['ModuleString'\] -- which will be concatenated. @@ -95,6 +96,21 @@ lookupSym sym db = map (ModuleString . unpackFS . mkFastStringByteString') $ S.t --------------------------------------------------------------- +loadSymbolDb' :: IOish m => GhcModT m SymbolDb +loadSymbolDb' = do + cache <- symbolCache <$> cradle + let doLoad True = do + db <- decode <$> liftIO (LBS.readFile cache) + outdated <- isOutdated db + if outdated + then doLoad False + else return db + doLoad False = do + db <- loadSymbolDb + liftIO $ LBS.writeFile cache $ encode db + return db + doLoad =<< liftIO (doesFileExist cache) + -- | Loading a file and creates 'SymbolDb'. loadSymbolDb :: IOish m => GhcModT m SymbolDb loadSymbolDb = do diff --git a/Language/Haskell/GhcMod/PathsAndFiles.hs b/Language/Haskell/GhcMod/PathsAndFiles.hs index 43ed020..6c0a68e 100644 --- a/Language/Haskell/GhcMod/PathsAndFiles.hs +++ b/Language/Haskell/GhcMod/PathsAndFiles.hs @@ -220,7 +220,7 @@ packageCache = "package.cache" -- | Filename of the symbol table cache file. symbolCache :: Cradle -> FilePath -symbolCache crdl = cradleTempDir crdl symbolCacheFile +symbolCache crdl = cradleRootDir crdl cradleDistDir crdl symbolCacheFile symbolCacheFile :: String symbolCacheFile = "ghc-mod.symbol-cache"