From 4164427d12877f2525bcfc5a680ff0d1d570368b Mon Sep 17 00:00:00 2001 From: nsingh Date: Wed, 28 Nov 2018 16:56:15 -0800 Subject: [PATCH] PT 162292472 - Disable arrow completions and other LS changes --- .../bosh/BoshLanguageServerInitializer.java | 15 ++++--- .../VscodeCompletionEngineAdapter.java | 40 +++++++++++++++++-- .../util/SimpleLanguageServer.java | 12 +++++- .../yaml/completion/YamlCompletionEngine.java | 2 +- .../starter/LanguageServerAutoConf.java | 7 +++- .../ConcourseLanguageServerBootApp.java | 4 -- .../ConcourseLanguageServerInitializer.java | 23 ++++------- .../ManifestYamlLanguageServerBootApp.java | 16 ++++++++ ...ManifestYamlLanguageServerInitializer.java | 16 ++++---- .../app/BootLanguageServerInitializer.java | 5 +-- ...ootPropertiesLanguageServerComponents.java | 1 + 11 files changed, 93 insertions(+), 48 deletions(-) diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java index de7ac8843..2aaf28568 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java @@ -10,13 +10,14 @@ *******************************************************************************/ package org.springframework.ide.vscode.bosh; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ide.vscode.bosh.models.BoshModels; import org.springframework.ide.vscode.bosh.models.CloudConfigModel; import org.springframework.ide.vscode.bosh.models.DynamicModelProvider; import org.springframework.ide.vscode.bosh.models.ReleasesModel; import org.springframework.ide.vscode.bosh.models.StemcellsModel; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; -import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerInitializer; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; @@ -38,17 +39,17 @@ import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaBasedReco import org.springframework.ide.vscode.commons.yaml.snippet.SchemaBasedSnippetGenerator; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; import org.springframework.stereotype.Component; -import org.springframework.util.Assert; @Component -public class BoshLanguageServerInitializer implements LanguageServerInitializer { +public class BoshLanguageServerInitializer implements InitializingBean { private BoshCliConfig cliConfig; private DynamicModelProvider cloudConfigProvider; private DynamicModelProvider stemcellsProvider; private DynamicModelProvider releasesProvider; - private SimpleLanguageServer server; + @Autowired private SimpleLanguageServer server; + private BoshSchemas schema; private VscodeCompletionEngineAdapter completionEngine; @@ -64,9 +65,7 @@ public class BoshLanguageServerInitializer implements LanguageServerInitializer } @Override - public void initialize(SimpleLanguageServer server) throws Exception { - Assert.isNull(this.server, "This initializer should only be used once"); - this.server = server; + public void afterPropertiesSet() throws Exception { BoshModels models = new BoshModels(cloudConfigProvider, stemcellsProvider, releasesProvider); SimpleTextDocumentService documents = server.getTextDocumentService(); schema = new BoshSchemas(models); @@ -77,7 +76,7 @@ public class BoshLanguageServerInitializer implements LanguageServerInitializer YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); enableSnippets(true); YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider, YamlCompletionEngineOptions.DEFAULT); - completionEngine = server.createCompletionEngineAdapter(server, yamlCompletionEngine); + completionEngine = server.createCompletionEngineAdapter(yamlCompletionEngine); HoverInfoProvider infoProvider = new YamlHoverInfoProvider(asts.getAstProvider(true), structureProvider, contextProvider); VscodeHoverEngineAdapter hoverEngine = new VscodeHoverEngineAdapter(server, infoProvider); YamlQuickfixes quickfixes = new YamlQuickfixes(server.getQuickfixRegistry(), server.getTextDocumentService(), structureProvider); diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java index ea8601a93..e63321b41 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.commons.languageserver.completion; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -37,8 +38,6 @@ import org.springframework.ide.vscode.commons.util.StringUtil; import org.springframework.ide.vscode.commons.util.text.IRegion; import org.springframework.ide.vscode.commons.util.text.TextDocument; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.gson.JsonPrimitive; @@ -100,6 +99,7 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { private SimpleLanguageServer server; private ICompletionEngine engine; private final LazyCompletionResolver resolver; + private Optional filter; /** * By setting a non-null {@link LazyCompletionResolver} you can enable lazy completion resolution. @@ -108,10 +108,11 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { * The resolver is injected rather than created locally to allow sharing it between multiple * engines. */ - public VscodeCompletionEngineAdapter(SimpleLanguageServer server, ICompletionEngine engine, LazyCompletionResolver resolver) { + public VscodeCompletionEngineAdapter(SimpleLanguageServer server, ICompletionEngine engine, LazyCompletionResolver resolver, Optional filter) { this.server = server; this.engine = engine; this.resolver = resolver; + this.filter = filter; } public void setMaxCompletions(int maxCompletions) { @@ -139,8 +140,10 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { // using reactive style? If not then this is overkill could just as well use // only standard Java API such as Executor and CompletableFuture directly. int offset = doc.toOffset(params.getPosition()); - List completions = new ArrayList<>(engine.getCompletions(doc, offset)); + List completions = filter(engine.getCompletions(doc, offset)); + Collections.sort(completions, ScoreableProposal.COMPARATOR); + CompletionList list = new CompletionList(); list.setIsIncomplete(false); List items = new ArrayList<>(completions.size()); @@ -185,6 +188,22 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { return item; } + private List filter(Collection completions) { + if (filter.isPresent()) { + List filtered = new ArrayList<>(completions.size()); + CompletionFilter filterVal = filter.get(); + for (ICompletionProposal proposal : completions) { + if (filterVal.include(proposal)) { + filtered.add(proposal); + } + } + return filtered; + } + else { + return new ArrayList<>(completions); + } + } + private static void resolveItem(TextDocument doc, ICompletionProposal completion, CompletionItem item) throws Exception { MarkupContent content = new MarkupContent(); content.setKind(MarkupKind.MARKDOWN); @@ -281,4 +300,17 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { resolver.resolveNow(unresolved); return unresolved; } + + @FunctionalInterface + public interface CompletionFilter { + + /** + * + * @param proposal + * @return true if proposal should be included from completion list. False + * otherwise + */ + boolean include(ICompletionProposal proposal); + + } } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index a8c19a1be..f9e60c20e 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; @@ -60,6 +61,7 @@ import org.springframework.ide.vscode.commons.languageserver.STS4LanguageClient; import org.springframework.ide.vscode.commons.languageserver.Sts4LanguageServer; 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.completion.VscodeCompletionEngineAdapter.CompletionFilter; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter.LazyCompletionResolver; import org.springframework.ide.vscode.commons.languageserver.jdt.ls.ClasspathListener; import org.springframework.ide.vscode.commons.languageserver.jdt.ls.ClasspathListenerManager; @@ -149,13 +151,15 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC })); private ClasspathListenerManager classpathListenerManager; + private Optional completionFilter = Optional.empty(); + @Override public void connect(LanguageClient _client) { this.client = (STS4LanguageClient) _client; } - public VscodeCompletionEngineAdapter createCompletionEngineAdapter(SimpleLanguageServer server, ICompletionEngine engine) { - return new VscodeCompletionEngineAdapter(server, engine, completionResolver); + public VscodeCompletionEngineAdapter createCompletionEngineAdapter(ICompletionEngine engine) { + return new VscodeCompletionEngineAdapter(this, engine, completionResolver, completionFilter); } protected LazyCompletionResolver createCompletionResolver() { @@ -696,4 +700,8 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC public void setDiagnosticSeverityProvider(DiagnosticSeverityProvider severities) { this.severityProvider = severities; } + + public void setCompletionFilter(Optional completionFilter) { + this.completionFilter = completionFilter; + } } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java index 3c5643647..5a63dc74a 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java @@ -63,6 +63,7 @@ public class YamlCompletionEngine implements ICompletionEngine { protected final YamlStructureProvider structureProvider; private YamlCompletionEngineOptions options; + public YamlCompletionEngine(YamlStructureProvider structureProvider, YamlAssistContextProvider contextProvider, YamlCompletionEngineOptions options) { this.options = options; Assert.isNotNull(structureProvider); @@ -478,5 +479,4 @@ public class YamlCompletionEngine implements ICompletionEngine { throw new IllegalStateException("Missing case"); } } - } diff --git a/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoConf.java b/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoConf.java index ac3b640a4..3790b62bd 100644 --- a/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoConf.java +++ b/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoConf.java @@ -21,6 +21,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter.CompletionFilter; import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerInitializer; import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerProperties; import org.springframework.ide.vscode.commons.languageserver.reconcile.DiagnosticSeverityProvider; @@ -42,13 +43,15 @@ public class LanguageServerAutoConf { @ConditionalOnMissingBean @Bean public SimpleLanguageServer languageServer( LanguageServerProperties props, - Optional severities + Optional severities, + Optional completionFilter ) throws Exception { SimpleLanguageServer server = new SimpleLanguageServer(props.getExtensionId()); + server.setCompletionFilter(completionFilter); severities.ifPresent(server::setDiagnosticSeverityProvider); return server; } - + @ConditionalOnBean({LanguageServerInitializer.class, SimpleLanguageServer.class}) @Bean InitializingBean initializer(SimpleLanguageServer server, LanguageServerInitializer serverInit) { diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerBootApp.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerBootApp.java index d8b04ba11..6f1d0fca5 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerBootApp.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerBootApp.java @@ -31,10 +31,6 @@ public class ConcourseLanguageServerBootApp { return SERVER_NAME; } - @Bean ConcourseLanguageServerInitializer languageServer(GithubInfoProvider github) { - return new ConcourseLanguageServerInitializer(github); - } - @Bean GithubInfoProvider github() { return new DefaultGithubInfoProvider(); } diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java index 6fed2b76a..1f695d659 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java @@ -13,14 +13,12 @@ package org.springframework.ide.vscode.concourse; import java.util.List; import org.eclipse.lsp4j.CompletionList; -import org.eclipse.lsp4j.DiagnosticSeverity; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; -import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerInitializer; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; -import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; -import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; @@ -35,27 +33,23 @@ import org.springframework.ide.vscode.commons.yaml.hover.YamlHoverInfoProvider; import org.springframework.ide.vscode.commons.yaml.quickfix.YamlQuickfixes; import org.springframework.ide.vscode.commons.yaml.reconcile.TypeBasedYamlSymbolHandler; import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaBasedReconcileEngine; -import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema; import org.springframework.ide.vscode.commons.yaml.snippet.SchemaBasedSnippetGenerator; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; import org.springframework.ide.vscode.concourse.github.GithubInfoProvider; import org.springframework.stereotype.Component; -import org.springframework.util.Assert; import com.google.common.collect.ImmutableList; import reactor.core.publisher.Mono; @Component -public class ConcourseLanguageServerInitializer implements LanguageServerInitializer { +public class ConcourseLanguageServerInitializer implements InitializingBean { private final YamlCompletionEngineOptions COMPLETION_OPTIONS = YamlCompletionEngineOptions.DEFAULT; - private final GithubInfoProvider github; private final YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; - private SimpleLanguageServer server; private ConcourseModel models; private SchemaSpecificPieces forPipelines; @@ -63,9 +57,8 @@ public class ConcourseLanguageServerInitializer implements LanguageServerInitial private YamlQuickfixes yamlQuickfixes; private YamlASTProvider currentAsts; - public ConcourseLanguageServerInitializer(GithubInfoProvider github) { - this.github = github; - } + @Autowired private SimpleLanguageServer server; + @Autowired private GithubInfoProvider github; private class SchemaSpecificPieces { @@ -77,7 +70,7 @@ public class ConcourseLanguageServerInitializer implements LanguageServerInitial SchemaSpecificPieces(YamlSchema schema, List definitionTypes) { SchemaBasedYamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider, COMPLETION_OPTIONS); - this.completionEngine = server.createCompletionEngineAdapter(server, yamlCompletionEngine); + this.completionEngine = server.createCompletionEngineAdapter(yamlCompletionEngine); HoverInfoProvider infoProvider = new YamlHoverInfoProvider(currentAsts, structureProvider, contextProvider); this.hoverEngine = new VscodeHoverEngineAdapter(server, infoProvider); @@ -104,9 +97,7 @@ public class ConcourseLanguageServerInitializer implements LanguageServerInitial } @Override - public void initialize(SimpleLanguageServer server) throws Exception { - Assert.isNull(this.server, "This initializer should only be used once"); - this.server = server; + public void afterPropertiesSet() throws Exception { this.models = new ConcourseModel(server); this.currentAsts = models.getAstCache().getAstProvider(false); PipelineYmlSchema pipelineSchema = new PipelineYmlSchema(models, github); diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerBootApp.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerBootApp.java index 4e233b01b..8bbab3df7 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerBootApp.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerBootApp.java @@ -13,7 +13,9 @@ package org.springframework.ide.vscode.manifest.yaml; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter.CompletionFilter; import org.springframework.ide.vscode.commons.util.LogRedirect; +import org.springframework.ide.vscode.commons.util.Unicodes; @SpringBootApplication public class ManifestYamlLanguageServerBootApp { @@ -28,4 +30,18 @@ public class ManifestYamlLanguageServerBootApp { @Bean public String serverName() { return SERVER_NAME; } + + @Bean + public CompletionFilter completionFilter() { + return (proposal) -> { + // Exclude proposals that start with an arrow due to this bug: + // PT 162292472 + if (proposal != null && + (proposal.getLabel().startsWith(Unicodes.RIGHT_ARROW+"") || + proposal.getLabel().startsWith(Unicodes.LEFT_ARROW+""))) { + return false; + } + return true; + }; + } } diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java index d75fe7319..1ee4d68d3 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java @@ -13,9 +13,11 @@ package org.springframework.ide.vscode.manifest.yaml; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.concurrent.Callable; import java.util.stream.Collectors; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ide.vscode.commons.cloudfoundry.client.ClientTimeouts; import org.springframework.ide.vscode.commons.cloudfoundry.client.CloudFoundryClientFactory; @@ -27,7 +29,7 @@ import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.Clien import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.NoTargetsException; import org.springframework.ide.vscode.commons.cloudfoundry.client.v2.DefaultCloudFoundryClientFactoryV2; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; -import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerInitializer; +import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter.CompletionFilter; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; @@ -51,14 +53,13 @@ import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaBasedReco import org.springframework.ide.vscode.commons.yaml.schema.YValueHint; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; import org.springframework.stereotype.Component; -import org.springframework.util.Assert; import org.yaml.snakeyaml.Yaml; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @Component -public class ManifestYamlLanguageServerInitializer implements LanguageServerInitializer { +public class ManifestYamlLanguageServerInitializer implements InitializingBean { private Yaml yaml = new Yaml(); private CfJson cfJson = new CfJson(); @@ -67,12 +68,11 @@ public class ManifestYamlLanguageServerInitializer implements LanguageServerInit private CloudFoundryClientFactory cfClientFactory; ClientParamsProvider defaultClientParamsProvider; - private SimpleLanguageServer server; + + @Autowired private SimpleLanguageServer server; @Override - public void initialize(SimpleLanguageServer server) throws Exception { - Assert.isNull(this.server, "This initializer should only be called once"); - this.server = server; + public void afterPropertiesSet() throws Exception { this.cfTargetCache = new CFTargetCache(ImmutableList.of(this.defaultClientParamsProvider), cfClientFactory, new ClientTimeouts()); SimpleTextDocumentService documents = server.getTextDocumentService(); @@ -85,7 +85,7 @@ public class ManifestYamlLanguageServerInitializer implements LanguageServerInit YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider, YamlCompletionEngineOptions.DEFAULT); - VscodeCompletionEngineAdapter completionEngine = server.createCompletionEngineAdapter(server, yamlCompletionEngine); + VscodeCompletionEngineAdapter completionEngine = server.createCompletionEngineAdapter(yamlCompletionEngine); HoverInfoProvider infoProvider = new YamlHoverInfoProvider(parser, structureProvider, contextProvider); HoverHandler hoverEngine = new VscodeHoverEngineAdapter(server, infoProvider); YamlQuickfixes quickfixes = new YamlQuickfixes(server.getQuickfixRegistry(), server.getTextDocumentService(), structureProvider); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java index 074246817..74e8b294e 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java @@ -19,9 +19,7 @@ import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents import org.springframework.ide.vscode.boot.java.links.JavaElementLocationProvider; import org.springframework.ide.vscode.boot.java.links.SourceLinks; import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache; -import org.springframework.ide.vscode.boot.metadata.AdHocSpringPropertyIndexProvider; import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexProvider; -import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; @@ -48,6 +46,7 @@ public class BootLanguageServerInitializer implements InitializingBean { @Autowired YamlASTProvider parser; @Autowired YamlStructureProvider yamlStructureProvider; @Autowired YamlAssistContextProvider yamlAssistContextProvider; + @Qualifier("adHocProperties") @Autowired ProjectBasedPropertyIndexProvider adHocProperties; private CompositeLanguageServerComponents components; @@ -87,7 +86,7 @@ public class BootLanguageServerInitializer implements InitializingBean { ICompletionEngine completionEngine = components.getCompletionEngine(); if (completionEngine!=null) { - completionEngineAdapter = server.createCompletionEngineAdapter(server, completionEngine); + completionEngineAdapter = server.createCompletionEngineAdapter(completionEngine); completionEngineAdapter.setMaxCompletions(100); documents.onCompletion(completionEngineAdapter::getCompletions); documents.onCompletionResolve(completionEngineAdapter::resolveCompletion); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java index b33072c19..d49535fa7 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/BootPropertiesLanguageServerComponents.java @@ -75,6 +75,7 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom private final SimpleLanguageServer server; private YamlASTProvider parser; + public BootPropertiesLanguageServerComponents( SimpleLanguageServer server, BootLanguageServerParams serverParams,