Skip to content

Fix hls-graph: phantom dependencies invoke in branching deps (resolve #3423) #4087

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 42 commits into from
Mar 16, 2024

Conversation

soulomoon
Copy link
Collaborator

@soulomoon soulomoon commented Feb 20, 2024

phantom depencies is invoke becase dependencies have preconditions in rules, see #3423. This pr is intend to fix that.
This might also fix some of the flaky tests.

Introduction a new ResultDepsTree to ResultDeps which contains a treelike minimap of dependencies for a key.
It provides the branching semantic when we reflesh a key. Key in depsTreeNodeCond is responsible for computing the branching condition. It equipped a continuation depsTreeContinuation, to decided what dependencies are needed after that.
Pros: we have correct semantic for the rules with branching dependencies.
cons:It requires us to manually annotate the rule by providing the ResultDepsTree.<\del>

In favor of @wz1000 appoach of running deps linearly.
It modify the deps result from KeySet to [KeySet] to make sure the result is sorted

we initialy thought it would have performance impact on the build system. But it turns out instead of performance lost, we actaully have performance gain since it avoid building the phantom depencies.

Overall things have been done:

  1. Fix up hls-graph phantom depencies issue by reflesh linear deps in a linear manner.
  2. Fix the bench for macos and added semantic tokens bench mark.
  3. add test to hls-graph to ensure phantom depencies would not be invoke.

Result:
Now no more phantom dependencies would be invoked in hls-graph, gaining correctness, less runtime and less mem usage at the some time.

@soulomoon
Copy link
Collaborator Author

First bench mark

| version  | configuration | name                           | success | samples | startup | setup | userT  | delayedT | 1stBuildT | avgPerRespT | totalT | rulesBuilt | rulesChanged | rulesVisited | rulesTotal | ruleEdges | ghcRebuilds | maxResidency | allocatedBytes |
| -------- | ------------- | ------------------------------ | ------- | ------- | ------- | ----- | ------ | -------- | --------- | ----------- | ------ | ---------- | ------------ | ------------ | ---------- | --------- | ----------- | ------------ | -------------- |
| upstream | All           | edit-header                    | True    | 50      | 2.00    | 0.00  | 30.51  | 0.05     | 2.84      | 0.28        | 30.57  | 14         | 12           | 1363         | 5910       | 31261     | 51          | 290MB        | 136737MB       |
| HEAD     | All           | edit-header                    | True    | 50      | 1.97    | 0.00  | 36.75  | 0.07     | 2.81      | 0.35        | 36.82  | 17         | 14           | 1367         | 5910       | 31261     | 51          | 298MB        | 160490MB       |
| upstream | All           | edit                           | True    | 50      | 2.39    | 0.00  | 30.74  | 0.03     | 2.82      | 0.28        | 30.77  | 14         | 12           | 1363         | 5909       | 31255     | 51          | 296MB        | 134882MB       |
| HEAD     | All           | edit                           | True    | 50      | 2.04    | 0.00  | 35.39  | 0.02     | 2.81      | 0.33        | 35.42  | 17         | 14           | 1367         | 5910       | 31261     | 51          | 297MB        | 156089MB       |
| upstream | All           | hover                          | True    | 50      | 2.02    | 0.00  | 2.85   | 0.01     | 2.81      | 0.00        | 2.86   | 5094       | 5093         | 5094         | 5912       | 31267     | 2           | 164MB        | 15418MB        |
| HEAD     | All           | hover                          | True    | 50      | 1.85    | 0.00  | 2.82   | 0.01     | 2.78      | 0.00        | 2.83   | 5126       | 5125         | 5126         | 5912       | 31267     | 2           | 127MB        | 15332MB        |
| upstream | All           | semanticTokens                 | True    | 50      | 1.97    | 0.00  | 66.98  | 1.28     | 3.65      | 0.65        | 68.27  | 12         | 10           | 1364         | 5914       | 31271     | 52          | 298MB        | 289880MB       |
| HEAD     | All           | semanticTokens                 | True    | 50      | 1.94    | 0.00  | 67.98  | 1.11     | 3.43      | 0.66        | 69.10  | 12         | 10           | 1364         | 5914       | 31271     | 52          | 300MB        | 301805MB       |
| upstream | All           | hover after edit               | True    | 50      | 1.92    | 0.00  | 3.08   | 30.96    | 2.94      | 0.00        | 34.04  | 21         | 18           | 1371         | 5912       | 31267     | 51          | 305MB        | 146999MB       |
| HEAD     | All           | hover after edit               | True    | 50      | 2.01    | 0.00  | 3.06   | 34.95    | 2.93      | 0.00        | 38.01  | 21         | 18           | 1371         | 5912       | 31267     | 51          | 308MB        | 162980MB       |
| upstream | All           | getDefinition                  | False   | 50      | 1.99    | 0.00  | 0.00   | 0.00     | 0.00      | 0.00        | 2.87   | 5125       | 5124         | 5125         | 5907       | 31262     | 2           | 158MB        | 15198MB        |
| HEAD     | All           | getDefinition                  | False   | 50      | 1.95    | 0.00  | 0.00   | 0.00     | 0.00      | 0.00        | 2.68   | 5122       | 5121         | 5122         | 5907       | 31262     | 2           | 189MB        | 15108MB        |
| upstream | All           | getDefinition after edit       | False   | 50      | 2.17    | 0.00  | 0.00   | 0.00     | 0.00      | 0.00        | 3.30   | 5127       | 5125         | 5127         | 5907       | 31262     | 2           | 134MB        | 15222MB        |
| HEAD     | All           | getDefinition after edit       | False   | 50      | 1.87    | 0.00  | 0.00   | 0.00     | 0.00      | 0.00        | 2.87   | 5128       | 5126         | 5128         | 5907       | 31262     | 2           | 164MB        | 15264MB        |
| upstream | All           | completions                    | True    | 50      | 1.98    | 0.00  | 5.01   | 0.01     | 3.00      | 0.02        | 5.03   | 5124       | 5123         | 5124         | 5914       | 31265     | 2           | 244MB        | 20874MB        |
| HEAD     | All           | completions                    | True    | 50      | 1.92    | 0.00  | 4.81   | 0.01     | 3.06      | 0.02        | 4.82   | 5124       | 5123         | 5124         | 5914       | 31265     | 2           | 221MB        | 20876MB        |
| upstream | All           | completions after edit         | True    | 50      | 1.98    | 0.00  | 12.07  | 22.16    | 3.16      | 0.09        | 34.24  | 23         | 20           | 1373         | 5914       | 31265     | 51          | 314MB        | 146901MB       |
| HEAD     | All           | completions after edit         | True    | 50      | 1.90    | 0.00  | 12.24  | 25.71    | 3.16      | 0.09        | 37.96  | 23         | 20           | 1373         | 5914       | 31265     | 51          | 324MB        | 164263MB       |
| upstream | All           | code actions                   | True    | 50      | 1.98    | 0.00  | 4.62   | 0.02     | 3.07      | 0.02        | 4.65   | 5184       | 5183         | 5184         | 5965       | 31638     | 2           | 213MB        | 23574MB        |
| HEAD     | All           | code actions                   | True    | 50      | 1.89    | 0.00  | 4.37   | 0.02     | 2.72      | 0.02        | 4.40   | 5176       | 5175         | 5176         | 5965       | 31638     | 2           | 209MB        | 23598MB        |
| upstream | All           | code actions after edit        | True    | 50      | 1.97    | 0.00  | 33.59  | 0.02     | 3.10      | 0.31        | 33.62  | 19         | 17           | 1370         | 5965       | 31638     | 51          | 290MB        | 144401MB       |
| HEAD     | All           | code actions after edit        | True    | 50      | 2.00    | 0.00  | 38.98  | 0.03     | 3.01      | 0.37        | 39.02  | 18         | 16           | 1369         | 5965       | 31638     | 51          | 317MB        | 164821MB       |
| upstream | All           | code actions after cradle edit | True    | 50      | 2.13    | 0.00  | 210.18 | 0.08     | 5.25      | 2.09        | 210.27 | 1299       | 803          | 2538         | 5965       | 31393     | 100         | 506MB        | 368322MB       |
| HEAD     | All           | code actions after cradle edit | True    | 50      | 1.86    | 0.00  | 159.57 | 0.17     | 4.52      | 1.58        | 159.74 | 1299       | 803          | 2538         | 5965       | 31393     | 100         | 505MB        | 308065MB       |
| upstream | All           | documentSymbols after edit     | True    | 50      | 1.97    | 0.00  | 5.73   | 3.37     | 3.00      | 0.06        | 9.10   | 14         | 11           | 1362         | 5905       | 31249     | 3           | 233MB        | 44703MB        |
| HEAD     | All           | documentSymbols after edit     | True    | 50      | 1.87    | 0.00  | 6.00   | 2.88     | 2.78      | 0.06        | 8.89   | 13         | 11           | 1360         | 5905       | 31249     | 2           | 248MB        | 44301MB        |
| upstream | All           | hole fit suggestions           | True    | 50      | 1.99    | 0.00  | 39.23  | 0.03     | 2.95      | 0.37        | 39.27  | 19         | 16           | 1369         | 5910       | 31261     | 51          | 325MB        | 162837MB       |
| HEAD     | All           | hole fit suggestions           | True    | 50      | 2.08    | 0.00  | 41.86  | 0.02     | 3.29      | 0.39        | 41.88  | 19         | 16           | 1369         | 5910       | 31261     | 51          | 327MB        | 186180MB       |
|          |               |                                |         |         |         |       |        |          |           |             |        |            |              |              |            |           |             |              |                |

@soulomoon
Copy link
Collaborator Author

soulomoon commented Feb 20, 2024

The result is generally better with large rule changes cases.
But worse for no change rule visited.

Since we are waiting for the conditional rule to yield a result when refreshing the dependency. No change visit would have a degeneration.

But with rule change, the unneeded rule won't run, thus cancel out the performance degeneration.

Would love to hear you guys opinion on this @pepeiborra @wz1000

@soulomoon
Copy link
Collaborator Author

Otherthing still quit a mess, the importance commit at 8a08863

@soulomoon
Copy link
Collaborator Author

Some good news, I have observed less failure in this branch than the master branch.

@wz1000
Copy link
Collaborator

wz1000 commented Feb 21, 2024

I don't think we need to complicate the API by introducing side conditions - we just need to try evaluating dependencies in order. This means instead of maintaining a KeySet of dependencies, we need to maintain something like a [KeySet]. When building a rule, we pop the first element of the [KeySet], and try building it in parallel - if that succeeds we proceed with the other elements, but if those fail we give up on rebuilding previous dependencies and kick off a fresh build.

@soulomoon
Copy link
Collaborator Author

soulomoon commented Feb 21, 2024

I don't think we need to complicate the API by introducing side conditions - we just need to try evaluating dependencies in order. This means instead of maintaining a KeySet of dependencies, we need to maintain something like a [KeySet]. When building a rule, we pop the first element of the [KeySet], and try building it in parallel - if that succeeds we proceed with the other elements, but if those fail we give up on rebuilding previous dependencies and kick off a fresh build.

On the above description, it is not clear to me how evaluating dependencies in order can avoid some unwanted Key(branch out) in the latter key set? We need to know which key we are branching on and kick a fresh rebuild on branch condition changed. We still need some explicit annotation?

@wz1000
Copy link
Collaborator

wz1000 commented Feb 21, 2024

rules can be evaluated in 2 modes - if the rule was previously run, then we build all of its dependencies from the previous run and then run (or skip) the rule according to its recomputation flags (is it always rerun etc..).

If the rule was not previously run, then we build it without building its previous dependencies (we don't have any!). The rule might request some dependencies to be built, and we build those on demand by suspending the evaluation of the current rule when this happens.

I'm proposing in case 1 (the rule was previously run), instead of building all dependencies immediately in parallel, we build them in order, and if any of them change, we skip building the subsequent dependencies and just build the rule itself, as in the second case.

@wz1000
Copy link
Collaborator

wz1000 commented Feb 21, 2024

Crucially, if an earlier dependency changes, we skip speculatively building later dependencies. This prevents us from getting into conditions where rules are built when their preconditions are not met because those preconditions should be captured by a change in an earlier dependency.

@soulomoon
Copy link
Collaborator Author

Oh i see how it goes, it would means kicking up deps linearly. It does solve the problem in a more direct way, but I am a bit worried on the performance impact on this linearity.

@wz1000
Copy link
Collaborator

wz1000 commented Feb 21, 2024

For a concrete example, consider the GetLinkable rule, which should only be executed when the NeedsCompilation rule returns a Just value. I think the bug is that in certain cases, initially NeedsCompilation returns a Just value, but then it changes to return Nothing. However, when we evaluate a rule for the second time, we see that it depended on NeedsCompilation and GetLinkable the first time, so we try to build both before proceeding with the rule. This is wrong! If NeedsCompilation changed, we do not want to build GetLinkable! That is the behaviour we need.

@wz1000
Copy link
Collaborator

wz1000 commented Feb 21, 2024

but I am a bit worried on the performance impact on this linearity.

Yes that was the concern, but we could still build all rules depended on simultaneously using the uses family of functions as well as the applicative combinators (<*>) in parallel. It's just that all the parallelism would have to be explicit in the rule definition.

If the performance impact is still too great, we could try doing "true" speculative builds, where we ignore errors and diagnostics from speculative builds of dependencies.

@soulomoon
Copy link
Collaborator Author

Let try a linear approach and do some benchmark to see how much we lost.

But I doubt the speculative builds would be better than annotating the dependencies with an explicit branching dependency tree.

@wz1000
Copy link
Collaborator

wz1000 commented Feb 21, 2024

I guess we could also just throw exceptions when preconditions are violated, and have these exceptions be caught and ignored by hls-graph.

Instead of

error $ "called GetLinkable for a file without a linkable: " ++ show f
throwIO $ PreconditionViolated $ "called GetLinkable for a file without a linkable: " ++ show f

@soulomoon
Copy link
Collaborator Author

soulomoon commented Feb 21, 2024

I guess we could also just throw exceptions when preconditions are violated, and have these exceptions be caught and ignored by hls-graph.

Instead of

error $ "called GetLinkable for a file without a linkable: " ++ show f
throwIO $ PreconditionViolated $ "called GetLinkable for a file without a linkable: " ++ show f

This is indeed a good add on, and we can benefit from it also collecting the precondition violation statitstic in bench.
But overall all I believe it is long term beneficial for us to improve hls-graph to a point that such violation can be avoided as much as possible when defining a rule but without sabotage the performance too much.

@soulomoon
Copy link
Collaborator Author

soulomoon commented Feb 21, 2024

Yes that was the concern, but we could still build all rules depended on simultaneously using the uses family of functions as well as the applicative combinators (<*>) in parallel. It's just that all the parallelism would have to be explicit in the rule definition.

It sounds good.

linear deps in https://github.com/soulomoon/haskell-language-server/tree/linearity-deps.
I am running some bench to see how it goes.

@soulomoon
Copy link
Collaborator Author

Also, I have added a test case to prevent phantom dependencies from occuring again in hls-graph.

@soulomoon soulomoon changed the title Fix hls-graph: phantom depencies invoke in branching deps Fix hls-graph: phantom depencies invoke in branching deps (resolve #3423) Feb 23, 2024
@jhrcek
Copy link
Collaborator

jhrcek commented Feb 23, 2024

These eval plugin tests https://github.com/haskell/haskell-language-server/actions/runs/8018144432/job/21903462404?pr=4087 usually fail due to the GetLinkable rule failure, so not sure how much this improves the issue.
I'll go over this PR tomorrow and try to see how much it improves the failure rate:

@soulomoon
Copy link
Collaborator Author

soulomoon commented Feb 23, 2024

In the end I got the (improved) error after 180 iterations of running that test. But it seems to occur less frequently now. "message": "called GetLinkable for a file without a linkable: NormalizedFilePath "/tmp/extra-dir-10246150986263/TI_Info.hs"\nCallStack (from HasCallStack):\n error, called at src/Development/IDE/Core/Rules.hs:1120:18 in ghcide-2.6.0.0-inplace:Development.IDE.Core.Rules"

I guess we can also try to see if this error still happened ? @jhrcek

@@ -23,8 +23,10 @@ examples:
package: Cabal
version: 3.6.3.0
modules:
- src/Distribution/Simple.hs
- src/Distribution/Types/Module.hs
# - src/Distribution/Simple.hs
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this commented out code?
Do we need to keep it? Does something break when you uncomment it?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two are small files, the other two are large files. Just conveniently choosing between them.

isDirty me = any (\(_,dep) -> resultBuilt me < resultChanged dep)

-- | Refresh dependencies for a key and compute the key:
-- The deps refresh is kicking up linearly. If any of the deps are dirty in the process,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please explain what does kicking mean in this context?
Also it's not clear to me what you mean by linearly. You're referring to linear order of something, but what's not clear to me is: linear order "of what"?

Copy link
Collaborator Author

@soulomoon soulomoon Feb 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we used to try to kick all the deps concurrently and collect all the results. The linearly means one following another. Following the deps order in the action when it last ran

Copy link
Collaborator Author

@soulomoon soulomoon Feb 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kicking means firing up the refresh of the dependency, if we have clean cache, it might be just a look up.

soulomoon and others added 2 commits February 24, 2024 16:36
Co-authored-by: Jan Hrcek <[email protected]>
Co-authored-by: Jan Hrcek <[email protected]>
@soulomoon soulomoon changed the title Fix hls-graph: phantom depencies invoke in branching deps (resolve #3423) Fix hls-graph: phantom dependencies invoke in branching deps (resolve #3423) Feb 24, 2024
@@ -144,17 +144,17 @@ data Result = Result {
resultData :: !BS.ByteString
}

data ResultDeps = UnknownDeps | AlwaysRerunDeps !KeySet | ResultDeps !KeySet
data ResultDeps = UnknownDeps | AlwaysRerunDeps ![KeySet] | ResultDeps ![KeySet]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make it clear that these are stored in reverse order

Copy link
Collaborator Author

@soulomoon soulomoon Feb 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I added a comment about this invariant.
and it also occurred to me that AlwaysRerunDeps should be recovered to KeySet, since it would be one way down to AlwaysRerunDeps on <>, and only ResultDeps need to maintain this invariant.

Copy link
Collaborator

@wz1000 wz1000 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to test this out locally before we merge, as there are a lot of tricky properties we need to maintain.

I'll try to do this in the next couple of days,

@soulomoon
Copy link
Collaborator Author

I would like to test this out locally before we merge, as there are a lot of tricky properties we need to maintain.

I'll try to do this in the next couple of days,

thanx, take your time.

@soulomoon
Copy link
Collaborator Author

@wz1000 Is there still some test you want to do locally ? If not, I am considering resolve the conflict and merge this week.

@soulomoon soulomoon merged commit 82148dc into haskell:master Mar 16, 2024
39 checks passed
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Jan 31, 2025
## 2.9.0.0

- Bindists for GHC 9.10.1 by @wz1000, @jhrcek, @michaelpj
- More hls-graph reliability improvements by @soulomoon
- Refactoring of test suite runners by @soulomoon
- Fixes in multiple home units support by @wz1000

### Pull Requests

- Fix quadratic memory usage in GetLocatedImports
  ([#4318](haskell/haskell-language-server#4318)) by @mpickering
- Bump stack configs + CI to 9.6.5 and 9.8.2
  ([#4316](haskell/haskell-language-server#4316)) by @jhrcek
- Add support for Fourmolu 0.16
  ([#4314](haskell/haskell-language-server#4314)) by @ brandonchinn178
- Code action to remove redundant record field import (fixes #4220)
  ([#4308](haskell/haskell-language-server#4308)) by @battermann
- Use restricted monad for plugins (#4057)
  ([#4304](haskell/haskell-language-server#4304)) by @awjchen
- 4301 we need to implement utility to wait for all runnning keys in hls graph done
  ([#4302](haskell/haskell-language-server#4302)) by @soulomoon
- Call useWithStale instead of useWithStaleFast when calling ParseCabalFields
  ([#4294](haskell/haskell-language-server#4294)) by @VeryMilkyJoe
- test: add test documenting #806
  ([#4292](haskell/haskell-language-server#4292)) by @develop7
- ghcide: drop ghc-check and ghc-paths dependency
  ([#4291](haskell/haskell-language-server#4291)) by @wz1000
- Limit number of valid hole fits to 10
  ([#4288](haskell/haskell-language-server#4288)) by @akshaymankar
- Add common stanza to completion data
  ([#4286](haskell/haskell-language-server#4286)) by @VeryMilkyJoe
- FindImports: ThisPkg means some home unit, not "this" unit
  ([#4284](haskell/haskell-language-server#4284)) by @wz1000
- Remove redudant absolutization in session loader
  ([#4280](haskell/haskell-language-server#4280)) by @soulomoon
- Bump to new lsp versions
  ([#4279](haskell/haskell-language-server#4279)) by @michaelpj
- Put more test code into pre-commit
  ([#4275](haskell/haskell-language-server#4275)) by @soulomoon
- Delete library ghcide test utils
  ([#4274](haskell/haskell-language-server#4274)) by @soulomoon
- Delete testUtil from ghcide-tests
  ([#4272](haskell/haskell-language-server#4272)) by @soulomoon
- CI change, only run bench on performance label
  ([#4271](haskell/haskell-language-server#4271)) by @soulomoon
- Migrate WatchedFileTests
  ([#4269](haskell/haskell-language-server#4269)) by @soulomoon
- Migrate UnitTests
  ([#4268](haskell/haskell-language-server#4268)) by @soulomoon
- Migrate SafeTests
  ([#4267](haskell/haskell-language-server#4267)) by @soulomoon
- Migrate SymlinkTests
  ([#4266](haskell/haskell-language-server#4266)) by @soulomoon
- Remove unused and outdated CHANGELOG files
  ([#4264](haskell/haskell-language-server#4264)) by @fendor
- Enable cabal flaky test
  ([#4263](haskell/haskell-language-server#4263)) by @soulomoon
- Migrate RootUriTests
  ([#4261](haskell/haskell-language-server#4261)) by @soulomoon
- Migrate PreprocessorTests
  ([#4260](haskell/haskell-language-server#4260)) by @soulomoon
- Migrate PluginSimpleTests
  ([#4259](haskell/haskell-language-server#4259)) by @soulomoon
- Migrate ClientSettingsTests
  ([#4258](haskell/haskell-language-server#4258)) by @soulomoon
- Unify critical session running in hls
  ([#4256](haskell/haskell-language-server#4256)) by @soulomoon
- Bump cachix/cachix-action from 14 to 15
  ([#4255](haskell/haskell-language-server#4255)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.7.2 to 2.7.3
  ([#4254](haskell/haskell-language-server#4254)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.7.2 to 2.7.3 in /.github/actions/setup-build
  ([#4253](haskell/haskell-language-server#4253)) by @dependabot[bot]
- Shorter file names completion
  ([#4252](haskell/haskell-language-server#4252)) by @VenInf
- Fix progress start delay
  ([#4249](haskell/haskell-language-server#4249)) by @michaelpj
- Bump cachix/install-nix-action from 26 to 27
  ([#4245](haskell/haskell-language-server#4245)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.7.1 to 2.7.2
  ([#4244](haskell/haskell-language-server#4244)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.7.1 to 2.7.2 in /.github/actions/setup-build
  ([#4243](haskell/haskell-language-server#4243)) by @dependabot[bot]
- Enable test for #717
  ([#4241](haskell/haskell-language-server#4241)) by @soulomoon
- Remove Pepe from CODEOWNERS
  ([#4239](haskell/haskell-language-server#4239)) by @michaelpj
- Fix resultBuilt(dirty mechanism) in hls-graph
  ([#4238](haskell/haskell-language-server#4238)) by @soulomoon
- Support for 9.10
  ([#4233](haskell/haskell-language-server#4233)) by @wz1000
- Refactor hls-test-util and reduce getCurrentDirectory after initilization
  ([#4231](haskell/haskell-language-server#4231)) by @soulomoon
- [Migrate BootTests] part of #4173 Migrate ghcide tests to hls test utils
  ([#4227](haskell/haskell-language-server#4227)) by @soulomoon
- Actually enable pedantic flag in ci flags job
  ([#4224](haskell/haskell-language-server#4224)) by @jhrcek
- Cleanup cabal files, ghc compat code, fix ghc warnings
  ([#4222](haskell/haskell-language-server#4222)) by @jhrcek
- Another attempt at using the lsp API for some progress reporting
  ([#4218](haskell/haskell-language-server#4218)) by @michaelpj
- [Migrate diagnosticTests] part of #4173 Migrate ghcide tests to hls test utils
  ([#4207](haskell/haskell-language-server#4207)) by @soulomoon
- Prepare release 2.8.0.0
  ([#4191](haskell/haskell-language-server#4191)) by @wz1000
- Stabilize the build system by correctly house keeping the dirtykeys and rule values [flaky test #4185 #4093]
  ([#4190](haskell/haskell-language-server#4190)) by @soulomoon
- hls-cabal-plugin: refactor context search to use `readFields`
  ([#4186](haskell/haskell-language-server#4186)) by @fendor
- 3944 extend the properties api to better support nested configuration
  ([#3952](haskell/haskell-language-server#3952)) by @soulomoon

## 2.8.0.0

- Bindists for GHC 9.6.5
- New hls-notes plugin (#4126, @jvanbruegge)
- Floskell, hlint and stylish-haskell plugins enabled for GHC 9.8
- Improvements for hls-graph increasing robustness (#4087, @soulomoon)
- Improvements to multi-component support (#4096, #4109, #4179, @wz1000, @fendor)

### Pull Requests

- Bump haskell-actions/setup from 2.7.0 to 2.7.1
  ([#4189](haskell/haskell-language-server#4189)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.7.0 to 2.7.1 in /.github/actions/setup-build
  ([#4188](haskell/haskell-language-server#4188)) by @dependabot[bot]
- Fix ghcdie-tests CI
  ([#4184](haskell/haskell-language-server#4184)) by @soulomoon
- Fix ghc and hlint warnings, fix formatting
  ([#4181](haskell/haskell-language-server#4181)) by @jhrcek
- Allow users to specify whether to use `cabal`'s multi-repl feature
  ([#4179](haskell/haskell-language-server#4179)) by @fendor
- Improve parsing of import suggestions extending multiple multiline imports (fixes #4175)
  ([#4177](haskell/haskell-language-server#4177)) by @jhrcek
- move ghcide-tests to haskell-language-server.cabal and make it depend on hls-test-utils
  ([#4176](haskell/haskell-language-server#4176)) by @soulomoon
- enable ThreadId for when testing
  ([#4174](haskell/haskell-language-server#4174)) by @soulomoon
- Drop Legacy Logger from Codebase
  ([#4171](haskell/haskell-language-server#4171)) by @fendor
- get rid of the `unsafeInterleaveIO` at start up
  ([#4167](haskell/haskell-language-server#4167)) by @soulomoon
- Remove EKG
  ([#4163](haskell/haskell-language-server#4163)) by @michaelpj
- Mark plugins as not buildable if the flag is disabled
  ([#4160](haskell/haskell-language-server#4160)) by @michaelpj
- Fix references to old CPP names in tests, update tests
  ([#4159](haskell/haskell-language-server#4159)) by @jhrcek
- Bump haskell-actions/setup from 2.6.3 to 2.7.0
  ([#4158](haskell/haskell-language-server#4158)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.6.3 to 2.7.0 in /.github/actions/setup-build
  ([#4157](haskell/haskell-language-server#4157)) by @dependabot[bot]
- Remove dead code in ghcide and hls-graph for priority
  ([#4151](haskell/haskell-language-server#4151)) by @soulomoon
- Bump haskell-actions/setup from 2.6.2 to 2.6.3 in /.github/actions/setup-build
  ([#4150](haskell/haskell-language-server#4150)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.6.2 to 2.6.3
  ([#4149](haskell/haskell-language-server#4149)) by @dependabot[bot]
- Run ExceptionTests in temporary directory
  ([#4146](haskell/haskell-language-server#4146)) by @fendor
- hls-eval-plugin: Replicate #4139
  ([#4140](haskell/haskell-language-server#4140)) by @mattapet
- Update comment in refactor tests
  ([#4138](haskell/haskell-language-server#4138)) by @jhrcek
- Update contact info in docs
  ([#4137](haskell/haskell-language-server#4137)) by @jhrcek
- hls-notes-plugin: Do not error if no note is under the cursor
  ([#4136](haskell/haskell-language-server#4136)) by @jvanbruegge
- improve logging in semantic tokens rule
  ([#4135](haskell/haskell-language-server#4135)) by @soulomoon
- Bump softprops/action-gh-release from 1 to 2
  ([#4133](haskell/haskell-language-server#4133)) by @dependabot[bot]
- Bump cachix/install-nix-action from 25 to 26
  ([#4132](haskell/haskell-language-server#4132)) by @dependabot[bot]
- Use Set.member instead of Foldable.elem
  ([#4128](haskell/haskell-language-server#4128)) by @jhrcek
- hls-notes-plugin: Initial implementation
  ([#4126](haskell/haskell-language-server#4126)) by @jvanbruegge
- Enable floskell and hlint plugins for ghc 9.8
  ([#4125](haskell/haskell-language-server#4125)) by @jhrcek
- Integrate stylish-haskell into hls executable with ghc 9.8
  ([#4124](haskell/haskell-language-server#4124)) by @jhrcek
- Reduce usage of partial functions
  ([#4123](haskell/haskell-language-server#4123)) by @jhrcek
- Benchmark: Enable 9.6, 9.8
  ([#4118](haskell/haskell-language-server#4118)) by @soulomoon
- Bump haskell-actions/setup from 2.6.1 to 2.6.2 in /.github/actions/setup-build
  ([#4116](haskell/haskell-language-server#4116)) by @dependabot[bot]
- Bump haskell-actions/setup from 2.6.1 to 2.6.2
  ([#4115](haskell/haskell-language-server#4115)) by @dependabot[bot]
- eval: more robust way to extract comments from ParsedModule
  ([#4113](haskell/haskell-language-server#4113)) by @jhrcek
- Improve isolation of build artefacts of test runs
  ([#4112](haskell/haskell-language-server#4112)) by @fendor
- Improve handling of nonsense rename attempts
  ([#4111](haskell/haskell-language-server#4111)) by @jhrcek
- Exit with non-zero exitcode if wrapper fails to launch
  ([#4110](haskell/haskell-language-server#4110)) by @fendor
- Replace checkHomeUnitsClosed with a faster implementation
  ([#4109](haskell/haskell-language-server#4109)) by @wz1000
- Don't distribute gifs or plugin readmes
  ([#4107](haskell/haskell-language-server#4107)) by @fendor
- Remove locale workaround for Module name that conatins non-ascii characters
  ([#4106](haskell/haskell-language-server#4106)) by @fendor
- Track extra-source-files of plugins more accurately
  ([#4105](haskell/haskell-language-server#4105)) by @fendor
- remove non-ascii name
  ([#4103](haskell/haskell-language-server#4103)) by @soulomoon
- Add cabal-gild as a cabal file formatter plugin
  ([#4101](haskell/haskell-language-server#4101)) by @fendor
- Remove more workarounds for GHCs < 9.2 (#4092)
  ([#4098](haskell/haskell-language-server#4098)) by @jhrcek
- session-loader: Don't loop forever when we don't find a file in any multi component
  ([#4096](haskell/haskell-language-server#4096)) by @wz1000
- Prepare release 2.7.0.0
  ([#4095](haskell/haskell-language-server#4095)) by @fendor
- Remove more workarounds for GHCs < 9.0
  ([#4092](haskell/haskell-language-server#4092)) by @jhrcek
- Fix hls-graph: phantom dependencies invoke in branching deps (resolve #3423)
  ([#4087](haskell/haskell-language-server#4087)) by @soulomoon
- Rename only if the current module compiles (#3799)
  ([#3848](haskell/haskell-language-server#3848)) by @sgillespie
- Reintroduce ghc-lib flag for hlint plugin
  ([#3757](haskell/haskell-language-server#3757)) by @RaoulHC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants