diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesCodeLensParticipant.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesCodeLensParticipant.java index a0c08e3f12..c6bada0195 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesCodeLensParticipant.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesCodeLensParticipant.java @@ -48,7 +48,8 @@ public XMLReferencesCodeLensParticipant(XMLReferencesPlugin plugin) { @Override public void doCodeLens(ICodeLensRequest request, List lenses, CancelChecker cancelChecker) { DOMDocument document = request.getDocument(); - Collection links = SearchEngine.getInstance().searchLinks(document, plugin.getReferencesSettings(), + Collection links = SearchEngine.getInstance().searchLinks(document, + plugin.getReferencesSettings(), cancelChecker); if (links.isEmpty()) { return; @@ -57,6 +58,10 @@ public void doCodeLens(ICodeLensRequest request, List lenses, CancelCh Map cache = new HashMap<>(); for (ReferenceLink link : links) { for (SearchNode to : link.getTos()) { + if (document != to.getOwnerDocument()) { + // The 'to' search node belongs to an included document, ignore it. + continue; + } // Increment references count Codelens for the given target element DOMNode toNode = to.getNode(); DOMElement toElement = toNode.isAttribute() ? ((DOMAttr) toNode).getOwnerElement() diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesDiagnosticParticipant.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesDiagnosticParticipant.java index e61396b6f1..5561a6e1e6 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesDiagnosticParticipant.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/participants/XMLReferencesDiagnosticParticipant.java @@ -57,6 +57,10 @@ public void doDiagnostics(DOMDocument document, List diagnostics, for (ReferenceLink link : links) { for (SearchNode from : link.getFroms()) { + if (document != from.getOwnerDocument()) { + // The 'from' search node belongs to an included document, ignore it. + continue; + } // Validate the syntax of from node. if (!from.isValid()) { if (from.getValidationStatus() == ValidationStatus.INVALID_PREFIX) { diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/search/SearchEngine.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/search/SearchEngine.java index 8119f14dd8..18004e610a 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/search/SearchEngine.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/references/search/SearchEngine.java @@ -75,6 +75,9 @@ public Collection searchLinks(DOMDocument document, XMLReferences SearchQuery query = SearchQueryFactory.createQuery(document, settings, QueryDirection.BOTH); if (query != null) { + // Search references in included files + query.setSearchInIncludedFiles(true); + final Map linksMap = new HashMap<>(); SearchEngine.getInstance().search(query, (fromSearchNode, toSearchNode, expression) -> { diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesCodeLensExtensionsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesCodeLensExtensionsTest.java index fa61e25382..a9bc863558 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesCodeLensExtensionsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesCodeLensExtensionsTest.java @@ -15,6 +15,7 @@ import static org.eclipse.lemminx.XMLAssert.r; import static org.eclipse.lemminx.client.ClientCommands.SHOW_REFERENCES; +import java.io.File; import java.util.Arrays; import java.util.function.Consumer; @@ -125,6 +126,32 @@ public void attrToText() throws BadLocationException { cl(r(3, 7, 3, 13), "1 reference", SHOW_REFERENCES)); } + @Test + public void docbookWithoutInclude() throws BadLocationException { + String xml = "\r\n" + + " \r\n" + // [1 reference] + + "
\r\n" + + " \r\n" + // + " \r\n" + + ""; + testCodeLensFor(xml, new File("src/test/resources/xml/docbook.xml").toURI().toString(), // + cl(r(2, 10, 2, 17), "1 reference", SHOW_REFERENCES)); + } + + @Test + public void docbookWithInclude() throws BadLocationException { + String xml = "\r\n" + + " \r\n" + // [3 references] + + "
\r\n" + + " \r\n" + + " \r\n" + + ""; + testCodeLensFor(xml, new File("src/test/resources/xml/docbook.xml").toURI().toString(), // + cl(r(2, 10, 2, 17), "3 references", SHOW_REFERENCES)); + } + private static void testCodeLensFor(String value, String fileURI, CodeLens... expected) { XMLLanguageService xmlLanguageService = new XMLLanguageService(); xmlLanguageService.getExtensions(); diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesDiagnosticsExtensionsTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesDiagnosticsExtensionsTest.java index 93572221d4..22a56fa819 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesDiagnosticsExtensionsTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/references/XMLReferencesDiagnosticsExtensionsTest.java @@ -13,6 +13,7 @@ import static org.eclipse.lemminx.XMLAssert.d; +import java.io.File; import java.util.function.Consumer; import org.eclipse.lemminx.AbstractCacheBasedTest; @@ -64,7 +65,6 @@ public void invalidPrefix() throws BadLocationException { "Undefined reference '#C': nothing that matches the expression '@xml:id' defines 'C'.", "xml", DiagnosticSeverity.Warning)); } - @Test public void noUndefinedReferences() throws BadLocationException { @@ -76,6 +76,32 @@ public void noUndefinedReferences() throws BadLocationException { testDiagnosticsFor(xml, "file:///test/foo.xml"); } + @Test + public void docbookWithoutInclude() throws BadLocationException { + String xml = "\r\n" + + " \r\n" + + "
\r\n" + + " \r\n" + // + " \r\n" + + ""; + testDiagnosticsFor(xml, new File("src/test/resources/xml/docbook.xml").toURI().toString(), + d(3, 16, 3, 19, XMLReferencesErrorCode.UndefinedReference, + "Undefined reference 'ch1': nothing that matches the expression '@id' defines 'ch1'.", + "xml", DiagnosticSeverity.Warning)); + } + + @Test + public void docbookWithInclude() throws BadLocationException { + String xml = "\r\n" + + " \r\n" + + "
\r\n" + + " \r\n" + + " \r\n" + + ""; + testDiagnosticsFor(xml, new File("src/test/resources/xml/docbook.xml").toURI().toString()); + } + public static void testDiagnosticsFor(String xml, String fileURI, Diagnostic... expected) { Consumer config = ls -> { diff --git a/org.eclipse.lemminx/src/test/resources/xml/sub-book.xml b/org.eclipse.lemminx/src/test/resources/xml/sub-book.xml new file mode 100644 index 0000000000..d4fca24c8c --- /dev/null +++ b/org.eclipse.lemminx/src/test/resources/xml/sub-book.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file