From 393a257090ea819c6faa45bf1cb0d854bf853819 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Sat, 3 Oct 2020 11:10:25 -0700 Subject: [PATCH] Boofity: Spring yaml and properties completion engine --- .../completion/CompositeCompletionEngine.java | 2 +- .../boot/app/BootLanguagServerBootApp.java | 21 +++++++++++ .../boot/app/ProblemSeverityConfigurer.java | 1 - ...ootPropertiesLanguageServerComponents.java | 34 ------------------ .../SpringPropertiesCompletionEngine.java | 13 +++++-- .../SpringYamlCompletionEngine.java | 36 +++++++++++++++++++ 6 files changed, 69 insertions(+), 38 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/SpringYamlCompletionEngine.java diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/CompositeCompletionEngine.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/CompositeCompletionEngine.java index 04acfed99..bc4a238e4 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/CompositeCompletionEngine.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/CompositeCompletionEngine.java @@ -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 languages = ((LanguageSpecific)engine).supportedLanguages(); Assert.isLegal(!languages.isEmpty(), "Completion engine that doesn't support any language"); for (LanguageId languageId : languages) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java index 53cf67e9c..38caaf1c4 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java @@ -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: diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java index a4a11738f..b92a2a517 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java @@ -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)); } 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 9b8a38d04..99cd8658d 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 @@ -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 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); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/SpringPropertiesCompletionEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/SpringPropertiesCompletionEngine.java index 096698a6a..119ac9cf0 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/SpringPropertiesCompletionEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/SpringPropertiesCompletionEngine.java @@ -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 supportedLanguages() { + return ImmutableList.of(LanguageId.BOOT_PROPERTIES); + } + } \ No newline at end of file diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/SpringYamlCompletionEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/SpringYamlCompletionEngine.java new file mode 100644 index 000000000..7cb78270f --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/SpringYamlCompletionEngine.java @@ -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 supportedLanguages() { + return ImmutableList.of(LanguageId.BOOT_PROPERTIES_YAML); + } + +}