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