Skip to content

Commit

Permalink
Add default language descriptions set (#8256)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmytro Kulieshov committed Jan 16, 2018
1 parent c51a892 commit 54bf493
Show file tree
Hide file tree
Showing 9 changed files with 468 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import org.eclipse.che.api.languageserver.messager.PublishDiagnosticsParamsJsonRpcTransmitter;
import org.eclipse.che.api.languageserver.messager.ShowMessageJsonRpcTransmitter;
import org.eclipse.che.api.languageserver.registry.CheLanguageClientFactory;
import org.eclipse.che.api.languageserver.registry.DefaultLanguageRecognizer;
import org.eclipse.che.api.languageserver.registry.LanguageRecognizer;
import org.eclipse.che.api.languageserver.registry.LanguageServerFileWatcher;
import org.eclipse.che.api.languageserver.registry.LanguageServerRegistry;
import org.eclipse.che.api.languageserver.registry.LanguageServerRegistryImpl;
Expand All @@ -35,6 +37,7 @@ public class LanguageServerModule extends AbstractModule {
protected void configure() {
install(new LsRemoteModule());

bind(LanguageRecognizer.class).to(DefaultLanguageRecognizer.class);
bind(LanguageServerRegistry.class).to(LanguageServerRegistryImpl.class);
bind(ServerInitializer.class).to(ServerInitializerImpl.class);
bind(LanguageRegistryService.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*
* Copyright (c) 2012-2018 Red Hat, Inc.
* 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.che.api.languageserver.registry;

import static org.eclipse.che.api.fs.server.WsPathUtils.nameOf;

import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;

/**
* Language recognizer based on default language set. Custom language descriptions created that are
* injected by guice are taken into account prior to default language set. Language recognition is
* based on file name or file extension, so may be improved further in future.
*/
@Singleton
public class DefaultLanguageRecognizer implements LanguageRecognizer {

private final Set<LanguageDescription> languages;
private final DefaultLanguages defaultLanguages;

@Inject
public DefaultLanguageRecognizer(
Set<LanguageDescription> languages, DefaultLanguages defaultLanguages) {
this.languages = languages;
this.defaultLanguages = defaultLanguages;
}

@Override
public LanguageDescription recognizeByPath(String wsPath) {
Name name = new Name(wsPath);
Extension extension = new Extension(wsPath);

for (LanguageDescription language : languages) {
if (name.matches(language) || extension.matches(language)) {
return language;
}
}

for (LanguageDescription language : defaultLanguages.getAll()) {
if (name.matches(language) || extension.matches(language)) {
return language;
}
}

return UNIDENTIFIED;
}

@Override
public LanguageDescription recognizeById(String id) {
for (LanguageDescription language : languages) {
if (language.getLanguageId().equals(id)) {
return language;
}
}

for (LanguageDescription language : defaultLanguages.getAll()) {
if (language.getLanguageId().equals(id)) {
return language;
}
}

return UNIDENTIFIED;
}

private static class Name {
private final String name;

private Name(String wsPath) {
String nameAndExtension = nameOf(wsPath);
int lastDotIndex = nameAndExtension.lastIndexOf('.');

this.name = lastDotIndex < 0 ? nameAndExtension : nameAndExtension.substring(0, lastDotIndex);
}

private boolean matches(LanguageDescription languageDescription) {
return languageDescription.getFileNames().contains(name);
}
}

private static class Extension {
private final String extension;

private Extension(String wsPath) {
String nameAndExtension = nameOf(wsPath);
int lastDotIndex = nameAndExtension.lastIndexOf('.');

this.extension = lastDotIndex < 0 ? "" : nameAndExtension.substring(lastDotIndex + 1);
}

private boolean matches(LanguageDescription languageDescription) {
return languageDescription.getFileExtensions().contains(extension);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*
* Copyright (c) 2012-2018 Red Hat, Inc.
* 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.che.api.languageserver.registry;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Singleton;
import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;

/** Contains set of default language descriptions */
@Singleton
public class DefaultLanguages {

private final Set<LanguageDescription> languages = new HashSet<>();

public DefaultLanguages() {
register("bat", "bat", "text/plain");
register("bibtex", "bib", "text/plain");
register("clojure", "clj", "text/x-clojure");
register("coffeescript", "coffee", "text/x-coffeescript");
register("c", "c", "text/x-csrc");
register("cpp", "cpp", "text/x-c++src");
register("csharp", "cs", "text/x-csharp");
register("css", "css", "text/css");
register("diff", "diff", "text/x-diff");
register("fsharp", "fs", "text/x-fsharp");
register("go", "go", "text/x-go");
register("groovy", "groovy", "text/x-groovy");
register("handlebars", "hbs", "text/plain");
register("html", "html", "text/html");
register("ini", "ini", "text/plain");
register("jade", "jade", "text/x-jade");
register("java", "java", "text/x-java");
register("javascript", "js", "text/javascript");
register("json", "json", "application/json");
register("scala", "scala", "text/x-scala");
register("kt", "kotlin", "text/x-kotlin");
register("latex", "tex", "text/x-latex");
register("lisp", "lisp", "text/x-commonlisp");
register("lua", "lua", "text/x-lua");
register("makefile", "Makefile", "text/plain");
register("markdown", "markdown", "text/x-markdown");
register("objective-c", "m", "text/x-objective-c");
register("objective-cpp", "mm", "text/x-objective-cpp");
register("perl", "pl", "text/x-perl");
register("php", "php", "text/x-php");
register("powershell", "ps1", "text/plain");
register("pascal", "pas", "text/x-pascal");
register("python", "py", "text/x-python");
register("r", "r", "text/x-rsrc");
register("ruby", "rb", "text/x-ruby");
register("rust", "rs", "text/x-rustsrc");
register("shellscript", "sh", "text/x-sh");
register("sql", "sql", "text/x-sql");
register("swift", "swift", "text/x-swift");
register("typescript", "ts", "application/typescript");
register("xml", "xml", "application/xml");
register("xsl", "xsl", "text/plain");
register("yaml", "yaml", "text/x-yaml");

registerWithName("dockerfile", "Dockerfile", "text/x-dockerfile");
}

public Set<LanguageDescription> getAll() {
return Collections.unmodifiableSet(languages);
}

private void register(String id, String extension, String mimeType) {
LanguageDescription languageDescription = new LanguageDescription();
languageDescription.setLanguageId(id);
languageDescription.setMimeType(mimeType);
languageDescription.setFileExtensions(Collections.singletonList(extension));
languages.add(languageDescription);
}

private void registerWithName(String id, String fileName, String mimeType) {
LanguageDescription languageDescription = new LanguageDescription();
languageDescription.setLanguageId(id);
languageDescription.setMimeType(mimeType);
languageDescription.setFileNames(Collections.singletonList(fileName));
languages.add(languageDescription);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright (c) 2012-2018 Red Hat, Inc.
* 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.che.api.languageserver.registry;

import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;

/**
* The implementations of this interface are responsible for language recognition of a file under
* defined path.
*/
public interface LanguageRecognizer {
LanguageDescription UNIDENTIFIED =
new LanguageDescription() {
@Override
public String getLanguageId() {
return "unidentified";
}

@Override
public String getMimeType() {
return "";
}

@Override
public String getHighlightingConfiguration() {
return "";
}
};

/**
* Recognize a language by file path. If language cannot be recognized for any reason than the
* implementation must return {@link LanguageRecognizer#UNIDENTIFIED}.
*
* @param wsPath workspace path of a file
* @return description of language that was recognized
*/
LanguageDescription recognizeByPath(String wsPath);

/**
* Recognize a language by it's identifier. If language cannot be recognized for any reason than
* the implementation must return {@link LanguageRecognizer#UNIDENTIFIED}.
*
* @param id language identifier
* @return description of language that was recognized
*/
LanguageDescription recognizeById(String id);
}
Loading

0 comments on commit 54bf493

Please sign in to comment.