Skip to content

Commit b1e9fa4

Browse files
Stale diagnostics fix (#1204)
* Add a test for updated diagnostics * Diagnostics fix: always use the rule diagnostics When the rule runs, always use the diagnostics it returns The only case where we reuse saved diagnostics is early cutoff Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent 17cd0af commit b1e9fa4

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

ghcide/src/Development/IDE/Core/Shake.hs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -815,20 +815,20 @@ defineEarlyCutoff op = addBuiltinRule noLint noIdentity $ \(Q (key, file)) (old
815815
(do v <- op key file; liftIO $ evaluate $ force v) $
816816
\(e :: SomeException) -> pure (Nothing, ([ideErrorText file $ T.pack $ show e | not $ isBadDependency e],Nothing))
817817
modTime <- liftIO $ (currentValue . fst =<<) <$> getValues state GetModificationTime file
818-
(bs, diags, diagsV, res) <- case res of
818+
(bs, res) <- case res of
819819
Nothing -> do
820820
staleV <- liftIO $ getValues state key file
821821
pure $ case staleV of
822-
Nothing -> (toShakeValue ShakeResult bs, diags, Vector.fromList diags, Failed)
822+
Nothing -> (toShakeValue ShakeResult bs, Failed)
823823
Just v -> case v of
824-
(Succeeded ver v, diags) ->
825-
(toShakeValue ShakeStale bs, Vector.toList diags, diags, Stale ver v)
826-
(Stale ver v, diags) ->
827-
(toShakeValue ShakeStale bs, Vector.toList diags, diags, Stale ver v)
828-
(Failed, diags) ->
829-
(toShakeValue ShakeResult bs, Vector.toList diags, diags, Failed)
830-
Just v -> pure (maybe ShakeNoCutoff ShakeResult bs, diags, Vector.fromList diags, Succeeded (vfsVersion =<< modTime) v)
831-
liftIO $ setValues state key file res diagsV
824+
(Succeeded ver v, _) ->
825+
(toShakeValue ShakeStale bs, Stale ver v)
826+
(Stale ver v, _) ->
827+
(toShakeValue ShakeStale bs, Stale ver v)
828+
(Failed, _) ->
829+
(toShakeValue ShakeResult bs, Failed)
830+
Just v -> pure (maybe ShakeNoCutoff ShakeResult bs, Succeeded (vfsVersion =<< modTime) v)
831+
liftIO $ setValues state key file res (Vector.fromList diags)
832832
updateFileDiagnostics file (Key key) extras $ map (\(_,y,z) -> (y,z)) diags
833833
let eq = case (bs, fmap decodeShakeValue old) of
834834
(ShakeResult a, Just (ShakeResult b)) -> a == b

ghcide/test/exe/Main.hs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,17 @@ diagnosticTests = testGroup "diagnostics"
201201
}
202202
changeDoc doc [change]
203203
expectDiagnostics [("Testing.hs", [(DsError, (0, 15), "parse error")])]
204+
, testSessionWait "update syntax error" $ do
205+
let content = T.unlines [ "module Testing(missing) where" ]
206+
doc <- createDoc "Testing.hs" "haskell" content
207+
expectDiagnostics [("Testing.hs", [(DsError, (0, 15), "Not in scope: 'missing'")])]
208+
let change = TextDocumentContentChangeEvent
209+
{ _range = Just (Range (Position 0 15) (Position 0 16))
210+
, _rangeLength = Nothing
211+
, _text = "l"
212+
}
213+
changeDoc doc [change]
214+
expectDiagnostics [("Testing.hs", [(DsError, (0, 15), "Not in scope: 'lissing'")])]
204215
, testSessionWait "variable not in scope" $ do
205216
let content = T.unlines
206217
[ "module Testing where"

0 commit comments

Comments
 (0)