Skip to content

Commit

Permalink
Initialize ExecuteCommandProvider for the server's capabilities
Browse files Browse the repository at this point in the history
Signed-off-by: Snjezana Peco <snjezana.peco@redhat.com>
  • Loading branch information
snjeza committed Nov 12, 2017
1 parent 9817e22 commit aae09d4
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.ResourcesPlugin;
Expand All @@ -40,6 +41,7 @@
import org.eclipse.lsp4j.ClientCapabilities;
import org.eclipse.lsp4j.CodeLensOptions;
import org.eclipse.lsp4j.CompletionOptions;
import org.eclipse.lsp4j.ExecuteCommandOptions;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.ServerCapabilities;
Expand Down Expand Up @@ -142,6 +144,10 @@ InitializeResult initialize(InitializeParams param) {
capabilities.setRenameProvider(Boolean.TRUE);
}
capabilities.setCodeActionProvider(Boolean.TRUE);
if (!preferenceManager.getClientPreferences().isExecuteCommandDynamicRegistrationSupported()) {
Set<String> commands = WorkspaceExecuteCommandHandler.getCommands();
capabilities.setExecuteCommandProvider(new ExecuteCommandOptions(new ArrayList<>(commands)));
}
result.setCapabilities(capabilities);
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,13 @@ public void didChangeConfiguration(DidChangeConfigurationParams params) {
unregisterCapability(Preferences.RENAME_ID, Preferences.TEXT_DOCUMENT_RENAME);
}
}
if (preferenceManager.getClientPreferences().isExecuteCommandDynamicRegistrationSupported()) {
if (preferenceManager.getPreferences().isExecuteCommandEnabled()) {
registerCapability(Preferences.EXECUTE_COMMAND_ID, Preferences.WORKSPACE_EXECUTE_COMMAND);
} else {
unregisterCapability(Preferences.EXECUTE_COMMAND_ID, Preferences.WORKSPACE_EXECUTE_COMMAND);
}
}
logInfo(">>New configuration: " + settings);
}

Expand Down Expand Up @@ -556,7 +563,7 @@ public CompletableFuture<BuildWorkspaceStatus> buildWorkspace(boolean forceReBui
BuildWorkspaceHandler handler = new BuildWorkspaceHandler(client, pm);
return computeAsync((cc) -> handler.buildWorkspace(forceReBuild, toMonitor(cc)));
}

/* (non-Javadoc)
* @see org.eclipse.jdt.ls.core.internal.lsp.WorkspaceServiceProposed#didChangeWorkspaceFolders(org.eclipse.jdt.ls.core.internal.lsp.DidChangeWorkspaceFoldersParams)
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
package org.eclipse.jdt.ls.core.internal.handlers;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -94,6 +95,14 @@ private static synchronized Set<DelegateCommandHandlerDescriptor> getDelegateCom
return fgContributedCommandHandlers;
}

public static Set<String> getCommands() {
Set<DelegateCommandHandlerDescriptor> handlers = getDelegateCommandHandlerDescriptors();
Set<String> commands = new HashSet<>();
for (DelegateCommandHandlerDescriptor handler : handlers) {
commands.addAll(handler.getCommands());
}
return commands;
}
/**
* Execute workspace command and invoke language server delegate command
* handler for matching command
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,8 @@ private boolean isDynamicRegistrationSupported(DynamicRegistrationCapabilities c
public boolean isRenameDynamicRegistrationSupported() {
return v3supported && isDynamicRegistrationSupported(capabilities.getTextDocument().getRename());
}

public boolean isExecuteCommandDynamicRegistrationSupported() {
return v3supported && isDynamicRegistrationSupported(capabilities.getWorkspace().getExecuteCommand());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ public class Preferences {
*/
public static final String RENAME_ENABLED_KEY = "java.rename.enabled";

/**
* Preference key to enable/disable executeCommand.
*/
public static final String EXECUTE_COMMAND_ENABLED_KEY = "java.executeCommand.enabled";

