Skip to content

Commit

Permalink
Shorter file names completion (#4252)
Browse files Browse the repository at this point in the history
Don't autocomplete `./` in cabal filepaths (e.g. `hs-source-dirs` or `main-is`), unless the user explicitly wrote `./`.
  • Loading branch information
VenInf authored May 27, 2024
1 parent 8f075d0 commit a6cb43b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Ide.Plugin.Cabal.Completion.Completer.Paths where

import qualified Data.List as List
import Data.List.Extra (dropPrefix)
import qualified Data.Text as T
import Distribution.PackageDescription (Benchmark (..),
BuildInfo (..),
Expand Down Expand Up @@ -45,6 +46,32 @@ data PathCompletionInfo = PathCompletionInfo
}
deriving (Eq, Show)


{- | Posix.splitFileName modification, that drops trailing ./ if
if wasn't present in the original path.
Fix for the issue #3774
Examples:
>>> splitFileNameNoTrailingSlash ""
("", "")
>>> splitFileNameNoTrailingSlash "./"
("./", "")
>>> splitFileNameNoTrailingSlash "dir"
("", "dir")
>>> splitFileNameNoTrailingSlash "./dir"
("./", "dir")
>>> splitFileNameNoTrailingSlash "dir1/dir2"
("dir1/","dir2")
>>> splitFileNameNoTrailingSlash "./dir1/dir2"
("./dir1/","dir2")
-}
splitFileNameNoTrailingSlash :: FilePath -> (String, String)
splitFileNameNoTrailingSlash prefix = rmTrailingSlash ("./" `List.isPrefixOf` prefix) (Posix.splitFileName prefix)
where rmTrailingSlash hadTrailingSlash (queryDirectory', pathSegment')
| hadTrailingSlash = (queryDirectory', pathSegment')
| otherwise = ("./" `dropPrefix` queryDirectory', pathSegment')

{- | Takes an optional source subdirectory and a prefix info
and creates a path completion info accordingly.
Expand All @@ -64,7 +91,7 @@ pathCompletionInfoFromCabalPrefixInfo srcDir prefInfo =
}
where
prefix = T.unpack $ completionPrefix prefInfo
(queryDirectory', pathSegment') = Posix.splitFileName prefix
(queryDirectory', pathSegment') = splitFileNameNoTrailingSlash prefix

-- | Extracts the source directories of the library stanza.
sourceDirsExtractionLibrary :: Maybe StanzaName -> GenericPackageDescription -> [FilePath]
Expand Down
20 changes: 10 additions & 10 deletions plugins/hls-cabal-plugin/test/Completer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ basicCompleterTests =
doc <- openDoc "main-is.cabal" "cabal"
compls <- getCompletions doc (Position 10 12)
let complTexts = getTextEditTexts compls
liftIO $ assertBool "suggests f2" $ "./f2.hs" `elem` complTexts
liftIO $ assertBool "does not suggest" $ "./Content.hs" `notElem` complTexts
liftIO $ assertBool "suggests f2" $ "f2.hs" `elem` complTexts
liftIO $ assertBool "does not suggest" $ "Content.hs" `notElem` complTexts
]
where
getTextEditTexts :: [CompletionItem] -> [T.Text]
Expand All @@ -66,21 +66,21 @@ fileCompleterTests :: TestTree
fileCompleterTests =
testGroup
"File Completer Tests"
[ testCase "Current Directory" $ do
[ testCase "Current Directory - no leading ./ by default" $ do
completions <- completeFilePath "" filePathComplTestDir
completions @?== ["./.hidden", "./Content.hs", "./dir1/", "./dir2/", "./textfile.txt", "./main-is.cabal"],
completions @?== [".hidden", "Content.hs", "dir1/", "dir2/", "textfile.txt", "main-is.cabal"],
testCase "Current Directory - alternative writing" $ do
completions <- completeFilePath "./" filePathComplTestDir
completions @?== ["./.hidden", "./Content.hs", "./dir1/", "./dir2/", "./textfile.txt", "./main-is.cabal"],
testCase "Current Directory - hidden file start" $ do
completions <- completeFilePath "." filePathComplTestDir
completions @?== ["./Content.hs", "./.hidden", "./textfile.txt", "./main-is.cabal"],
completions @?== ["Content.hs", ".hidden", "textfile.txt", "main-is.cabal"],
testCase "Current Directory - incomplete directory path written" $ do
completions <- completeFilePath "di" filePathComplTestDir
completions @?== ["./dir1/", "./dir2/"],
completions @?== ["dir1/", "dir2/"],
testCase "Current Directory - incomplete filepath written" $ do
completions <- completeFilePath "te" filePathComplTestDir
completions @?== ["./Content.hs", "./textfile.txt"],
completions @?== ["Content.hs", "textfile.txt"],
testCase "Subdirectory" $ do
completions <- completeFilePath "dir1/" filePathComplTestDir
completions @?== ["dir1/f1.txt", "dir1/f2.hs"],
Expand Down Expand Up @@ -165,15 +165,15 @@ directoryCompleterTests :: TestTree
directoryCompleterTests =
testGroup
"Directory Completer Tests"
[ testCase "Current Directory" $ do
[ testCase "Current Directory - no leading ./ by default" $ do
completions <- completeDirectory "" filePathComplTestDir
completions @?== ["./dir1/", "./dir2/"],
completions @?== ["dir1/", "dir2/"],
testCase "Current Directory - alternative writing" $ do
completions <- completeDirectory "./" filePathComplTestDir
completions @?== ["./dir1/", "./dir2/"],
testCase "Current Directory - incomplete directory path written" $ do
completions <- completeDirectory "di" filePathComplTestDir
completions @?== ["./dir1/", "./dir2/"],
completions @?== ["dir1/", "dir2/"],
testCase "Current Directory - incomplete filepath written" $ do
completions <- completeDirectory "te" filePathComplTestDir
completions @?== [],
Expand Down
6 changes: 3 additions & 3 deletions plugins/hls-cabal-plugin/test/Context.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ pathCompletionInfoFromCompletionContextTests :: TestTree
pathCompletionInfoFromCompletionContextTests =
testGroup
"Completion Info to Completion Context Tests"
[ testCase "Current Directory" $ do
[ testCase "Current Directory - no leading ./ by default" $ do
let complInfo = pathCompletionInfoFromCabalPrefixInfo "" $ simpleCabalPrefixInfoFromFp "" testDataDir
queryDirectory complInfo @?= "./"
queryDirectory complInfo @?= ""
, testCase "Current Directory - partly written next" $ do
let complInfo = pathCompletionInfoFromCabalPrefixInfo "" $ simpleCabalPrefixInfoFromFp "di" testDataDir
queryDirectory complInfo @?= "./"
queryDirectory complInfo @?= ""
pathSegment complInfo @?= "di"
, testCase "Current Directory - alternative writing" $ do
let complInfo = pathCompletionInfoFromCabalPrefixInfo "" $ simpleCabalPrefixInfoFromFp "./" testDataDir
Expand Down

0 comments on commit a6cb43b

Please sign in to comment.