1
+ {-# LANGUAGE BangPatterns #-}
1
2
{-# LANGUAGE CPP #-}
2
3
{-# LANGUAGE DeriveAnyClass #-}
3
4
{-# LANGUAGE DeriveGeneric #-}
@@ -45,7 +46,7 @@ import Development.IDE.Core.RuleTypes as Ghcide (GetModIface (..),
45
46
HiFileResult (.. ),
46
47
TypeCheck (.. ),
47
48
tmrModule )
48
- import Development.IDE.Core.Shake (IdeRule ,
49
+ import Development.IDE.Core.Shake (ideLogger , knownFilesVar , IdeRule ,
49
50
IdeState (shakeExtras ),
50
51
runIdeAction , use ,
51
52
useWithStaleFast , use_ )
@@ -97,6 +98,10 @@ import Retrie.SYB (listify)
97
98
import Retrie.Util (Verbosity (Loud ))
98
99
import StringBuffer (stringToStringBuffer )
99
100
import System.Directory (makeAbsolute )
101
+ import Control.Concurrent.Extra (readVar )
102
+ import Data.Hashable (unhashed )
103
+ import qualified Data.HashSet as Set
104
+ import Development.IDE.Types.Logger (Priority (.. ), Logger (logPriority ))
100
105
101
106
descriptor :: PluginId -> PluginDescriptor
102
107
descriptor plId =
@@ -118,7 +123,8 @@ data RunRetrieParams = RunRetrieParams
118
123
-- | rewrites for Retrie
119
124
rewrites :: [Either ImportSpec RewriteSpec ],
120
125
-- | Originating file
121
- originatingFile :: String -- NormalizedFilePath
126
+ originatingFile :: String ,
127
+ restrictToOriginatingFile :: Bool
122
128
}
123
129
deriving (Eq , Show , Generic , FromJSON , ToJSON )
124
130
@@ -139,6 +145,7 @@ runRetrieCmd lsp state RunRetrieParams {..} =
139
145
(hscEnv session)
140
146
rewrites
141
147
(toNormalizedFilePath originatingFile)
148
+ restrictToOriginatingFile
142
149
unless (null errors) $
143
150
sendFunc lsp $
144
151
NotShowMessage $
@@ -228,17 +235,24 @@ suggestBindRewrites originatingFile pos ms_mod (FunBind {fun_id = L l' rdrName,
228
235
let ideclAsString = moduleNameString . fst <$> isQual_maybe r,
229
236
let ideclThing = Just (IEVar $ occNameString $ rdrNameOcc r)
230
237
]
231
- in [ let rewrites =
232
- [Right $ Unfold (qualify ms_mod pprName)]
233
- ++ map Left imports
234
- description = " Unfold " <> pprNameText
235
- in (description, CodeActionRefactorInline , RunRetrieParams {.. }),
238
+ unfoldRewrite restrictToOriginatingFile =
239
+ let rewrites =
240
+ [Right $ Unfold (qualify ms_mod pprName)]
241
+ ++ map Left imports
242
+ description = " Unfold " <> pprNameText <> describeRestriction restrictToOriginatingFile
243
+ in (description, CodeActionRefactorInline , RunRetrieParams {.. })
244
+ foldRewrite restrictToOriginatingFile =
236
245
let rewrites = [Right $ Fold (qualify ms_mod pprName)]
237
- description = " Fold " <> pprNameText
246
+ description = " Fold " <> pprNameText <> describeRestriction restrictToOriginatingFile
238
247
in (description, CodeActionRefactorExtract , RunRetrieParams {.. })
239
- ]
248
+ in [unfoldRewrite False , unfoldRewrite True , foldRewrite False , foldRewrite True ]
249
+ where
240
250
suggestBindRewrites _ _ _ _ = []
241
251
252
+ describeRestriction :: IsString p => Bool -> p
253
+ describeRestriction restrictToOriginatingFile =
254
+ if restrictToOriginatingFile then " in current file" else " "
255
+
242
256
-- TODO add imports to the rewrite
243
257
suggestTypeRewrites ::
244
258
(Outputable (IdP pass )) =>
@@ -251,13 +265,15 @@ suggestTypeRewrites originatingFile pos ms_mod (SynDecl {tcdLName = L l rdrName}
251
265
| pos `isInsideSrcSpan` l =
252
266
let pprName = prettyPrint rdrName
253
267
pprNameText = T. pack pprName
254
- in [ let rewrites = [Right $ TypeForward (qualify ms_mod pprName)]
255
- description = " Unfold " <> pprNameText
256
- in (description, CodeActionRefactorInline , RunRetrieParams {.. }),
268
+ unfoldRewrite restrictToOriginatingFile =
269
+ let rewrites = [Right $ TypeForward (qualify ms_mod pprName)]
270
+ description = " Unfold " <> pprNameText <> describeRestriction restrictToOriginatingFile
271
+ in (description, CodeActionRefactorInline , RunRetrieParams {.. })
272
+ foldRewrite restrictToOriginatingFile =
257
273
let rewrites = [Right $ TypeBackward (qualify ms_mod pprName)]
258
- description = " Fold " <> pprNameText
274
+ description = " Fold " <> pprNameText <> describeRestriction restrictToOriginatingFile
259
275
in (description, CodeActionRefactorExtract , RunRetrieParams {.. })
260
- ]
276
+ in [unfoldRewrite False , unfoldRewrite True , foldRewrite False , foldRewrite True ]
261
277
suggestTypeRewrites _ _ _ _ = []
262
278
263
279
-- TODO add imports to the rewrite
@@ -269,21 +285,11 @@ suggestRuleRewrites ::
269
285
[(T. Text , CodeActionKind , RunRetrieParams )]
270
286
suggestRuleRewrites originatingFile pos ms_mod (L _ (HsRules {rds_rules})) =
271
287
concat
272
- [ [ let rewrites =
273
- [Right $ RuleForward (qualify ms_mod ruleName)]
274
- description = " Apply rule " <> T. pack ruleName <> " forward"
275
- in ( description,
276
- CodeActionRefactor ,
277
- RunRetrieParams {.. }
278
- ),
279
- let rewrites =
280
- [Right $ RuleBackward (qualify ms_mod ruleName)]
281
- description = " Apply rule " <> T. pack ruleName <> " backwards"
282
- in ( description,
283
- CodeActionRefactor ,
284
- RunRetrieParams {.. }
285
- )
286
- ]
288
+ [ [ forwardRewrite ruleName True
289
+ , forwardRewrite ruleName False
290
+ , backwardsRewrite ruleName True
291
+ , backwardsRewrite ruleName False
292
+ ]
287
293
| L l r <- rds_rules,
288
294
pos `isInsideSrcSpan` l,
289
295
#if MIN_GHC_API_VERSION(8,8,0)
@@ -293,6 +299,26 @@ suggestRuleRewrites originatingFile pos ms_mod (L _ (HsRules {rds_rules})) =
293
299
#endif
294
300
let ruleName = unpackFS rn
295
301
]
302
+ where
303
+ forwardRewrite ruleName restrictToOriginatingFile =
304
+ let rewrites =
305
+ [Right $ RuleForward (qualify ms_mod ruleName)]
306
+ description = " Apply rule " <> T. pack ruleName <> " forward" <>
307
+ describeRestriction restrictToOriginatingFile
308
+
309
+ in ( description,
310
+ CodeActionRefactor ,
311
+ RunRetrieParams {.. }
312
+ )
313
+ backwardsRewrite ruleName restrictToOriginatingFile =
314
+ let rewrites =
315
+ [Right $ RuleBackward (qualify ms_mod ruleName)]
316
+ description = " Apply rule " <> T. pack ruleName <> " backwards"
317
+ in ( description,
318
+ CodeActionRefactor ,
319
+ RunRetrieParams {.. }
320
+ )
321
+
296
322
suggestRuleRewrites _ _ _ _ = []
297
323
298
324
qualify :: GHC. Module -> String -> String
@@ -321,8 +347,11 @@ callRetrie ::
321
347
HscEnv ->
322
348
[Either ImportSpec RewriteSpec ] ->
323
349
NormalizedFilePath ->
350
+ Bool ->
324
351
IO ([CallRetrieError ], WorkspaceEdit )
325
- callRetrie state session rewrites origin = do
352
+ callRetrie state session rewrites origin restrictToOriginatingFile = do
353
+ knownFiles <- readVar $ knownFilesVar $ shakeExtras state
354
+ print knownFiles
326
355
let reuseParsedModule f = do
327
356
pm <-
328
357
useOrFail " GetParsedModule" NoParse GetParsedModule f
@@ -338,10 +367,11 @@ callRetrie state session rewrites origin = do
338
367
{ ms_hspp_buf =
339
368
Just (stringToStringBuffer contents)
340
369
}
341
- (_, parsed) <-
370
+ logPriority (ideLogger state) Info $ T. pack $ " Parsing module: " <> t
371
+ (_, ! parsed) <-
342
372
runGhcEnv session (parseModule ms')
343
373
`catch` \ e -> throwIO (GHCParseError nt (show @ SomeException e))
344
- (fixities, parsed) <- fixFixities f (fixAnns parsed)
374
+ (! fixities, ! parsed) <- fixFixities f (fixAnns parsed)
345
375
return (fixities, parsed)
346
376
347
377
contents <- do
@@ -359,7 +389,7 @@ callRetrie state session rewrites origin = do
359
389
return res
360
390
res <- parseCPP parseModule contents
361
391
fixities <- readIORef fixitiesRef
362
- return (fixities, res)
392
+ return $! (fixities, res)
363
393
else do
364
394
(fixities, pm) <- reuseParsedModule nt
365
395
return (fixities, NoCPP pm)
@@ -368,7 +398,13 @@ callRetrie state session rewrites origin = do
368
398
target = " ."
369
399
370
400
retrieOptions :: Retrie. Options
371
- retrieOptions = (defaultOptions target) {Retrie. verbosity = Loud }
401
+ retrieOptions = (defaultOptions target)
402
+ {Retrie. verbosity = Loud
403
+ ,Retrie. targetFiles = map fromNormalizedFilePath $
404
+ if restrictToOriginatingFile
405
+ then [origin]
406
+ else Set. toList $ unhashed knownFiles
407
+ }
372
408
373
409
(theImports, theRewrites) = partitionEithers rewrites
374
410
0 commit comments