Skip to content
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

Support structured diagnostics 2 #4433

Open
wants to merge 76 commits into
base: master
Choose a base branch
from

Conversation

noughtmare
Copy link
Contributor

@noughtmare noughtmare commented Oct 17, 2024

This is my attempt at finishing the work of @dylan-thinnes on !4311.

Addresses #2014

Should hopefully enable #3246

These are two things Dylan listed as work for future PRs:

  • Replacing regexes with structured diagnostic checks
  • Improve typing so that it can be known that an error has a structured diagnostic, instead of defaulting to Maybe

Some future work discovered in reviews of this PR:

  • requireDiagnostic could take a more structured error code query type as argument. See Support structured diagnostics 2 #4433 (comment)
  • The HTTP work should be un-reverted in a future PR: 1bc221c
  • Check that tests using requireDiagnostics and related functions use explicit error codes if possible

@noughtmare
Copy link
Contributor Author

All failures in the jobs of e651d41 seem to be spurious (except for the stylish-haskell formatting failure).

@noughtmare
Copy link
Contributor Author

I think the remaining failures are not caused by this PR. Are these kinds of spurious failures common in HLS?

Also, I would really like to get this merged before the next release, because I want to develop a VS Code extension which uses these diagnostic numbers.

@fendor
Copy link
Collaborator

fendor commented Oct 18, 2024

Are these kinds of spurious failures common in HLS?

Yes, they unfortunately are

@fendor
Copy link
Collaborator

fendor commented Oct 18, 2024

Some errors in ghc 9.4 seem to be genuine, though. Many tests are seemingly time outing for some reason.

@noughtmare
Copy link
Contributor Author

You're right. Can anyone give me some tips on how to profile HLS to see where these timeouts are coming from?

@fendor
Copy link
Collaborator

fendor commented Oct 18, 2024

@noughtmare Profiling is likely not necessary, I think the tests are waiting for an LSP message that never arrives, and then just wait for 60s and time out.

Use HLS_TEST_LOG_STDERR=1 cabal test ... and TASTY_PATTERN to run a specific test with all HLS logging enabled.
Printf debugging also works quite well to figure out where the tests gets stuck.
To get the raw LSP messages, you can use LSP_TEST_LOG_MESSAGES=1 or LSP_TEST_LOG_STDERR=1 (they do the same thign)

@noughtmare
Copy link
Contributor Author

noughtmare commented Oct 18, 2024

Ah, I was thinking there was some inefficiency somewhere that only GHC 9.6 and later could properly optimize. However, I think you're suggesting an alternative explanation: that one of the conditional CPP blocks contains an actual correctness issue. Perhaps I could just visually inspect those first; I don't think that would be that much work.

Edit: no obvious loops or anything, so perhaps some tracing would indeed be better.

@noughtmare
Copy link
Contributor Author

noughtmare commented Oct 22, 2024

I've decided to make the tests ignore all error codes on GHC 9.4. I think some errors already have codes in 9.4, so we could do a bit more, but I don't think it is worth the effort.

@noughtmare
Copy link
Contributor Author

noughtmare commented Oct 23, 2024

The remaining MacOS failure seems like a compiler bug. The linker is throwing an error.

Edit: https://gitlab.haskell.org/ghc/ghc/-/issues/24648

Adding the compiler flag -ld_classic might be a workaround.

@noughtmare
Copy link
Contributor Author

@fendor do you think we could try setting the -ld_classic flag? If so, where should I put it?

@noughtmare
Copy link
Contributor Author

noughtmare commented Oct 23, 2024

Oh, I see we already have that exact workaround in some places. I'll just copy that to the hlint plugin.

@noughtmare
Copy link
Contributor Author

noughtmare commented Oct 23, 2024

Yay, it has finally passed CI! Should I squash the commits? I'm not sure what to write in the message as I don't really know the details of what exactly Dylan did.

@noughtmare noughtmare requested a review from michaelpj as a code owner October 23, 2024 13:36
@noughtmare noughtmare force-pushed the support-structured-diagnostics branch from 7773572 to 469d8a7 Compare October 23, 2024 13:37
@fendor fendor force-pushed the support-structured-diagnostics branch 3 times, most recently from af550e3 to f4d5c24 Compare November 30, 2024 15:17
Copy link
Collaborator

@fendor fendor left a comment

Choose a reason for hiding this comment

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

It took me long enough, but I am happy with the PR now.

I still have to address my own comments, and likely I have to revert any changes to the plugins and split these commits off into a separate PR.

ghcide/src/Development/IDE/Core/Compile.hs Outdated Show resolved Hide resolved
ghcide/src/Development/IDE/Core/RuleTypes.hs Show resolved Hide resolved
ghcide/src/Development/IDE/GHC/Warnings.hs Outdated Show resolved Hide resolved
@fendor
Copy link
Collaborator

fendor commented Dec 1, 2024

@noughtmare Is there anythign else you need or want from this PR?

@noughtmare
Copy link
Contributor Author

I personally just wanted access to the diagnostic codes. So I'm more than satisfied!

Copy link
Collaborator

@soulomoon soulomoon left a comment

Choose a reason for hiding this comment

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

LGTM, Just two questions

plugins/hls-class-plugin/src/Ide/Plugin/Class/Types.hs Outdated Show resolved Hide resolved
fendor and others added 13 commits December 23, 2024 11:15
Implement 'rangesOverlap' function which checks whether two 'Range's
overlap in any way.
Implement two new plugin utility functions which allow to conveniently
get all currently displayed diagnostics for a given 'Range'.
Add compatibility module for GHC's structured error messages.
Introduce 'Prism's and 'Lens's to easily access nested structures.
Expand documentation for 'StructuredMessage'
Fixes haskell#4440

Fixes test for disabling deferred-type-errors.
Co-authored-by: Mergify <37929162+mergify[bot]@users.noreply.github.com>
* new tests

* change codeAction title

* more tests and docs

---------

Co-authored-by: fendor <[email protected]>
Allows HLS to 'Goto Definition' for Note references.
@fendor fendor force-pushed the support-structured-diagnostics branch from c1513bd to 371896a Compare December 23, 2024 10:45
@fendor fendor mentioned this pull request Dec 23, 2024
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
performance Issues about memory consumption, responsiveness, etc. status: needs review This PR is ready for review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants