diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/FilePath.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/FilePath.hs index b75eba950ca..e577e10f355 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/FilePath.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/FilePath.hs @@ -5,22 +5,22 @@ module Ide.Plugin.Cabal.Completion.Completer.FilePath where -import Data.Maybe (fromMaybe) -import qualified Data.Text as T +import Data.Maybe (fromMaybe) +import qualified Data.Text as T import Ide.Plugin.Cabal.Completion.Completer.Types -import Control.Exception (evaluate, try) -import Control.Monad (filterM) -import Control.Monad.Extra (forM) +import Control.Exception (evaluate, try) +import Control.Monad (filterM) +import Control.Monad.Extra (forM) import Development.IDE.Types.Logger +import Ide.Plugin.Cabal.Completion.Completer.Simple import Ide.Plugin.Cabal.Completion.Types -import System.Directory (doesDirectoryExist, - doesFileExist, - listDirectory) -import qualified System.FilePath as FP -import qualified System.FilePath.Posix as Posix -import qualified Text.Fuzzy.Parallel as Fuzzy -import Ide.Plugin.Cabal.Completion.Completer.Simple +import System.Directory (doesDirectoryExist, + doesFileExist, + listDirectory) +import qualified System.FilePath as FP +import qualified System.FilePath.Posix as Posix +import qualified Text.Fuzzy.Parallel as Fuzzy {- | Completer to be used when a file path can be @@ -30,7 +30,7 @@ import Ide.Plugin.Cabal.Completion.Completer.Simple filePathCompleter :: Completer filePathCompleter recorder cData = do let prefInfo = cabalPrefixInfo cData - suffix = fromMaybe "" $ completionSuffix prefInfo + suffix' = fromMaybe "" $ completionSuffix prefInfo complInfo = pathCompletionInfoFromCabalPrefixInfo prefInfo toMatch = fromMaybe (partialFileName complInfo) $ T.stripPrefix "./" $ partialFileName complInfo filePathCompletions <- listFileCompletions recorder complInfo @@ -39,7 +39,10 @@ filePathCompleter recorder cData = do scored ( \compl' -> do let compl = Fuzzy.original compl' - fullFilePath <- mkFilePathCompletion suffix compl complInfo + suffix = if ' ' `T.elem` compl then "\"" else suffix' + fullFilePath' <- mkFilePathCompletion suffix compl complInfo + -- if we complete a filepath name which contains a space then we need to wrap the path in apostrophes + let fullFilePath = if ' ' `T.elem` fullFilePath' then T.append "\"" fullFilePath' else fullFilePath' pure $ mkCompletionItem (completionRange prefInfo) fullFilePath fullFilePath ) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Module.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Module.hs index 2d5e62cf69e..a596886555f 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Module.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Module.hs @@ -3,8 +3,7 @@ module Ide.Plugin.Cabal.Completion.Completer.Module where import qualified Data.List as List -import Data.Maybe (fromJust, - fromMaybe) +import Data.Maybe (fromMaybe) import qualified Data.Text as T import Development.IDE (IdeState (shakeExtras)) import Development.IDE.Core.Shake (runIdeAction, @@ -19,7 +18,11 @@ import Distribution.PackageDescription (Benchmark (..), mkUnqualComponentName, testBuildInfo) import Distribution.Utils.Path (getSymbolicPath) -import Ide.Plugin.Cabal.Completion.Completer.FilePath +import Ide.Plugin.Cabal.Completion.Completer.FilePath + ( listFileCompletions, + mkCompletionDirectory, + mkPathCompletion, + PathCompletionInfo(..) ) import Ide.Plugin.Cabal.Completion.Completer.Types import Ide.Plugin.Cabal.Completion.Types @@ -33,6 +36,7 @@ import System.Directory (doesFileExist) import qualified System.FilePath as FP import qualified System.FilePath.Posix as Posix import qualified Text.Fuzzy.Parallel as Fuzzy + {- | Completer to be used when module paths can be completed for the field. Takes an extraction function which extracts the source directories @@ -72,10 +76,12 @@ sourceDirsExtractionLibrary gpd = sourceDirsExtractionExecutable :: Maybe T.Text -> GenericPackageDescription -> [FilePath] sourceDirsExtractionExecutable Nothing _ = [] sourceDirsExtractionExecutable (Just name) gpd - | exeName executable == (mkUnqualComponentName $ T.unpack name) = map getSymbolicPath $ hsSourceDirs $ buildInfo executable + | Just executable <- executableM + , exeName executable == (mkUnqualComponentName $ T.unpack name) = + map getSymbolicPath $ hsSourceDirs $ buildInfo executable | otherwise = [] where - executable = condTreeData $ snd $ fromJust res + executableM = fmap (condTreeData . snd) res execsM = condExecutables gpd res = List.find @@ -90,10 +96,12 @@ sourceDirsExtractionExecutable (Just name) gpd sourceDirsExtractionTestSuite :: Maybe T.Text -> GenericPackageDescription -> [FilePath] sourceDirsExtractionTestSuite Nothing _ = [] sourceDirsExtractionTestSuite (Just name) gpd - | testName testSuite == (mkUnqualComponentName $ T.unpack name) = map getSymbolicPath $ hsSourceDirs $ testBuildInfo testSuite + | Just testSuite <- testSuiteM + , testName testSuite == (mkUnqualComponentName $ T.unpack name) = + map getSymbolicPath $ hsSourceDirs $ testBuildInfo testSuite | otherwise = [] where - testSuite = condTreeData $ snd $ fromJust res + testSuiteM = fmap (condTreeData . snd) res testSuitesM = condTestSuites gpd res = List.find @@ -108,10 +116,12 @@ sourceDirsExtractionTestSuite (Just name) gpd sourceDirsExtractionBenchmark :: Maybe T.Text -> GenericPackageDescription -> [FilePath] sourceDirsExtractionBenchmark Nothing _ = [] sourceDirsExtractionBenchmark (Just name) gpd - | benchmarkName bMark == (mkUnqualComponentName $ T.unpack name) = map getSymbolicPath $ hsSourceDirs $ benchmarkBuildInfo bMark + | Just bMark <- bMarkM + , benchmarkName bMark == (mkUnqualComponentName $ T.unpack name) = + map getSymbolicPath $ hsSourceDirs $ benchmarkBuildInfo bMark | otherwise = [] where - bMark = condTreeData $ snd $ fromJust res + bMarkM = fmap (condTreeData . snd) res bMarksM = condBenchmarks gpd res = List.find diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Data.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Data.hs index 31aa37e7551..1c95213e5c7 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Data.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Data.hs @@ -15,6 +15,7 @@ import Ide.Plugin.Cabal.Completion.Completer.FilePath import Ide.Plugin.Cabal.Completion.Completer.Module import Ide.Plugin.Cabal.Completion.Completer.Simple import Ide.Plugin.Cabal.Completion.Completer.Types (Completer) + -- ---------------------------------------------------------------- -- Completion Data -- ---------------------------------------------------------------- diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Types.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Types.hs index 1b44c0d8e60..5fb6b1b1686 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Types.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Types.hs @@ -4,7 +4,6 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} - module Ide.Plugin.Cabal.Completion.Types where import Control.DeepSeq (NFData)