Skip to content

Commit 6fed490

Browse files
alexnaspojneiraalexnaspoleapmergify[bot]
authored
enable completions of local imports (#2190)
* enable completions of local imports * added unit test * use HM.keys * rename test * Revert "enable completions of local imports" This reverts commit a52894f. * use GetKnownTargets * clean up * clean up * leverage CachedCompletions over argument * clean up * clean Co-authored-by: Javier Neira <atreyu.bbb@gmail.com> Co-authored-by: alexnaspoleap <88672779+alexnaspoleap@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent 3bfb9b3 commit 6fed490

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

ghcide/src/Development/IDE/Plugin/Completions.hs

+10-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import Development.IDE.GHC.ExactPrint (Annotated (annsA)
3030
import Development.IDE.GHC.Util (prettyPrint)
3131
import Development.IDE.Graph
3232
import Development.IDE.Graph.Classes
33+
import qualified Development.IDE.Types.KnownTargets as KT
3334
import Development.IDE.Plugin.CodeAction (newImport,
3435
newImportToEdit)
3536
import Development.IDE.Plugin.CodeAction.ExactPrint
@@ -132,7 +133,9 @@ getCompletionsLSP ide plId
132133
nonLocalCompls <- useWithStaleFast NonLocalCompletions npath
133134
pm <- useWithStaleFast GetParsedModule npath
134135
binds <- fromMaybe (mempty, zeroMapping) <$> useWithStaleFast GetBindings npath
135-
136+
knownTargets <- liftIO $ runAction "Completion" ide $ useNoFile GetKnownTargets
137+
let localModules = maybe [] Map.keys knownTargets
138+
let lModules = mempty{importableModules = map toModueNameText localModules}
136139
-- set up the exports map including both package and project-level identifiers
137140
packageExportsMapIO <- fmap(envPackageExports . fst) <$> useWithStaleFast GhcSession npath
138141
packageExportsMap <- mapM liftIO packageExportsMapIO
@@ -142,7 +145,7 @@ getCompletionsLSP ide plId
142145
let moduleExports = getModuleExportsMap exportsMap
143146
exportsCompItems = foldMap (map (fromIdentInfo uri) . Set.toList) . Map.elems . getExportsMap $ exportsMap
144147
exportsCompls = mempty{anyQualCompls = exportsCompItems}
145-
let compls = (fst <$> localCompls) <> (fst <$> nonLocalCompls) <> Just exportsCompls
148+
let compls = (fst <$> localCompls) <> (fst <$> nonLocalCompls) <> Just exportsCompls <> Just lModules
146149

147150
pure (opts, fmap (,pm,binds) compls, moduleExports)
148151
case compls of
@@ -162,6 +165,11 @@ getCompletionsLSP ide plId
162165

163166
----------------------------------------------------------------------------------------------------
164167

168+
toModueNameText :: KT.Target -> T.Text
169+
toModueNameText target = case target of
170+
KT.TargetModule m -> T.pack $ moduleNameString m
171+
_ -> T.empty
172+
165173
extendImportCommand :: PluginCommand IdeState
166174
extendImportCommand =
167175
PluginCommand (CommandId extendImportCommandId) "additional edits for a completion" extendImportHandler

ghcide/test/exe/Main.hs

+19-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import Development.IDE.Test (Cursor,
5656
import Development.IDE.Test.Runfiles
5757
import qualified Development.IDE.Types.Diagnostics as Diagnostics
5858
import Development.IDE.Types.Location
59+
import qualified Language.LSP.Types.Lens as Lens (label)
5960
import Development.Shake (getDirectoryFilesIO)
6061
import qualified Experiments as Bench
6162
import Ide.Plugin.Config
@@ -4589,7 +4590,24 @@ projectCompletionTests =
45894590
<- compls
45904591
, _label == "anidentifier"
45914592
]
4592-
liftIO $ compls' @?= ["Defined in 'A"]
4593+
liftIO $ compls' @?= ["Defined in 'A"],
4594+
testSession' "auto complete project imports" $ \dir-> do
4595+
liftIO $ writeFile (dir </> "hie.yaml")
4596+
"cradle: {direct: {arguments: [\"-Wmissing-signatures\", \"ALocalModule\", \"B\"]}}"
4597+
_ <- createDoc "ALocalModule.hs" "haskell" $ T.unlines
4598+
[ "module ALocalModule (anidentifier) where",
4599+
"anidentifier = ()"
4600+
]
4601+
_ <- waitForDiagnostics
4602+
-- Note that B does not import A
4603+
doc <- createDoc "B.hs" "haskell" $ T.unlines
4604+
[ "module B where",
4605+
"import ALocal"
4606+
]
4607+
compls <- getCompletions doc (Position 1 13)
4608+
let item = head $ filter ((== "ALocalModule") . (^. Lens.label)) compls
4609+
liftIO $ do
4610+
item ^. Lens.label @?= "ALocalModule"
45934611
]
45944612

45954613
highlightTests :: TestTree

0 commit comments

Comments
 (0)