haskell / haskell/haskell-language-server

Multiple Components HLS doesn't recompile on *.cabal change

Open
#4,236 4 comments 3 reactions 0 assignees View on GitHub
build tool: cabal multi-component status: needs info type: bug
Dominant language
Haskell
Stars
3k
Forks
455
Avg merge
2d 19h
Merged PRs (30d)
11

Description

### Summary

When Multiple Component Support enabled, HLS won't update the state even when any `*.cabal` file update.

### Your environment

Which OS do you use? macOS

Which version of GHC do you use and how did you install it? GHC 9.4.8

How is your project built (alternative: link to the project)? Cabal 3.11.0.0 prerelease (installed by `ghcup --no-cache install cabal -u 'https://gitlab.haskell.org/haskell/cabal/-/jobs/1848320/artifacts/raw/out/cabal-install-3.11.0.0-x86_64-linux-alpine3_12.tar.xz' 3.12.0.0-prerelease
`)

Which LSP client (editor/plugin) do you use? VSCode

Which version of HLS do you use and how did you install it? HLS 2.8.0.0, installed via ghcup

Have you configured HLS in any way (especially: a `hie.yaml` file)? No `hie.yaml`

### Steps to reproduce

1. Install cabal 3.12.0.0 prerelease. For example:

```bash
ghcup --no-cache install cabal -u 'https://gitlab.haskell.org/haskell/cabal/-/jobs/1848320/artifacts/raw/out/cabal-install-3.11.0.0-x86_64-linux-alpine3_12.tar.xz' 3.12.0.0-prerelease --no-set
```

3. Clone `konn/hls-cabal-monorepo-multihome-recomp-repro`

```bash
git clone https://github.com/konn/hls-cabal-monorepo-multihome-recomp-repro.git
```

4. Make sure LSP client uses HLS 2.8 and Cabal 3.11.0.0. You don't have to any configuration if you are using VSCode, as it contains the necessary configuration file.
5. Open `package-a/src/MyLibA.hs` and `package-b/src/MyLibB.hs` and wait for HLS to warmup.
6. After HLS has been successfully launched, add `package-a` as the `build-depends` of `package-b`, remove `someFunc` from `MyLibB.hs` and import `MyLibA` instead.

```diff
diff --git a/package-b/package-b.cabal b/package-b/package-b.cabal
index e74338b..b23761d 100644
--- a/package-b/package-b.cabal
+++ b/package-b/package-b.cabal
@@ -13,5 +13,8 @@ extra-doc-files: CHANGELOG.md
library
ghc-options: -Wall
exposed-modules: MyLibB
- build-depends: base
+ build-depends:
+ base,
+ package-a,
+
hs-source-dirs: src
diff --git a/package-b/src/MyLibB.hs b/package-b/src/MyLibB.hs
index febc71a..936e822 100644
--- a/package-b/src/MyLibB.hs
+++ b/package-b/src/MyLibB.hs
@@ -1,4 +1,3 @@
module MyLibB (someFunc) where

-someFunc :: IO ()
-someFunc = putStrLn "someFunc"
+import MyLibA
```

### Expected behaviour

HLS should reconfigure package-b so that `MyLibA` can be imported in `MyLibB` without any hassle.

### Actual behaviour

HLS seems to make no recompilation/state update, and complaining `MyLibA` not found.

```
Could not find module ‘MyLibA’
It is not a module in the current program, or in any known package
```

#### Side note

- In this case, we added a local package. The same bug occurs if one adds some other (boot or external) packages.
- If one changes `sessionLoading` to `singleComponent`, then HLS updates/recompiles when `*.cabal` changes.

### Debug information

[lop.log](https://github.com/haskell/haskell-language-server/files/15344494/lop.log)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.