From 812c2cab44f3abe8fdc0d9e78651f4ffdfd7c79c Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Sun, 12 May 2019 19:11:54 +0200 Subject: [PATCH] rolling out content-assist for Spring XML config files to a lot more elements and attributes --- .../app/XmlBeansConfigDefinitionHandler.java | 3 -- .../boot/xml/SpringXMLCompletionEngine.java | 36 ++++++++++++++-- .../vscode/boot/xml/XmlConfigConstants.java | 42 +++++++++++++++---- .../hyperlinks/BeanRefHyperlinkProvider.java | 2 - .../hyperlinks/JavaTypeHyperlinkProvider.java | 2 - .../PropertyNameHyperlinkProvider.java | 2 - .../xml/hyperlinks/XMLHyperlinkProvider.java | 2 - 7 files changed, 68 insertions(+), 21 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/XmlBeansConfigDefinitionHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/XmlBeansConfigDefinitionHandler.java index 0659b5473..c86ff495f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/XmlBeansConfigDefinitionHandler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/XmlBeansConfigDefinitionHandler.java @@ -51,9 +51,7 @@ import org.springframework.stereotype.Component; import com.google.common.collect.ImmutableList; /** - * * @author Alex Boyko - * */ @Component public class XmlBeansConfigDefinitionHandler implements DefinitionHandler, LanguageSpecific { @@ -78,7 +76,6 @@ public class XmlBeansConfigDefinitionHandler implements DefinitionHandler, Langu hyperlinkProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, BEAN_ELEMENT, CLASS_ATTRIBUTE), Arrays.asList(new JavaTypeHyperlinkProvider(projectFinder, locationProvider))); hyperlinkProviders.put(new XMLElementKey(BEANS_NAMESPACE, BEAN_ELEMENT, PROPERTY_ELEMENT, NAME_ATTRIBUTE), Arrays.asList(new PropertyNameHyperlinkProvider(projectFinder, locationProvider))); hyperlinkProviders.put(new XMLElementKey(BEANS_NAMESPACE, BEAN_ELEMENT, PROPERTY_ELEMENT, REF_ATTRIBUTE), Arrays.asList(new BeanRefHyperlinkProvider(projectFinder, symbolIndex, documents))); - } @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java index 3d8b37f6a..8b31fea70 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java @@ -49,9 +49,39 @@ public class SpringXMLCompletionEngine implements ICompletionEngine { this.config = config; this.completionProviders = new HashMap<>(); - this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, BEAN_ELEMENT, CLASS_ATTRIBUTE), new TypeCompletionProposalProvider(server, projectFinder, true, true, false, false)); - this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, BEAN_ELEMENT, PROPERTY_ELEMENT, NAME_ATTRIBUTE), new PropertyNameCompletionProposalProvider(projectFinder)); - this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, BEAN_ELEMENT, PROPERTY_ELEMENT, REF_ATTRIBUTE), new BeanRefCompletionProposalProvider(projectFinder, symbolIndex)); + + TypeCompletionProposalProvider classesOnlyProvider = new TypeCompletionProposalProvider(server, projectFinder, true, true, false, false); + TypeCompletionProposalProvider classesAndInterfacesProvider = new TypeCompletionProposalProvider(server, projectFinder, true, true, true, false); + TypeCompletionProposalProvider packagesProvider = new TypeCompletionProposalProvider(server, projectFinder, true, false, false, false); + + BeanRefCompletionProposalProvider beanRefProvider = new BeanRefCompletionProposalProvider(projectFinder, symbolIndex); + PropertyNameCompletionProposalProvider propertyNameProvider = new PropertyNameCompletionProposalProvider(projectFinder); + + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, BEAN_ELEMENT, CLASS_ATTRIBUTE), classesOnlyProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, CONSTRUCTOR_ARG_ELEMENT, TYPE_ATTRIBUTE), classesAndInterfacesProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, ARG_TYPE_ELEMENT, MATCH_ATTRIBUTE), classesAndInterfacesProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, VALUE_ELEMENT, TYPE_ATTRIBUTE), classesAndInterfacesProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, null, VALUE_TYPE_ATTRIBUTE), classesAndInterfacesProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, null, KEY_TYPE_ATTRIBUTE), classesAndInterfacesProvider); + + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, BEAN_ELEMENT, PARENT_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, BEAN_ELEMENT, DEPENDS_ON_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, BEAN_ELEMENT, FACTORY_BEAN_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, REF_ELEMENT, BEAN_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, IDREF_ELEMENT, BEAN_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, CONSTRUCTOR_ARG_ELEMENT, REF_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, ALIAS_ELEMENT, NAME_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, REPLACED_METHOD_ELEMENT, REPLACER_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, ENTRY_ELEMENT, VALUE_REF_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, ENTRY_ELEMENT, KEY_REF_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, null, LOOKUP_METHOD_ELEMENT, BEAN_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, BEAN_ELEMENT, PROPERTY_ELEMENT, REF_ATTRIBUTE), beanRefProvider); + + this.completionProviders.put(new XMLElementKey(BEANS_NAMESPACE, BEAN_ELEMENT, PROPERTY_ELEMENT, NAME_ATTRIBUTE), propertyNameProvider); + + this.completionProviders.put(new XMLElementKey(CONTEXT_NAMESPACE, null, COMPONENT_SCAN_ELEMENT, BASE_PACKAGE_ATTRIBUTE), packagesProvider); + this.completionProviders.put(new XMLElementKey(CONTEXT_NAMESPACE, null, COMPONENT_SCAN_ELEMENT, NAME_GENERATOR_ATTRIBUTE), beanRefProvider); + this.completionProviders.put(new XMLElementKey(CONTEXT_NAMESPACE, null, COMPONENT_SCAN_ELEMENT, SCOPE_RESOLVER_ATTRIBUTE), beanRefProvider); } @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/XmlConfigConstants.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/XmlConfigConstants.java index fa46f20f2..cb795b048 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/XmlConfigConstants.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/XmlConfigConstants.java @@ -11,19 +11,47 @@ package org.springframework.ide.vscode.boot.xml; /** - * * @author Alex Boyko - * */ public class XmlConfigConstants { public static final String BEANS_NAMESPACE = "http://www.springframework.org/schema/beans"; + + public static final String BEAN_ELEMENT = "bean"; + public static final String CONSTRUCTOR_ARG_ELEMENT = "constructor-arg"; + public static final String ARG_TYPE_ELEMENT = "arg-type"; + public static final String VALUE_ELEMENT = "value"; + public static final String PROPERTY_ELEMENT = "property"; + public static final String REF_ELEMENT = "ref"; + public static final String IDREF_ELEMENT = "idref"; + public static final String ALIAS_ELEMENT = "alias"; + public static final String REPLACED_METHOD_ELEMENT = "replaced-method"; + public static final String ENTRY_ELEMENT = "entry"; + public static final String LOOKUP_METHOD_ELEMENT = "lookup-method"; + + public static final String CLASS_ATTRIBUTE = "class"; + public static final String TYPE_ATTRIBUTE = "type"; + public static final String NAME_ATTRIBUTE = "name"; + public static final String REF_ATTRIBUTE = "ref"; + public static final String MATCH_ATTRIBUTE = "match"; + public static final String VALUE_TYPE_ATTRIBUTE = "value-type"; + public static final String KEY_TYPE_ATTRIBUTE = "key-type"; + public static final String PARENT_ATTRIBUTE = "parent"; + public static final String DEPENDS_ON_ATTRIBUTE = "depends-on"; + public static final String FACTORY_BEAN_ATTRIBUTE = "factory-bean"; + public static final String BEAN_ATTRIBUTE = "bean"; + public static final String REPLACER_ATTRIBUTE = "replacer"; + public static final String VALUE_REF_ATTRIBUTE = "value-ref"; + public static final String KEY_REF_ATTRIBUTE = "key-ref"; + public static final String LOCAL_ATTRIBUTE = "local"; - public static final String BEAN_ELEMENT = "bean"; - public static final String CLASS_ATTRIBUTE = "class"; - public static final String PROPERTY_ELEMENT = "property"; - public static final String NAME_ATTRIBUTE = "name"; - public static final String REF_ATTRIBUTE = "ref"; + public static final String CONTEXT_NAMESPACE = "http://www.springframework.org/schema/context"; + + public static final String COMPONENT_SCAN_ELEMENT = "component-scan"; + public static final String BASE_PACKAGE_ATTRIBUTE = "base-package"; + public static final String NAME_GENERATOR_ATTRIBUTE = "name-generator"; + public static final String SCOPE_RESOLVER_ATTRIBUTE = "scope-resolver"; + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/BeanRefHyperlinkProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/BeanRefHyperlinkProvider.java index 1424fe7ef..8c5ce1520 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/BeanRefHyperlinkProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/BeanRefHyperlinkProvider.java @@ -28,9 +28,7 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocu import org.springframework.ide.vscode.commons.util.text.TextDocument; /** - * * @author Alex Boyko - * */ public class BeanRefHyperlinkProvider implements XMLHyperlinkProvider { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/JavaTypeHyperlinkProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/JavaTypeHyperlinkProvider.java index 75b41208a..666ddd941 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/JavaTypeHyperlinkProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/JavaTypeHyperlinkProvider.java @@ -22,9 +22,7 @@ import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFin import org.springframework.ide.vscode.commons.util.text.TextDocument; /** - * * @author Alex Boyko - * */ public class JavaTypeHyperlinkProvider implements XMLHyperlinkProvider { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/PropertyNameHyperlinkProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/PropertyNameHyperlinkProvider.java index 7e0dd9b09..566957a0e 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/PropertyNameHyperlinkProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/PropertyNameHyperlinkProvider.java @@ -22,9 +22,7 @@ import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFin import org.springframework.ide.vscode.commons.util.text.TextDocument; /** - * * @author Alex Boyko - * */ public class PropertyNameHyperlinkProvider implements XMLHyperlinkProvider { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/XMLHyperlinkProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/XMLHyperlinkProvider.java index a8315fbd0..046585d3b 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/XMLHyperlinkProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/hyperlinks/XMLHyperlinkProvider.java @@ -16,9 +16,7 @@ import org.eclipse.lsp4xml.dom.DOMNode; import org.springframework.ide.vscode.commons.util.text.TextDocument; /** - * * @author Alex Boyko - * */ public interface XMLHyperlinkProvider {