Skip to content

Commit 3397180

Browse files
authored
Fix type adapter for workspace/diagnostic response (#683)
Fixes #682
1 parent 86611cb commit 3397180

File tree

6 files changed

+99
-18
lines changed

6 files changed

+99
-18
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ Fixed issues: <https://github.com/eclipse/lsp4j/milestone/26?closed=1>
66

77
Breaking API changes:
88

9-
* None.
9+
* Removed `WorkspaceDocumentDiagnosticReportTypeAdapter`, which was
10+
effectively replaced with `WorkspaceDocumentDiagnosticReportListAdapter`
11+
as part of fixing issue <https://github.com/eclipse/lsp4j/issues/682>.
1012

1113
Nightly japicmp report: <https://download.eclipse.org/lsp4j/builds/main/japicmp-report/>
1214

org.eclipse.lsp4j/src/main/java/org/eclipse/lsp4j/Protocol.xtend

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.eclipse.lsp4j.adapters.ProgressNotificationAdapter
2626
import org.eclipse.lsp4j.adapters.ResourceOperationTypeAdapter
2727
import org.eclipse.lsp4j.adapters.SymbolInformationTypeAdapter
2828
import org.eclipse.lsp4j.adapters.VersionedTextDocumentIdentifierTypeAdapter
29+
import org.eclipse.lsp4j.adapters.WorkspaceDocumentDiagnosticReportListAdapter
2930
import org.eclipse.lsp4j.adapters.WorkspaceSymbolLocationTypeAdapter
3031
import org.eclipse.lsp4j.generator.JsonRpcData
3132
import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter
@@ -10343,6 +10344,7 @@ class PreviousResultId {
1034310344
@JsonRpcData
1034410345
class WorkspaceDiagnosticReport {
1034510346
@NonNull
10347+
@JsonAdapter(WorkspaceDocumentDiagnosticReportListAdapter)
1034610348
List<WorkspaceDocumentDiagnosticReport> items
1034710349

1034810350
new() {
@@ -10451,6 +10453,7 @@ class WorkspaceDocumentDiagnosticReport extends Either<WorkspaceFullDocumentDiag
1045110453
@JsonRpcData
1045210454
class WorkspaceDiagnosticReportPartialResult {
1045310455
@NonNull
10456+
@JsonAdapter(WorkspaceDocumentDiagnosticReportListAdapter)
1045410457
List<WorkspaceDocumentDiagnosticReport> items
1045510458

1045610459
new() {
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
package org.eclipse.lsp4j.adapters;
1313

1414
import java.io.IOException;
15+
import java.util.ArrayList;
1516
import java.util.function.Predicate;
1617

1718
import org.eclipse.lsp4j.WorkspaceDocumentDiagnosticReport;
1819
import org.eclipse.lsp4j.WorkspaceFullDocumentDiagnosticReport;
1920
import org.eclipse.lsp4j.WorkspaceUnchangedDocumentDiagnosticReport;
21+
import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
2022
import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
2123
import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
2224

@@ -26,7 +28,7 @@
2628
import com.google.gson.TypeAdapterFactory;
2729
import com.google.gson.reflect.TypeToken;
2830

29-
public class WorkspaceDocumentDiagnosticReportTypeAdapter implements TypeAdapterFactory {
31+
public class WorkspaceDocumentDiagnosticReportListAdapter implements TypeAdapterFactory {
3032

3133
private static final TypeToken<WorkspaceDocumentDiagnosticReport> ELEMENT_TYPE = TypeToken.get(WorkspaceDocumentDiagnosticReport.class);
3234

@@ -35,9 +37,9 @@ public class WorkspaceDocumentDiagnosticReportTypeAdapter implements TypeAdapter
3537
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
3638
Predicate<JsonElement> leftChecker = new PropertyChecker("kind", "full");
3739
Predicate<JsonElement> rightChecker = new PropertyChecker("kind", "unchanged");
38-
return (TypeAdapter<T>) new EitherTypeAdapter<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>(
39-
gson, ELEMENT_TYPE, leftChecker, rightChecker) {
40-
40+
EitherTypeAdapter<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport> elementTypeAdapter =
41+
new EitherTypeAdapter<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>(
42+
gson, ELEMENT_TYPE, leftChecker, rightChecker) {
4143
@Override
4244
protected WorkspaceDocumentDiagnosticReport createLeft(WorkspaceFullDocumentDiagnosticReport obj) throws IOException {
4345
return new WorkspaceDocumentDiagnosticReport(obj);
@@ -48,5 +50,6 @@ protected WorkspaceDocumentDiagnosticReport createRight(WorkspaceUnchangedDocume
4850
return new WorkspaceDocumentDiagnosticReport(obj);
4951
}
5052
};
53+
return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new);
5154
}
5255
}

org.eclipse.lsp4j/src/main/java/org/eclipse/lsp4j/services/WorkspaceService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.eclipse.lsp4j.WorkspaceEdit;
2828
import org.eclipse.lsp4j.WorkspaceSymbol;
2929
import org.eclipse.lsp4j.WorkspaceSymbolParams;
30-
import org.eclipse.lsp4j.adapters.WorkspaceDocumentDiagnosticReportTypeAdapter;
3130
import org.eclipse.lsp4j.adapters.WorkspaceSymbolResponseAdapter;
3231
import org.eclipse.lsp4j.jsonrpc.json.ResponseJsonAdapter;
3332
import org.eclipse.lsp4j.jsonrpc.messages.Either;
@@ -192,7 +191,6 @@ default void didDeleteFiles(DeleteFilesParams params) {
192191
* Since 3.17.0
193192
*/
194193
@JsonRequest
195-
@ResponseJsonAdapter(WorkspaceDocumentDiagnosticReportTypeAdapter.class)
196194
default CompletableFuture<WorkspaceDiagnosticReport> diagnostic(WorkspaceDiagnosticParams params) {
197195
throw new UnsupportedOperationException();
198196
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/******************************************************************************
2+
* Copyright (c) 2022 1C-Soft LLC and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0,
7+
* or the Eclipse Distribution License v. 1.0 which is available at
8+
* http://www.eclipse.org/org/documents/edl-v10.php.
9+
*
10+
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
11+
******************************************************************************/
12+
package org.eclipse.lsp4j.test.adapters;
13+
14+
import static org.junit.Assert.assertEquals;
15+
16+
import java.util.Arrays;
17+
import java.util.Collections;
18+
19+
import org.eclipse.lsp4j.WorkspaceDiagnosticReport;
20+
import org.eclipse.lsp4j.WorkspaceDiagnosticReportPartialResult;
21+
import org.eclipse.lsp4j.WorkspaceDocumentDiagnosticReport;
22+
import org.eclipse.lsp4j.WorkspaceFullDocumentDiagnosticReport;
23+
import org.eclipse.lsp4j.WorkspaceUnchangedDocumentDiagnosticReport;
24+
import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
25+
import org.junit.Test;
26+
27+
import com.google.gson.Gson;
28+
29+
public class WorkspaceDocumentDiagnosticReportListAdapterTest {
30+
31+
private final Gson gson = new MessageJsonHandler(Collections.emptyMap()).getGson();
32+
33+
@Test
34+
public void testParseWorkspaceDiagnosticReport() {
35+
36+
assertEquals(
37+
gson.fromJson("{'items': [{'kind': 'full', 'items': [], 'uri': 'file:///tmp/foo'}]}",
38+
WorkspaceDiagnosticReport.class),
39+
new WorkspaceDiagnosticReport(Arrays.asList(new WorkspaceDocumentDiagnosticReport(
40+
new WorkspaceFullDocumentDiagnosticReport(Collections.emptyList(), "file:///tmp/foo", null)))));
41+
42+
assertEquals(
43+
gson.fromJson("{'items': [{'kind': 'unchanged', 'resultId': '123', 'uri': 'file:///tmp/foo'}]}",
44+
WorkspaceDiagnosticReport.class),
45+
new WorkspaceDiagnosticReport(Arrays.asList(new WorkspaceDocumentDiagnosticReport(
46+
new WorkspaceUnchangedDocumentDiagnosticReport("123", "file:///tmp/foo", null)))));
47+
}
48+
49+
@Test
50+
public void testParseWorkspaceDiagnosticReportPartialResult() {
51+
52+
assertEquals(
53+
gson.fromJson("{'items': [{'kind': 'full', 'items': [], 'uri': 'file:///tmp/foo'}]}",
54+
WorkspaceDiagnosticReportPartialResult.class),
55+
new WorkspaceDiagnosticReportPartialResult(Arrays.asList(new WorkspaceDocumentDiagnosticReport(
56+
new WorkspaceFullDocumentDiagnosticReport(Collections.emptyList(), "file:///tmp/foo", null)))));
57+
58+
assertEquals(
59+
gson.fromJson("{'items': [{'kind': 'unchanged', 'resultId': '123', 'uri': 'file:///tmp/foo'}]}",
60+
WorkspaceDiagnosticReportPartialResult.class),
61+
new WorkspaceDiagnosticReportPartialResult(Arrays.asList(new WorkspaceDocumentDiagnosticReport(
62+
new WorkspaceUnchangedDocumentDiagnosticReport("123", "file:///tmp/foo", null)))));
63+
}
64+
}

org.eclipse.lsp4j/src/test/java/org/eclipse/lsp4j/test/services/JsonParseTest.xtend

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ import org.eclipse.lsp4j.WorkDoneProgressCreateParams
8989
import org.eclipse.lsp4j.WorkDoneProgressEnd
9090
import org.eclipse.lsp4j.WorkDoneProgressNotification
9191
import org.eclipse.lsp4j.WorkspaceClientCapabilities
92+
import org.eclipse.lsp4j.WorkspaceDiagnosticReport
9293
import org.eclipse.lsp4j.WorkspaceDocumentDiagnosticReport
9394
import org.eclipse.lsp4j.WorkspaceEdit
9495
import org.eclipse.lsp4j.WorkspaceFullDocumentDiagnosticReport
@@ -347,7 +348,7 @@ class JsonParseTest {
347348
}
348349

349350
@Test
350-
def void testWorkspaceDocumentDiagnosticResponse1() {
351+
def void testWorkspaceDiagnosticResponse1() {
351352
jsonHandler.methodProvider = [ id |
352353
switch id {
353354
case '12': MessageMethods.WORKSPACE_DIAGNOSTIC
@@ -358,24 +359,28 @@ class JsonParseTest {
358359
"jsonrpc": "2.0",
359360
"id": "12",
360361
"result": {
361-
"kind": "full",
362-
"items": [],
363-
"uri": "file:///tmp/foo"
362+
"items": [
363+
{
364+
"kind": "full",
365+
"items": [],
366+
"uri": "file:///tmp/foo"
367+
}
368+
]
364369
}
365370
}
366371
'''.assertParse(new ResponseMessage => [
367372
jsonrpc = "2.0"
368373
id = "12"
369-
result = new WorkspaceDocumentDiagnosticReport(
374+
result = new WorkspaceDiagnosticReport(newArrayList(new WorkspaceDocumentDiagnosticReport(
370375
new WorkspaceFullDocumentDiagnosticReport => [
371376
uri = "file:///tmp/foo"
372377
]
373-
)
378+
)))
374379
])
375380
}
376381

377382
@Test
378-
def void testWorkspaceDocumentDiagnosticResponse2() {
383+
def void testWorkspaceDiagnosticResponse2() {
379384
jsonHandler.methodProvider = [ id |
380385
switch id {
381386
case '12': MessageMethods.WORKSPACE_DIAGNOSTIC
@@ -386,18 +391,24 @@ class JsonParseTest {
386391
"jsonrpc": "2.0",
387392
"id": "12",
388393
"result": {
389-
"kind": "unchanged",
390-
"uri": "file:///tmp/foo"
394+
"items": [
395+
{
396+
"kind": "unchanged",
397+
"resultId": "123",
398+
"uri": "file:///tmp/foo"
399+
}
400+
]
391401
}
392402
}
393403
'''.assertParse(new ResponseMessage => [
394404
jsonrpc = "2.0"
395405
id = "12"
396-
result = new WorkspaceDocumentDiagnosticReport(
406+
result = new WorkspaceDiagnosticReport(newArrayList(new WorkspaceDocumentDiagnosticReport(
397407
new WorkspaceUnchangedDocumentDiagnosticReport => [
408+
resultId = "123"
398409
uri = "file:///tmp/foo"
399410
]
400-
)
411+
)))
401412
])
402413
}
403414

0 commit comments

Comments
 (0)