4
4
5
5
module Ide.Plugin.Cabal.Completions where
6
6
7
- import Control.Exception (try )
8
- import Control.Exception.Extra (evaluate )
9
- import Control.Monad (filterM , forM )
10
- import qualified Data.List as List
11
- import qualified Data.List.Extra as Extra
12
- import Data.Map (Map )
13
- import qualified Data.Map as Map
14
- import Data.Maybe (fromMaybe )
15
- import qualified Data.Text as T
16
- import Development.IDE as D
17
- import Distribution.CabalSpecVersion (CabalSpecVersion (CabalSpecV1_2 ),
18
- showCabalSpecVersion )
19
- import Distribution.Compat.Lens ((^.) )
20
- import qualified Language.LSP.Types as J
21
- import qualified Language.LSP.Types.Lens as JL
22
- import qualified Language.LSP.VFS as VFS
23
- import System.Directory (doesDirectoryExist ,
24
- doesFileExist , listDirectory )
25
- import System.FilePath
26
- import qualified Text.Fuzzy.Parallel as Fuzzy
27
- import Ide.Plugin.Cabal.LicenseSuggest (licenseNames )
7
+ import Control.Exception (try )
8
+ import Control.Exception.Extra (evaluate )
9
+ import Control.Monad (filterM , forM )
10
+ import qualified Data.List as List
11
+ import qualified Data.List.Extra as Extra
12
+ import Data.Map (Map )
13
+ import qualified Data.Map as Map
14
+ import Data.Maybe (fromMaybe )
15
+ import qualified Data.Text as T
16
+ import Development.IDE as D
17
+ import Distribution.CabalSpecVersion (CabalSpecVersion (CabalSpecV1_2 ),
18
+ showCabalSpecVersion )
19
+ import Distribution.Compat.Lens ((^.) )
20
+ import Ide.Plugin.Cabal.LicenseSuggest (licenseNames )
21
+ import qualified Language.LSP.Types as J
22
+ import qualified Language.LSP.Types.Lens as JL
23
+ import qualified Language.LSP.VFS as VFS
24
+ import System.Directory (doesDirectoryExist ,
25
+ doesFileExist , listDirectory )
26
+ import qualified System.FilePath as FP
27
+ import qualified System.FilePath.Posix as Posix
28
+ import qualified Text.Fuzzy.Parallel as Fuzzy
28
29
29
30
-- | Takes information needed to build possible completion items
30
31
-- and returns the list of possible completion items
@@ -91,11 +92,11 @@ contextToCompleter :: Context -> Completer
91
92
-- if we are in the top level of the cabal file and not in a keyword context,
92
93
-- we can write any top level keywords or a stanza declaration
93
94
contextToCompleter (TopLevel , None ) =
94
- constantCompleter $ Map. keys ( cabalKeywords) ++ Map. keys stanzaKeywordMap
95
+ constantCompleter $ Map. keys cabalKeywords ++ Map. keys stanzaKeywordMap
95
96
-- if we are in a keyword context in the top level,
96
97
-- we look up that keyword in the toplevel context and can complete its possible values
97
98
contextToCompleter (TopLevel , KeyWord kw) =
98
- case Map. lookup kw ( cabalKeywords) of
99
+ case Map. lookup kw cabalKeywords of
99
100
Nothing -> noopCompleter
100
101
Just l -> l
101
102
-- if we are in a stanza and not in a keyword context,
@@ -294,7 +295,7 @@ filePathCompleter ctx = do
294
295
-- | Takes a suffix and a text and returns filepath with the suffix
295
296
makeFullFilePath :: T. Text -> T. Text -> PathCompletionInfo -> IO T. Text
296
297
makeFullFilePath suffix' completion' complInfo = do
297
- let fullPath' = prefixPathInfo complInfo </> T. unpack completion'
298
+ let fullPath' = prefixPathInfo complInfo Posix. </> T. unpack completion'
298
299
isFilePath <- doesFileExist fullPath'
299
300
let fullPath = if isFilePath then fullPath' ++ T. unpack suffix' else fullPath'
300
301
pure $ T. pack fullPath
@@ -306,7 +307,7 @@ listFileCompletions complInfo = do
306
307
fixedDirs <- mapM
307
308
(\ d -> do
308
309
isDir <- doesDirectoryExist $ mkDirFromCWD complInfo d
309
- pure $ if isDir then addTrailingPathSeparator d else d
310
+ pure $ if isDir then Posix. addTrailingPathSeparator d else d
310
311
)
311
312
dirs
312
313
pure fixedDirs
@@ -331,18 +332,18 @@ directoryCompleter ctx = do
331
332
pathCompletionInfoFromCompletionContext :: CabalCompletionContext -> PathCompletionInfo
332
333
pathCompletionInfoFromCompletionContext ctx = PathCompletionInfo
333
334
{ prefixLeftOver = dirNamePrefix
334
- , prefixPathInfo = addTrailingPathSeparator $ takeDirectory prefix
335
+ , prefixPathInfo = Posix. addTrailingPathSeparator $ Posix. takeDirectory prefix
335
336
, cabalFilePathInfo = fp}
336
337
where
337
338
prefix = T. unpack $ completionPrefix ctx
338
- dirNamePrefix = T. pack $ takeFileName prefix
339
- fp = takeDirectory $ completionCabalFilePath ctx
339
+ dirNamePrefix = T. pack $ Posix. takeFileName prefix
340
+ fp = Posix. takeDirectory $ completionCabalFilePath ctx
340
341
341
342
mkCompletionDirectory :: PathCompletionInfo -> FilePath
342
- mkCompletionDirectory complInfo = addTrailingPathSeparator $ cabalFilePathInfo complInfo </> prefixPathInfo complInfo
343
+ mkCompletionDirectory complInfo = FP. addTrailingPathSeparator $ cabalFilePathInfo complInfo FP. </> ( FP. normalise $ prefixPathInfo complInfo)
343
344
344
345
mkDirFromCWD :: PathCompletionInfo -> FilePath -> FilePath
345
- mkDirFromCWD complInfo fp = addTrailingPathSeparator $ mkCompletionDirectory complInfo </> fp
346
+ mkDirFromCWD complInfo fp = Posix. addTrailingPathSeparator $ mkCompletionDirectory complInfo Posix. </> Posix. normalise fp
346
347
347
348
data PathCompletionInfo = PathCompletionInfo
348
349
{ prefixLeftOver :: T. Text
0 commit comments