Signed-off-by: Even Vidolob <evidolob@codenvy.com>6.19.x
parent
65f7e352b3
commit
2d260702d8
|
|
@ -0,0 +1,24 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012-2017 Codenvy, S.A.
|
||||
* 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:
|
||||
* Codenvy, S.A. - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.che.plugin.json.languageserver;
|
||||
|
||||
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public interface JsonExtension {
|
||||
|
||||
@JsonNotification(value="json/schemaAssociations", useSegment = false)
|
||||
void jsonSchemaAssociation(Map<String, String[]> associations);
|
||||
}
|
||||
|
|
@ -12,11 +12,14 @@ package org.eclipse.che.plugin.json.languageserver;
|
|||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
import org.eclipse.che.api.languageserver.exception.LanguageServerException;
|
||||
import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncherTemplate;
|
||||
import org.eclipse.che.api.languageserver.registry.ServerInitializerObserver;
|
||||
import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;
|
||||
import org.eclipse.lsp4j.ServerCapabilities;
|
||||
import org.eclipse.lsp4j.jsonrpc.Endpoint;
|
||||
import org.eclipse.lsp4j.jsonrpc.Launcher;
|
||||
import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
|
||||
import org.eclipse.lsp4j.services.LanguageClient;
|
||||
import org.eclipse.lsp4j.services.LanguageServer;
|
||||
|
||||
|
|
@ -24,6 +27,8 @@ import java.io.IOException;
|
|||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
|
||||
|
|
@ -32,7 +37,7 @@ import static java.util.Arrays.asList;
|
|||
* @author Anatolii Bazko
|
||||
*/
|
||||
@Singleton
|
||||
public class JsonLanguageServerLauncher extends LanguageServerLauncherTemplate {
|
||||
public class JsonLanguageServerLauncher extends LanguageServerLauncherTemplate implements ServerInitializerObserver {
|
||||
|
||||
private static final String LANGUAGE_ID = "json";
|
||||
private static final String[] EXTENSIONS = new String[]{"json", "bowerrc", "jshintrc", "jscsrc", "eslintrc",
|
||||
|
|
@ -42,6 +47,8 @@ public class JsonLanguageServerLauncher extends LanguageServerLauncherTemplate {
|
|||
|
||||
private final Path launchScript;
|
||||
|
||||
private LanguageClient client;
|
||||
|
||||
@Inject
|
||||
public JsonLanguageServerLauncher() {
|
||||
launchScript = Paths.get(System.getenv("HOME"), "che/ls-json/launch.sh");
|
||||
|
|
@ -58,6 +65,7 @@ public class JsonLanguageServerLauncher extends LanguageServerLauncherTemplate {
|
|||
}
|
||||
|
||||
protected LanguageServer connectToLanguageServer(final Process languageServerProcess, LanguageClient client) {
|
||||
this.client = client;
|
||||
Launcher<LanguageServer> launcher = Launcher.createLauncher(client, LanguageServer.class,
|
||||
languageServerProcess.getInputStream(),
|
||||
languageServerProcess.getOutputStream());
|
||||
|
|
@ -82,4 +90,20 @@ public class JsonLanguageServerLauncher extends LanguageServerLauncherTemplate {
|
|||
description.setLanguageId(LANGUAGE_ID);
|
||||
description.setMimeTypes(asList(MIME_TYPES));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServerInitialized(LanguageServer server, ServerCapabilities capabilities, LanguageDescription languageDescription, String projectPath) {
|
||||
Endpoint endpoint = ServiceEndpoints.toEndpoint(server);
|
||||
JsonExtension serviceObject = ServiceEndpoints.toServiceObject(endpoint, JsonExtension.class);
|
||||
Map<String, String[]> associations = new HashMap<>();
|
||||
associations.put("/*.schema.json", new String[]{"http://json-schema.org/draft-04/schema#"});
|
||||
associations.put("/bower.json", new String[]{"http://json.schemastore.org/bower"});
|
||||
associations.put("/.bower.json", new String[]{"http://json.schemastore.org/bower"});
|
||||
associations.put("/.bowerrc", new String[]{"http://json.schemastore.org/bowerrc"});
|
||||
associations.put("/composer.json", new String[]{"https://getcomposer.org/schema.json"});
|
||||
associations.put("/package.json", new String[]{"http://json.schemastore.org/package"});
|
||||
associations.put("/jsconfig.json", new String[]{"http://json.schemastore.org/jsconfig"});
|
||||
associations.put("/tsconfig.json", new String[]{"http://json.schemastore.org/tsconfig"});
|
||||
serviceObject.jsonSchemaAssociation(associations);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@ import org.eclipse.lsp4j.TextDocumentIdentifier;
|
|||
*/
|
||||
public class ExtendedCompletionItem extends CompletionItem {
|
||||
|
||||
private TextDocumentIdentifier documentIdentifier;
|
||||
private TextDocumentIdentifier textDocumentIdentifier;
|
||||
|
||||
public TextDocumentIdentifier getTextDocumentIdentifier() {
|
||||
return documentIdentifier;
|
||||
return textDocumentIdentifier;
|
||||
}
|
||||
|
||||
public void setTextDocumentIdentifier(TextDocumentIdentifier documentIdentifier) {
|
||||
this.documentIdentifier = documentIdentifier;
|
||||
this.textDocumentIdentifier = documentIdentifier;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,9 @@ public class PublishDiagnosticsParamsJsonRpcTransmitter {
|
|||
@Inject
|
||||
private void subscribe(EventService eventService, RequestTransmitter requestTransmitter) {
|
||||
eventService.subscribe(event -> {
|
||||
event.setUri(event.getUri().substring(16));
|
||||
if(event.getUri() != null) {
|
||||
event.setUri(event.getUri().substring(16));
|
||||
}
|
||||
endpointIds.forEach(endpointId -> requestTransmitter.newRequest()
|
||||
.endpointId(endpointId)
|
||||
.methodName("textDocument/publishDiagnostics")
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ package org.eclipse.che.api.languageserver.registry;
|
|||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
import org.eclipse.che.api.core.notification.EventService;
|
||||
import org.eclipse.che.api.languageserver.exception.LanguageServerException;
|
||||
import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncher;
|
||||
|
|
@ -149,7 +148,7 @@ public class ServerInitializerImpl implements ServerInitializer {
|
|||
throw new LanguageServerException(
|
||||
"Can't initialize Language Server " + languageId + " on " + projectPath + ". " + e.getMessage(), e);
|
||||
}
|
||||
registerCallbacks(server);
|
||||
registerCallbacks(server, launcher);
|
||||
|
||||
CompletableFuture<InitializeResult> completableFuture = server.initialize(initializeParams);
|
||||
try {
|
||||
|
|
@ -166,18 +165,24 @@ public class ServerInitializerImpl implements ServerInitializer {
|
|||
return server;
|
||||
}
|
||||
|
||||
protected void registerCallbacks(LanguageServer server) {
|
||||
protected void registerCallbacks(LanguageServer server, LanguageServerLauncher launcher) {
|
||||
|
||||
if (server instanceof ServerInitializerObserver) {
|
||||
addObserver((ServerInitializerObserver)server);
|
||||
}
|
||||
|
||||
if (launcher instanceof ServerInitializerObserver) {
|
||||
addObserver((ServerInitializerObserver) launcher);
|
||||
}
|
||||
}
|
||||
|
||||
protected InitializeParams prepareInitializeParams(String projectPath) {
|
||||
InitializeParams initializeParams = new InitializeParams();
|
||||
initializeParams.setProcessId(PROCESS_ID);
|
||||
initializeParams.setRootPath(projectPath);
|
||||
initializeParams.setCapabilities(new ClientCapabilities());
|
||||
initializeParams.setCapabilities(new ClientCapabilities(){
|
||||
|
||||
});
|
||||
initializeParams.setClientName(CLIENT_NAME);
|
||||
return initializeParams;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
package org.eclipse.che.api.languageserver.service;
|
||||
|
||||
import com.google.inject.Singleton;
|
||||
|
||||
import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcException;
|
||||
import org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;
|
||||
import org.eclipse.che.api.languageserver.exception.LanguageServerException;
|
||||
|
|
@ -19,12 +18,12 @@ import org.eclipse.che.api.languageserver.registry.LanguageServerRegistry;
|
|||
import org.eclipse.che.api.languageserver.registry.LanguageServerRegistryImpl;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.CompletionItemDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.CompletionListDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.ExtendedCompletionItemDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.HoverDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.LocationDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.SignatureHelpDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.SymbolInformationDto;
|
||||
import org.eclipse.che.api.languageserver.server.dto.DtoServerImpls.TextEditDto;
|
||||
import org.eclipse.che.api.languageserver.shared.model.ExtendedCompletionItem;
|
||||
import org.eclipse.lsp4j.DidChangeTextDocumentParams;
|
||||
import org.eclipse.lsp4j.DidCloseTextDocumentParams;
|
||||
import org.eclipse.lsp4j.DidOpenTextDocumentParams;
|
||||
|
|
@ -34,6 +33,7 @@ import org.eclipse.lsp4j.DocumentHighlight;
|
|||
import org.eclipse.lsp4j.DocumentOnTypeFormattingParams;
|
||||
import org.eclipse.lsp4j.DocumentRangeFormattingParams;
|
||||
import org.eclipse.lsp4j.DocumentSymbolParams;
|
||||
import org.eclipse.lsp4j.Hover;
|
||||
import org.eclipse.lsp4j.Location;
|
||||
import org.eclipse.lsp4j.ReferenceParams;
|
||||
import org.eclipse.lsp4j.TextDocumentIdentifier;
|
||||
|
|
@ -81,7 +81,7 @@ public class TextDocumentService {
|
|||
dtoToDtoList("references", ReferenceParams.class, LocationDto.class, this::references);
|
||||
dtoToDtoList("onTypeFormatting", DocumentOnTypeFormattingParams.class, TextEditDto.class, this::onTypeFormatting);
|
||||
|
||||
dtoToDto("completionItem/resolve", ExtendedCompletionItemDto.class, CompletionItemDto.class, this::completionItemResolve);
|
||||
dtoToDto("completionItem/resolve", ExtendedCompletionItem.class, CompletionItemDto.class, this::completionItemResolve);
|
||||
dtoToDto("documentHighlight", TextDocumentPositionParams.class, DocumentHighlight.class, this::documentHighlight);
|
||||
dtoToDto("completion", TextDocumentPositionParams.class, CompletionListDto.class, this::completion);
|
||||
dtoToDto("hover", TextDocumentPositionParams.class, HoverDto.class, this::hover);
|
||||
|
|
@ -157,7 +157,7 @@ public class TextDocumentService {
|
|||
}
|
||||
}
|
||||
|
||||
private CompletionItemDto completionItemResolve(ExtendedCompletionItemDto unresolved) {
|
||||
private CompletionItemDto completionItemResolve(ExtendedCompletionItem unresolved) {
|
||||
try {
|
||||
LanguageServer server = getServer(prefixURI(unresolved.getTextDocumentIdentifier().getUri()));
|
||||
|
||||
|
|
@ -173,7 +173,13 @@ public class TextDocumentService {
|
|||
positionParams.getTextDocument().setUri(prefixURI(positionParams.getTextDocument().getUri()));
|
||||
positionParams.setUri(prefixURI(positionParams.getUri()));
|
||||
LanguageServer server = getServer(positionParams.getTextDocument().getUri());
|
||||
return server != null ? new HoverDto(server.getTextDocumentService().hover(positionParams).get()) : null;
|
||||
if(server != null) {
|
||||
Hover hover = server.getTextDocumentService().hover(positionParams).get();
|
||||
if (hover != null) {
|
||||
return new HoverDto(hover);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
} catch (InterruptedException | ExecutionException | LanguageServerException e) {
|
||||
throw new JsonRpcException(-27000, e.getMessage());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ public class ServerInitializerImplTest {
|
|||
|
||||
when(launcher.getLanguageDescription()).thenReturn(languageDescription);
|
||||
when(launcher.launch(anyString(), any())).thenReturn(server);
|
||||
doNothing().when(initializer).registerCallbacks(server);
|
||||
doNothing().when(initializer).registerCallbacks(server, launcher);
|
||||
|
||||
initializer.addObserver(observer);
|
||||
LanguageServer languageServer = initializer.initialize(launcher, "/path");
|
||||
|
|
|
|||
Loading…
Reference in New Issue