diff --git a/org.eclipse.lemminx/pom.xml b/org.eclipse.lemminx/pom.xml
index 4c266c4e8..56de06b8c 100644
--- a/org.eclipse.lemminx/pom.xml
+++ b/org.eclipse.lemminx/pom.xml
@@ -3,7 +3,7 @@
org.eclipse.lemminx
lemminx-parent
- 0.27.1-SNAPSHOT
+ 0.28.0-SNAPSHOT
org.eclipse.lemminx
@@ -287,5 +287,11 @@
9.4.53.v20231009
test
+
+ org.mockito
+ mockito-core
+ 4.11.0
+ test
+
diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLCompletions.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLCompletions.java
index f8a85bb0a..5e6892f72 100644
--- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLCompletions.java
+++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLCompletions.java
@@ -262,6 +262,14 @@ public CompletionList doComplete(DOMDocument xmlDocument, Position position, Sha
return completionResponse;
}
break;
+ // CDATA
+ case CDATATagOpen:
+ case CDATAContent:
+ if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {
+ collectCDATAContentSuggestions(completionRequest, completionResponse, cancelChecker);
+ return completionResponse;
+ }
+ break;
// DTD
case DTDAttlistAttributeName:
case DTDAttlistAttributeType:
@@ -869,6 +877,21 @@ private void collectionRegionProposals(ICompletionRequest request, ICompletionRe
}
}
+ private void collectCDATAContentSuggestions(CompletionRequest request, CompletionResponse response,
+ CancelChecker cancelChecker){
+ // Participant completion on CDATA content
+ for (ICompletionParticipant participant : getCompletionParticipants()) {
+ try {
+ participant.onCDATAContent(request, response, cancelChecker);
+ } catch (CancellationException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.log(Level.SEVERE, "While performing ICompletionParticipant#onCDATAContent for participant '"
+ + participant.getClass().getName() + "'.", e);
+ }
+ }
+ }
+
private void collectAttributeNameSuggestions(int nameStart, CompletionRequest completionRequest,
CompletionResponse completionResponse, CancelChecker cancelChecker) {
collectAttributeNameSuggestions(nameStart, completionRequest.getOffset(), completionRequest, completionResponse,
diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/completion/ICompletionParticipant.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/completion/ICompletionParticipant.java
index 875af9a83..e64d03f4b 100644
--- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/completion/ICompletionParticipant.java
+++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/extensions/completion/ICompletionParticipant.java
@@ -59,6 +59,17 @@ void onDTDSystemId(String valuePrefix, ICompletionRequest request, ICompletionRe
CancelChecker cancelChecker)
throws Exception;
+ /**
+ * Collects and stores completion items within the provided response response
+ *
+ * @param request the completion request
+ * @param response the completion response
+ * @param cancelChecker object used to monitor if this execution should finish
+ * @throws Exception
+ */
+ default void onCDATAContent(ICompletionRequest request, ICompletionResponse response, CancelChecker cancelChecker)
+ throws Exception {}
+
/**
* Returns the completion item resolver that corresponds to the given
* participant id or null otherwise.
diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLCompletionTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLCompletionTest.java
index 75701b178..4912bf3e2 100644
--- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLCompletionTest.java
+++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLCompletionTest.java
@@ -21,6 +21,10 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.List;
@@ -30,6 +34,7 @@
import org.eclipse.lemminx.customservice.AutoCloseTagResponse;
import org.eclipse.lemminx.dom.DOMDocument;
import org.eclipse.lemminx.dom.DOMParser;
+import org.eclipse.lemminx.services.extensions.completion.ICompletionParticipant;
import org.eclipse.lemminx.settings.SharedSettings;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionList;
@@ -267,7 +272,23 @@ public void testNoEndTagInAttributeValue() throws BadLocationException {
String xml = " ",null,null,null, 0,settings);
+ verify(mockParticipant).onCDATAContent(any(),any(),any());
+ }
+ @Test
+ public void testCDATAContent() throws Exception {
+ ICompletionParticipant mockParticipant = mock(ICompletionParticipant.class);
+ SharedSettings settings = new SharedSettings();
+ this.languageService.registerCompletionParticipant(mockParticipant);
+ testCompletionFor(this.languageService," ",null,null,null, 0,settings);
+ verify(mockParticipant).onCDATAContent(any(),any(),any());
+ }
// -------------------Tools----------------------------------------------------------
public void assertOpenStartTagCompletion(String xmlText, int expectedStartTagOffset, boolean startWithTagOpen,
diff --git a/pom.xml b/pom.xml
index adedb9a09..0f1d31a70 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
org.eclipse.lemminx
lemminx-parent
- 0.27.1-SNAPSHOT
+ 0.28.0-SNAPSHOT
pom
Eclipse LemMinX
LemMinX is a XML Language Server Protocol (LSP), and can be used with any editor that supports LSP, to offer an outstanding XML editing experience