diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java index 8a91bbf04..ed21a5ea7 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java @@ -13,6 +13,7 @@ package org.springframework.ide.vscode.boot; import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.composable.ComposableLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.composable.CompositeLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; @@ -23,9 +24,13 @@ public class BootLanguageServer extends Comp super(extensionId, _components); } - public static ComposableLanguageServer create(LSFactory params) { - //TODO compose properties and java - return new ComposableLanguageServer<>("vscode-boot", s -> new BootPropertiesLanguageServerComponents(s, params)); + public static ComposableLanguageServer create(LSFactory params) { + return new ComposableLanguageServer<>("vscode-boot", s -> { + CompositeLanguageServerComponents.Builder components = new CompositeLanguageServerComponents.Builder(); + components.add(new BootPropertiesLanguageServerComponents(s, params)); + components.add(new BootJavaLanguageServerComponents(s, params)); + return components.build(s); + }); } public static ComposableLanguageServer createProperties(LSFactory params) { diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServerParams.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServerParams.java index cda18d9dc..bb232166b 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServerParams.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServerParams.java @@ -35,6 +35,7 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguage import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.java.MavenProjectCache; import org.springframework.ide.vscode.commons.maven.java.MavenProjectFinder; +import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.text.IDocument; /** @@ -66,6 +67,7 @@ public class BootLanguageServerParams { Duration watchDogInterval ) { super(); + Assert.isNotNull(projectObserver); // null is bad should be ProjectObserver.NULL this.projectFinder = projectFinder; this.projectObserver = projectObserver; this.indexProvider = indexProvider; diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index e0ff1e0db..99c950aa6 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -13,6 +13,8 @@ package org.springframework.ide.vscode.boot.java; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -59,6 +61,7 @@ import org.springframework.ide.vscode.commons.languageserver.completion.IComplet import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; import org.springframework.ide.vscode.commons.languageserver.util.ReferencesHandler; @@ -66,9 +69,11 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguage import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServerWrapper; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; /** * Language Server for Spring Boot Application Properties files @@ -77,6 +82,8 @@ import com.google.common.collect.ImmutableList; */ public class BootJavaLanguageServerComponents implements LanguageServerComponents { + private static final Set LANGUAGES = ImmutableSet.of(LanguageId.JAVA); + private final SimpleLanguageServer server; private final BootLanguageServerParams serverParams; private final SpringIndexer indexer; @@ -328,4 +335,10 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent public BootLanguageServerParams getServerParams() { return this.serverParams; } + + @Override + public Set getInterestingLanguages() { + return LANGUAGES; + } + } diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java index 81645e571..f881673ce 100644 --- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java +++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java @@ -10,6 +10,9 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.properties; +import java.util.Optional; +import java.util.Set; + import org.springframework.ide.vscode.boot.BootLanguageServerParams; import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory; import org.springframework.ide.vscode.boot.common.RelaxedNameConfig; @@ -22,7 +25,6 @@ import org.springframework.ide.vscode.boot.properties.reconcile.SpringProperties import org.springframework.ide.vscode.boot.yaml.completions.ApplicationYamlAssistContext; import org.springframework.ide.vscode.boot.yaml.reconcile.ApplicationYamlReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; -import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter; @@ -34,6 +36,7 @@ import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.text.IDocument; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.commons.yaml.ast.YamlASTProvider; import org.springframework.ide.vscode.commons.yaml.ast.YamlParser; @@ -47,6 +50,7 @@ import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvid import org.yaml.snakeyaml.Yaml; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; /** * Language Server for Spring Boot Application Properties files @@ -58,6 +62,11 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom private static final String YML = ".yml"; private static final String PROPERTIES = ".properties"; + + private static final Set LANGUAGES = ImmutableSet.of( + LanguageId.BOOT_PROPERTIES, + LanguageId.BOOT_PROPERTIES_YAML + ); private static final YamlCompletionEngineOptions COMPLETION_OPTIONS = new YamlCompletionEngineOptions() { @Override @@ -100,6 +109,11 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom } + @Override + public Set getInterestingLanguages() { + return LANGUAGES; + } + @Override public ICompletionEngine getCompletionEngine() { ICompletionEngine propertiesCompletions = new SpringPropertiesCompletionEngine(indexProvider, typeUtilProvider, javaProjectFinder); @@ -137,11 +151,11 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom } @Override - public IReconcileEngine getReconcileEngine() { + public Optional getReconcileEngine() { IReconcileEngine propertiesReconciler = new SpringPropertiesReconcileEngine(indexProvider, typeUtilProvider); IReconcileEngine ymlReconciler = new ApplicationYamlReconcileEngine(parser, indexProvider, typeUtilProvider); - return (doc, problemCollector) -> { + return Optional.of((doc, problemCollector) -> { String uri = doc.getUri(); if (uri!=null) { if (uri.endsWith(PROPERTIES)) { @@ -155,10 +169,11 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom //No real reconciler is applicable. So tell the problemCollector there are no problems. problemCollector.beginCollecting(); problemCollector.endCollecting(); - }; + }); } public SpringPropertyIndexProvider getPropertiesIndexProvider() { return indexProvider; } + } diff --git a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/editor/harness/AbstractPropsEditorTest.java b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/editor/harness/AbstractPropsEditorTest.java index c43047e22..73ec8fe35 100644 --- a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/editor/harness/AbstractPropsEditorTest.java +++ b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/editor/harness/AbstractPropsEditorTest.java @@ -34,6 +34,7 @@ import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFin import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; import org.springframework.ide.vscode.commons.util.text.IDocument; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.Editor; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; @@ -77,6 +78,10 @@ public abstract class AbstractPropsEditorTest { public void setup() throws Exception { md = new PropertyIndexHarness(); harness = new LanguageServerHarness(this::newLanguageServer) { + @Override + protected LanguageId getDefaultLanguageId() { + return AbstractPropsEditorTest.this.getLanguageId(); + } protected String getFileExtension() { return AbstractPropsEditorTest.this.getFileExtension(); } @@ -84,6 +89,8 @@ public abstract class AbstractPropsEditorTest { harness.intialize(null); } + protected abstract LanguageId getLanguageId(); + /** * Determines the extension used to create temporary uris for editor contents documents. * Tests need to control this if the language server behavior they are testing varies depending on the diff --git a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java index e1ed08b03..2b23be7eb 100644 --- a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java +++ b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java @@ -35,8 +35,10 @@ import org.springframework.ide.vscode.boot.metadata.PropertiesLoader; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.languageserver.composable.ComposableLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.Editor; import com.google.common.collect.ImmutableList; @@ -1592,7 +1594,7 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { ComposableLanguageServer server = BootLanguageServer.create( s -> new BootLanguageServerParams( javaProjectFinder, - null, + ProjectObserver.NULL, md.getIndexProvider(), typeUtilProvider, RunningAppProvider.NULL, @@ -1635,4 +1637,9 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { return ".properties"; } + @Override + protected LanguageId getLanguageId() { + return LanguageId.BOOT_PROPERTIES; + } + } diff --git a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java index 31bbd4a0f..8b4d85ff4 100644 --- a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java +++ b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java @@ -32,8 +32,10 @@ import org.springframework.ide.vscode.boot.metadata.PropertyInfo; import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.composable.ComposableLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.StringUtil; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.Editor; /** @@ -3712,7 +3714,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ComposableLanguageServer server = BootLanguageServer.create( s -> new BootLanguageServerParams( javaProjectFinder, - null, + ProjectObserver.NULL, md.getIndexProvider(), typeUtilProvider, RunningAppProvider.NULL, @@ -3728,4 +3730,9 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { return ".yml"; } + @Override + protected LanguageId getLanguageId() { + return LanguageId.BOOT_PROPERTIES_YAML; + } + } diff --git a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/SpringPropertiesIndexTest.java b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/SpringPropertiesIndexTest.java index e61963ccb..a6a21b236 100644 --- a/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/SpringPropertiesIndexTest.java +++ b/headless-services/commons/commons-boot/src/test/java/org/springframework/ide/vscode/boot/test/SpringPropertiesIndexTest.java @@ -26,6 +26,7 @@ import org.springframework.ide.vscode.boot.metadata.DefaultSpringPropertyIndexPr import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.ProgressService; import org.springframework.ide.vscode.commons.languageserver.composable.ComposableLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.composable.CompositeLanguageServerComponents; import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -40,7 +41,7 @@ import org.springframework.ide.vscode.project.harness.ProjectsHarness; */ public class SpringPropertiesIndexTest { - private LanguageServerHarness> harness; + private LanguageServerHarness> harness; private DefaultSpringPropertyIndexProvider propertyIndexProvider; @@ -52,7 +53,9 @@ public class SpringPropertiesIndexTest { @Test public void testPropertiesIndexRefreshOnProjectChange() throws Exception { harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/boot-1.2.0-properties-live-metadta/").toURI())); - propertyIndexProvider = (DefaultSpringPropertyIndexProvider) harness.getServerWrapper().getComponents().getPropertiesIndexProvider(); + propertyIndexProvider = (DefaultSpringPropertyIndexProvider) harness.getServerWrapper() + .getComponents().get(BootPropertiesLanguageServerComponents.class) + .getPropertiesIndexProvider(); File directory = new File(ProjectsHarness.class.getResource("/test-projects/boot-1.2.0-properties-live-metadta/").toURI()); diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/ComposableLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/ComposableLanguageServer.java index 5fc007d99..a8daca6c3 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/ComposableLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/ComposableLanguageServer.java @@ -40,13 +40,12 @@ public class ComposableLanguageServer implem SimpleTextDocumentService documents = server.getTextDocumentService(); - IReconcileEngine reconcileEngine = components.getReconcileEngine(); - if (reconcileEngine!=null) { + components.getReconcileEngine().ifPresent(reconcileEngine -> { documents.onDidChangeContent(params -> { TextDocument doc = params.getDocument(); server.validateWith(doc.getId(), reconcileEngine); }); - } + }); ICompletionEngine completionEngine = components.getCompletionEngine(); if (completionEngine!=null) { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java new file mode 100644 index 000000000..bbcdb9cf2 --- /dev/null +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java @@ -0,0 +1,148 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, 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: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.languageserver.composable; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.lsp4j.Hover; +import org.eclipse.lsp4j.TextDocumentPositionParams; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; +import org.springframework.ide.vscode.commons.util.Assert; +import org.springframework.ide.vscode.commons.util.text.IDocument; +import org.springframework.ide.vscode.commons.util.text.LanguageId; +import org.springframework.ide.vscode.commons.util.text.TextDocument; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +public class CompositeLanguageServerComponents implements LanguageServerComponents { + + public static class Builder { + private Map componentsByLanguageId = new HashMap<>(); + + public void add(LanguageServerComponents components) { + for (LanguageId language : components.getInterestingLanguages()) { + //Multiple associations to a single language id not yet supported. + Assert.isLegal(!componentsByLanguageId.containsKey(language)); + componentsByLanguageId.put(language, components); + } + } + + public CompositeLanguageServerComponents build(SimpleLanguageServer server) { + return new CompositeLanguageServerComponents(server, this); + } + + } + + private final Map componentsByLanguageId; + private final ICompletionEngine completionEngine; + private final IReconcileEngine reconcileEngine; + private final HoverHandler hoverHandler; + + public CompositeLanguageServerComponents(SimpleLanguageServer server, Builder builder) { + this.componentsByLanguageId = ImmutableMap.copyOf(builder.componentsByLanguageId); + //Create composite Completion engine + this.completionEngine = new ICompletionEngine() { + @Override + public Collection getCompletions(TextDocument document, int offset) throws Exception { + LanguageId language = document.getLanguageId(); + LanguageServerComponents subComponents = componentsByLanguageId.get(language); + if (subComponents!=null) { + ICompletionEngine subEngine = subComponents.getCompletionEngine(); + if (subEngine!=null) { + return subEngine.getCompletions(document, offset); + } + } + return ImmutableList.of(); + } + }; + //Create composite Reconcile engine + if (componentsByLanguageId.values().stream().map(LanguageServerComponents::getReconcileEngine).anyMatch(Optional::isPresent)) { + this.reconcileEngine = new IReconcileEngine() { + @Override + public void reconcile(IDocument document, IProblemCollector problemCollector) { + LanguageId language = document.getLanguageId(); + LanguageServerComponents subComponents = componentsByLanguageId.get(language); + if (subComponents!=null) { + Optional subEngine = subComponents.getReconcileEngine(); + if (subEngine.isPresent()) { + subEngine.get().reconcile(document, problemCollector); + return; + } + } + //No applicable subEngine... but we still have to obey the IReconcileEngine contract! + IReconcileEngine.NULL.reconcile(document, problemCollector); + } + }; + } else { + this.reconcileEngine = null; + } + //Create composite hover handler + this.hoverHandler = new HoverHandler() { + @Override + public CompletableFuture handle(TextDocumentPositionParams params) { + TextDocument doc = server.getTextDocumentService().get(params); + LanguageId language = doc.getLanguageId(); + LanguageServerComponents subComponents = componentsByLanguageId.get(language); + if (subComponents!=null) { + HoverHandler subEngine = subComponents.getHoverProvider(); + if (subEngine!=null) { + return subEngine.handle(params); + } + } + //No applicable subEngine... + return SimpleTextDocumentService.NO_HOVER; + } + }; + } + + @Override + public Set getInterestingLanguages() { + return componentsByLanguageId.keySet(); + } + + @Override + public ICompletionEngine getCompletionEngine() { + return completionEngine; + } + + @Override + public HoverHandler getHoverProvider() { + return hoverHandler; + } + + @Override + public Optional getReconcileEngine() { + return Optional.ofNullable(reconcileEngine); + } + + @SuppressWarnings("unchecked") + public C get(Class subComponentsType) { + for (LanguageServerComponents subcomp : this.componentsByLanguageId.values()) { + if (subComponentsType.isInstance(subcomp)) { + return (C) subcomp; + } + } + return null; + } + +} diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java index 920cb633a..c265a9229 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java @@ -10,15 +10,18 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.languageserver.composable; +import java.util.Optional; +import java.util.Set; + import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; +import org.springframework.ide.vscode.commons.util.text.LanguageId; public interface LanguageServerComponents { - default IReconcileEngine getReconcileEngine() { - return null; - } + Set getInterestingLanguages(); + default Optional getReconcileEngine() { return Optional.empty(); } ICompletionEngine getCompletionEngine(); HoverHandler getHoverProvider(); } diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java index 980fae8e3..68d2bb0da 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java @@ -27,6 +27,8 @@ public class LanguageId { public static final LanguageId BOSH_DEPLOYMENT = of("bosh-deployment-manifest"); public static final LanguageId BOSH_CLOUD_CONFIG = of("bosh-cloud-config"); + public static final LanguageId BOOT_PROPERTIES = of("spring-boot-properties"); + public static final LanguageId BOOT_PROPERTIES_YAML = of("spring-boot-properties-yaml"); private final String id; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/Main.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/Main.java index 741e23020..4740eb784 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/Main.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/Main.java @@ -27,7 +27,6 @@ public class Main { public static void main(String[] args) throws IOException, InterruptedException { String serverName = "boot-language-server"; LogRedirect.redirectToFile(serverName); - //TODO: wrap both BootProperties and BootJavaLanguageServers into a composite of some kind. LaunguageServerApp.start(serverName, () -> BootLanguageServer.create(BootLanguageServerParams.createDefault()).getServer() );