haskell / haskell/haskell-language-server

Various `Rule Failed`, shown as "Type constructor or class is not in scope (GHC-76037)" — yet the project compiles

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

Description

Hi! Here's a weird issue, as a treat for the connoisseurs 🤌

On a project that's using [TH splices][] of the `persistent` library, I'm *reliably* getting an extra stubborn "typecheck error" which **is not real**:

![Image](https://github.com/user-attachments/assets/30868ef2-312e-4629-901f-c909a384171d)

The names flagged as errors, `RoleID`, `UserId`, are defined in a TH splice, `$(persistFileWith ...)` above in the same module. Full error as text:

> **Not in scope: type constructor or class ‘UserId’ typecheck(GHC-76037)**

I'm saying it is "not real" because:
1. `stack build` **compiles just fine**, GHC itself is happy with the module. Making it hard to believe the displayed error being a genuine typecheck error coming from GHC.
2. Furthermore, `haskell-language-server-wrapper` **succeeds** when I invoke it directly on this module, `Completed (1 file worked, 0 files failed)`.

As a triple-check, I can load this module in this project into Neovim equipped with an LSP client — and the module typechecks just fine as well, no fake `not in scope` errors whatsoever:

![Image](https://github.com/user-attachments/assets/af6688f9-baf2-454a-8c9b-e89b2a4b7786)

Thus as shown, HLS itself seems alright — therefore I'm filing this onto the **VSCode extension**. ⚠

These aren't making much sense to me, but the extension logs a good bunch of `Rule Failed` messages:

![Image](https://github.com/user-attachments/assets/c256d1de-02d8-4fdc-b9eb-784419807f95)

and 3 `Rule Failed` exceptions in devtools console as well:

![Image](https://github.com/user-attachments/assets/d5cf6289-4fd3-413c-a3de-9c37263df695)

At the very least, these `Rule Failed` exceptions **should not be translating** into `GHC-76037` a.k.a. `NotInScope` diagnostics. I hope to be wrong here, but doing so is a big compromise to trustworthiness of the UI. 💀

Then as a secondary matter, the question remains, what's the cause of those exceptions in the first place.

[TH splices]: https://hackage-content.haskell.org/package/persistent-2.15.1.0/docs/Database-Persist-TH.html

### Environment

OS: Ubuntu 24.04.2 LTS.

GHC, Stack, HLS — all from GHCup. I found multiple executables called `haskell-language-server-wrapper` on this system, but also am reasonably certain that the only one that ever gets invoked is the `~/.ghcup/bin/haskell-language-server-wrapper` symlink.

HLS version: just rechecked on `2.10.0.0-p1`. This has also been happening on `2.9.0.1` with exact same symptoms.

GHC version: repro'd on 9.6.6 and today on 9.6.7.

IDE: [VSCodium](https://vscodium.com/) today's latest 1.99.32704.

Extension: `vscode-haskell` 2.6.0.

### Steps to reproduce

*Edit:* Not quite minimal, but an isolated shareable repro case worked out — https://github.com/ulidtko/hls-issue4583-repro

~I only see this issue in one specific project; minimizing a repro case seems a bit daunting. Didn't try yet.~

~Would appreciate further hints on what to try in this direction — perhaps it's an already known issue that I just couldn't find.~

### Workarounds

1. Don't use VSCode 🤷 Works okay in NeoVIM for me.
2. Within VSCode... **none known** so far.

From a few months of observation: the error does occasionally go away — when something, somehow, gets into caches. I couldn't spot what & in which cache exactly. Places I'm wiping clean now for experiment precision:

* `rm -rf ~/.cache/ghcide`, with HLS stopped, of course;
* `git clean -fxd` in the project dir, which blows out the dust in `.stack-work`, `dist-newstyle`, etc.
* the readme mentions that the extension has *its own cache*, in my case that's `~/.config/VSCodium/User/globalStorage/haskell.haskell/` — and on my machine, it's there but always empty.

### Debug logs

`haskell-language-server-wrapper --debug` — done, it produces a whole bunch of information I don't want to review & redact. It ends with **Completed (1 file worked, 0 files failed)** — i.e. there're no typecheck errors.

Re: extension specific log, already shown on the screenshots. There're pages upon pages, among which a lot of `Rule Failed` errors like this one:

Extension log sample:

```
[Trace - 2:25:14 PM] Sending request 'textDocument/semanticTokens/full - (60)'.
2025-05-06T12:25:14.525852Z | Debug | semanticTokens: SemanticTokensConfig_: STC {stFunction = SemanticTokenTypes_Function, stVariable = SemanticTokenTypes_Variable, stDataConstructor = SemanticTokenTypes_EnumMember, stTypeVariable = SemanticTokenTypes_TypeParameter, stClassMethod = SemanticTokenTypes_Method, stPatternSynonym = SemanticTokenTypes_Macro, stTypeConstructor = SemanticTokenTypes_Enum, stClass = SemanticTokenTypes_Class, stTypeSynonym = SemanticTokenTypes_Type, stTypeFamily = SemanticTokenTypes_Interface, stRecordField = SemanticTokenTypes_Property, stModule = SemanticTokenTypes_Namespace, stOperator = SemanticTokenTypes_Operator}
2025-05-06T12:25:14.526202Z | Warning | semanticTokens: SemanticTokens' dependency error: Rule Failed: GetHieAst
2025-05-06T12:25:14.526442Z | Debug | LOOKUP PERSISTENT FOR: GetSemanticTokens
2025-05-06T12:25:14.526628Z | Debug | Finished: SemanticTokens.semanticTokensFull Took: 0.00s
2025-05-06T12:25:14.526788Z | Debug | semanticTokens: Rule Failed: GetSemanticTokens
[Trace - 2:25:14 PM] Received response 'textDocument/semanticTokens/full - (60)' in 5ms. Request failed: semanticTokens: Rule Failed: GetSemanticTokens (-32803).
[Error - 2:25:14 PM] Request textDocument/semanticTokens/full failed.
Message: semanticTokens: Rule Failed: GetSemanticTokens
Code: -32803
[Trace - 2:25:27 PM] Sending request 'textDocument/foldingRange - (61)'.
2025-05-06T12:25:27.492652Z | Debug | Finished: FoldingRange Took: 0.00s
2025-05-06T12:25:27.492763Z | Debug | codeRange: Rule Failed: GetCodeRange
[Trace - 2:25:27 PM] Received response 'textDocument/foldingRange - (61)' in 2ms. Request failed: codeRange: Rule Failed: GetCodeRange (-32803).
[Error - 2:25:27 PM] Request textDocument/foldingRange failed.
Message: codeRange: Rule Failed: GetCodeRange
Code: -32803
2025-05-06T12:25:49.092374Z | Info | Live bytes: 525.30MB Heap size: 2218.79MB
```

Kindly LMK what else to check.

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.