|
4 | 4 |
|
5 | 5 | module Haskell.Ide.Engine.GhcModuleCache where
|
6 | 6 |
|
| 7 | +import Control.Monad.IO.Class ( liftIO , MonadIO(..) ) |
| 8 | + |
7 | 9 | import qualified Data.Map as Map
|
8 | 10 | import Data.Dynamic (Dynamic)
|
9 | 11 | import Data.Typeable (TypeRep)
|
@@ -100,21 +102,59 @@ data LookupCradleResult = ReuseCradle | LoadCradle CachedCradle | NewCradle File
|
100 | 102 | lookupCradle :: FilePath -> GhcModuleCache -> LookupCradleResult
|
101 | 103 | lookupCradle fp gmc =
|
102 | 104 | case currentCradle gmc of
|
103 |
| - Just (dirs, _c) | (any (\d -> d `isPrefixOf` fp) dirs) -> ReuseCradle |
| 105 | + Just (dirs, _c, _) | any (`isPrefixOf` fp) dirs -> ReuseCradle |
104 | 106 | _ -> case T.match (cradleCache gmc) (B.pack fp) of
|
105 | 107 | Just (_k, c, _suf) -> LoadCradle c
|
106 | 108 | Nothing -> NewCradle fp
|
107 | 109 |
|
108 |
| -data CachedCradle = CachedCradle BIOS.Cradle HscEnv |
| 110 | +getComponentOptions |
| 111 | + :: (MonadIO m, HasGhcModuleCache m) |
| 112 | + => FilePath |
| 113 | + -> m (Maybe BIOS.ComponentOptions) |
| 114 | +getComponentOptions fp = do |
| 115 | + mc <- getModuleCache |
| 116 | + case currentCradle mc of |
| 117 | + Just (dirs, cradle, co) | any (`isPrefixOf` fp) dirs -> case co of |
| 118 | + Just _ -> return co |
| 119 | + _ -> setCo fp cradle setCur |
| 120 | + _ -> case T.match (cradleCache mc) (B.pack fp) of |
| 121 | + Just (_, CachedCradle _ _ (Just co), _) -> return $ Just co |
| 122 | + Just (p, CachedCradle cradle _ Nothing, _) -> |
| 123 | + setCo (B.unpack p) cradle setCac |
| 124 | + _ -> return Nothing |
| 125 | + where |
| 126 | + setCo fp' cradle mod' = do |
| 127 | + res <- liftIO $ BIOS.getCompilerOptions fp' cradle |
| 128 | + case res of |
| 129 | + BIOS.CradleSuccess opts -> do |
| 130 | + modifyModuleCache $ mod' opts fp' |
| 131 | + return $ Just opts |
| 132 | + _ -> return Nothing |
| 133 | + setCur opts _ mc'@(GhcModuleCache _ _ (Just (fps, c', _))) = |
| 134 | + mc' { currentCradle = Just (fps, c', Just opts) } |
| 135 | + setCur _ _ mc' = mc' |
| 136 | + setCac opts fp' mc' = mc' |
| 137 | + { cradleCache = T.adjust (\cc -> cc { mCompOpts = Just opts }) (B.pack fp') |
| 138 | + $ cradleCache mc' |
| 139 | + } |
| 140 | + |
| 141 | + |
| 142 | + |
| 143 | +data CachedCradle = CachedCradle |
| 144 | + { ccradle :: BIOS.Cradle |
| 145 | + , hscEnv :: HscEnv |
| 146 | + , mCompOpts :: Maybe BIOS.ComponentOptions |
| 147 | + } |
109 | 148 |
|
110 | 149 | instance Show CachedCradle where
|
111 |
| - show (CachedCradle x _) = show x |
| 150 | + show (CachedCradle x _ _) = show x |
112 | 151 |
|
113 | 152 | data GhcModuleCache = GhcModuleCache
|
114 | 153 | { cradleCache :: !(T.Trie CachedCradle)
|
115 | 154 | -- ^ map from FilePath to cradles
|
| 155 | + -- May not include currentCradle |
116 | 156 | , uriCaches :: !UriCaches
|
117 |
| - , currentCradle :: Maybe ([FilePath], BIOS.Cradle) |
| 157 | + , currentCradle :: Maybe ([FilePath], BIOS.Cradle, Maybe BIOS.ComponentOptions) |
118 | 158 | -- ^ The current cradle and which FilePath's it is
|
119 | 159 | -- responsible for
|
120 | 160 | } deriving (Show)
|
|
0 commit comments