Skip to content

Commit 1ed280b

Browse files
authored
Save source files with HIE files (#701)
1 parent 9ae5134 commit 1ed280b

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/Development/IDE/Core/Compile.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import Control.Monad.Extra
7373
import Control.Monad.Except
7474
import Control.Monad.Trans.Except
7575
import Data.Bifunctor (first, second)
76+
import qualified Data.ByteString as BS
7677
import qualified Data.Text as T
7778
import Data.IORef
7879
import Data.List.Extra
@@ -280,13 +281,13 @@ atomicFileWrite targetPath write = do
280281
(tempFilePath, cleanUp) <- newTempFileWithin dir
281282
(write tempFilePath >> renameFile tempFilePath targetPath) `onException` cleanUp
282283

283-
generateAndWriteHieFile :: HscEnv -> TypecheckedModule -> IO [FileDiagnostic]
284-
generateAndWriteHieFile hscEnv tcm =
284+
generateAndWriteHieFile :: HscEnv -> TypecheckedModule -> BS.ByteString -> IO [FileDiagnostic]
285+
generateAndWriteHieFile hscEnv tcm source =
285286
handleGenerationErrors dflags "extended interface generation" $ do
286287
case tm_renamed_source tcm of
287288
Just rnsrc -> do
288289
hf <- runHsc hscEnv $
289-
GHC.mkHieFile mod_summary (fst $ tm_internals_ tcm) rnsrc ""
290+
GHC.mkHieFile mod_summary (fst $ tm_internals_ tcm) rnsrc source
290291
atomicFileWrite targetPath $ flip GHC.writeHieFile hf
291292
_ ->
292293
return ()

src/Development/IDE/Core/Rules.hs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import Data.IntMap.Strict (IntMap)
5858
import Data.List
5959
import qualified Data.Set as Set
6060
import qualified Data.Text as T
61+
import qualified Data.Text.Encoding as T
6162
import Development.IDE.GHC.Error
6263
import Development.Shake hiding (Diagnostic)
6364
import Development.IDE.Core.RuleTypes
@@ -188,11 +189,18 @@ getHomeHieFile f = do
188189
wait <- lift $ delayedAction $ mkDelayedAction "OutOfDateHie" L.Info $ do
189190
hsc <- hscEnv <$> use_ GhcSession f
190191
pm <- use_ GetParsedModule f
191-
typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles
192+
source <- getSourceFileSource f
193+
typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles (Just source)
192194
_ <- MaybeT $ liftIO $ timeout 1 wait
193195
ncu <- mkUpdater
194196
liftIO $ loadHieFile ncu hie_f
195197

198+
getSourceFileSource :: NormalizedFilePath -> Action BS.ByteString
199+
getSourceFileSource nfp = do
200+
(_, msource) <- getFileContents nfp
201+
case msource of
202+
Nothing -> liftIO $ BS.readFile (fromNormalizedFilePath nfp)
203+
Just source -> pure $ T.encodeUtf8 source
196204

197205
getPackageHieFile :: ShakeExtras
198206
-> Module -- ^ Package Module to load .hie file for
@@ -519,7 +527,7 @@ typeCheckRule = define $ \TypeCheck file -> do
519527
hsc <- hscEnv <$> use_ GhcSessionDeps file
520528
-- do not generate interface files as this rule is called
521529
-- for files of interest on every keystroke
522-
typeCheckRuleDefinition hsc pm SkipGenerationOfInterfaceFiles
530+
typeCheckRuleDefinition hsc pm SkipGenerationOfInterfaceFiles Nothing
523531

524532
knownFilesRule :: Rules ()
525533
knownFilesRule = defineEarlyCutOffNoFile $ \GetKnownFiles -> do
@@ -546,8 +554,9 @@ typeCheckRuleDefinition
546554
:: HscEnv
547555
-> ParsedModule
548556
-> GenerateInterfaceFiles -- ^ Should generate .hi and .hie files ?
557+
-> Maybe BS.ByteString
549558
-> Action (IdeResult TcModuleResult)
550-
typeCheckRuleDefinition hsc pm generateArtifacts = do
559+
typeCheckRuleDefinition hsc pm generateArtifacts source = do
551560
setPriority priorityTypeCheck
552561
IdeOptions { optDefer = defer } <- getIdeOptions
553562

@@ -560,7 +569,7 @@ typeCheckRuleDefinition hsc pm generateArtifacts = do
560569
-- type errors, as we won't get proper diagnostics if we load these from
561570
-- disk
562571
, not $ tmrDeferedError tcm -> do
563-
diagsHie <- generateAndWriteHieFile hsc (tmrModule tcm)
572+
diagsHie <- generateAndWriteHieFile hsc (tmrModule tcm) (fromMaybe "" source)
564573
diagsHi <- writeHiFile hsc tcm
565574
return (diags <> diagsHi <> diagsHie, Just tcm)
566575
(diags, res) ->
@@ -801,9 +810,10 @@ regenerateHiFile sess f = do
801810
case mb_pm of
802811
Nothing -> return (diags, Nothing)
803812
Just pm -> do
813+
source <- getSourceFileSource f
804814
-- Invoke typechecking directly to update it without incurring a dependency
805815
-- on the parsed module and the typecheck rules
806-
(diags', tmr) <- typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles
816+
(diags', tmr) <- typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles (Just source)
807817
-- Bang pattern is important to avoid leaking 'tmr'
808818
let !res = extractHiFileResult tmr
809819
return (diags <> diags', res)

0 commit comments

Comments
 (0)