diff --git a/Core/Parser/XmlRootState.cs b/Core/Parser/XmlRootState.cs index b5f5b6e6..39eb4ee9 100644 --- a/Core/Parser/XmlRootState.cs +++ b/Core/Parser/XmlRootState.cs @@ -89,8 +89,8 @@ public override XmlParserState PushChar (char c, XmlParserContext context, ref s context.Diagnostics?.LogError ( "Incomplete tag opening; encountered unexpected '<'.", TextSpan.FromBounds ( - context.Position - LengthFromOpenBracket (context) - 1, - context.Position - 1 + context.Position + 1 - LengthFromOpenBracket (context), + context.Position + 1 ) ); context.StateTag = BRACKET; diff --git a/Tests/Parser/ParsingTests.cs b/Tests/Parser/ParsingTests.cs index 76e0f4d0..ecc5864f 100644 --- a/Tests/Parser/ParsingTests.cs +++ b/Tests/Parser/ParsingTests.cs @@ -462,5 +462,16 @@ public void InvalidNameState () parser.Parse (docTxt); parser.AssertErrorCount (2); } - } + + [Test] + public void TwoOpenAngles () + { + var docTxt = "<<"; + var parser = new XmlTreeParser (CreateRootState ()); + parser.Parse (docTxt); + var diagnostic = parser.GetContext ().Diagnostics.Single (); + Assert.AreEqual (1, diagnostic.Span.Start); + Assert.AreEqual (1, diagnostic.Span.Length); + } + } } diff --git a/Tests/Parser/TestXmlParser.cs b/Tests/Parser/TestXmlParser.cs index c0b3b27c..ce865dac 100644 --- a/Tests/Parser/TestXmlParser.cs +++ b/Tests/Parser/TestXmlParser.cs @@ -89,6 +89,12 @@ public static void Parse (this XmlParser parser, string doc, char trigger = '$', } } Assert.AreEqual (asserts.Length, assertNo); + + var diagnostics = context.Diagnostics; + foreach (var diagnostic in diagnostics) { + Assert.GreaterOrEqual (diagnostic.Span.Start, 0); + Assert.GreaterOrEqual (diagnostic.Span.Length, 0); + } } public static XObject PeekSpine (this XmlParser parser) => parser.GetContext ().Nodes.Peek ();