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 10, 2017
1 parent 9817e22 commit 7a82a7f
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 0 deletions.
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 @@ -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
@@ -0,0 +1,80 @@
/*******************************************************************************
* 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.assertTrue;

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

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.ExecuteCommandCapabilities;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.TextDocumentClientCapabilities;
import org.eclipse.lsp4j.WorkspaceClientCapabilities;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

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

protected JDTLanguageServer server;

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

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

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

private InitializeResult initialize(boolean dynamicRegistration) throws InterruptedException, ExecutionException {
InitializeParams params = new InitializeParams();
ClientCapabilities capabilities = new ClientCapabilities();
WorkspaceClientCapabilities workspaceCapabilities = new WorkspaceClientCapabilities();
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 7a82a7f

Please sign in to comment.