11
11
{-# LANGUAGE StandaloneDeriving #-}
12
12
{-# LANGUAGE TypeApplications #-}
13
13
{-# LANGUAGE TypeFamilies #-}
14
+ {-# LANGUAGE ViewPatterns #-}
14
15
15
16
{-# OPTIONS -Wno-orphans #-}
16
17
17
18
module Ide.Plugin.Retrie (descriptor ) where
18
19
19
- import Control.Concurrent.Extra (readVar )
20
20
import Control.Concurrent.STM (readTVarIO )
21
21
import Control.Exception.Safe (Exception (.. ),
22
22
SomeException , catch ,
@@ -29,11 +29,8 @@ import Control.Monad.Trans.Except (ExceptT (ExceptT),
29
29
import Control.Monad.Trans.Maybe
30
30
import Data.Aeson (FromJSON (.. ),
31
31
ToJSON (.. ),
32
- Value (Null ),
33
- genericParseJSON )
34
- import qualified Data.Aeson as Aeson
35
- import Data.Bifunctor (Bifunctor (first ),
36
- second )
32
+ Value (Null ))
33
+ import Data.Bifunctor (second )
37
34
import qualified Data.ByteString as BS
38
35
import Data.Coerce
39
36
import Data.Either (partitionEithers )
@@ -43,45 +40,47 @@ import qualified Data.HashSet as Set
43
40
import Data.IORef.Extra (atomicModifyIORef'_ ,
44
41
newIORef , readIORef )
45
42
import Data.List.Extra (find , nubOrdOn )
46
- import Data.String (IsString ( fromString ) )
43
+ import Data.String (IsString )
47
44
import qualified Data.Text as T
48
45
import qualified Data.Text.Encoding as T
49
46
import Data.Typeable (Typeable )
50
47
import Development.IDE hiding (pluginHandlers )
51
48
import Development.IDE.Core.PositionMapping
52
49
import Development.IDE.Core.Shake (ShakeExtras (knownTargetsVar ),
53
50
toKnownFiles )
54
- import Development.IDE.GHC.Compat (GenLocated (L ), GhcRn ,
51
+ import Development.IDE.GHC.Compat (GenLocated (L ), GhcPs ,
52
+ GhcRn , GhcTc ,
55
53
HsBindLR (FunBind ),
56
54
HsGroup (.. ),
57
55
HsValBindsLR (.. ),
58
56
HscEnv , IdP , LRuleDecls ,
59
57
ModSummary (ModSummary , ms_hspp_buf , ms_mod ),
60
- NHsValBindsLR (.. ),
61
58
Outputable ,
62
59
ParsedModule (.. ),
63
60
RuleDecl (HsRule ),
64
61
RuleDecls (HsRules ),
65
62
SourceText (.. ),
66
- SrcSpan (.. ),
67
63
TyClDecl (SynDecl ),
68
64
TyClGroup (.. ), fun_id ,
69
65
hm_iface , isQual ,
70
- isQual_maybe ,
66
+ isQual_maybe , locA ,
71
67
mi_fixities ,
72
68
moduleNameString ,
73
69
nameModule_maybe ,
74
- nameRdrName , occNameFS ,
75
- occNameString ,
76
- parseModule ,
70
+ nameRdrName , noLocA ,
71
+ occNameFS , occNameString ,
77
72
pattern IsBoot ,
78
73
pattern NotBoot ,
79
74
pattern RealSrcSpan ,
75
+ pm_parsed_source ,
80
76
rdrNameOcc , rds_rules ,
81
- srcSpanFile )
77
+ srcSpanFile , unLocA )
82
78
import Development.IDE.GHC.Compat.Util hiding (catch , try )
83
- import qualified GHC (parseModule )
79
+ import qualified GHC (Module ,
80
+ ParsedModule (.. ),
81
+ moduleName , parseModule )
84
82
import GHC.Generics (Generic )
83
+ import GHC.Paths (libdir )
85
84
import Ide.PluginUtils
86
85
import Ide.Types
87
86
import Language.LSP.Server (LspM ,
@@ -94,8 +93,13 @@ import Language.LSP.Types as J hiding
94
93
SemanticTokenRelative (length ),
95
94
SemanticTokensEdit (_start ))
96
95
import Retrie.CPP (CPP (NoCPP ), parseCPP )
97
- import Retrie.ExactPrint (fix , relativiseApiAnns ,
96
+ import Retrie.ExactPrint (Annotated , fix ,
98
97
transformA , unsafeMkA )
98
+ #if MIN_VERSION_ghc(9,2,0)
99
+ import Retrie.ExactPrint (makeDeltaAst )
100
+ #else
101
+ import Retrie.ExactPrint (relativiseApiAnns )
102
+ #endif
99
103
import Retrie.Fixity (mkFixityEnv )
100
104
import qualified Retrie.GHC as GHC
101
105
import Retrie.Monad (addImports , apply ,
@@ -202,7 +206,7 @@ provider state plId (CodeActionParams _ _ (TextDocumentIdentifier uri) range ca)
202
206
++ concatMap (suggestRuleRewrites uri pos ms_mod) hs_ruleds
203
207
++ [ r
204
208
| TyClGroup {group_tyclds} <- hs_tyclds,
205
- L l g <- group_tyclds,
209
+ L (locA -> l) g <- group_tyclds,
206
210
pos `isInsideSrcSpan` l,
207
211
r <- suggestTypeRewrites uri ms_mod g
208
212
@@ -225,7 +229,7 @@ getBinds nfp = runMaybeT $ do
225
229
( HsGroup
226
230
{ hs_valds =
227
231
XValBindsLR
228
- (NValBinds binds _sigs :: NHsValBindsLR GHC. GhcRn ),
232
+ (GHC. NValBinds binds _sigs :: GHC. NHsValBindsLR GhcRn ),
229
233
hs_ruleds,
230
234
hs_tyclds
231
235
},
@@ -247,7 +251,7 @@ suggestBindRewrites ::
247
251
GHC. Module ->
248
252
HsBindLR GhcRn GhcRn ->
249
253
[(T. Text , CodeActionKind , RunRetrieParams )]
250
- suggestBindRewrites originatingFile pos ms_mod FunBind {fun_id = L l' rdrName}
254
+ suggestBindRewrites originatingFile pos ms_mod FunBind {fun_id = L (locA -> l') rdrName}
251
255
| pos `isInsideSrcSpan` l' =
252
256
let pprNameText = printOutputable rdrName
253
257
pprName = T. unpack pprNameText
@@ -267,13 +271,13 @@ describeRestriction restrictToOriginatingFile =
267
271
if restrictToOriginatingFile then " in current file" else " "
268
272
269
273
suggestTypeRewrites ::
270
- (Outputable (IdP pass )) =>
274
+ (Outputable (IdP GhcRn )) =>
271
275
Uri ->
272
276
GHC. Module ->
273
- TyClDecl pass ->
277
+ TyClDecl GhcRn ->
274
278
[(T. Text , CodeActionKind , RunRetrieParams )]
275
- suggestTypeRewrites originatingFile ms_mod SynDecl {tcdLName = L _ rdrName } =
276
- let pprNameText = printOutputable rdrName
279
+ suggestTypeRewrites originatingFile ms_mod SynDecl {tcdLName} =
280
+ let pprNameText = printOutputable (unLocA tcdLName)
277
281
pprName = T. unpack pprNameText
278
282
unfoldRewrite restrictToOriginatingFile =
279
283
let rewrites = [TypeForward (qualify ms_mod pprName)]
@@ -290,7 +294,7 @@ suggestRuleRewrites ::
290
294
Uri ->
291
295
Position ->
292
296
GHC. Module ->
293
- LRuleDecls pass ->
297
+ LRuleDecls GhcRn ->
294
298
[(T. Text , CodeActionKind , RunRetrieParams )]
295
299
suggestRuleRewrites originatingFile pos ms_mod (L _ HsRules {rds_rules}) =
296
300
concat
@@ -299,7 +303,7 @@ suggestRuleRewrites originatingFile pos ms_mod (L _ HsRules {rds_rules}) =
299
303
, backwardsRewrite ruleName True
300
304
, backwardsRewrite ruleName False
301
305
]
302
- | L l r <- rds_rules,
306
+ | L (locA -> l) r <- rds_rules,
303
307
pos `isInsideSrcSpan` l,
304
308
#if MIN_VERSION_ghc(8,8,0)
305
309
let HsRule {rd_name = L _ (_, rn)} = r,
@@ -327,8 +331,6 @@ suggestRuleRewrites originatingFile pos ms_mod (L _ HsRules {rds_rules}) =
327
331
RunRetrieParams {.. }
328
332
)
329
333
330
- suggestRuleRewrites _ _ _ _ = []
331
-
332
334
qualify :: GHC. Module -> String -> String
333
335
qualify ms_mod x = T. unpack (printOutputable ms_mod) <> " ." <> x
334
336
@@ -360,10 +362,9 @@ callRetrie ::
360
362
callRetrie state session rewrites origin restrictToOriginatingFile = do
361
363
knownFiles <- toKnownFiles . unhashed <$> readTVarIO (knownTargetsVar $ shakeExtras state)
362
364
let reuseParsedModule f = do
363
- pm <-
364
- useOrFail " GetParsedModule" NoParse GetParsedModule f
365
- (fixities, pm) <- fixFixities f (fixAnns pm)
366
- return (fixities, pm)
365
+ pm <- useOrFail " GetParsedModule" NoParse GetParsedModule f
366
+ (fixities, pm') <- fixFixities f (fixAnns pm)
367
+ return (fixities, pm')
367
368
getCPPmodule t = do
368
369
nt <- toNormalizedFilePath' <$> makeAbsolute t
369
370
let getParsedModule f contents = do
@@ -375,8 +376,7 @@ callRetrie state session rewrites origin restrictToOriginatingFile = do
375
376
Just (stringToStringBuffer contents)
376
377
}
377
378
logPriority (ideLogger state) Info $ T. pack $ " Parsing module: " <> t
378
- parsed <-
379
- evalGhcEnv session (GHC. parseModule ms')
379
+ parsed <- evalGhcEnv session (GHC. parseModule ms')
380
380
`catch` \ e -> throwIO (GHCParseError nt (show @ SomeException e))
381
381
(fixities, parsed) <- fixFixities f (fixAnns parsed)
382
382
return (fixities, parsed)
@@ -416,12 +416,19 @@ callRetrie state session rewrites origin restrictToOriginatingFile = do
416
416
(theImports, theRewrites) = partitionEithers rewrites
417
417
418
418
annotatedImports =
419
- unsafeMkA (map (GHC. noLoc . toImportDecl) theImports) mempty 0
419
+ #if MIN_VERSION_ghc(9,2,0)
420
+ unsafeMkA (map (noLocA . toImportDecl) theImports) 0
421
+ #else
422
+ unsafeMkA (map (noLocA . toImportDecl) theImports) mempty 0
423
+ #endif
420
424
421
425
(originFixities, originParsedModule) <- reuseParsedModule origin
422
426
retrie <-
423
427
(\ specs -> apply specs >> addImports annotatedImports)
424
428
<$> parseRewriteSpecs
429
+ #if MIN_VERSION_ghc(9,2,0)
430
+ libdir -- TODO: does this actualy get the proper libdir?
431
+ #endif
425
432
(\ _f -> return $ NoCPP originParsedModule)
426
433
originFixities
427
434
theRewrites
@@ -463,9 +470,13 @@ callRetrie state session rewrites origin restrictToOriginatingFile = do
463
470
let fixities = fixityEnvFromModIface hirModIface
464
471
res <- transformA pm (fix fixities)
465
472
return (fixities, res)
466
- fixAnns ParsedModule {.. } =
473
+ #if MIN_VERSION_ghc(9,2,0)
474
+ fixAnns GHC. ParsedModule {pm_parsed_source} = unsafeMkA (makeDeltaAst pm_parsed_source) 0
475
+ #else
476
+ fixAnns GHC. ParsedModule {.. } =
467
477
let ranns = relativiseApiAnns pm_parsed_source pm_annotations
468
478
in unsafeMkA pm_parsed_source ranns 0
479
+ #endif
469
480
470
481
asEditMap :: [[(Uri , TextEdit )]] -> WorkspaceEditMap
471
482
asEditMap = coerce . HM. fromListWith (++) . concatMap (map (second pure ))
@@ -533,14 +544,18 @@ toImportDecl :: ImportSpec -> GHC.ImportDecl GHC.GhcPs
533
544
toImportDecl AddImport {.. } = GHC. ImportDecl {ideclSource = ideclSource', .. }
534
545
where
535
546
ideclSource' = if ideclSource then IsBoot else NotBoot
536
- toMod = GHC. noLoc . GHC. mkModuleName
547
+ toMod = noLocA . GHC. mkModuleName
537
548
ideclName = toMod ideclNameString
538
549
ideclPkgQual = Nothing
539
550
ideclSafe = False
540
551
ideclImplicit = False
541
552
ideclHiding = Nothing
542
553
ideclSourceSrc = NoSourceText
554
+ #if MIN_VERSION_ghc(9,2,0)
555
+ ideclExt = GHC. EpAnnNotUsed
556
+ #else
543
557
ideclExt = GHC. noExtField
558
+ #endif
544
559
ideclAs = toMod <$> ideclAsString
545
560
#if MIN_VERSION_ghc(8,10,0)
546
561
ideclQualified = if ideclQualifiedBool then GHC. QualifiedPre else GHC. NotQualified
0 commit comments