Boofity: Spring yaml and properties completion engine

This commit is contained in:
Kris De Volder
2020-10-03 11:10:25 -07:00
parent a23cf242f8
commit 393a257090
6 changed files with 69 additions and 38 deletions

View File

@@ -41,7 +41,7 @@ public class CompositeCompletionEngine implements ICompletionEngine {
}
public void add(ICompletionEngine engine) {
Assert.isLegal(engine instanceof LanguageSpecific, "Only LanguageSpecific completion engines are currently supported");
Assert.isLegal(engine instanceof LanguageSpecific, "Only LanguageSpecific completion engines are currently supported "+engine.getClass().getName());
Collection<LanguageId> languages = ((LanguageSpecific)engine).supportedLanguages();
Assert.isLegal(!languages.isEmpty(), "Completion engine that doesn't support any language");
for (LanguageId languageId : languages) {

View File

@@ -45,9 +45,13 @@ import org.springframework.ide.vscode.boot.metadata.ClassReferenceProvider;
import org.springframework.ide.vscode.boot.metadata.LoggerNameProvider;
import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexProvider;
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndex;
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider;
import org.springframework.ide.vscode.boot.metadata.ValueProviderRegistry;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtilProvider;
import org.springframework.ide.vscode.boot.properties.completions.SpringPropertiesCompletionEngine;
import org.springframework.ide.vscode.boot.xml.SpringXMLCompletionEngine;
import org.springframework.ide.vscode.boot.yaml.completions.ApplicationYamlAssistContext;
import org.springframework.ide.vscode.boot.yaml.completions.SpringYamlCompletionEngine;
import org.springframework.ide.vscode.commons.languageserver.LanguageServerRunner;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentEventListenerManager;
@@ -60,6 +64,8 @@ import org.springframework.ide.vscode.commons.yaml.ast.YamlASTProvider;
import org.springframework.ide.vscode.commons.yaml.ast.YamlParser;
import org.springframework.ide.vscode.commons.yaml.completion.YamlAssistContext;
import org.springframework.ide.vscode.commons.yaml.completion.YamlAssistContextProvider;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngine;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngineOptions;
import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument;
import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider;
import org.springframework.ide.vscode.languageserver.starter.LanguageServerAutoConf;
@@ -150,6 +156,21 @@ public class BootLanguagServerBootApp {
return new SpringXMLCompletionEngine(server, projectFinder, symbolIndex, config);
}
@Bean SpringPropertiesCompletionEngine propertiesCompletionEngine(BootLanguageServerParams params, JavaProjectFinder projectFinder, SourceLinks sourceLinks) {
return new SpringPropertiesCompletionEngine(
params.indexProvider,
params.typeUtilProvider,
projectFinder, sourceLinks);
}
@Bean YamlCompletionEngine yamlCompletionEngine(YamlStructureProvider structureProvider, YamlAssistContextProvider contextProvider) {
YamlCompletionEngineOptions options = new YamlCompletionEngineOptions() {
@Override
public boolean includeDeindentedProposals() { return false; };
};
return new SpringYamlCompletionEngine(structureProvider, contextProvider, options);
}
@Bean JavaDocumentUriProvider javaDocumentUriProvider() {
switch (LspClient.currentClient()) {
case ECLIPSE:

View File

@@ -47,7 +47,6 @@ public class ProblemSeverityConfigurer implements InitializingBean {
Settings problemConf = settings.navigate(editorType);
for (String code : problemConf.keys()) {
String severity = problemConf.getString(code);
System.out.println(code+" => "+severity);
Assert.isLegal(!severityOverrides.containsKey(code), "Multpile entries for problem type "+code);
severityOverrides.put(code, ProblemSeverity.valueOf(severity));
}

View File

@@ -18,33 +18,26 @@ import org.springframework.ide.vscode.boot.java.links.JavaElementLocationProvide
import org.springframework.ide.vscode.boot.java.links.SourceLinks;
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtilProvider;
import org.springframework.ide.vscode.boot.properties.completions.SpringPropertiesCompletionEngine;
import org.springframework.ide.vscode.boot.properties.hover.PropertiesHoverInfoProvider;
import org.springframework.ide.vscode.boot.properties.quickfix.AppPropertiesQuickFixes;
import org.springframework.ide.vscode.boot.properties.quickfix.CommonQuickfixes;
import org.springframework.ide.vscode.boot.properties.reconcile.SpringPropertiesReconcileEngine;
import org.springframework.ide.vscode.boot.yaml.quickfix.AppYamlQuickfixes;
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.composable.LanguageServerComponents;
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.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.SimpleLanguageServer;
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.completion.YamlAssistContextProvider;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngine;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngineOptions;
import org.springframework.ide.vscode.commons.yaml.hover.YamlHoverInfoProvider;
import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
/**
@@ -63,12 +56,7 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom
LanguageId.BOOT_PROPERTIES_YAML
);
private static final YamlCompletionEngineOptions COMPLETION_OPTIONS = new YamlCompletionEngineOptions() {
@Override
public boolean includeDeindentedProposals() { return false; };
};
// Shared:
private final ProjectObserver projectObserver;
private final JavaProjectFinder javaProjectFinder;
private final SpringPropertyIndexProvider indexProvider;
private final TypeUtilProvider typeUtilProvider;
@@ -96,7 +84,6 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom
this.indexProvider = serverParams.indexProvider;
this.typeUtilProvider = serverParams.typeUtilProvider;
this.javaProjectFinder = serverParams.projectFinder;
this.projectObserver = serverParams.projectObserver;
this.yamlStructureProvider = yamlStructureProvider;
this.yamlAssistContextProvider = yamlAssistContextProvider;
this.sourceLinks = sourceLinks;
@@ -126,27 +113,6 @@ public class BootPropertiesLanguageServerComponents implements LanguageServerCom
return LANGUAGES;
}
@Override
public Optional<ICompletionEngine> getCompletionEngine() {
ICompletionEngine propertiesCompletions = new SpringPropertiesCompletionEngine(indexProvider, typeUtilProvider, javaProjectFinder, sourceLinks);
ICompletionEngine yamlCompletions = new YamlCompletionEngine(yamlStructureProvider, yamlAssistContextProvider, COMPLETION_OPTIONS);
return Optional.of((TextDocument document, int offset) -> {
String uri = document.getUri();
if (uri!=null) {
if (uri.endsWith(PROPERTIES)) {
return propertiesCompletions.getCompletions(document, offset);
} else {
for (String yml : YML) {
if (uri.endsWith(yml)) {
return yamlCompletions.getCompletions(document, offset);
}
}
}
}
return ImmutableList.of();
});
}
@Override
public HoverHandler getHoverProvider() {
HoverInfoProvider propertiesHovers = new PropertiesHoverInfoProvider(indexProvider, typeUtilProvider, javaProjectFinder, sourceLinks);

View File

@@ -20,13 +20,17 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeUtilProvider;
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.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.util.LanguageSpecific;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.TextDocument;;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;;
/**
* @author Kris De Volder
*/
public class SpringPropertiesCompletionEngine implements ICompletionEngine {
public class SpringPropertiesCompletionEngine implements ICompletionEngine, LanguageSpecific {
private boolean preferLowerCaseEnums = true; //might make sense to make this user configurable
@@ -63,4 +67,9 @@ public class SpringPropertiesCompletionEngine implements ICompletionEngine {
this.preferLowerCaseEnums = preferLowerCaseEnums;
}
@Override
public Collection<LanguageId> supportedLanguages() {
return ImmutableList.of(LanguageId.BOOT_PROPERTIES);
}
}

View File

@@ -0,0 +1,36 @@
/*******************************************************************************
* Copyright (c) 2015, 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
* https://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.boot.yaml.completions;
import java.util.Collection;
import org.springframework.ide.vscode.commons.languageserver.util.LanguageSpecific;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.commons.yaml.completion.YamlAssistContextProvider;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngine;
import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngineOptions;
import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider;
import com.google.common.collect.ImmutableList;
public class SpringYamlCompletionEngine extends YamlCompletionEngine implements LanguageSpecific {
public SpringYamlCompletionEngine(YamlStructureProvider structureProvider,
YamlAssistContextProvider contextProvider, YamlCompletionEngineOptions options) {
super(structureProvider, contextProvider, options);
}
@Override
public Collection<LanguageId> supportedLanguages() {
return ImmutableList.of(LanguageId.BOOT_PROPERTIES_YAML);
}
}