1
- {-# LANGUAGE CPP #-}
2
- {-# LANGUAGE DataKinds #-}
3
- {-# LANGUAGE GADTs #-}
4
- {-# LANGUAGE NamedFieldPuns #-}
1
+ {-# LANGUAGE CPP #-}
2
+ {-# LANGUAGE DataKinds #-}
3
+ {-# LANGUAGE GADTs #-}
4
+ {-# LANGUAGE NamedFieldPuns #-}
5
+ {-# LANGUAGE RankNTypes #-}
6
+ {-# LANGUAGE ScopedTypeVariables #-}
7
+ {-# LANGUAGE TypeApplications #-}
5
8
6
9
module Ide.Plugin.Rename (descriptor ) where
7
10
@@ -11,7 +14,7 @@ import Control.Monad.Trans.Class
11
14
import Control.Monad.Trans.Except
12
15
import Data.Containers.ListUtils
13
16
import Data.Generics
14
- import Data.List.Extra hiding (nubOrd )
17
+ import Data.List.Extra hiding (nubOrd , replace )
15
18
import qualified Data.Map as M
16
19
import Data.Maybe
17
20
import qualified Data.Text as T
@@ -20,11 +23,16 @@ import Development.IDE.Core.PositionMapping
20
23
import Development.IDE.Core.Shake
21
24
import Development.IDE.GHC.Compat
22
25
import Development.IDE.Spans.AtPoint
26
+ #if MIN_VERSION_ghc(9,2,1)
27
+ import GHC.Parser.Annotation (AnnContext , AnnList ,
28
+ AnnParen , AnnPragma )
29
+ #endif
23
30
#if MIN_VERSION_ghc(9,0,1)
24
31
import GHC.Types.Name
25
32
#else
26
33
import Name
27
34
#endif
35
+ import Development.IDE.GHC.ExactPrint (GetAnnotatedParsedSource (GetAnnotatedParsedSource ))
28
36
import HieDb.Query
29
37
import Ide.Plugin.Config
30
38
import Ide.PluginUtils
@@ -46,7 +54,6 @@ renameProvider state pluginId (RenameParams (TextDocumentIdentifier uri) pos _pr
46
54
workspaceRefs <- refsAtName state nfp oldName
47
55
let filesRefs = groupOn locToUri workspaceRefs
48
56
getFileEdits = ap (getSrcEdits state . renameModRefs newNameText) (locToUri . head )
49
-
50
57
fileEdits <- mapM getFileEdits filesRefs
51
58
pure $ foldl' (<>) mempty fileEdits
52
59
@@ -67,14 +74,14 @@ getSrcEdits ::
67
74
getSrcEdits state updateMod uri = do
68
75
ccs <- lift getClientCapabilities
69
76
nfp <- safeUriToNfp uri
70
- ~ ParsedModule {pm_parsed_source = ps, pm_annotations = apiAnns} <-
77
+ annotatedAst <-
71
78
handleMaybeM " Error: could not get parsed source" $ liftIO $ runAction
72
79
" Rename.GetParsedModuleWithComments"
73
80
state
74
- (use GetParsedModuleWithComments nfp)
81
+ (use GetAnnotatedParsedSource nfp)
82
+ let (ps, anns) = (astA annotatedAst, annsA annotatedAst)
75
83
#if !MIN_VERSION_ghc(9,2,1)
76
- let anns = relativiseApiAnns ps apiAnns
77
- src = T. pack $ exactPrint ps anns
84
+ let src = T. pack $ exactPrint ps anns
78
85
res = T. pack $ exactPrint (updateMod <$> ps) anns
79
86
#else
80
87
let src = T. pack $ exactPrint ps
@@ -94,12 +101,32 @@ renameModRefs ::
94
101
HsModule GhcPs
95
102
-> HsModule GhcPs
96
103
#endif
104
+ #if MIN_VERSION_ghc(9,2,1)
105
+ renameModRefs newNameText refs = everywhere $
106
+ -- there has to be a better way...
107
+ mkT (replace @ AnnListItem ) `extT`
108
+ -- replace @AnnList `extT` -- not needed
109
+ -- replace @AnnParen `extT` -- not needed
110
+ -- replace @AnnPragma `extT` -- not needed
111
+ -- replace @AnnContext `extT` -- not needed
112
+ -- replace @NoEpAnns `extT` -- not needed
113
+ replace @ NameAnn
114
+ where
115
+ replace :: forall an . Typeable an => LocatedAn an RdrName -> LocatedAn an RdrName
116
+ replace (L srcSpan oldRdrName)
117
+ | isRef (locA srcSpan) = L srcSpan $ newRdrName oldRdrName
118
+ replace lOldRdrName = lOldRdrName
119
+ #else
97
120
renameModRefs newNameText refs = everywhere $ mkT replace
98
121
where
99
122
replace :: Located RdrName -> Located RdrName
100
123
replace (L srcSpan oldRdrName)
101
124
| isRef srcSpan = L srcSpan $ newRdrName oldRdrName
102
125
replace lOldRdrName = lOldRdrName
126
+ #endif
127
+
128
+ isRef :: SrcSpan -> Bool
129
+ isRef = (`elem` refs) . fromJust . srcSpanToLocation
103
130
104
131
newRdrName :: RdrName -> RdrName
105
132
newRdrName oldRdrName = case oldRdrName of
@@ -108,9 +135,8 @@ renameModRefs newNameText refs = everywhere $ mkT replace
108
135
109
136
newOccName = mkTcOcc $ T. unpack newNameText
110
137
111
- isRef :: SrcSpan -> Bool
112
- isRef = (`elem` refs) . fromJust . srcSpanToLocation
113
-
138
+ newRdrName :: RdrName -> RdrName
139
+ newRdrName = error " not implemented"
114
140
-------------------------------------------------------------------------------
115
141
-- Reference finding
116
142
0 commit comments