# Haskell Language Server 2.15.0.0 is now available

**URL:** <https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638>\
**Category:** Announcements\
**Created:** [September 3, 2026, 10:42am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638 "2026-09-03T10:42:11Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![fendor](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/fendor/32/376_2.png) [@fendor](https://discourse.haskell.org/u/fendor)\
**Post date:** [September 3, 2026, 10:42am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/1 "2026-09-03T10:42:11Z")

</div>

The HLS team is excited to announce the release 2.15.0.0 of the Haskell Language Server.

Binaries for this release are available at  
[Index of /~hls/haskell-language-server-2.15.0.0/](https://downloads.haskell.org/~hls/haskell-language-server-2.15.0.0/).

These binaries can be installed using [GHCup](https://www.haskell.org/ghcup/), using the vanilla metadata channel.

**WARNING** : Only use this if you also installed GHC via the vanilla channel.

```haskell
ghcup --url-source=https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-vanilla-0.1.0.yaml install hls 2.15.0.0

```

All of these tarballs have associated GPG signatures. The signature should be from `Hannes Siebenhandl <hannes.siebenhandl@posteo.net>` (key ID [9849506453CA97E75F505D054EF829564CA34FC8](https://keys.openpgp.org/search?q=9849506453CA97E75F505D054EF829564CA34FC8)).

The prebuilt binaries in this release support the following GHC versions:

- GHC 9.14.1
- GHC 9.12.4
- GHC 9.12.2
- GHC 9.10.3
- GHC 9.8.4
- GHC 9.6.7

## 2.15.0.0

This release brings some much-needed performance improvements to the startup time in large projects and fixes issues with multiple home unit support.

In this release, we are excited to introduce two brand new plugins:

- `hls-case-split-plugin` (only on GHC 9.14.1) which allows you to case split on constructors in `case` and `\case` expressions.
  - See [Google Summer of Code 2026 Wrap-up | The Haskell Programming Language's blog](https://blog.haskell.org/gsoc-2026/#case-split-plugin-for-haskell-language-server)

- `hls-export-plugin` which allows you to add a symbol to the export list of a module via a code action.

Last but not least, this release adds support for [whole project loading](https://haskell-language-server.readthedocs.io/en/2.15.0.0/configuration.html#language-specific-server-options) which you can opt into by setting the option `haskell.componentLoading: "multi: whole-project"`.  
This allows you to load the whole Haskell project into your editor at once.  
The option `haskell.sessionLoading` is deprecated but HLS 2.15.0.0 honours it regardless. If both `haskell.componentLoading` and `haskell.sessionLoading` are set, then the former is preferred.

An in-depth summary of these changes will be posted to [https://blog.haskell.org/](https://blog.haskell.org/) soon.

### Changes

- Remove `hls-retrie-plugin`
- Add `hls-case-split-plugin` for GHC 9.14 only
- Add `hls-export-plugin`
- Enable `hls-semantic-tokens-plugin` by default
- Prefer multi-component loading by default
- Replace the `sessionLoading` config with `componentsLoading`
- Support for Ormolu and Fourmolu on GHC 9.14
- Improvements to ghcide
  - Point documentation and source links at Hackage
  - Stop unloading all bytecode whenever new bytecode is generated
  - Unload linkables when any transitive dependency changes

- Improvements to `hls-rename-plugin`
  - Improved limited cross-module renaming

- Improvements to `hls-refactor-plugin`
  - Code action to delete all unused bindings, including `let` bindings

- Improvements to `hls-eval-plugin`
  - Capture `stdout` and `stderr` from evaluated expressions

- Improvements to `hls-splice-plugin`
  - Support declaration splices

- Optimizations
  - Speed up dependency graph building
  - Load core files on demand and improve freshness checking

- Bug fixes
  - Correct code action edits across several plugins
  - Match GHC when resolving imports and boot files
  - Avoid serving stale completions, documentation and diagnostics

See the [plugin support table](https://haskell-language-server.readthedocs.io/en/2.15.0.0/support/plugin-support.html) and [GHC version support table](https://haskell-language-server.readthedocs.io/en/2.15.0.0/support/ghc-version-support.html) for an overview of supported GHC versions and plugins.

Full Changelog is available on GitHub: [Release 2.15.0.0 · haskell/haskell-language-server · GitHub](https://github.com/haskell/haskell-language-server/releases/tag/2.15.0.0)

We thank @crtschin for effortlessly managing this release!

---

<div class="post-metadata">

**Author:** ![jaror](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/jaror/32/3271_2.png) [@jaror](https://discourse.haskell.org/u/jaror)\
**Post date:** [September 3, 2026, 10:55am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/2 "2026-09-03T10:55:52Z")

</div>

That’s a very fast turnaround on the case splitting plugin!

---

<div class="post-metadata">

**Author:** ![L0neGamer](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/l0negamer/32/4536_2.png) [@L0neGamer](https://discourse.haskell.org/u/L0neGamer)\
**Post date:** [September 3, 2026, 11:03am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/3 "2026-09-03T11:03:50Z")

</div>

Out of curiosity, what’s there a reason the case splitting isn’t available for previous GHC versions?

---

<div class="post-metadata">

**Author:** ![fendor](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/fendor/32/376_2.png) [@fendor](https://discourse.haskell.org/u/fendor)\
**Post date:** [September 3, 2026, 11:14am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/4 "2026-09-03T11:14:36Z")

</div>

The GHC AST exactprint annotations change for each major version in some ways.  
This can cause considerable churn and make it hard to work on older GHC versions.

We wanted this plugin to be rock-solid first, with maintainability as the primary goal and an exhaustive test suite, and then expand support for other GHC versions.  
Otherwise, the GSoC project might not have successful as you need to do exactprint annotation fine tuning for each GHC version.  
We hope, that updating the plugin for new GHC versions is going to be easier/possible.

However, this is not to say that a motivated contributor couldn’t try to add support for GHC 9.12 or 9.10, for example at [MuniHac 2026](https://munihac.de/2026.html) 😉

---

<div class="post-metadata">

**Author:** ![enlico](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/enlico/32/5600_2.png) [@enlico](https://discourse.haskell.org/u/enlico)\
**Post date:** [September 3, 2026, 12:12pm UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/5 "2026-09-03T12:12:20Z")

</div>

What @fendor said is true, but I’ll add a couple of details:

- I’m pretty sure I’ve tried running the tests I’ve written for the plugin with `-w ghc-9.12.2`, and something fails precisely because of changes in the exactprint annotations; I don’t remember what exactly, but I’ve just launched a build&test, and I’ll update this message if any understandable “look at how it would be comeplicated” comes up;
  - well, it didn’t even get as far as compiling successfully:

```haskell
[1 of 1] Compiling Ide.Plugin.CaseSplit ( plugins/hls-case-split-plugin/src/Ide/Plugin/CaseSplit.hs, dist-newstyle/build/x86_64-linux/ghc-9.12.2/haskell-language-server-2.14.0.0/l/hls-case-split-plugin/build/hls-case-split-plugin/Ide/Plugin/CaseSplit.o, dist-newstyle/build/x86_64-linux/ghc-9.12.2/haskell-language-server-2.14.0.0/l/hls-case-split-plugin/build/hls-case-split-plugin/Ide/Plugin/CaseSplit.dyn_o )
plugins/hls-case-split-plugin/src/Ide/Plugin/CaseSplit.hs:104:57: error: [GHC-61689]
    Module ‘Development.IDE.GHC.Compat’ does not export ‘HoleKind’.
    |
104 | HoleKind (HoleVar),
    | ^^^^^^^^^^^^^^^^^^

plugins/hls-case-split-plugin/src/Ide/Plugin/CaseSplit.hs:147:57: error: [GHC-61689]
    Module ‘GHC.Hs’ does not export ‘unnamedHoleRdrName’.
    |
147 | unnamedHoleRdrName)
    | ^^^^^^^^^^^^^^^^^^

plugins/hls-case-split-plugin/src/Ide/Plugin/CaseSplit.hs:185:57: error: [GHC-10237]
    In the import of ‘Language.Haskell.Syntax.Expr’:
      an item called ‘HsExpr’ is exported, but it does not export any children
      (constructors, class methods or field names) called ‘HsHole’.
    |
185 | HsExpr (HsCase, HsHole, HsLam),
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

```

- furthermore, during the second half (in chronologial sense) of the project, I discovered a bug in ghc-exactprint, as you can see from [this message](https://matrix.to/#/!caZLxGrrbiQktNWBbz:matrix.org/$Ddw5G2luaeXycsi7-hLS9OHOyw0Xoaa3pdGqZ_74Glk?via=matrix.org&via=kf8nh.com&via=beeper.com) and following ones from @alanz , who fixed the bug [here](https://github.com/alanz/ghc-exactprint/commit/aedfb90a77f091edc4166788439a2c59b9039322); that bug hasn’t been backported, so I have a dependency on a recent enough `ghc-exactprint`, which in turn means `ghc-9.14` or later.

That’s to say that making the plugin work for earlier GHC versions, means

1. backporting [that solution](https://github.com/alanz/ghc-exactprint/commit/aedfb90a77f091edc4166788439a2c59b9039322) to one-or-more earlier versions of `ghc-exactprint` (the fix is a 1-word fix, but I don’t know what impacts it has),
2. changing possibly quite a bit of core logic of the plugin to handle older EP annotations, both in compile-time terms (see compilation errors above), and in run-time terms (what I’ve alluded to above, but I can’t show any example if I don’t fix the compilation errors first, ahah).

---

<div class="post-metadata">

**Author:** ![george.fst](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/george.fst/32/4933_2.png) [@george.fst](https://discourse.haskell.org/u/george.fst)\
**Post date:** [September 3, 2026, 5:16pm UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/6 "2026-09-03T17:16:21Z")

</div>

_Lot_ of great stuff here!

I’ve been trying out the new multi-component-loading stuff (`"haskell.componentsLoading": "multi: whole-project"` in VSCode) for a few weeks and it seems rock-solid already. Looking forward to that becoming the default.

And I’d been waiting years for case splitting to make a comeback. Now I don’t need to be so defensive about Haskell editor tooling around Rust and Agda people. It does seem a bit odd that we’re using unicode arrows, even with `-XNoUnicodeSyntax`? But I’m sure stuff like this will get ironed out.

Also, HLS Ormolu/Fourmolu support was the last thing stopping me from bumping most of my projects to GHC 9.14, so it’s nice to see that finally land.

Finally, I think “Improvements to hls-splice-plugin” is quite an understatement. Isn’t this the first release in years to include the plugin at all?

---

<div class="post-metadata">

**Author:** ![crtschin](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/crtschin/32/5571_2.png) [@crtschin](https://discourse.haskell.org/u/crtschin)\
**Post date:** [September 3, 2026, 8:58pm UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/7 "2026-09-03T20:58:33Z")

</div>

> [@george.fst](#):
>
> Finally, I think “Improvements to hls-splice-plugin” is quite an understatement. Isn’t this the first release in years to include the plugin at all?

Definitely an understatement, very good work on this in [#4915](https://github.com/haskell/haskell-language-server/pull/4915)! I may have been a bit too summary when making the summary 😅

---

<div class="post-metadata">

**Author:** ![george.fst](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/george.fst/32/4933_2.png) [@george.fst](https://discourse.haskell.org/u/george.fst)\
**Post date:** [September 3, 2026, 9:14pm UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/8 "2026-09-03T21:14:20Z")

</div>

Ha, thanks. I didn’t mean to sound like I was fishing for praise!

Anyway, hopefully the plugin being back and mostly working encourages someone to pick up the work I started on [qualifying names](https://github.com/haskell/haskell-language-server/pull/4925). Then we can have dumped splices that always actually compile. I’ve lost my main motivation for this stuff personally, due to the end of a particular work project. And TH internals and the `ghc-exactprint` API are not exactly things I’m an expert on.

---

<div class="post-metadata">

**Author:** ![fendor](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/fendor/32/376_2.png) [@fendor](https://discourse.haskell.org/u/fendor)\
**Post date:** [September 4, 2026, 7:21am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/9 "2026-09-04T07:21:04Z")

</div>

> [@george.fst](#):
>
> It does seem a bit odd that we’re using unicode arrows, even with `-XNoUnicodeSyntax`? But I’m sure stuff like this will get ironed out.

Unicode arrows should only be used if the `UnicodeSyntax` extension is given, the tests definitely don’t use unicode arrows everywhere 🤔

EDIT, I see, there is [File local `{-# LANGUAGE NoUnicodeSyntax #-}` is mistakenly ignored by case-split plugin if the owning stanza in the .cabal file has `default-extensions: UnicodeSyntax` · Issue #5067 · haskell/haskell-language-server · GitHub](https://github.com/haskell/haskell-language-server/issues/5067)

---

<div class="post-metadata">

**Author:** ![dawkrish](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/dawkrish/32/4746_2.png) [@dawkrish](https://discourse.haskell.org/u/dawkrish)\
**Post date:** [September 4, 2026, 11:23pm UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/10 "2026-09-04T23:23:29Z")

</div>

Will this nor support the upcoming GHC 9.14.2? Which was supposed to be released on 13th Aug ?

---

<div class="post-metadata">

**Author:** ![fendor](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/fendor/32/376_2.png) [@fendor](https://discourse.haskell.org/u/fendor)\
**Post date:** [September 5, 2026, 7:28am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/11 "2026-09-05T07:28:53Z")

</div>

I don’t know, the code base wasn’t tested with GHC 9.14.2 rcs to the best of my knowledge.  
If the codebase compiles and tests are green, then yes, we might add binaries for 9.14.2 via ghcup revisions.

However, we can only say for certain once 9.14.2 is released.

---

<div class="post-metadata">

**Author:** ![dawkrish](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/dawkrish/32/4746_2.png) [@dawkrish](https://discourse.haskell.org/u/dawkrish)\
**Post date:** [September 6, 2026, 4:08am UTC](https://discourse.haskell.org/t/haskell-language-server-2-15-0-0-is-now-available/14638/12 "2026-09-06T04:08:57Z")

</div>

Okayy; I want to test the bug fix of Broken Documentation Links in VScode/Emacs which add a cryptic 4 letter hex code in urls
