Skip to content

Commit a89df8a

Browse files
committed
Add RuleWithOldValue to allow access to previous results
1 parent 5f57614 commit a89df8a

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,7 @@ data RuleBody k v
984984
{ newnessCheck :: BS.ByteString -> BS.ByteString -> Bool
985985
, build :: k -> NormalizedFilePath -> Action (Maybe BS.ByteString, Maybe v)
986986
}
987+
| RuleWithOldValue (k -> NormalizedFilePath -> Value v -> Action (Maybe BS.ByteString, IdeResult v))
987988

988989
-- | Define a new Rule with early cutoff
989990
defineEarlyCutoff
@@ -995,13 +996,13 @@ defineEarlyCutoff (Rule op) = addRule $ \(Q (key, file)) (old :: Maybe BS.ByteSt
995996
let diagnostics diags = do
996997
traceDiagnostics diags
997998
updateFileDiagnostics file (Key key) extras . map (\(_,y,z) -> (y,z)) $ diags
998-
defineEarlyCutoff' diagnostics (==) key file old mode $ op key file
999+
defineEarlyCutoff' diagnostics (==) key file old mode $ const $ op key file
9991000
defineEarlyCutoff (RuleNoDiagnostics op) = addRule $ \(Q (key, file)) (old :: Maybe BS.ByteString) mode -> otTracedAction key file mode traceA $ \traceDiagnostics -> do
10001001
ShakeExtras{logger} <- getShakeExtras
10011002
let diagnostics diags = do
10021003
traceDiagnostics diags
10031004
mapM_ (\d -> liftIO $ logWarning logger $ showDiagnosticsColored [d]) diags
1004-
defineEarlyCutoff' diagnostics (==) key file old mode $ second (mempty,) <$> op key file
1005+
defineEarlyCutoff' diagnostics (==) key file old mode $ const $ second (mempty,) <$> op key file
10051006
defineEarlyCutoff RuleWithCustomNewnessCheck{..} =
10061007
addRule $ \(Q (key, file)) (old :: Maybe BS.ByteString) mode ->
10071008
otTracedAction key file mode traceA $ \ traceDiagnostics -> do
@@ -1010,7 +1011,13 @@ defineEarlyCutoff RuleWithCustomNewnessCheck{..} =
10101011
mapM_ (\d -> liftIO $ logWarning logger $ showDiagnosticsColored [d]) diags
10111012
traceDiagnostics diags
10121013
defineEarlyCutoff' diagnostics newnessCheck key file old mode $
1013-
second (mempty,) <$> build key file
1014+
const $ second (mempty,) <$> build key file
1015+
defineEarlyCutoff (RuleWithOldValue op) = addRule $ \(Q (key, file)) (old :: Maybe BS.ByteString) mode -> otTracedAction key file mode traceA $ \traceDiagnostics -> do
1016+
extras <- getShakeExtras
1017+
let diagnostics diags = do
1018+
traceDiagnostics diags
1019+
updateFileDiagnostics file (Key key) extras . map (\(_,y,z) -> (y,z)) $ diags
1020+
defineEarlyCutoff' diagnostics (==) key file old mode $ op key file
10141021

10151022
defineNoFile :: IdeRule k v => (k -> Action v) -> Rules ()
10161023
defineNoFile f = defineNoDiagnostics $ \k file -> do
@@ -1031,7 +1038,7 @@ defineEarlyCutoff'
10311038
-> NormalizedFilePath
10321039
-> Maybe BS.ByteString
10331040
-> RunMode
1034-
-> Action (Maybe BS.ByteString, IdeResult v)
1041+
-> (Value v -> Action (Maybe BS.ByteString, IdeResult v))
10351042
-> Action (RunResult (A (RuleResult k)))
10361043
defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
10371044
ShakeExtras{state, progress, dirtyKeys} <- getShakeExtras
@@ -1061,7 +1068,7 @@ defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
10611068
Just (Failed b, _) -> Failed b
10621069

10631070
(bs, (diags, res)) <- actionCatch
1064-
(do v <- action; liftIO $ evaluate $ force v) $
1071+
(do v <- action staleV; liftIO $ evaluate $ force v) $
10651072
\(e :: SomeException) -> do
10661073
pure (Nothing, ([ideErrorText file $ T.pack $ show e | not $ isBadDependency e],Nothing))
10671074

0 commit comments

Comments
 (0)