Skip to content

Commit 23a3242

Browse files
jdneofbricon
authored andcommitted
Check additionalTextEdits & documentation resolve support via standard LSP
Signed-off-by: Sheng Chen <sheche@microsoft.com>
1 parent 146b0ba commit 23a3242

File tree

5 files changed

+65
-5
lines changed

5 files changed

+65
-5
lines changed

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ public CompletionItem resolve(CompletionItem param, IProgressMonitor monitor) {
129129
Range range = JDTUtils.toRange(unit, ctx.getOffset(), 0);
130130
TextEdit textEdit = new TextEdit(range, content);
131131
param.setTextEdit(Either.forLeft(textEdit));
132-
param.setDocumentation(SnippetUtils.beautifyDocument(content));
132+
if (manager.getClientPreferences().isCompletionResolveDocumentSupport()) {
133+
param.setDocumentation(SnippetUtils.beautifyDocument(content));
134+
}
133135
param.setData(null);
134136
} catch (JavaModelException e) {
135137
JavaLanguageServerPlugin.logException(e.getMessage(), e);
@@ -148,6 +150,12 @@ public CompletionItem resolve(CompletionItem param, IProgressMonitor monitor) {
148150
);
149151
proposalProvider.updateReplacement(completionResponse.getProposals().get(proposalId), param, '\0');
150152
}
153+
154+
if (!manager.getClientPreferences().isCompletionResolveDocumentSupport()) {
155+
return param;
156+
}
157+
158+
// below code is for resolving documentation
151159
if (data.containsKey(DATA_FIELD_DECLARATION_SIGNATURE)) {
152160
String typeName = stripSignatureToFQN(String.valueOf(data.get(DATA_FIELD_DECLARATION_SIGNATURE)));
153161
try {

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/ClientPreferences.java

+19-4
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,6 @@ public boolean isGradleChecksumWrapperPromptSupport() {
275275
return Boolean.parseBoolean(extendedClientCapabilities.getOrDefault("gradleChecksumWrapperPromptSupport", "false").toString());
276276
}
277277

278-
public boolean isResolveAdditionalTextEditsSupport() {
279-
return Boolean.parseBoolean(extendedClientCapabilities.getOrDefault("resolveAdditionalTextEditsSupport", "false").toString());
280-
}
281-
282278
/**
283279
* The command which will be triggered when the completion item is selected. Different clients can have different
284280
* command ids. The command id is set in the 'onCompletionItemSelectedCommand' field of the extended client capabilities.
@@ -418,6 +414,25 @@ public boolean isCompletionItemLabelDetailsSupport() {
418414
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getLabelDetailsSupport().booleanValue();
419415
}
420416

417+
public boolean isResolveAdditionalTextEditsSupport() {
418+
return isPropertySupportedForCompletionResolve("additionalTextEdits")
419+
// TODO: the extended capability 'resolveAdditionalTextEditsSupport' should be deprecated.
420+
|| Boolean.parseBoolean(extendedClientCapabilities.getOrDefault("resolveAdditionalTextEditsSupport", "false").toString());
421+
}
422+
423+
public boolean isCompletionResolveDocumentSupport() {
424+
return isPropertySupportedForCompletionResolve("documentation");
425+
}
426+
427+
public boolean isPropertySupportedForCompletionResolve(String property) {
428+
return (v3supported
429+
&& capabilities.getTextDocument().getCompletion() != null
430+
&& capabilities.getTextDocument().getCompletion().getCompletionItem() != null
431+
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getResolveSupport() != null
432+
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getResolveSupport().getProperties() != null
433+
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getResolveSupport().getProperties().contains(property));
434+
}
435+
421436
public boolean isInlayHintRefreshSupported() {
422437
return v3supported
423438
&& capabilities.getWorkspace().getInlayHint() != null

org.eclipse.jdt.ls.tests.syntaxserver/src/org/eclipse/jdt/ls/core/internal/syntaxserver/SyntaxServerTest.java

+6
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.eclipse.jdt.ls.core.internal.handlers.JsonRpcHelpers;
4444
import org.eclipse.jdt.ls.core.internal.managers.ContentProviderManager;
4545
import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
46+
import org.eclipse.jdt.ls.core.internal.preferences.ClientPreferences;
4647
import org.eclipse.lsp4j.CompletionItem;
4748
import org.eclipse.lsp4j.CompletionItemKind;
4849
import org.eclipse.lsp4j.CompletionList;
@@ -72,6 +73,7 @@
7273
import org.junit.Before;
7374
import org.junit.Test;
7475
import org.junit.runner.RunWith;
76+
import org.mockito.Mockito;
7577
import org.mockito.junit.MockitoJUnitRunner;
7678

7779
@RunWith(MockitoJUnitRunner.class)
@@ -384,6 +386,10 @@ public class Completion {
384386

385387
@Test
386388
public void testResolveCompletion() throws Exception {
389+
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
390+
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
391+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
392+
387393
URI fileURI = openFile("maven/salut4", "src/main/java/java/Completion.java");
388394
ICompilationUnit cu = JDTUtils.resolveCompilationUnit(fileURI);
389395
assertNotNull(cu);

org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandlerTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ public void tearDown() throws Exception {
132132

133133
@Test
134134
public void testCompletion_javadoc() throws Exception {
135+
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
136+
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
137+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
135138
IJavaProject javaProject = JavaCore.create(project);
136139
ICompilationUnit unit = (ICompilationUnit) javaProject.findElement(new Path("org/sample/TestJavadoc.java"));
137140
unit.becomeWorkingCopy(null);
@@ -163,6 +166,7 @@ public void testCompletion_javadocMarkdown() throws Exception {
163166
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
164167
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
165168
Mockito.when(mockCapabilies.isSupportsCompletionDocumentationMarkdown()).thenReturn(true);
169+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
166170
ICompilationUnit unit = (ICompilationUnit) javaProject.findElement(new Path("org/sample/TestJavadoc.java"));
167171
unit.becomeWorkingCopy(null);
168172
String joinOnCompletion = System.getProperty(JDTLanguageServer.JAVA_LSP_JOIN_ON_COMPLETION);
@@ -2561,6 +2565,9 @@ public void testCompletion_testClassesDontLeakIntoMainCode() throws Exception {
25612565

25622566
@Test
25632567
public void testCompletion_testMethodWithParams() throws Exception {
2568+
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
2569+
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
2570+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
25642571
ICompilationUnit unit = getWorkingCopy(
25652572
//@formatter:off
25662573
"src/org/sample/Test.java",
@@ -3030,6 +3037,7 @@ public void testCompletion_linksInMarkdown() throws JavaModelException{
30303037
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
30313038
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
30323039
Mockito.when(mockCapabilies.isSupportsCompletionDocumentationMarkdown()).thenReturn(true);
3040+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
30333041
Mockito.lenient().when(mockCapabilies.isClassFileContentSupported()).thenReturn(true);
30343042

30353043
//@formatter:off
@@ -3446,6 +3454,9 @@ public void testCompletion_InvalidJavadoc() throws Exception {
34463454

34473455
@Test
34483456
public void testCompletion_ConstantDefaultValue() throws JavaModelException {
3457+
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
3458+
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
3459+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
34493460
ICompilationUnit unit = getWorkingCopy("src/org/sample/Test.java",
34503461
//@formatter:off
34513462
"package org.sample;\n"
@@ -3486,6 +3497,9 @@ public void testCompletion_ConstantDefaultValue() throws JavaModelException {
34863497
// See https://github.com/redhat-developer/vscode-java/issues/1258
34873498
@Test
34883499
public void testCompletion_javadocOriginal() throws JavaModelException {
3500+
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
3501+
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
3502+
Mockito.when(mockCapabilies.isCompletionResolveDocumentSupport()).thenReturn(true);
34893503
ICompilationUnit unit = getWorkingCopy("src/org/sample/Test.java",
34903504
//@formatter:off
34913505
"package org.sample;\n"

org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/preferences/ClientPreferencesTest.java

+17
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616
import static org.junit.Assert.assertTrue;
1717
import static org.mockito.Mockito.when;
1818

19+
import java.util.Collections;
20+
1921
import org.eclipse.lsp4j.ClientCapabilities;
2022
import org.eclipse.lsp4j.CodeLensCapabilities;
2123
import org.eclipse.lsp4j.CompletionCapabilities;
2224
import org.eclipse.lsp4j.CompletionItemCapabilities;
25+
import org.eclipse.lsp4j.CompletionItemResolveSupportCapabilities;
2326
import org.eclipse.lsp4j.CompletionItemTagSupportCapabilities;
2427
import org.eclipse.lsp4j.DocumentSymbolCapabilities;
2528
import org.eclipse.lsp4j.FormattingCapabilities;
@@ -180,6 +183,20 @@ public void testIsCompletionItemTagSupported() throws Exception {
180183
assertTrue(prefs.isCompletionItemTagSupported());
181184
}
182185

186+
@Test
187+
public void testIsPropertySupportedForCompletionResolve() {
188+
String property = "property";
189+
assertFalse(prefs.isPropertySupportedForCompletionResolve(property));
190+
CompletionItemCapabilities itemCapabilities = new CompletionItemCapabilities();
191+
CompletionCapabilities capabilities = new CompletionCapabilities(itemCapabilities);
192+
when(text.getCompletion()).thenReturn(capabilities);
193+
194+
CompletionItemResolveSupportCapabilities resolveCapabilities = new CompletionItemResolveSupportCapabilities();
195+
resolveCapabilities.setProperties(Collections.singletonList(property));
196+
itemCapabilities.setResolveSupport(resolveCapabilities);
197+
assertTrue(prefs.isPropertySupportedForCompletionResolve(property));
198+
}
199+
183200
@Test
184201
public void testIsSymbolTagSupported() throws Exception {
185202
assertFalse(prefs.isSymbolTagSupported());

0 commit comments

Comments
 (0)