GH-1163: added basic content-assist to easily add common spring namespaces
This commit is contained in:
@@ -62,6 +62,7 @@ import org.springframework.ide.vscode.boot.app.SpringSymbolIndex;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.BeanRefCompletionProposalProvider;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.ConstructorArgNameCompletionProposalProvider;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.GenericXMLCompletionProposal;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.NamespaceCompletionProvider;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.PropertyNameCompletionProposalProvider;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.TypeCompletionProposalProvider;
|
||||
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
|
||||
@@ -85,7 +86,7 @@ public class SpringXMLCompletionEngine implements ICompletionEngine, LanguageSpe
|
||||
|
||||
private final Map<XMLElementKey, XMLCompletionProvider> completionProviders;
|
||||
private final BootJavaConfig config;
|
||||
|
||||
|
||||
public SpringXMLCompletionEngine(
|
||||
SimpleLanguageServer server,
|
||||
JavaProjectFinder projectFinder,
|
||||
@@ -180,6 +181,22 @@ public class SpringXMLCompletionEngine implements ICompletionEngine, LanguageSpe
|
||||
}
|
||||
}
|
||||
break;
|
||||
case AttributeName:
|
||||
if (scanner.getTokenOffset() <= offset && offset < scanner.getTokenEnd()) {
|
||||
if (node.getParentNode() != null && node.getParentNode() instanceof DOMDocument
|
||||
&& namespace.equals("http://www.springframework.org/schema/beans") && node.getNodeName().equals("beans")) {
|
||||
return NamespaceCompletionProvider.createNamespaceCompletionProposals(doc, offset, token, node);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Whitespace:
|
||||
if (scanner.getTokenOffset() <= offset && offset < scanner.getTokenEnd()) {
|
||||
if (node.getParentNode() != null && node.getParentNode() instanceof DOMDocument
|
||||
&& namespace.equals("http://www.springframework.org/schema/beans") && node.getNodeName().equals("beans")) {
|
||||
return NamespaceCompletionProvider.createNamespaceCompletionProposals(doc, offset, token, node);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -229,7 +246,7 @@ public class SpringXMLCompletionEngine implements ICompletionEngine, LanguageSpe
|
||||
|
||||
return completions;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Collection<LanguageId> supportedLanguages() {
|
||||
return ImmutableList.of(LanguageId.XML);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2019, 2020 Pivotal, Inc.
|
||||
* Copyright (c) 2019, 2024 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
|
||||
@@ -10,6 +10,9 @@
|
||||
*******************************************************************************/
|
||||
package org.springframework.ide.vscode.boot.xml.completions;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.eclipse.lsp4j.CompletionItemKind;
|
||||
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
|
||||
import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal;
|
||||
@@ -26,8 +29,14 @@ public class GenericXMLCompletionProposal extends ScoreableProposal {
|
||||
private final String detail;
|
||||
private final Renderable documentation;
|
||||
private final double score;
|
||||
private final String filterText;
|
||||
private final DocumentEdits additionalEdits;
|
||||
|
||||
public GenericXMLCompletionProposal(String label, CompletionItemKind kind, DocumentEdits edits, String detail, Renderable documentation, double score) {
|
||||
this(label, kind, edits, detail, documentation, score, label, null);
|
||||
}
|
||||
|
||||
public GenericXMLCompletionProposal(String label, CompletionItemKind kind, DocumentEdits edits, String detail, Renderable documentation, double score, String filterText, DocumentEdits additionalEdits) {
|
||||
super();
|
||||
this.label = label;
|
||||
this.kind = kind;
|
||||
@@ -35,6 +44,8 @@ public class GenericXMLCompletionProposal extends ScoreableProposal {
|
||||
this.detail = detail;
|
||||
this.documentation = documentation;
|
||||
this.score = score;
|
||||
this.filterText = filterText;
|
||||
this.additionalEdits = additionalEdits;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,5 +77,20 @@ public class GenericXMLCompletionProposal extends ScoreableProposal {
|
||||
public double getBaseScore() {
|
||||
return this.score;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFilterText() {
|
||||
return this.filterText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Supplier<DocumentEdits>> getAdditionalEdit() {
|
||||
if (this.additionalEdits != null) {
|
||||
return Optional.of(() -> additionalEdits);
|
||||
}
|
||||
else {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,218 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2024 Broadcom
|
||||
* 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:
|
||||
* Broadcom - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.springframework.ide.vscode.boot.xml.completions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
import org.eclipse.lemminx.dom.DOMAttr;
|
||||
import org.eclipse.lemminx.dom.DOMNode;
|
||||
import org.eclipse.lemminx.dom.DOMRange;
|
||||
import org.eclipse.lemminx.dom.parser.TokenType;
|
||||
import org.eclipse.lsp4j.CompletionItemKind;
|
||||
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
|
||||
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
|
||||
import org.springframework.ide.vscode.commons.languageserver.completion.IndentUtil;
|
||||
import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder;
|
||||
import org.springframework.ide.vscode.commons.util.Renderable;
|
||||
import org.springframework.ide.vscode.commons.util.Renderables;
|
||||
import org.springframework.ide.vscode.commons.util.text.TextDocument;
|
||||
|
||||
public class NamespaceCompletionProvider {
|
||||
|
||||
private static PrefixFinder PREFIX_FINDER = new PrefixFinder() {
|
||||
@Override
|
||||
protected boolean isPrefixChar(char c) {
|
||||
return Character.isAlphabetic(c) || c == ':';
|
||||
}
|
||||
};
|
||||
|
||||
public static Collection<ICompletionProposal> createNamespaceCompletionProposals(TextDocument doc, int offset, TokenType token, DOMNode node) {
|
||||
String prefix = PREFIX_FINDER.getPrefix(doc, offset);
|
||||
|
||||
if (prefix != null) {
|
||||
Collection<ICompletionProposal> result = new ArrayList<>();
|
||||
|
||||
NamespaceInformation[] namespaces = getNamespaces();
|
||||
for (NamespaceInformation namespace : namespaces) {
|
||||
if (namespace.getNamespaceURI().startsWith(prefix)) {
|
||||
result.add(createCompletionProposal(namespace, prefix, doc, offset, token, node));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
private static ICompletionProposal createCompletionProposal(NamespaceInformation namespace, String prefix, TextDocument doc, int offset, TokenType token, DOMNode node) {
|
||||
|
||||
IndentUtil indentUtil = new IndentUtil(doc);
|
||||
|
||||
// main edit (inserts the namespace attribute itself)
|
||||
DocumentEdits edits = new DocumentEdits(doc, false);
|
||||
String startIndent = indentUtil.getReferenceIndent(offset, doc);
|
||||
edits.replace(offset - prefix.length(), offset, namespace.getNamespaceURI() + "\n" + startIndent);
|
||||
|
||||
// additional edit (inserts the namespace location to an existing xsi:schemaLocation attribute)
|
||||
DocumentEdits additionalEdits = null;
|
||||
DOMAttr attributeNode = node.getAttributeNode("xsi:schemaLocation");
|
||||
if (attributeNode != null) {
|
||||
DOMRange range = attributeNode.getNodeAttrValue();
|
||||
|
||||
String locationIndent = indentUtil.getReferenceIndent(range.getEnd(), doc);
|
||||
String locationIndentAtStart = indentUtil.getReferenceIndent(range.getStart(), doc);
|
||||
|
||||
if (locationIndent.length() == locationIndentAtStart.length()) {
|
||||
locationIndent = locationIndent + locationIndent;
|
||||
}
|
||||
|
||||
String additionalInsertText = "\n"
|
||||
+ locationIndent
|
||||
+ namespace.getNamespaceLocation();
|
||||
|
||||
additionalEdits = new DocumentEdits(doc, false);
|
||||
additionalEdits.insert(range.getEnd() - 1, additionalInsertText);
|
||||
}
|
||||
|
||||
Renderable documentation = Renderables.text(namespace.getDetails());
|
||||
return new GenericXMLCompletionProposal(namespace.getLabel(), CompletionItemKind.Text, edits, namespace.getDetails(), documentation, 1.0d, namespace.getNamespaceURI(), additionalEdits);
|
||||
}
|
||||
|
||||
public static NamespaceInformation[] getNamespaces() {
|
||||
return NAMESPACES;
|
||||
}
|
||||
|
||||
public static class NamespaceInformation {
|
||||
|
||||
private final String label;
|
||||
private final String details;
|
||||
private final String namespaceURI;
|
||||
private final String namespaceLocation;
|
||||
|
||||
public NamespaceInformation(String label, String details, String namespaceURI,
|
||||
String namespaceLocation) {
|
||||
this.label = label;
|
||||
this.details = details;
|
||||
this.namespaceURI = namespaceURI;
|
||||
this.namespaceLocation = namespaceLocation;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public String getDetails() {
|
||||
return details;
|
||||
}
|
||||
|
||||
public String getNamespaceURI() {
|
||||
return namespaceURI;
|
||||
}
|
||||
|
||||
public String getNamespaceLocation() {
|
||||
return namespaceLocation;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final NamespaceInformation[] NAMESPACES = {
|
||||
|
||||
// core framework
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/beans",
|
||||
"http://www.springframework.org/schema/beans",
|
||||
"xmlns:beans=\"http://www.springframework.org/schema/beans\"",
|
||||
"http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/context",
|
||||
"http://www.springframework.org/schema/context",
|
||||
"xmlns:context=\"http://www.springframework.org/schema/context\"",
|
||||
"http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/tx",
|
||||
"http://www.springframework.org/schema/tx",
|
||||
"xmlns:tx=\"http://www.springframework.org/schema/tx\"",
|
||||
"http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/aop",
|
||||
"http://www.springframework.org/schema/aop",
|
||||
"xmlns:aop=\"http://www.springframework.org/schema/aop\"",
|
||||
"http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/oxm",
|
||||
"http://www.springframework.org/schema/oxm",
|
||||
"xmlns:oxm=\"http://www.springframework.org/schema/oxm\"",
|
||||
"http://www.springframework.org/schema/oxm https://www.springframework.org/schema/oxm/spring-oxm.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/jms",
|
||||
"http://www.springframework.org/schema/jms",
|
||||
"xmlns:jms=\"http://www.springframework.org/schema/jms\"",
|
||||
"http://www.springframework.org/schema/jms https://www.springframework.org/schema/jms/spring-jms.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/jdbc",
|
||||
"http://www.springframework.org/schema/jdbc",
|
||||
"xmlns:jdbc=\"http://www.springframework.org/schema/jdbc\"",
|
||||
"http://www.springframework.org/schema/jdbc https://www.springframework.org/schema/jdbc/spring-jdbc.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/tool",
|
||||
"http://www.springframework.org/schema/tool",
|
||||
"xmlns:tool=\"http://www.springframework.org/schema/tool\"",
|
||||
"http://www.springframework.org/schema/tool https://www.springframework.org/schema/tool/spring-tool.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/util",
|
||||
"http://www.springframework.org/schema/util",
|
||||
"xmlns:util=\"http://www.springframework.org/schema/util\"",
|
||||
"http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/mvc",
|
||||
"http://www.springframework.org/schema/mvc",
|
||||
"xmlns:mvc=\"http://www.springframework.org/schema/mvc\"",
|
||||
"http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/jee",
|
||||
"http://www.springframework.org/schema/jee",
|
||||
"xmlns:jee=\"http://www.springframework.org/schema/jee\"",
|
||||
"http://www.springframework.org/schema/jee https://www.springframework.org/schema/jee/spring-jee.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/lang",
|
||||
"http://www.springframework.org/schema/lang",
|
||||
"xmlns:lang=\"http://www.springframework.org/schema/lang\"",
|
||||
"http://www.springframework.org/schema/lang https://www.springframework.org/schema/lang/spring-lang.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/task",
|
||||
"http://www.springframework.org/schema/task",
|
||||
"xmlns:task=\"http://www.springframework.org/schema/task\"",
|
||||
"http://www.springframework.org/schema/task https://www.springframework.org/schema/task/spring-task.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/cache",
|
||||
"http://www.springframework.org/schema/cache",
|
||||
"xmlns:cache=\"http://www.springframework.org/schema/cache\"",
|
||||
"http://www.springframework.org/schema/cache https://www.springframework.org/schema/cache/spring-cache.xsd"),
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/websocket",
|
||||
"http://www.springframework.org/schema/websocket",
|
||||
"xmlns:websocket=\"http://www.springframework.org/schema/websocket\"",
|
||||
"http://www.springframework.org/schema/websocket https://www.springframework.org/schema/websocket/spring-websocket.xsd"),
|
||||
|
||||
// security
|
||||
new NamespaceInformation(
|
||||
"http://www.springframework.org/schema/security",
|
||||
"http://www.springframework.org/schema/security",
|
||||
"xmlns:security=\"http://www.springframework.org/schema/security\"",
|
||||
"http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security.xsd"),
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -1,19 +1,18 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2024 Broadcom, Inc.
|
||||
* Copyright (c) 2024 Broadcom
|
||||
* 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:
|
||||
* Broadcom, Inc. - initial API and implementation
|
||||
* Broadcom - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.springframework.ide.vscode.boot.xml.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -33,9 +32,9 @@ import org.springframework.ide.vscode.boot.app.BootLanguageServerBootApp;
|
||||
import org.springframework.ide.vscode.boot.app.SpringSymbolIndex;
|
||||
import org.springframework.ide.vscode.boot.bootiful.XmlBeansTestConf;
|
||||
import org.springframework.ide.vscode.boot.java.utils.test.MockProjectObserver;
|
||||
import org.springframework.ide.vscode.boot.xml.completions.NamespaceCompletionProvider;
|
||||
import org.springframework.ide.vscode.commons.languageserver.util.Settings;
|
||||
import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject;
|
||||
import org.springframework.ide.vscode.commons.util.UriUtil;
|
||||
import org.springframework.ide.vscode.commons.util.text.LanguageId;
|
||||
import org.springframework.ide.vscode.languageserver.starter.LanguageServerAutoConf;
|
||||
import org.springframework.ide.vscode.languageserver.testharness.Editor;
|
||||
@@ -71,6 +70,7 @@ public class XMLContentAssistTest {
|
||||
private MavenJavaProject project;
|
||||
|
||||
private Level originalLevel;
|
||||
private int ALL_NAMESPACE_COMPLETIONS = NamespaceCompletionProvider.getNamespaces().length;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() throws Exception {
|
||||
@@ -112,10 +112,7 @@ public class XMLContentAssistTest {
|
||||
|
||||
@Test
|
||||
void testEmptyXMLFileCompletions() throws Exception {
|
||||
Path xmlFilePath = Paths.get(project.getLocationUri()).resolve("beans.xml");
|
||||
Editor editor = harness.newEditor(LanguageId.XML, "",
|
||||
UriUtil.toUri(xmlFilePath.toFile()).toString()
|
||||
);
|
||||
Editor editor = new Editor(harness, "<*>", LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(1, completions.size());
|
||||
@@ -124,13 +121,364 @@ public class XMLContentAssistTest {
|
||||
|
||||
@Test
|
||||
void testNoSkeletonSnippetForNonEmptyXMLFile() throws Exception {
|
||||
Path xmlFilePath = Paths.get(project.getLocationUri()).resolve("beans.xml");
|
||||
Editor editor = harness.newEditor(LanguageId.XML, "<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n",
|
||||
UriUtil.toUri(xmlFilePath.toFile()).toString()
|
||||
);
|
||||
Editor editor = new Editor(harness, "<*><?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n", LanguageId.XML);
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddNamespaceCompletion1() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
<*>xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(ALL_NAMESPACE_COMPLETIONS, completions.size());
|
||||
|
||||
CompletionItem contextItem = getContextCompletionItem(completions);
|
||||
assertNotNull(contextItem);
|
||||
|
||||
editor.apply(contextItem);
|
||||
String editorContent = editor.getText();
|
||||
|
||||
assertEquals("""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
<*>xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
editorContent);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddNamespaceCompletion2() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(ALL_NAMESPACE_COMPLETIONS, completions.size());
|
||||
|
||||
CompletionItem contextItem = getContextCompletionItem(completions);
|
||||
assertNotNull(contextItem);
|
||||
|
||||
editor.apply(contextItem);
|
||||
String editorContent = editor.getText();
|
||||
|
||||
assertEquals("""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
editorContent);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddNamespaceCompletion3() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(ALL_NAMESPACE_COMPLETIONS, completions.size());
|
||||
|
||||
CompletionItem contextItem = getContextCompletionItem(completions);
|
||||
assertNotNull(contextItem);
|
||||
|
||||
editor.apply(contextItem);
|
||||
String editorContent = editor.getText();
|
||||
|
||||
assertEquals("""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
editorContent);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddNamespaceCompletion4() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(ALL_NAMESPACE_COMPLETIONS, completions.size());
|
||||
|
||||
CompletionItem contextItem = getContextCompletionItem(completions);
|
||||
assertNotNull(contextItem);
|
||||
|
||||
editor.apply(contextItem);
|
||||
String editorContent = editor.getText();
|
||||
|
||||
assertEquals("""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
editorContent);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddNamespaceCompletion5() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xm<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(ALL_NAMESPACE_COMPLETIONS, completions.size());
|
||||
|
||||
CompletionItem contextItem = getContextCompletionItem(completions);
|
||||
assertNotNull(contextItem);
|
||||
|
||||
editor.apply(contextItem);
|
||||
String editorContent = editor.getText();
|
||||
|
||||
assertEquals("""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
<*>
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
editorContent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement1() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
<*>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement2() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<*><bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement3() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<<*>bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement4() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean <*>id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement5() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"><<*>/bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement6() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"><<*>/bean>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement7() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></be<*>an>
|
||||
</beans>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNoNamespaceCompletionOutsideOfMainElement8() throws Exception {
|
||||
Editor editor = new Editor(harness, """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<!-- Root Context: defines shared resources visible to all other web components -->
|
||||
<bean id="simpleObj" class="u.t.r.SimpleObj"></bean>
|
||||
</beans<*>>
|
||||
""",
|
||||
LanguageId.XML);
|
||||
|
||||
List<CompletionItem> completions = editor.getCompletions();
|
||||
assertEquals(0, completions.size());
|
||||
}
|
||||
|
||||
private CompletionItem getContextCompletionItem(List<CompletionItem> completions) {
|
||||
for (CompletionItem completionItem : completions) {
|
||||
if (completionItem.getLabel().contains("/schema/context")) {
|
||||
return completionItem;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user