Skip to content

Commit b3ac77c

Browse files
committed
Add RuleWithOldValue to allow access to previous results
1 parent 75b0b4d commit b3ac77c

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,7 @@ data RuleBody k v
10341034
{ newnessCheck :: BS.ByteString -> BS.ByteString -> Bool
10351035
, build :: k -> NormalizedFilePath -> Action (Maybe BS.ByteString, Maybe v)
10361036
}
1037+
| RuleWithOldValue (k -> NormalizedFilePath -> Value v -> Action (Maybe BS.ByteString, IdeResult v))
10371038

10381039
-- | Define a new Rule with early cutoff
10391040
defineEarlyCutoff
@@ -1046,20 +1047,26 @@ defineEarlyCutoff recorder (Rule op) = addRule $ \(Q (key, file)) (old :: Maybe
10461047
let diagnostics diags = do
10471048
traceDiagnostics diags
10481049
updateFileDiagnostics recorder file (Key key) extras . map (\(_,y,z) -> (y,z)) $ diags
1049-
defineEarlyCutoff' diagnostics (==) key file old mode $ op key file
1050+
defineEarlyCutoff' diagnostics (==) key file old mode $ const $ op key file
10501051
defineEarlyCutoff recorder (RuleNoDiagnostics op) = addRule $ \(Q (key, file)) (old :: Maybe BS.ByteString) mode -> otTracedAction key file mode traceA $ \traceDiagnostics -> do
10511052
let diagnostics diags = do
10521053
traceDiagnostics diags
10531054
mapM_ (logWith recorder Warning . LogDefineEarlyCutoffRuleNoDiagHasDiag) diags
1054-
defineEarlyCutoff' diagnostics (==) key file old mode $ second (mempty,) <$> op key file
1055+
defineEarlyCutoff' diagnostics (==) key file old mode $ const $ second (mempty,) <$> op key file
10551056
defineEarlyCutoff recorder RuleWithCustomNewnessCheck{..} =
10561057
addRule $ \(Q (key, file)) (old :: Maybe BS.ByteString) mode ->
10571058
otTracedAction key file mode traceA $ \ traceDiagnostics -> do
10581059
let diagnostics diags = do
10591060
traceDiagnostics diags
10601061
mapM_ (logWith recorder Warning . LogDefineEarlyCutoffRuleCustomNewnessHasDiag) diags
10611062
defineEarlyCutoff' diagnostics newnessCheck key file old mode $
1062-
second (mempty,) <$> build key file
1063+
const $ second (mempty,) <$> build key file
1064+
defineEarlyCutoff recorder (RuleWithOldValue op) = addRule $ \(Q (key, file)) (old :: Maybe BS.ByteString) mode -> otTracedAction key file mode traceA $ \traceDiagnostics -> do
1065+
extras <- getShakeExtras
1066+
let diagnostics diags = do
1067+
traceDiagnostics diags
1068+
updateFileDiagnostics recorder file (Key key) extras . map (\(_,y,z) -> (y,z)) $ diags
1069+
defineEarlyCutoff' diagnostics (==) key file old mode $ op key file
10631070

10641071
defineNoFile :: IdeRule k v => Recorder (WithPriority Log) -> (k -> Action v) -> Rules ()
10651072
defineNoFile recorder f = defineNoDiagnostics recorder $ \k file -> do
@@ -1080,7 +1087,7 @@ defineEarlyCutoff'
10801087
-> NormalizedFilePath
10811088
-> Maybe BS.ByteString
10821089
-> RunMode
1083-
-> Action (Maybe BS.ByteString, IdeResult v)
1090+
-> (Value v -> Action (Maybe BS.ByteString, IdeResult v))
10841091
-> Action (RunResult (A (RuleResult k)))
10851092
defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
10861093
ShakeExtras{state, progress, dirtyKeys} <- getShakeExtras
@@ -1103,8 +1110,13 @@ defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
11031110
res <- case val of
11041111
Just res -> return res
11051112
Nothing -> do
1113+
staleV <- liftIO $ atomicallyNamed "define -read 3" $ getValues state key file <&> \case
1114+
Nothing -> Failed False
1115+
Just (Succeeded ver v, _) -> Stale Nothing ver v
1116+
Just (Stale d ver v, _) -> Stale d ver v
1117+
Just (Failed b, _) -> Failed b
11061118
(bs, (diags, res)) <- actionCatch
1107-
(do v <- action; liftIO $ evaluate $ force v) $
1119+
(do v <- action staleV; liftIO $ evaluate $ force v) $
11081120
\(e :: SomeException) -> do
11091121
pure (Nothing, ([ideErrorText file $ T.pack $ show e | not $ isBadDependency e],Nothing))
11101122

@@ -1116,11 +1128,6 @@ defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
11161128

11171129
(bs, res) <- case res of
11181130
Nothing -> do
1119-
staleV <- liftIO $ atomicallyNamed "define -read 3" $ getValues state key file <&> \case
1120-
Nothing -> Failed False
1121-
Just (Succeeded ver v, _) -> Stale Nothing ver v
1122-
Just (Stale d ver v, _) -> Stale d ver v
1123-
Just (Failed b, _) -> Failed b
11241131
pure (toShakeValue ShakeStale bs, staleV)
11251132
Just v -> pure (maybe ShakeNoCutoff ShakeResult bs, Succeeded modTime v)
11261133
liftIO $ atomicallyNamed "define - write" $ setValues state key file res (Vector.fromList diags)

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import Development.IDE.Types.Diagnostics
3131
import Development.IDE.Types.Location
3232
import GHC.Generics
3333
import HieDb.Types (HieDb)
34-
import Language.LSP.Types
3534
import qualified StmContainers.Map as STM
3635
import Type.Reflection (SomeTypeRep (SomeTypeRep),
3736
pattern App, pattern Con,

0 commit comments

Comments
 (0)