From 149543515f36496c78f049363dc59cb98e6b8036 Mon Sep 17 00:00:00 2001 From: JMoss-dev <79190520+JMoss-dev@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:47:49 +0200 Subject: [PATCH 1/4] added guardAgainstHpack function Revert "added guardAgainstHpack function" This reverts commit f7fb00c942494bf8200d1eae120bfc0ecdde5878. added guardAgainstHpack function --- .../hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs index 1a086dbc85..96533ec7b4 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs @@ -277,7 +277,7 @@ getDependencyEdit recorder env cabalFilePath buildTarget dependency = do logWith recorder Debug $ LogCreatedEdit edit pure edit --- | Given a path to a haskell file, returns the closest cabal file. +-- | Given a path to a haskell file, returns the closest cabal file, except if package.yaml is also present. -- If cabal file wasn't found, gives Nothing. findResponsibleCabalFile :: FilePath -> IO (Maybe FilePath) findResponsibleCabalFile haskellFilePath = do @@ -293,7 +293,12 @@ findResponsibleCabalFile haskellFilePath = do cabalFiles <- filterM (\c -> doesFileExist c) objectsCabalExtension case safeHead cabalFiles of Nothing -> go ps - Just cabalFile -> pure $ Just cabalFile + Just cabalFile -> guardAgainstHpack path cabalFile + where + guardAgainstHpack :: FilePath -> FilePath -> IO (Maybe FilePath) + guardAgainstHpack path cabalFile = do + exists <- doesFileExist $ path "package.yaml" + if exists then pure Nothing else pure $ Just cabalFile -- | Gives cabal file's contents or throws error. -- Inspired by @readCabalFile@ in cabal-add, From 0e95226f117ff7fc39c7a8fca0efdf51056ac082 Mon Sep 17 00:00:00 2001 From: ASnd-dev <184600539+ASnd-dev@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:55:53 +0200 Subject: [PATCH 2/4] added test for guardAgainstHPack --- plugins/hls-cabal-plugin/test/CabalAdd.hs | 11 +++++++++++ .../cabal-add-packageYaml/cabal-add-bench.cabal | 17 +++++++++++++++++ .../cabal-add-packageYaml/package.yaml | 0 .../cabal-add-packageYaml/src/Main.hs | 6 ++++++ .../testdata/cabal-add-testdata/cabal.project | 1 + 5 files changed, 35 insertions(+) create mode 100644 plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/cabal-add-bench.cabal create mode 100644 plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/package.yaml create mode 100644 plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/src/Main.hs diff --git a/plugins/hls-cabal-plugin/test/CabalAdd.hs b/plugins/hls-cabal-plugin/test/CabalAdd.hs index d2804b481c..2f9b16d1b3 100644 --- a/plugins/hls-cabal-plugin/test/CabalAdd.hs +++ b/plugins/hls-cabal-plugin/test/CabalAdd.hs @@ -29,6 +29,8 @@ cabalAddTests = "CabalAdd Tests" [ runHaskellTestCaseSession "Code Actions - Can add hidden package" ("cabal-add-testdata" "cabal-add-exe") (generateAddDependencyTestSession "cabal-add-exe.cabal" ("src" "Main.hs") "split" [253]) + , runHaskellTestCaseSession "Code Actions - Guard against HPack" ("cabal-add-testdata" "cabal-add-packageYaml") + (generatePackageYAMLTestSession ("src" "Main.hs")) , runHaskellTestCaseSession "Code Actions - Can add hidden package to a library" ("cabal-add-testdata" "cabal-add-lib") (generateAddDependencyTestSession "cabal-add-lib.cabal" ("src" "MyLib.hs") "split" [348]) , runHaskellTestCaseSession "Code Actions - Can add hidden package to a test" ("cabal-add-testdata" "cabal-add-tests") @@ -139,3 +141,12 @@ cabalAddTests = , _codeDescription = Nothing , _data_ = Nothing } + + + generatePackageYAMLTestSession :: FilePath -> Session () + generatePackageYAMLTestSession haskellFile = do + hsdoc <- openDoc haskellFile "haskell" + _ <- waitForDiagnosticsFrom hsdoc + cas <- Maybe.mapMaybe (^? _R) <$> getAllCodeActions hsdoc + let selectedCas = filter (\ca -> "Add dependency" `T.isPrefixOf` (ca ^. L.title)) cas + liftIO $ assertEqual "PackageYAML" [] selectedCas diff --git a/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/cabal-add-bench.cabal b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/cabal-add-bench.cabal new file mode 100644 index 0000000000..b58a6d3302 --- /dev/null +++ b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/cabal-add-bench.cabal @@ -0,0 +1,17 @@ +cabal-version: 2.4 +name: cabal-add-bench +version: 0.1.0.0 +license: NONE +author: George Gerasev +maintainer: george30032002@gmail.com +build-type: Simple + +common warnings + ghc-options: -Wall + +benchmark benchmark + type: exitcode-stdio-1.0 + ghc-options: -threaded + main-is: Main.hs + hs-source-dirs: bench + build-depends: base diff --git a/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/package.yaml b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/package.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/src/Main.hs b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/src/Main.hs new file mode 100644 index 0000000000..e5c42398f2 --- /dev/null +++ b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal-add-packageYaml/src/Main.hs @@ -0,0 +1,6 @@ +module Main (main) where + +import Data.List.Split + +main :: IO () +main = putStrLn "Test suite not yet implemented." diff --git a/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal.project b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal.project index dfa2feed39..786cb592de 100644 --- a/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal.project +++ b/plugins/hls-cabal-plugin/test/testdata/cabal-add-testdata/cabal.project @@ -2,3 +2,4 @@ packages: cabal-add-exe cabal-add-lib cabal-add-tests cabal-add-bench + cabal-add-packageYaml From 1402c42f74e7f8d5f0899ae7229d0e71841740a1 Mon Sep 17 00:00:00 2001 From: JMoss-dev <79190520+JMoss-dev@users.noreply.github.com> Date: Sat, 12 Oct 2024 10:17:07 +0200 Subject: [PATCH 3/4] better documentation for findResponsibleCabalFile --- plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs index 96533ec7b4..7336dca1a5 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs @@ -277,7 +277,10 @@ getDependencyEdit recorder env cabalFilePath buildTarget dependency = do logWith recorder Debug $ LogCreatedEdit edit pure edit --- | Given a path to a haskell file, returns the closest cabal file, except if package.yaml is also present. +-- | Given a path to a haskell file, returns the closest cabal file. +-- If package.yaml is present in same directory as .cabal file, it returns nothing, because adding a dependency to a generated cabal file +-- will break propagation of changes from package.yaml to cabal file in stack project. +-- -- If cabal file wasn't found, gives Nothing. findResponsibleCabalFile :: FilePath -> IO (Maybe FilePath) findResponsibleCabalFile haskellFilePath = do From d4f19147325438287bc773922a93f55acd2975a9 Mon Sep 17 00:00:00 2001 From: fendor Date: Sat, 12 Oct 2024 13:51:22 +0200 Subject: [PATCH 4/4] Update plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs Co-authored-by: VeryMilkyJoe --- plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs index 7336dca1a5..c7569bff72 100644 --- a/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs +++ b/plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs @@ -278,9 +278,8 @@ getDependencyEdit recorder env cabalFilePath buildTarget dependency = do pure edit -- | Given a path to a haskell file, returns the closest cabal file. --- If package.yaml is present in same directory as .cabal file, it returns nothing, because adding a dependency to a generated cabal file --- will break propagation of changes from package.yaml to cabal file in stack project. --- +-- If a package.yaml is present in same directory as the .cabal file, returns nothing, because adding a dependency to a generated cabal file +-- will break propagation of changes from package.yaml to cabal files in stack projects. -- If cabal file wasn't found, gives Nothing. findResponsibleCabalFile :: FilePath -> IO (Maybe FilePath) findResponsibleCabalFile haskellFilePath = do