LSP Server computeDiagnostics overwrites ERRORS with HINTS

Open Beginner friendly
#9,548 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
78/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Quiet
Tech stack
java
Domain
api, tooling

Research direction

Open java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java and inspect computeDiagnostics around line 2150, focusing on how ERRORS and HINTS are returned together. Verify that a request containing both kinds preserves both diagnostic sets in the completed result, and check the relevant LSP diagnostics tests if available.

Written by the indexing model from the issue text.

Description

kind:bug LSP needs:triage
Apache NetBeans version

Apache NetBeans 30

What happened

Bug Report: LSP Server computeDiagnostics overwrites ERRORS with HINTS

Component

Java Language Server (java.lsp.server)

File

java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java

Description

There is a logic flaw in the computeDiagnostics method inside TextDocumentServiceImpl.java that causes valid Java compilation errors to randomly disappear from the client or be completely overwritten by minor code hints.

When the LSP client requests both ERRORS and HINTS simultaneously (or when they are computed in the same batch), the method retrieves the errors successfully but fails to properly merge them with the hints. Instead of aggregating both into a single List<Diagnostic>, the result list was being overwritten.

The Bug

In the original implementation of computeDiagnostics(String uri, EnumSet<ErrorProvider.Kind> types) (around line 2150):

List<Diagnostic> result = Collections.emptyList();
if (types.contains(ErrorProvider.Kind.ERRORS)) {
    result = computeDiags(uri, -1, ErrorProvider.Kind.ERRORS, originalVersion, docHolder);
}
if (types.contains(ErrorProvider.Kind.HINTS)) {
    // BUG: This completely overwrites the ERRORS computed above!
    result = computeDiags(uri, -1, ErrorProvider.Kind.HINTS, originalVersion, docHolder); 
}
r.complete(result);

Because result is assigned directly without appending, if both ERRORS and HINTS are requested, the HINTS computation completely eradicates the ERRORS from the final payload sent back to the LSP client.

Proposed Fix

The result collection must be instantiated as an ArrayList and both types of diagnostics must be merged into it using .addAll().

List<Diagnostic> result = new ArrayList<>();
if (types.contains(ErrorProvider.Kind.ERRORS)) {
    result.addAll(computeDiags(uri, -1, ErrorProvider.Kind.ERRORS, originalVersion, docHolder));
}
if (types.contains(ErrorProvider.Kind.HINTS)) {
    result.addAll(computeDiags(uri, -1, ErrorProvider.Kind.HINTS, originalVersion, docHolder));
}
r.complete(result);
Impact

Without this fix, any client-side tool or background scanner that requests full diagnostics for a file via the nbls.get.diagnostics command will receive an incomplete picture of the file's health, leading to valid compilation errors being hidden from the developer.

Language / Project Type / NetBeans Component

No response

How to reproduce

When the LSP client requests both ERRORS and HINTS simultaneously (or when they are computed in the same batch), the method retrieves the errors successfully but fails to properly merge them with the hints. Instead of aggregating both into a single List, the result list was being overwritten.

Did this work correctly in an earlier version?

No / Don't know

Operating System

Windows

JDK

26

Apache NetBeans packaging

Apache NetBeans binary zip

Anything else

this is related to this Pull Request for Netbeans-vscode:
https://github.com/apache/netbeans-vscode/pull/33

Are you willing to submit a pull request?

No

Dominant language
Java
Stars
3.1k
Forks
933
Avg merge
4d 12h
Merged PRs (30d)
22

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from apache/netbeans

All issues in apache/netbeans

Similar issues

More Java issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.