From 8e2d63d96a5388e20392d22fa9631d6482f64f93 Mon Sep 17 00:00:00 2001 From: Nikolas Date: Mon, 18 Mar 2019 14:49:52 -0400 Subject: [PATCH] Fixed EOF Error Fixes #157 The most common ocurrences of this error are when the document is empty or there is just the xml prolog (). Errors that give negative values will be ignored for now. Signed-off-by: Nikolas --- .../participants/XMLSyntaxErrorCode.java | 3 ++- .../diagnostics/AbstractLSPErrorReporter.java | 11 ++++++++++- .../src/test/java/org/eclipse/lsp4xml/XMLAssert.java | 7 ++++++- .../contentmodel/XMLSchemaDiagnosticsTest.java | 12 ++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/XMLSyntaxErrorCode.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/XMLSyntaxErrorCode.java index ccea5db4d4..0e2a07c5da 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/XMLSyntaxErrorCode.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/XMLSyntaxErrorCode.java @@ -47,7 +47,7 @@ EqRequiredInAttribute, the_element_type_lmsg("the-element-type-lmsg"), EqRequire InvalidCommentStart, LessthanInAttValue, MarkupEntityMismatch, MarkupNotRecognizedInContent, NameRequiredInReference, OpenQuoteExpected, PITargetRequired, PseudoAttrNameExpected, QuoteRequiredInXMLDecl, SDDeclInvalid, SpaceRequiredBeforeEncodingInXMLDecl, SpaceRequiredBeforeStandalone, SpaceRequiredInPI, - VersionInfoRequired, VersionNotSupported, XMLDeclUnterminated, CustomETag; // https://wiki.xmldation.com/Support/Validator/EqRequiredInAttribute + VersionInfoRequired, VersionNotSupported, XMLDeclUnterminated, CustomETag, PrematureEOF; // https://wiki.xmldation.com/Support/Validator/EqRequiredInAttribute private final String code; @@ -173,6 +173,7 @@ public static Range toLSPRange(XMLLocator location, XMLSyntaxErrorCode code, Obj int start = selectCurrentTagOffset(offset, document) + 1; int end = offset + 1; return XMLPositionUtility.createRange(start, end, document); + case PrematureEOF: case XMLDeclUnterminated: break; default: diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/diagnostics/AbstractLSPErrorReporter.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/diagnostics/AbstractLSPErrorReporter.java index 00ed8360c5..18f1999e93 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/diagnostics/AbstractLSPErrorReporter.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/diagnostics/AbstractLSPErrorReporter.java @@ -77,8 +77,13 @@ public String reportError(XMLLocator location, String domain, String key, Object message = str.toString(); } + Range adjustedRange = internalToLSPRange(location, key, arguments, xmlDocument); + + if(adjustedRange == null) { + return null; + } // Fill diagnostic - diagnostics.add(new Diagnostic(internalToLSPRange(location, key, arguments, xmlDocument), message, + diagnostics.add(new Diagnostic(adjustedRange, message, toLSPSeverity(severity), source, key)); if (severity == SEVERITY_FATAL_ERROR && !fContinueAfterFatalError) { @@ -127,6 +132,10 @@ private Range internalToLSPRange(XMLLocator location, String key, Object[] argum int startOffset = location.getCharacterOffset() - 1; int endOffset = location.getCharacterOffset() - 1; + if(startOffset < 0 || endOffset < 0) { + return null; + } + // Create LSP range Position start = toLSPPosition(startOffset, location, document.getTextDocument()); Position end = toLSPPosition(endOffset, location, document.getTextDocument()); diff --git a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/XMLAssert.java b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/XMLAssert.java index 03e59a4fc2..88aedfca26 100644 --- a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/XMLAssert.java +++ b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/XMLAssert.java @@ -10,6 +10,8 @@ */ package org.eclipse.lsp4xml; +import static org.junit.Assert.assertTrue; + import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -280,7 +282,10 @@ public static void testDiagnosticsFor(String xml, String catalogPath, Consumer actual = xmlLanguageService.doDiagnostics(xmlDocument, () -> { }, settings.getValidation()); - + if(expected == null) { + assertTrue(actual.isEmpty()); + return; + } assertDiagnostics(actual, Arrays.asList(expected), filter); } diff --git a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/contentmodel/XMLSchemaDiagnosticsTest.java b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/contentmodel/XMLSchemaDiagnosticsTest.java index 58f9045e3c..ef4c939e26 100644 --- a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/contentmodel/XMLSchemaDiagnosticsTest.java +++ b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/contentmodel/XMLSchemaDiagnosticsTest.java @@ -27,6 +27,18 @@ */ public class XMLSchemaDiagnosticsTest { + @Test + public void prematureEOFError() throws Exception { + String xml = " "; + testDiagnosticsFor(xml); + } + + @Test + public void prematureEOFErrorWithProlog() throws Exception { + String xml = " "; + testDiagnosticsFor(xml); + } + @Test public void cvc_complex_type_2_3() throws Exception { String xml = "\r\n" + //