From 03793d1549cbceebdbe82f8c1021cb2e699bb1a0 Mon Sep 17 00:00:00 2001 From: George Gerasev Date: Sun, 26 May 2024 20:29:06 +0300 Subject: [PATCH 1/4] issue #3774 fix --- .../Cabal/Completion/Completer/Paths.hs | 24 ++++++++++++++++++- plugins/hls-cabal-plugin/test/Completer.hs | 6 ++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs index b067fa9e49..167865f565 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs @@ -15,6 +15,8 @@ import Distribution.Utils.Path (getSymbolicPath) import Ide.Plugin.Cabal.Completion.Types import qualified System.FilePath as FP import qualified System.FilePath.Posix as Posix +import Data.List.Extra (dropPrefix) +import Data.List (isPrefixOf) {- | Information used to query and build path completions. @@ -45,6 +47,26 @@ 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 of path splitting: + "" -> ("", "") instead of ("./","") + "./" -> ("./", "") + "dir" -> ("", "dir") instead of ("./","dir") + "./dir" -> ("./", "dir") + "dir1/dir2" -> ("dir1/","dir2") + "./dir1/dir2" -> ("./dir1/","dir2") +-} +splitFileNameNoTrailingSlash :: FilePath -> (String, String) +splitFileNameNoTrailingSlash prefix = rmTrailingSlash ("./" `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. @@ -64,7 +86,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] diff --git a/plugins/hls-cabal-plugin/test/Completer.hs b/plugins/hls-cabal-plugin/test/Completer.hs index 61d637a1b6..207b603725 100644 --- a/plugins/hls-cabal-plugin/test/Completer.hs +++ b/plugins/hls-cabal-plugin/test/Completer.hs @@ -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 @?== [], From 423ac9bd59b1b54c635ecb0599ac28b3d11c0bc1 Mon Sep 17 00:00:00 2001 From: George Gerasev Date: Sun, 26 May 2024 20:44:05 +0300 Subject: [PATCH 2/4] changed other related tests --- plugins/hls-cabal-plugin/test/Completer.hs | 14 +++++++------- plugins/hls-cabal-plugin/test/Context.hs | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/hls-cabal-plugin/test/Completer.hs b/plugins/hls-cabal-plugin/test/Completer.hs index 207b603725..80da8c53e6 100644 --- a/plugins/hls-cabal-plugin/test/Completer.hs +++ b/plugins/hls-cabal-plugin/test/Completer.hs @@ -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] @@ -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"], diff --git a/plugins/hls-cabal-plugin/test/Context.hs b/plugins/hls-cabal-plugin/test/Context.hs index ba2275dc1b..badc9263c0 100644 --- a/plugins/hls-cabal-plugin/test/Context.hs +++ b/plugins/hls-cabal-plugin/test/Context.hs @@ -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 From 4d0904e0752e47c2275661fd6b6653a1d3a24bab Mon Sep 17 00:00:00 2001 From: George Gerasev Date: Sun, 26 May 2024 21:05:55 +0300 Subject: [PATCH 3/4] fixed imports --- .../src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs index 167865f565..02747ecdfc 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs @@ -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 (..), @@ -15,8 +16,6 @@ import Distribution.Utils.Path (getSymbolicPath) import Ide.Plugin.Cabal.Completion.Types import qualified System.FilePath as FP import qualified System.FilePath.Posix as Posix -import Data.List.Extra (dropPrefix) -import Data.List (isPrefixOf) {- | Information used to query and build path completions. @@ -62,7 +61,7 @@ data PathCompletionInfo = PathCompletionInfo "./dir1/dir2" -> ("./dir1/","dir2") -} splitFileNameNoTrailingSlash :: FilePath -> (String, String) -splitFileNameNoTrailingSlash prefix = rmTrailingSlash ("./" `isPrefixOf` prefix) (Posix.splitFileName prefix) +splitFileNameNoTrailingSlash prefix = rmTrailingSlash ("./" `List.isPrefixOf` prefix) (Posix.splitFileName prefix) where rmTrailingSlash hadTrailingSlash (queryDirectory', pathSegment') | hadTrailingSlash = (queryDirectory', pathSegment') | otherwise = ("./" `dropPrefix` queryDirectory', pathSegment') From 7e205404ffe07388c4fb7b29a9289c2e3971ee0f Mon Sep 17 00:00:00 2001 From: George Gerasev Date: Mon, 27 May 2024 13:18:06 +0300 Subject: [PATCH 4/4] fixed documentation --- .../Cabal/Completion/Completer/Paths.hs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs index 02747ecdfc..5defdbbe63 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/Completer/Paths.hs @@ -51,14 +51,20 @@ data PathCompletionInfo = PathCompletionInfo if wasn't present in the original path. Fix for the issue #3774 - - Examples of path splitting: - "" -> ("", "") instead of ("./","") - "./" -> ("./", "") - "dir" -> ("", "dir") instead of ("./","dir") - "./dir" -> ("./", "dir") - "dir1/dir2" -> ("dir1/","dir2") - "./dir1/dir2" -> ("./dir1/","dir2") + 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) @@ -85,7 +91,7 @@ pathCompletionInfoFromCabalPrefixInfo srcDir prefInfo = } where prefix = T.unpack $ completionPrefix prefInfo - (queryDirectory', pathSegment') = splitFileNameNoTrailingSlash prefix + (queryDirectory', pathSegment') = splitFileNameNoTrailingSlash prefix -- | Extracts the source directories of the library stanza. sourceDirsExtractionLibrary :: Maybe StanzaName -> GenericPackageDescription -> [FilePath]