Skip to content

Commit a7f0d2c

Browse files
committed
Display hint after when using ImportQualifiedPost
1 parent 9763120 commit a7f0d2c

File tree

3 files changed

+62
-23
lines changed

3 files changed

+62
-23
lines changed

plugins/hls-explicit-imports-plugin/src/Ide/Plugin/ExplicitImports.hs

+13-6
Original file line numberDiff line numberDiff line change
@@ -292,19 +292,26 @@ importPackageInlayHintProvider _ state _ InlayHintParams {_textDocument = TextDo
292292
isPackageImport ImportDecl{ideclPkgQual = NoRawPkgQual} = False
293293
isPackageImport _ = True
294294

295-
(L _ hsImports) = hsmodImports <$> pm_parsed_source parsedModule
295+
L _ hsImports = hsmodImports <$> pm_parsed_source parsedModule
296296

297297
srcSpanToPosition :: SrcSpan -> Position
298298
srcSpanToPosition srcSpan = (realSrcSpanToRange . realSrcSpan $ srcSpan) ^. L.end
299299

300-
annToPosition :: EpAnnImportDecl -> Position
301-
annToPosition ann = case importDeclAnnQualified ann of
302-
Just loc -> (srcSpanToPosition $ getHasLoc loc)
303-
_ -> (srcSpanToPosition $ getHasLoc $ importDeclAnnImport ann)
300+
hintPosition :: ImportDecl GhcPs -> Position
301+
hintPosition importDecl =
302+
let importAnn = anns $ ideclAnn $ ideclExt importDecl
303+
importPosition = srcSpanToPosition $ getHasLoc $ importDeclAnnImport $ importAnn
304+
moduleNamePosition = srcSpanToPosition $ getHasLoc $ ideclName importDecl
305+
maybeQualifiedPosition = srcSpanToPosition . getHasLoc <$> importDeclAnnQualified importAnn
306+
in case maybeQualifiedPosition of
307+
Just qualifiedPosition -> if qualifiedPosition < moduleNamePosition
308+
then qualifiedPosition
309+
else importPosition
310+
Nothing -> importPosition
304311
in hsImports
305312
& filter (\(L _ importDecl) -> not $ isPackageImport importDecl)
306313
& map (\(L _ importDecl) ->
307-
(annToPosition $ anns $ ideclAnn $ ideclExt importDecl, unLoc $ ideclName importDecl))
314+
(hintPosition importDecl, unLoc $ ideclName importDecl))
308315

309316
-- |For explicit imports: If there are any implicit imports, provide both one
310317
-- code action per import to make that specific import explicit, and one code

plugins/hls-explicit-imports-plugin/test/Main.hs

+33-17
Original file line numberDiff line numberDiff line change
@@ -111,23 +111,39 @@ main = defaultTestRunner $ testGroup "import-actions"
111111
testGroup
112112
"Import package inlay hints"
113113
[ testGroup "Without package imports"
114-
[ inlayHintsTestWithCap "ImportUsual" 2 $ (@=?)
115-
[mkInlayHintNoTextEdit (Position 2 6) "\"base\""]
116-
, inlayHintsTestWithCap "ImportUsual" 3 $ (@=?)
117-
[mkInlayHintNoTextEdit (Position 3 16) "\"containers\""]
118-
, inlayHintsTestWithCap "ImportUsual" 4 $ (@=?) []
119-
, inlayHintsTestWithoutCap "ImportUsual" 2 $ (@=?) []
120-
, inlayHintsTestWithoutCap "ImportUsual" 3 $ (@=?) []
121-
, inlayHintsTestWithoutCap "ImportUsual" 4 $ (@=?) []
122-
], testGroup "With package imports"
123-
[ inlayHintsTestWithCap "ImportWithPackageImport" 3 $ (@=?) []
124-
, inlayHintsTestWithCap "ImportWithPackageImport" 4 $ (@=?)
125-
[mkInlayHintNoTextEdit (Position 4 16) "\"containers\""]
126-
, inlayHintsTestWithCap "ImportWithPackageImport" 5 $ (@=?) []
127-
, inlayHintsTestWithoutCap "ImportWithPackageImport" 3 $ (@=?) []
128-
, inlayHintsTestWithoutCap "ImportWithPackageImport" 4 $ (@=?) []
129-
, inlayHintsTestWithoutCap "ImportWithPackageImport" 5 $ (@=?) []
130-
]]]
114+
(let testWithCap = inlayHintsTestWithCap "ImportUsual"
115+
testWithoutCap = inlayHintsTestWithoutCap "ImportUsual"
116+
in
117+
[ testWithCap 2 $ (@=?) [mkInlayHintNoTextEdit (Position 2 6) "\"base\""]
118+
, testWithCap 3 $ (@=?) [mkInlayHintNoTextEdit (Position 3 16) "\"containers\""]
119+
, testWithCap 4 $ (@=?) []
120+
, testWithoutCap 2 $ (@=?) []
121+
, testWithoutCap 3 $ (@=?) []
122+
, testWithoutCap 4 $ (@=?) []
123+
])
124+
, testGroup "With package imports"
125+
(let testWithCap = inlayHintsTestWithCap "ImportWithPackageImport"
126+
testWithoutCap = inlayHintsTestWithoutCap "ImportWithPackageImport"
127+
in
128+
[ testWithCap 3 $ (@=?) []
129+
, testWithCap 4 $ (@=?) [mkInlayHintNoTextEdit (Position 4 16) "\"containers\""]
130+
, testWithCap 5 $ (@=?) []
131+
, testWithoutCap 3 $ (@=?) []
132+
, testWithoutCap 4 $ (@=?) []
133+
, testWithoutCap 5 $ (@=?) []
134+
])
135+
, testGroup "When using ImportQualifiedPost"
136+
(let testWithCap = inlayHintsTestWithCap "ImportWithQualifiedPost"
137+
testWithoutCap = inlayHintsTestWithoutCap "ImportWithQualifiedPost"
138+
in
139+
[ testWithCap 3 $ (@=?) [mkInlayHintNoTextEdit (Position 3 6) "\"base\""]
140+
, testWithCap 4 $ (@=?) [mkInlayHintNoTextEdit (Position 4 6) "\"containers\""]
141+
, testWithCap 5 $ (@=?) []
142+
, testWithoutCap 3 $ (@=?) []
143+
, testWithoutCap 4 $ (@=?) []
144+
, testWithoutCap 5 $ (@=?) []
145+
])
146+
]]
131147

132148
-- code action tests
133149

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{-# LANGUAGE ImportQualifiedPost #-}
2+
module ImportWithQualifiedPost where
3+
4+
import Data.List (intersperse)
5+
import Data.Map qualified as Map
6+
import ExplicitA ( a1, a2 )
7+
8+
ordinaryMap :: Map.Map String String
9+
ordinaryMap = Map.fromList [(a1, a2)]
10+
11+
main :: IO ()
12+
main =
13+
putStrLn (concat (intersperse " " ["hello", "world", name, "!"]))
14+
where
15+
name =
16+
Map.findWithDefault "default" a1 ordinaryMap

0 commit comments

Comments
 (0)