@@ -1034,6 +1034,7 @@ data RuleBody k v
1034
1034
{ newnessCheck :: BS. ByteString -> BS. ByteString -> Bool
1035
1035
, build :: k -> NormalizedFilePath -> Action (Maybe BS. ByteString , Maybe v )
1036
1036
}
1037
+ | RuleWithOldValue (k -> NormalizedFilePath -> Value v -> Action (Maybe BS. ByteString , IdeResult v ))
1037
1038
1038
1039
-- | Define a new Rule with early cutoff
1039
1040
defineEarlyCutoff
@@ -1046,20 +1047,26 @@ defineEarlyCutoff recorder (Rule op) = addRule $ \(Q (key, file)) (old :: Maybe
1046
1047
let diagnostics diags = do
1047
1048
traceDiagnostics diags
1048
1049
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
1050
1051
defineEarlyCutoff recorder (RuleNoDiagnostics op) = addRule $ \ (Q (key, file)) (old :: Maybe BS. ByteString ) mode -> otTracedAction key file mode traceA $ \ traceDiagnostics -> do
1051
1052
let diagnostics diags = do
1052
1053
traceDiagnostics diags
1053
1054
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
1055
1056
defineEarlyCutoff recorder RuleWithCustomNewnessCheck {.. } =
1056
1057
addRule $ \ (Q (key, file)) (old :: Maybe BS. ByteString ) mode ->
1057
1058
otTracedAction key file mode traceA $ \ traceDiagnostics -> do
1058
1059
let diagnostics diags = do
1059
1060
traceDiagnostics diags
1060
1061
mapM_ (logWith recorder Warning . LogDefineEarlyCutoffRuleCustomNewnessHasDiag ) diags
1061
1062
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
1063
1070
1064
1071
defineNoFile :: IdeRule k v => Recorder (WithPriority Log ) -> (k -> Action v ) -> Rules ()
1065
1072
defineNoFile recorder f = defineNoDiagnostics recorder $ \ k file -> do
@@ -1080,7 +1087,7 @@ defineEarlyCutoff'
1080
1087
-> NormalizedFilePath
1081
1088
-> Maybe BS. ByteString
1082
1089
-> RunMode
1083
- -> Action (Maybe BS. ByteString , IdeResult v )
1090
+ -> ( Value v -> Action (Maybe BS. ByteString , IdeResult v ) )
1084
1091
-> Action (RunResult (A (RuleResult k )))
1085
1092
defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
1086
1093
ShakeExtras {state, progress, dirtyKeys} <- getShakeExtras
@@ -1103,8 +1110,13 @@ defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
1103
1110
res <- case val of
1104
1111
Just res -> return res
1105
1112
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
1106
1118
(bs, (diags, res)) <- actionCatch
1107
- (do v <- action; liftIO $ evaluate $ force v) $
1119
+ (do v <- action staleV ; liftIO $ evaluate $ force v) $
1108
1120
\ (e :: SomeException ) -> do
1109
1121
pure (Nothing , ([ideErrorText file $ T. pack $ show e | not $ isBadDependency e],Nothing ))
1110
1122
@@ -1116,11 +1128,6 @@ defineEarlyCutoff' doDiagnostics cmp key file old mode action = do
1116
1128
1117
1129
(bs, res) <- case res of
1118
1130
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
1124
1131
pure (toShakeValue ShakeStale bs, staleV)
1125
1132
Just v -> pure (maybe ShakeNoCutoff ShakeResult bs, Succeeded modTime v)
1126
1133
liftIO $ atomicallyNamed " define - write" $ setValues state key file res (Vector. fromList diags)
0 commit comments