@@ -58,6 +58,7 @@ import Data.IntMap.Strict (IntMap)
5858import Data.List
5959import qualified Data.Set as Set
6060import qualified Data.Text as T
61+ import qualified Data.Text.Encoding as T
6162import Development.IDE.GHC.Error
6263import Development.Shake hiding (Diagnostic )
6364import 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
197205getPackageHieFile :: 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
524532knownFilesRule :: Rules ()
525533knownFilesRule = 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