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