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 a0c08e3f1..c6bada019 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 e61396b6f..5561a6e1e 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 8119f14dd..18004e610 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/main/java/org/eclipse/lemminx/utils/DOMUtils.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/utils/DOMUtils.java index 1c86b6aa2..7b2764e6b 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/utils/DOMUtils.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/utils/DOMUtils.java @@ -11,23 +11,18 @@ *******************************************************************************/ package org.eclipse.lemminx.utils; -import java.io.IOException; import java.io.StringReader; import java.net.URL; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; -import org.apache.xerces.parsers.SAXParser; import org.eclipse.lemminx.dom.DOMDocument; import org.eclipse.lemminx.dom.DOMElement; import org.eclipse.lemminx.dom.DOMNode; import org.eclipse.lemminx.dom.DOMParser; import org.eclipse.lemminx.uriresolver.URIResolverExtensionManager; import org.xml.sax.InputSource; -import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; @@ -37,8 +32,6 @@ */ public class DOMUtils { - private static final Logger LOGGER = Logger.getLogger(DOMUtils.class.getName()); - private static final String XSD_EXTENSION = ".xsd"; // DTD file extensions @@ -217,7 +210,6 @@ public static DOMDocument loadDocument(String documentURI, URIResolverExtensionM return DOMParser.getInstance().parse(IOUtils.convertStreamToString(new URL(documentURI).openStream()), documentURI, resolverExtensionManager); } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Error while loading XML Schema '" + documentURI + "'.", e); return null; } } 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 fa61e2538..a9bc86355 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 93572221d..22a56fa81 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 000000000..d4fca24c8 --- /dev/null +++ b/org.eclipse.lemminx/src/test/resources/xml/sub-book.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file