/******************************************************************************* * 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.web.typescript; import org.eclipse.che.api.languageserver.exception.LanguageServerException; import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncherTemplate; import org.eclipse.che.api.languageserver.shared.model.LanguageDescription; import org.eclipse.che.plugin.web.shared.Constants; import org.eclipse.lsp4j.jsonrpc.Launcher; import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.LanguageServer; import javax.inject.Singleton; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import static java.util.Arrays.asList; /** * Launcher for TypeScript Language Server */ @Singleton public class TSLSLauncher extends LanguageServerLauncherTemplate { private static final String[] EXTENSIONS = new String[]{Constants.TS_EXT}; private static final String[] MIME_TYPES = new String[]{Constants.TS_MIME_TYPE}; private static final LanguageDescription description; private final Path launchScript; public TSLSLauncher() { launchScript = Paths.get(System.getenv("HOME"), "che/ls-typescript/launch.sh"); } @Override protected Process startLanguageServerProcess(String projectPath) throws LanguageServerException { ProcessBuilder processBuilder = new ProcessBuilder(launchScript.toString()); processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE); processBuilder.redirectOutput(ProcessBuilder.Redirect.PIPE); try { return processBuilder.start(); } catch (IOException e) { throw new LanguageServerException("Can't start TypeScript language server", e); } } @Override protected LanguageServer connectToLanguageServer(final Process languageServerProcess, LanguageClient client) { Launcher<LanguageServer> launcher = Launcher.createLauncher(client, LanguageServer.class, languageServerProcess.getInputStream(), languageServerProcess.getOutputStream()); launcher.startListening(); return launcher.getRemoteProxy(); } @Override public LanguageDescription getLanguageDescription() { return description; } @Override public boolean isAbleToLaunch() { return Files.exists(launchScript); } static { description = new LanguageDescription(); description.setFileExtensions(asList(EXTENSIONS)); description.setLanguageId(Constants.TS_LANG); description.setMimeTypes(asList(MIME_TYPES)); description.setHighlightingConfiguration("[\n" + " {\"include\":\"orion.js\"},\n" + " {\"match\":\"\\\\b(?:constructor|declare|module)\\\\b\",\"name\" :\"keyword.operator.typescript\"},\n" + " {\"match\":\"\\\\b(?:any|boolean|number|string)\\\\b\",\"name\" : \"storage.type.typescript\"}\n" + "]"); } }