haskell / haskell/haskell-language-server

LSP project root vs hie-bios cradle

Open
#3,043 2 comments 1 reaction 0 assignees View on GitHub
level: easy type: bug
Dominant language
Haskell
Stars
3k
Forks
455
Avg merge
2d 19h
Merged PRs (30d)
11

Description

HLS uses hie-bios to set up a GHC API session appropriate for the project. From hie-bios, hls inherits the `hie.yaml` which is a way to explicitly describe what kind of project we have (e.g. cabal or stack).

In particular hie-bios will use `hie.yaml` to determine the project root directory as described in https://github.com/haskell/hie-bios#explicit-configuration. hie-bios will refer to this directory as the "cradle".

I claim hie-bios cradle detection can get hls confused.

Hopefully reproducible example:
```shell commands
mkdir tmp tmp/a tmp/b
cd tmp
(cd a; cabal init -n -m)
(cd b; cabal init -n -m)
echo 'packages: a b' > cabal.project
echo 'cradle: { cabal: null }' >> hie.yaml
cd a
haskell-language-server-wrapper app/Main.hs
```

this fails with

```
Found "/home/andrea/tmp/hie.yaml" for "/home/andrea/tmp/a/a"
Run entered for haskell-language-server-wrapper(haskell-language-server-wrapper) Version 1.7.0.0 x86_64 ghc-9.2.2
Current directory: /home/andrea/tmp/a
Operating system: linux
Arguments: ["app/Main.hs"]
Cradle directory: /home/andrea/tmp
Cradle type: Cabal

Tool versions found on the $PATH
cabal: 3.8.0.20220526
stack: 2.7.5
ghc: 8.10.7

Consulting the cradle to get project GHC version...
Project GHC version: 8.10.7
haskell-language-server exe candidates: ["haskell-language-server-8.10.7","haskell-language-server"]
Launching haskell-language-server exe at:/home/andrea/.ghcup/bin/haskell-language-server-8.10.7
2022-07-15T14:02:42.893354Z | Info | No log file specified; using stderr.
2022-07-15T14:02:42.893709Z | Info | haskell-language-server version: 1.7.0.0 (GHC: 8.10.7) (PATH: /home/andrea/.ghcup/hls/1.7.0.0/lib/haskell-language-server-1.7.0.0/bin/haskell-language-server-8.10.7)
2022-07-15T14:02:42.893992Z | Info | Directory: /home/andrea/tmp
2022-07-15T14:02:42.894096Z | Info | Logging heap statistics every 60.00s
ghcide setup tester in /home/andrea/tmp.
Report bugs at https://github.com/haskell/haskell-language-server/issues

Step 1/4: Finding files to test in /home/andrea/tmp
haskell-language-server-8.10.7: app/Main.hs: getDirectoryContents:openDirStream: does not exist (No such file or directory)
```

My reading is that the `hie.yaml` is what determines the crade directory but hls assumes that is the current directory, which is false.

Another symptom of the confusion appears using neovim and lsp-config: after opening `nvim app/Main.hs` from the `tmp/a` directory; `LspInfo` informs me the root is `tmp/a` (as determined by the client, neovim) but the cache gets created in `~/.cache/hie-bios/dist-tmp-...`.

ring @michaelpj

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.