Fix import suggestions when dot is typed (#800)

* Fix module suggestions

* Document PositionMapping

* Remove maybe
This commit is contained in:
Marcelo Lazaroni 2020-09-17 11:42:24 +01:00 committed by GitHub
parent 153536bda1
commit 4184f7da87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 9 deletions

View File

@ -24,7 +24,6 @@ import Development.IDE.Plugin.Completions.Logic
import Development.IDE.Types.Location
import Development.IDE.Types.Options
import Development.IDE.Core.Compile
import Development.IDE.Core.PositionMapping
import Development.IDE.Core.RuleTypes
import Development.IDE.Core.Shake
import Development.IDE.GHC.Compat (hsmodExports, ParsedModule(..), ModSummary (ms_hspp_buf))
@ -150,15 +149,14 @@ getCompletionsLSP lsp ide
pure (opts, liftA2 (,) compls pm)
case compls of
Just ((cci', _), (pm, mapping)) -> do
let !position' = fromCurrentPosition mapping position
pfix <- maybe (return Nothing) (flip VFS.getCompletionPrefix cnts) position'
pfix <- VFS.getCompletionPrefix position cnts
case (pfix, completionContext) of
(Just (VFS.PosPrefixInfo _ "" _ _), Just CompletionContext { _triggerCharacter = Just "."})
-> return (Completions $ List [])
(Just pfix', _) -> do
-- TODO pass the real capabilities here (or remove the logic for snippets)
let fakeClientCapabilities = ClientCapabilities Nothing Nothing Nothing Nothing
Completions . List <$> getCompletions ideOpts cci' pm pfix' fakeClientCapabilities (WithSnippets True)
Completions . List <$> getCompletions ideOpts cci' pm mapping pfix' fakeClientCapabilities (WithSnippets True)
_ -> return (Completions $ List [])
_ -> return (Completions $ List [])
_ -> return (Completions $ List [])

View File

@ -38,6 +38,7 @@ import Language.Haskell.LSP.Types
import Language.Haskell.LSP.Types.Capabilities
import qualified Language.Haskell.LSP.VFS as VFS
import Development.IDE.Core.Compile
import Development.IDE.Core.PositionMapping
import Development.IDE.Plugin.Completions.Types
import Development.IDE.Spans.Documentation
import Development.IDE.GHC.Compat as GHC
@ -371,10 +372,18 @@ toggleSnippets ClientCapabilities { _textDocument } (WithSnippets with) x
where supported = Just True == (_textDocument >>= _completion >>= _completionItem >>= _snippetSupport)
-- | Returns the cached completions for the given module and position.
getCompletions :: IdeOptions -> CachedCompletions -> ParsedModule -> VFS.PosPrefixInfo -> ClientCapabilities -> WithSnippets -> IO [CompletionItem]
getCompletions ideOpts CC { allModNamesAsNS, unqualCompls, qualCompls, importableModules }
pm prefixInfo caps withSnippets = do
let VFS.PosPrefixInfo { VFS.fullLine, VFS.prefixModule, VFS.prefixText } = prefixInfo
getCompletions
:: IdeOptions
-> CachedCompletions
-> ParsedModule
-> PositionMapping -- ^ map current position to position in parsed module
-> VFS.PosPrefixInfo
-> ClientCapabilities
-> WithSnippets
-> IO [CompletionItem]
getCompletions ideOpts cc pm pmapping prefixInfo caps withSnippets = do
let CC { allModNamesAsNS, unqualCompls, qualCompls, importableModules } = cc
VFS.PosPrefixInfo { VFS.fullLine, VFS.prefixModule, VFS.prefixText } = prefixInfo
enteredQual = if T.null prefixModule then "" else prefixModule <> "."
fullPrefix = enteredQual <> prefixText
@ -404,8 +413,12 @@ getCompletions ideOpts CC { allModNamesAsNS, unqualCompls, qualCompls, importabl
filtCompls = map Fuzzy.original $ Fuzzy.filter prefixText ctxCompls "" "" label False
where
mcc = do
position' <- fromCurrentPosition pmapping pos
getCContext position' pm
-- completions specific to the current context
ctxCompls' = case getCContext pos pm of
ctxCompls' = case mcc of
Nothing -> compls
Just TypeContext -> filter isTypeCompl compls
Just ValueContext -> filter (not . isTypeCompl) compls