/**
* Preference key to exclude directories when importing projects.
*/
Expand Down Expand Up @@ -116,12 +121,14 @@ public class Preferences {
public static final String TEXT_DOCUMENT_CODE_LENS = "textDocument/codeLens";
public static final String TEXT_DOCUMENT_SIGNATURE_HELP = "textDocument/signatureHelp";
public static final String TEXT_DOCUMENT_RENAME = "textDocument/rename";
public static final String WORKSPACE_EXECUTE_COMMAND = "workspace/executeCommand";

public static final String FORMATTING_ID = UUID.randomUUID().toString();
public static final String FORMATTING_RANGE_ID = UUID.randomUUID().toString();
public static final String CODE_LENS_ID = UUID.randomUUID().toString();
public static final String SIGNATURE_HELP_ID = UUID.randomUUID().toString();
public static final String RENAME_ID = UUID.randomUUID().toString();
public static final String EXECUTE_COMMAND_ID = UUID.randomUUID().toString();

private Map<String, Object> configuration;
private Severity incompleteClasspathSeverity;
Expand All @@ -131,6 +138,7 @@ public class Preferences {
private boolean javaFormatEnabled;
private boolean signatureHelpEnabled;
private boolean renameEnabled;
private boolean executeCommandEnabled;
private MemberSortOrder memberOrders;
private List<String> preferredContentProviderIds;

Expand Down Expand Up @@ -197,6 +205,7 @@ public Preferences() {
javaFormatEnabled = true;
signatureHelpEnabled = false;
renameEnabled = true;
executeCommandEnabled = true;
memberOrders = new MemberSortOrder(null);
preferredContentProviderIds = null;
favoriteStaticMembers = "";
Expand Down Expand Up @@ -234,6 +243,9 @@ public static Preferences createFrom(Map<String, Object> configuration) {
boolean renameEnabled = getBoolean(configuration, RENAME_ENABLED_KEY, true);
prefs.setRenameEnabled(renameEnabled);

boolean executeCommandEnable = getBoolean(configuration, EXECUTE_COMMAND_ENABLED_KEY, true);
prefs.setExecuteCommandEnabled(executeCommandEnable);

List<String> javaImportExclusions = getList(configuration, JAVA_IMPORT_EXCLUSIONS_KEY, JAVA_IMPORT_EXCLUSIONS_DEFAULT);
prefs.setJavaImportExclusions(javaImportExclusions);

Expand Down Expand Up @@ -287,6 +299,11 @@ private Preferences setRenameEnabled(boolean enabled) {
return this;
}

private Preferences setExecuteCommandEnabled(boolean enabled) {
this.executeCommandEnabled = enabled;
return this;
}

public Preferences setJavaFormatEnabled(boolean enabled) {
this.javaFormatEnabled = enabled;
return this;
Expand Down Expand Up @@ -351,6 +368,10 @@ public boolean isRenameEnabled() {
return renameEnabled;
}

public boolean isExecuteCommandEnabled() {
return executeCommandEnabled;
}

public Preferences setMavenUserSettings(String mavenUserSettings) {
this.mavenUserSettings = mavenUserSettings;
return this;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*******************************************************************************
* Copyright (c) 2017 Red Hat Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ls.core.internal.handlers;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

import org.eclipse.jdt.ls.core.internal.JavaClientConnection.JavaLanguageClient;
import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest;
import org.eclipse.jdt.ls.core.internal.preferences.ClientPreferences;
import org.eclipse.lsp4j.ClientCapabilities;
import org.eclipse.lsp4j.DidChangeConfigurationCapabilities;
import org.eclipse.lsp4j.ExecuteCommandCapabilities;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.TextDocumentClientCapabilities;
import org.eclipse.lsp4j.WorkspaceClientCapabilities;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

/**
* @author snjeza
*
*/
@RunWith(MockitoJUnitRunner.class)
public class InitHandlerTest extends AbstractProjectsManagerBasedTest {

protected JDTLanguageServer server;

@Mock
private JavaLanguageClient client;

@Before
public void setup() throws Exception {
server = new JDTLanguageServer(projectsManager, preferenceManager);
server.connectClient(client);
}

@After
public void tearDown() {
server.disconnectClient();
}

@Test
public void testExecuteCommandProvider() throws Exception {
ClientPreferences mockCapabilies = mock(ClientPreferences.class);
when(mockCapabilies.isExecuteCommandDynamicRegistrationSupported()).thenReturn(Boolean.FALSE);
when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
InitializeResult result = initialize(false);
List<String> commands = result.getCapabilities().getExecuteCommandProvider().getCommands();
assertFalse(commands.isEmpty());
}

@Test
public void testExecuteCommandProviderDynamicRegistration() throws Exception {
ClientPreferences mockCapabilies = mock(ClientPreferences.class);
when(mockCapabilies.isExecuteCommandDynamicRegistrationSupported()).thenReturn(Boolean.TRUE);
when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
InitializeResult result = initialize(true);
assertNull(result.getCapabilities().getExecuteCommandProvider());
}

private InitializeResult initialize(boolean dynamicRegistration) throws InterruptedException, ExecutionException {
InitializeParams params = new InitializeParams();
ClientCapabilities capabilities = new ClientCapabilities();
WorkspaceClientCapabilities workspaceCapabilities = new WorkspaceClientCapabilities();
workspaceCapabilities.setDidChangeConfiguration(new DidChangeConfigurationCapabilities(dynamicRegistration));
ExecuteCommandCapabilities executeCommand = new ExecuteCommandCapabilities(dynamicRegistration);
workspaceCapabilities.setExecuteCommand(executeCommand);
capabilities.setWorkspace(workspaceCapabilities);
TextDocumentClientCapabilities textDocument = new TextDocumentClientCapabilities();
capabilities.setTextDocument(textDocument);
params.setCapabilities(capabilities);
CompletableFuture<InitializeResult> result = server.initialize(params);
return result.get();
}
}

0 comments on commit aae09d4

Please sign in to comment.