@@ -86,59 +86,6 @@ getParsedModuleStale state nfp =
8686 runAction " rename.getParsedModuleStale" state
8787 (useWithStale GetParsedModule nfp)
8888
89- -- | Find the 'ImportAlias' if the cursor is on an import alias declaration,
90- -- such as @L@ in @import Data.List as L@.
91- findAliasDeclAtPos ::
92- VFS. CodePointPosition ->
93- [LImportDecl GhcPs ] ->
94- Maybe ImportAlias
95- findAliasDeclAtPos pos imports = listToMaybe $ do
96- let allAliases = mapMaybe (fmap unLoc . ideclAs . unLoc) imports
97- importDecl <- map unLoc imports
98- Just locatedAlias <- [ideclAs importDecl]
99- RealSrcSpan aliasDeclSpan _ <- [getLoc locatedAlias]
100- let aliasDeclRange = realSrcSpanToCodePointRange aliasDeclSpan
101- guard (rangeContainsPosition aliasDeclRange pos)
102- let aliasModuleName = unLoc (ideclName importDecl)
103- aliasName = unLoc locatedAlias
104- aliasIsShared = length (filter (== aliasName) allAliases) > 1
105- [ImportAlias {aliasModuleName, aliasName, aliasDeclRange, aliasIsShared}]
106-
107- -- | Find the 'ImportAlias' matching the name qualifier at the cursor, such as
108- -- @L@ in @L.take@.
109- -- Returns multiple values if multiple modules share the same alias.
110- findAliasUseAtPos ::
111- VFS. CodePointPosition ->
112- [LImportDecl GhcPs ] ->
113- [LHsDecl GhcPs ] ->
114- [ImportAlias ]
115- findAliasUseAtPos pos imports hsDecls =
116- let qualifiersAtPos = do
117- locatedRdrName :: XRec GhcPs RdrName <- listify (const True ) hsDecls
118- Qual qualifier _ <- [unLoc locatedRdrName]
119- RealSrcSpan qualifiedNameSpan _ <- [getLoc locatedRdrName]
120- let qualifiedNameRange = realSrcSpanToCodePointRange qualifiedNameSpan
121- guard (rangeContainsPosition qualifiedNameRange pos)
122- let qualifierLength = fromIntegral (moduleNameLength qualifier)
123- qualifierStart = qualifiedNameRange ^. VFS. start
124- qualifierRange = qualifiedNameRange
125- & VFS. end .~ (qualifierStart & VFS. character +~ qualifierLength)
126- guard (rangeContainsPosition qualifierRange pos)
127- [qualifier]
128- in case qualifiersAtPos of
129- [] -> []
130- qualifierAtPos : _ -> do
131- let allAliases = mapMaybe (fmap unLoc . ideclAs . unLoc) imports
132- importDecl <- map unLoc imports
133- Just locatedAlias <- [ideclAs importDecl]
134- let aliasName = unLoc locatedAlias
135- guard (aliasName == qualifierAtPos)
136- RealSrcSpan aliasDeclSpan _ <- [getLoc locatedAlias]
137- let aliasModuleName = unLoc (ideclName importDecl)
138- aliasDeclRange = realSrcSpanToCodePointRange aliasDeclSpan
139- aliasIsShared = length (filter (== aliasName) allAliases) > 1
140- [ImportAlias {aliasModuleName, aliasName, aliasDeclRange, aliasIsShared}]
141-
14289-- | Return the 'ImportAlias' being renamed at the cursor. The cursor may be on
14390-- the alias token in an import declaration or on a qualifier at a use site. If
14491-- multiple imports share the same alias, falls back to the typechecked module's
@@ -206,6 +153,59 @@ aliasBasedRename state nfp uri importAlias hsDecls newNameText = do
206153 workspaceEdit = WorkspaceEdit fileChanges Nothing Nothing
207154 pure $ InL workspaceEdit
208155
156+ -- | Find the 'ImportAlias' if the cursor is on an import alias declaration,
157+ -- such as @L@ in @import Data.List as L@.
158+ findAliasDeclAtPos ::
159+ VFS. CodePointPosition ->
160+ [LImportDecl GhcPs ] ->
161+ Maybe ImportAlias
162+ findAliasDeclAtPos pos imports = listToMaybe $ do
163+ let allAliases = mapMaybe (fmap unLoc . ideclAs . unLoc) imports
164+ importDecl <- map unLoc imports
165+ Just locatedAlias <- [ideclAs importDecl]
166+ RealSrcSpan aliasDeclSpan _ <- [getLoc locatedAlias]
167+ let aliasDeclRange = realSrcSpanToCodePointRange aliasDeclSpan
168+ guard (rangeContainsPosition aliasDeclRange pos)
169+ let aliasModuleName = unLoc (ideclName importDecl)
170+ aliasName = unLoc locatedAlias
171+ aliasIsShared = length (filter (== aliasName) allAliases) > 1
172+ [ImportAlias {aliasModuleName, aliasName, aliasDeclRange, aliasIsShared}]
173+
174+ -- | Find the 'ImportAlias' matching the name qualifier at the cursor, such as
175+ -- @L@ in @L.take@.
176+ -- Returns multiple values if multiple modules share the same alias.
177+ findAliasUseAtPos ::
178+ VFS. CodePointPosition ->
179+ [LImportDecl GhcPs ] ->
180+ [LHsDecl GhcPs ] ->
181+ [ImportAlias ]
182+ findAliasUseAtPos pos imports hsDecls =
183+ let qualifiersAtPos = do
184+ locatedRdrName :: XRec GhcPs RdrName <- listify (const True ) hsDecls
185+ Qual qualifier _ <- [unLoc locatedRdrName]
186+ RealSrcSpan qualifiedNameSpan _ <- [getLoc locatedRdrName]
187+ let qualifiedNameRange = realSrcSpanToCodePointRange qualifiedNameSpan
188+ guard (rangeContainsPosition qualifiedNameRange pos)
189+ let qualifierLength = fromIntegral (moduleNameLength qualifier)
190+ qualifierStart = qualifiedNameRange ^. VFS. start
191+ qualifierRange = qualifiedNameRange
192+ & VFS. end .~ (qualifierStart & VFS. character +~ qualifierLength)
193+ guard (rangeContainsPosition qualifierRange pos)
194+ [qualifier]
195+ in case qualifiersAtPos of
196+ [] -> []
197+ qualifierAtPos : _ -> do
198+ let allAliases = mapMaybe (fmap unLoc . ideclAs . unLoc) imports
199+ importDecl <- map unLoc imports
200+ Just locatedAlias <- [ideclAs importDecl]
201+ let aliasName = unLoc locatedAlias
202+ guard (aliasName == qualifierAtPos)
203+ RealSrcSpan aliasDeclSpan _ <- [getLoc locatedAlias]
204+ let aliasModuleName = unLoc (ideclName importDecl)
205+ aliasDeclRange = realSrcSpanToCodePointRange aliasDeclSpan
206+ aliasIsShared = length (filter (== aliasName) allAliases) > 1
207+ [ImportAlias {aliasModuleName, aliasName, aliasDeclRange, aliasIsShared}]
208+
209209-- | Collect the 'CodePointRange' of every qualified use of @importAlias@, such
210210-- as @L@ in @L.take@, @L.drop@, and so on.
211211aliasUseSiteRanges :: ImportAlias -> [LHsDecl GhcPs ] -> [VFS. CodePointRange ]
0 commit comments