Skip to content

Commit da006bd

Browse files
committed
Rename only if the current module compiles (#3799)
Prefer `useE` over `useWithStaleE`
1 parent 9593d04 commit da006bd

File tree

1 file changed

+17
-12
lines changed
  • plugins/hls-rename-plugin/src/Ide/Plugin

1 file changed

+17
-12
lines changed

plugins/hls-rename-plugin/src/Ide/Plugin/Rename.hs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Control.Monad
1414
import Control.Monad.Except (ExceptT, throwError)
1515
import Control.Monad.IO.Class (MonadIO, liftIO)
1616
import Control.Monad.Trans.Class (lift)
17-
import Data.Bifunctor (first)
17+
import Data.Either (rights)
1818
import Data.Foldable (fold)
1919
import Data.Generics
2020
import Data.Hashable
@@ -31,14 +31,11 @@ import qualified Data.Text as T
3131
import Development.IDE (Recorder, WithPriority,
3232
usePropertyAction)
3333
import Development.IDE.Core.PluginUtils
34-
import Development.IDE.Core.PositionMapping
3534
import Development.IDE.Core.RuleTypes
3635
import Development.IDE.Core.Service
3736
import Development.IDE.Core.Shake
38-
import Development.IDE.GHC.Compat.Core
37+
import Development.IDE.GHC.Compat
3938
import Development.IDE.GHC.Compat.ExactPrint
40-
import Development.IDE.GHC.Compat.Parser
41-
import Development.IDE.GHC.Compat.Units
4239
import Development.IDE.GHC.Error
4340
import Development.IDE.GHC.ExactPrint
4441
import qualified Development.IDE.GHC.ExactPrint as E
@@ -212,26 +209,29 @@ refsAtName state nfp name = do
212209
)
213210
pure $ nameLocs name ast ++ dbRefs
214211

215-
nameLocs :: Name -> (HieAstResult, PositionMapping) -> [Location]
216-
nameLocs name (HAR _ _ rm _ _, pm) =
217-
concatMap (mapMaybe (toCurrentLocation pm . realSrcSpanToLocation . fst))
212+
nameLocs :: Name -> HieAstResult -> [Location]
213+
nameLocs name (HAR _ _ rm _ _) =
214+
concatMap (map (realSrcSpanToLocation . fst))
218215
(M.lookup (Right name) rm)
219216

220217
---------------------------------------------------------------------------------------------------
221218
-- Util
222219

223220
getNamesAtPos :: MonadIO m => IdeState -> NormalizedFilePath -> Position -> ExceptT PluginError m [Name]
224221
getNamesAtPos state nfp pos = do
225-
(HAR{hieAst}, pm) <- handleGetHieAst state nfp
226-
pure $ getNamesAtPoint hieAst pos pm
222+
HAR{hieAst} <- handleGetHieAst state nfp
223+
pure $ getNamesAtPoint' hieAst pos
227224

228225
handleGetHieAst ::
229226
MonadIO m =>
230227
IdeState ->
231228
NormalizedFilePath ->
232-
ExceptT PluginError m (HieAstResult, PositionMapping)
229+
ExceptT PluginError m HieAstResult
233230
handleGetHieAst state nfp =
234-
fmap (first removeGenerated) $ runActionE "Rename.GetHieAst" state $ useWithStaleE GetHieAst nfp
231+
-- We explicitly do not want to allow a stale version here - we only want to rename if
232+
-- the module compiles, otherwise we can't guarantee that we'll rename everything,
233+
-- which is bad (see https://github.com/haskell/haskell-language-server/issues/3799)
234+
fmap removeGenerated $ runActionE "Rename.GetHieAst" state $ useE GetHieAst nfp
235235

236236
-- | We don't want to rename in code generated by GHC as this gives false positives.
237237
-- So we restrict the HIE file to remove all the generated code.
@@ -246,6 +246,11 @@ removeGenerated HAR{..} = HAR{hieAst = go hieAst,..}
246246
collectWith :: (Hashable a, Eq b) => (a -> b) -> HashSet a -> [(b, HashSet a)]
247247
collectWith f = map (\(a :| as) -> (f a, HS.fromList (a:as))) . groupWith f . HS.toList
248248

249+
-- | A variant 'getNamesAtPoint' that does not expect a 'PositionMapping'
250+
getNamesAtPoint' :: HieASTs a -> Position -> [Name]
251+
getNamesAtPoint' hf pos =
252+
concat $ pointCommand hf pos (rights . M.keys . getNodeIds)
253+
249254
locToUri :: Location -> Uri
250255
locToUri (Location uri _) = uri
251256

0 commit comments

Comments
 (0)