@@ -58,6 +58,7 @@ import Data.IntMap.Strict (IntMap)
58
58
import Data.List
59
59
import qualified Data.Set as Set
60
60
import qualified Data.Text as T
61
+ import qualified Data.Text.Encoding as T
61
62
import Development.IDE.GHC.Error
62
63
import Development.Shake hiding (Diagnostic )
63
64
import Development.IDE.Core.RuleTypes
@@ -188,11 +189,18 @@ getHomeHieFile f = do
188
189
wait <- lift $ delayedAction $ mkDelayedAction " OutOfDateHie" L. Info $ do
189
190
hsc <- hscEnv <$> use_ GhcSession f
190
191
pm <- use_ GetParsedModule f
191
- typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles
192
+ source <- getSourceFileSource f
193
+ typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles (Just source)
192
194
_ <- MaybeT $ liftIO $ timeout 1 wait
193
195
ncu <- mkUpdater
194
196
liftIO $ loadHieFile ncu hie_f
195
197
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
196
204
197
205
getPackageHieFile :: ShakeExtras
198
206
-> Module -- ^ Package Module to load .hie file for
@@ -519,7 +527,7 @@ typeCheckRule = define $ \TypeCheck file -> do
519
527
hsc <- hscEnv <$> use_ GhcSessionDeps file
520
528
-- do not generate interface files as this rule is called
521
529
-- for files of interest on every keystroke
522
- typeCheckRuleDefinition hsc pm SkipGenerationOfInterfaceFiles
530
+ typeCheckRuleDefinition hsc pm SkipGenerationOfInterfaceFiles Nothing
523
531
524
532
knownFilesRule :: Rules ()
525
533
knownFilesRule = defineEarlyCutOffNoFile $ \ GetKnownFiles -> do
@@ -546,8 +554,9 @@ typeCheckRuleDefinition
546
554
:: HscEnv
547
555
-> ParsedModule
548
556
-> GenerateInterfaceFiles -- ^ Should generate .hi and .hie files ?
557
+ -> Maybe BS. ByteString
549
558
-> Action (IdeResult TcModuleResult )
550
- typeCheckRuleDefinition hsc pm generateArtifacts = do
559
+ typeCheckRuleDefinition hsc pm generateArtifacts source = do
551
560
setPriority priorityTypeCheck
552
561
IdeOptions { optDefer = defer } <- getIdeOptions
553
562
@@ -560,7 +569,7 @@ typeCheckRuleDefinition hsc pm generateArtifacts = do
560
569
-- type errors, as we won't get proper diagnostics if we load these from
561
570
-- disk
562
571
, not $ tmrDeferedError tcm -> do
563
- diagsHie <- generateAndWriteHieFile hsc (tmrModule tcm)
572
+ diagsHie <- generateAndWriteHieFile hsc (tmrModule tcm) (fromMaybe " " source)
564
573
diagsHi <- writeHiFile hsc tcm
565
574
return (diags <> diagsHi <> diagsHie, Just tcm)
566
575
(diags, res) ->
@@ -801,9 +810,10 @@ regenerateHiFile sess f = do
801
810
case mb_pm of
802
811
Nothing -> return (diags, Nothing )
803
812
Just pm -> do
813
+ source <- getSourceFileSource f
804
814
-- Invoke typechecking directly to update it without incurring a dependency
805
815
-- on the parsed module and the typecheck rules
806
- (diags', tmr) <- typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles
816
+ (diags', tmr) <- typeCheckRuleDefinition hsc pm DoGenerateInterfaceFiles ( Just source)
807
817
-- Bang pattern is important to avoid leaking 'tmr'
808
818
let ! res = extractHiFileResult tmr
809
819
return (diags <> diags', res)
0 commit comments