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:
apache/netbeans-vscode#33
Are you willing to submit a pull request?
No
Apache NetBeans version
Apache NetBeans 30
What happened
Bug Report: LSP Server
computeDiagnosticsoverwrites ERRORS with HINTSComponent
Java Language Server (
java.lsp.server)File
java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.javaDescription
There is a logic flaw in the
computeDiagnosticsmethod insideTextDocumentServiceImpl.javathat 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
ERRORSandHINTSsimultaneously (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 singleList<Diagnostic>, theresultlist was being overwritten.The Bug
In the original implementation of
computeDiagnostics(String uri, EnumSet<ErrorProvider.Kind> types)(around line 2150):Because
resultis assigned directly without appending, if bothERRORSandHINTSare requested, theHINTScomputation completely eradicates theERRORSfrom the final payload sent back to the LSP client.Proposed Fix
The
resultcollection must be instantiated as anArrayListand both types of diagnostics must be merged into it using.addAll().Impact
Without this fix, any client-side tool or background scanner that requests full diagnostics for a file via the
nbls.get.diagnosticscommand 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:
apache/netbeans-vscode#33
Are you willing to submit a pull request?
No