PT 162292472 - Disable arrow completions and other LS changes

This commit is contained in:
nsingh
2018-11-28 16:56:15 -08:00
parent 21b06df305
commit 4164427d12
11 changed files with 93 additions and 48 deletions

View File

@@ -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<CloudConfigModel> cloudConfigProvider;
private DynamicModelProvider<StemcellsModel> stemcellsProvider;
private DynamicModelProvider<ReleasesModel> 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);

View File

@@ -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<CompletionFilter> 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<CompletionFilter> 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<ICompletionProposal> completions = new ArrayList<>(engine.getCompletions(doc, offset));
List<ICompletionProposal> completions = filter(engine.getCompletions(doc, offset));
Collections.sort(completions, ScoreableProposal.COMPARATOR);
CompletionList list = new CompletionList();
list.setIsIncomplete(false);
List<CompletionItem> items = new ArrayList<>(completions.size());
@@ -185,6 +188,22 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine {
return item;
}
private List<ICompletionProposal> filter(Collection<ICompletionProposal> completions) {
if (filter.isPresent()) {
List<ICompletionProposal> 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);
}
}

View File

@@ -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> 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> completionFilter) {
this.completionFilter = completionFilter;
}
}

View File

@@ -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");
}
}
}

View File

@@ -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<DiagnosticSeverityProvider> severities
Optional<DiagnosticSeverityProvider> severities,
Optional<CompletionFilter> 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) {

View File

@@ -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();
}

View File

@@ -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<YType> 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);

View File

@@ -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;
};
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -75,6 +75,7 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom
private final SimpleLanguageServer server;
private YamlASTProvider parser;
public BootPropertiesLanguageServerComponents(
SimpleLanguageServer server,
BootLanguageServerParams serverParams,