diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index 280b74474..9cbeb5063 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -58,7 +58,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { }); ICompletionEngine bootCompletionEngine = new BootJavaCompletionEngine(javaProjectFinder, indexProvider); - completionEngine = new VscodeCompletionEngineAdapter(this, bootCompletionEngine); + completionEngine = createCompletionEngineAdapter(this, bootCompletionEngine); completionEngine.setMaxCompletions(100); documents.onCompletion(completionEngine::getCompletions); documents.onCompletionResolve(completionEngine::resolveCompletion); diff --git a/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java b/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java index 637b241e5..ad52baecb 100644 --- a/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java +++ b/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java @@ -112,7 +112,7 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { }); ICompletionEngine propertiesCompletionEngine = getCompletionEngine(); - completionEngine = new VscodeCompletionEngineAdapter(this, propertiesCompletionEngine); + completionEngine = createCompletionEngineAdapter(this, propertiesCompletionEngine); completionEngine.setMaxCompletions(100); documents.onCompletion(completionEngine::getCompletions); documents.onCompletionResolve(completionEngine::resolveCompletion); diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java index 31757f0cc..541970a8e 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java @@ -13,7 +13,6 @@ package org.springframework.ide.vscode.bosh; import org.springframework.ide.vscode.bosh.models.CloudConfigModel; import org.springframework.ide.vscode.bosh.models.DynamicModelProvider; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; -import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter.LazyCompletionResolver; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngine; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter; @@ -36,7 +35,6 @@ import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvid public class BoshLanguageServer extends SimpleLanguageServer { - private final LazyCompletionResolver completionResolver = new LazyCompletionResolver(); //Set to null to disable lazy resolving private final VscodeCompletionEngineAdapter completionEngine; public BoshLanguageServer(DynamicModelProvider cloudConfigProvider) { @@ -50,8 +48,7 @@ public class BoshLanguageServer extends SimpleLanguageServer { YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider, YamlCompletionEngineOptions.DEFAULT); - completionEngine = new VscodeCompletionEngineAdapter(this, yamlCompletionEngine); - completionEngine.setLazyCompletionResolver(completionResolver); + completionEngine = createCompletionEngineAdapter(this, yamlCompletionEngine); HoverInfoProvider infoProvider = new YamlHoverInfoProvider(asts.getAstProvider(true), structureProvider, contextProvider); VscodeHoverEngine hoverEngine = new VscodeHoverEngineAdapter(this, infoProvider); YamlQuickfixes quickfixes = new YamlQuickfixes(getQuickfixRegistry(), getTextDocumentService(), structureProvider); @@ -68,6 +65,7 @@ public class BoshLanguageServer extends SimpleLanguageServer { documents.onDefinition(new BoshDefintionFinder(this, schema, asts, astTypeCache)); } + private void validateOnDocumentChange(IReconcileEngine engine, TextDocument doc) { if (LanguageId.BOSH_DEPLOYMENT.equals(doc.getLanguageId())) { validateWith(doc.getId(), engine); @@ -76,11 +74,6 @@ public class BoshLanguageServer extends SimpleLanguageServer { } } - @Override - public boolean hasLazyCompletionResolver() { - return completionResolver!=null; - } - public BoshLanguageServer setMaxCompletions(int maxCompletions) { completionEngine.setMaxCompletions(maxCompletions); return this; 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 b4e466f66..71c2da1b0 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 @@ -72,6 +72,7 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { if (id!=null) { Consumer resolver = resolvers.get(id); if (resolver!=null) { + Log.info("Resolving lazy completion item: "+unresolved.getLabel()); resolver.accept(unresolved); unresolved.setData(null); //No longer needed after item is resolved. } else { @@ -91,12 +92,7 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { private SimpleLanguageServer server; private ICompletionEngine engine; - private LazyCompletionResolver resolver = null; - - public VscodeCompletionEngineAdapter(SimpleLanguageServer server, ICompletionEngine engine) { - this.server = server; - this.engine = engine; - } + private final LazyCompletionResolver resolver; /** * By setting a non-null {@link LazyCompletionResolver} you can enable lazy completion resolution. @@ -105,7 +101,9 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { * The resolver is injected rather than created locally to allow sharing it between multiple * engines. */ - public void setLazyCompletionResolver(LazyCompletionResolver resolver) { + public VscodeCompletionEngineAdapter(SimpleLanguageServer server, ICompletionEngine engine, LazyCompletionResolver resolver) { + this.server = server; + this.engine = engine; this.resolver = resolver; } 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 7eb4b7a8c..5b44fc190 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 @@ -39,6 +39,9 @@ import org.eclipse.lsp4j.services.LanguageServer; import org.springframework.ide.vscode.commons.languageserver.ProgressParams; import org.springframework.ide.vscode.commons.languageserver.ProgressService; import org.springframework.ide.vscode.commons.languageserver.STS4LanguageClient; +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.LazyCompletionResolver; import org.springframework.ide.vscode.commons.languageserver.quickfix.Quickfix; import org.springframework.ide.vscode.commons.languageserver.quickfix.Quickfix.QuickfixData; import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixEdit; @@ -72,6 +75,7 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl public final String EXTENSION_ID; private final String CODE_ACTION_COMMAND_ID; + protected final LazyCompletionResolver completionResolver = createCompletionResolver(); private Path workspaceRoot; @@ -103,6 +107,17 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl this.client = (STS4LanguageClient) _client; } + protected VscodeCompletionEngineAdapter createCompletionEngineAdapter(SimpleLanguageServer server, ICompletionEngine engine) { + return new VscodeCompletionEngineAdapter(server, engine, completionResolver); + } + + protected LazyCompletionResolver createCompletionResolver() { + if (!Boolean.getBoolean("lsp.lazy.completions.disable")) { + return new LazyCompletionResolver(); + } + return null; + } + protected synchronized QuickfixRegistry getQuickfixRegistry() { if (quickfixRegistry==null) { quickfixRegistry = new QuickfixRegistry(); @@ -233,8 +248,8 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl return c; } - public boolean hasLazyCompletionResolver() { - return false; + public final boolean hasLazyCompletionResolver() { + return completionResolver!=null; } private boolean hasDocumentSymbolHandler() { diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java index de3f8186b..614b7b08a 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java @@ -16,7 +16,6 @@ import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.CompletionList; import org.eclipse.lsp4j.DiagnosticSeverity; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; -import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter.LazyCompletionResolver; 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; @@ -53,7 +52,6 @@ public class ConcourseLanguageServer extends SimpleLanguageServer { private SchemaSpecificPieces forPipelines; private SchemaSpecificPieces forTasks; private final YamlQuickfixes yamlQuickfixes; - private final LazyCompletionResolver completionResolver = new LazyCompletionResolver(); //Set this to null to disable lazy completion resolving private class SchemaSpecificPieces { @@ -65,8 +63,7 @@ public class ConcourseLanguageServer extends SimpleLanguageServer { SchemaSpecificPieces(YamlSchema schema, List definitionTypes) { SchemaBasedYamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider, COMPLETION_OPTIONS); - this.completionEngine = new VscodeCompletionEngineAdapter(ConcourseLanguageServer.this, yamlCompletionEngine); - this.completionEngine.setLazyCompletionResolver(completionResolver); + this.completionEngine = createCompletionEngineAdapter(ConcourseLanguageServer.this, yamlCompletionEngine); HoverInfoProvider infoProvider = new YamlHoverInfoProvider(currentAsts, structureProvider, contextProvider); this.hoverEngine = new VscodeHoverEngineAdapter(ConcourseLanguageServer.this, infoProvider); @@ -84,11 +81,6 @@ public class ConcourseLanguageServer extends SimpleLanguageServer { } } - @Override - public boolean hasLazyCompletionResolver() { - return completionResolver!=null; - } - public ConcourseLanguageServer(YamlCompletionEngineOptions completionOptions) { super("vscode-concourse"); this.COMPLETION_OPTIONS = completionOptions; diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java index 9d6c057bf..b71f8596c 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java @@ -31,7 +31,6 @@ 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.completion.VscodeCompletionEngineAdapter.LazyCompletionResolver; import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngine; import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter; @@ -65,7 +64,6 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { private CFTargetCache cfTargetCache; private final CloudFoundryClientFactory cfClientFactory; private final CfClientConfig cfClientConfig; - private final LazyCompletionResolver completionResolver = new LazyCompletionResolver(); //Set to null to disable lazy resolving private final ImmutableSet FALLBACK_YML_IDS = ImmutableSet.of(LanguageId.of("yml"), LanguageId.of("yaml")); final private ClientParamsProvider defaultClientParamsProvider; @@ -89,8 +87,7 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider, YamlCompletionEngineOptions.DEFAULT); - VscodeCompletionEngineAdapter completionEngine = new VscodeCompletionEngineAdapter(this, yamlCompletionEngine); - completionEngine.setLazyCompletionResolver(completionResolver); + VscodeCompletionEngineAdapter completionEngine = createCompletionEngineAdapter(this, yamlCompletionEngine); HoverInfoProvider infoProvider = new YamlHoverInfoProvider(parser, structureProvider, contextProvider); VscodeHoverEngine hoverEngine = new VscodeHoverEngineAdapter(this, infoProvider); YamlQuickfixes quickfixes = new YamlQuickfixes(getQuickfixRegistry(), getTextDocumentService(), structureProvider); @@ -222,11 +219,6 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { }; } - @Override - public boolean hasLazyCompletionResolver() { - return completionResolver!=null; - } - private CFTargetCache getCfTargetCache() { if (cfTargetCache == null) { // Init CF client params provider if it's initilized