Skip to content

Commit fbaa203

Browse files
committed
Prevent duplicate missing module diagnostics
1 parent 523bf4e commit fbaa203

File tree

2 files changed

+30
-33
lines changed

2 files changed

+30
-33
lines changed

Diff for: ghcide/src/Development/IDE/Core/Rules.hs

+22-18
Original file line numberDiff line numberDiff line change
@@ -691,27 +691,31 @@ loadGhcSession = do
691691

692692
defineNoDiagnostics $ \GhcSessionDeps file -> do
693693
env <- use_ GhcSession file
694-
Just <$> ghcSessionDepsDefinition False env file
694+
ghcSessionDepsDefinition False env file
695695

696-
ghcSessionDepsDefinition :: Bool -> HscEnvEq -> NormalizedFilePath -> Action HscEnvEq
696+
ghcSessionDepsDefinition :: Bool -> HscEnvEq -> NormalizedFilePath -> Action (Maybe HscEnvEq)
697697
ghcSessionDepsDefinition forceLinkable env file = do
698698
let hsc = hscEnv env
699-
deps <- mapMaybe (fmap artifactFilePath . snd) <$> use_ GetLocatedImports file
700-
_ <- uses_ ReportImportCycles deps
701-
ms:mss <- map msrModSummary <$> uses_ GetModSummaryWithoutTimestamps (file:deps)
702-
703-
depSessions <- map hscEnv <$> uses_ GhcSessionDeps deps
704-
let uses_th_qq =
705-
xopt LangExt.TemplateHaskell dflags || xopt LangExt.QuasiQuotes dflags
706-
dflags = ms_hspp_opts ms
707-
ifaces <- if uses_th_qq || forceLinkable
708-
then uses_ GetModIface deps
709-
else uses_ GetModIfaceWithoutLinkable deps
710-
711-
let inLoadOrder = map hirHomeMod ifaces
712-
session' <- liftIO $ mergeEnvs hsc mss inLoadOrder depSessions
713-
714-
liftIO $ newHscEnvEqWithImportPaths (envImportPaths env) session' []
699+
700+
mbdeps <- mapM(fmap artifactFilePath . snd) <$> use_ GetLocatedImports file
701+
case mbdeps of
702+
Nothing -> return Nothing
703+
Just deps -> do
704+
_ <- uses_ ReportImportCycles deps
705+
ms:mss <- map msrModSummary <$> uses_ GetModSummaryWithoutTimestamps (file:deps)
706+
707+
depSessions <- map hscEnv <$> uses_ GhcSessionDeps deps
708+
let uses_th_qq =
709+
xopt LangExt.TemplateHaskell dflags || xopt LangExt.QuasiQuotes dflags
710+
dflags = ms_hspp_opts ms
711+
ifaces <- if uses_th_qq || forceLinkable
712+
then uses_ GetModIface deps
713+
else uses_ GetModIfaceWithoutLinkable deps
714+
715+
let inLoadOrder = map hirHomeMod ifaces
716+
session' <- liftIO $ mergeEnvs hsc mss inLoadOrder depSessions
717+
718+
Just <$> liftIO (newHscEnvEqWithImportPaths (envImportPaths env) session' [])
715719

716720
-- | Load a iface from disk, or generate it if there isn't one or it is out of date
717721
-- This rule also ensures that the `.hie` and `.o` (if needed) files are written out.

Diff for: plugins/hls-eval-plugin/src/Ide/Plugin/Eval/CodeLens.hs

+8-15
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ module Ide.Plugin.Eval.CodeLens (
2727

2828
import Control.Applicative (Alternative ((<|>)))
2929
import Control.Arrow (second, (>>>))
30-
import Control.Exception (assert, try)
30+
import Control.Exception (try)
3131
import qualified Control.Exception as E
3232
import Control.Lens (_1, _3, (%~), (<&>), (^.))
3333
import Control.Monad (guard, join, void, when)
@@ -38,31 +38,23 @@ import Data.Char (isSpace)
3838
import qualified Data.HashMap.Strict as HashMap
3939
import Data.List (dropWhileEnd, find,
4040
intercalate, intersperse)
41-
import Data.Maybe (catMaybes, fromMaybe, isJust)
41+
import Data.Maybe (catMaybes, fromMaybe)
4242
import Data.String (IsString)
4343
import Data.Text (Text)
4444
import qualified Data.Text as T
4545
import Data.Time (getCurrentTime)
4646
import Data.Typeable (Typeable)
47-
import Development.IDE (Action, GetDependencies (..),
48-
GetModIface (..),
49-
GetModSummary (..),
50-
GhcSessionIO (..),
51-
HiFileResult (hirHomeMod, hirModSummary),
52-
HscEnvEq, IdeState,
47+
import Development.IDE (GetModSummary (..),
48+
GhcSessionIO (..), IdeState,
5349
ModSummaryResult (..),
5450
NeedsCompilation (NeedsCompilation),
5551
evalGhcEnv, hscEnv,
56-
hscEnvWithImportPaths,
5752
prettyPrint, runAction,
5853
textToStringBuffer,
5954
toNormalizedFilePath',
6055
uriToFilePath', useNoFile_,
61-
useWithStale_, use_, uses_)
62-
import Development.IDE.Core.Compile (loadModulesHome,
63-
setupFinderCache)
64-
import Development.IDE.Core.Rules (TransitiveDependencies (transitiveModuleDeps),
65-
ghcSessionDepsDefinition)
56+
useWithStale_, use_)
57+
import Development.IDE.Core.Rules (ghcSessionDepsDefinition)
6658
import Development.IDE.GHC.Compat hiding (typeKind, unitState)
6759
import qualified Development.IDE.GHC.Compat as Compat
6860
import qualified Development.IDE.GHC.Compat as SrcLoc
@@ -544,7 +536,8 @@ runGetSession st nfp = liftIO $ runAction "eval" st $ do
544536
let fp = fromNormalizedFilePath nfp
545537
((_, res),_) <- liftIO $ loadSessionFun fp
546538
let env = fromMaybe (error $ "Unknown file: " <> fp) res
547-
hscEnv <$> ghcSessionDepsDefinition False env nfp
539+
res <- fmap hscEnv <$> ghcSessionDepsDefinition False env nfp
540+
return $ fromMaybe (error $ "Unable to load file: " <> fp) res
548541

549542
needsQuickCheck :: [(Section, Test)] -> Bool
550543
needsQuickCheck = any (isProperty . snd)

0 commit comments

Comments
 (0)