From 8565dbf4904761358b1fb92de7f7f6e97f87bd91 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 22 Dec 2005 20:54:01 +0000 Subject: [PATCH] Fixed VB lexer crash when "&H" was not followed by a number. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@935 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NRefactory/Project/Src/Lexer/VBNet/Lexer.cs | 5 +++++ .../NRefactory/Test/Lexer/VBNet/LiteralsTests.cs | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs index 2e162cbe03..55a32b0359 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs @@ -304,6 +304,11 @@ namespace ICSharpCode.NRefactory.Parser.VB } } + if (digit.Length == 0) { + errors.Error(Line, Col, String.Format("digit expected")); + return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0); + } + if (ReaderPeek() != -1 && ("%&SILU".IndexOf(PeekUpperChar()) != -1 || ishex || isokt)) { ch = (char)ReaderPeek(); sb.Append(ch); diff --git a/src/Libraries/NRefactory/Test/Lexer/VBNet/LiteralsTests.cs b/src/Libraries/NRefactory/Test/Lexer/VBNet/LiteralsTests.cs index 6c3f20e2aa..ed323342ab 100644 --- a/src/Libraries/NRefactory/Test/Lexer/VBNet/LiteralsTests.cs +++ b/src/Libraries/NRefactory/Test/Lexer/VBNet/LiteralsTests.cs @@ -67,6 +67,20 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.VB CheckToken("&h3ff&", Tokens.LiteralInteger, 0x3ff); } + [Test] + public void TestIncompleteHexadecimal() + { + ILexer lexer = GenerateLexer(new StringReader("&H\r\nabc")); + Token t = lexer.NextToken(); + Assert.AreEqual(Tokens.LiteralInteger, t.kind); + Assert.AreEqual(0, (int)t.literalValue); + Assert.AreEqual(Tokens.EOL, lexer.NextToken().kind, "Tokens.EOL (1)"); + Assert.AreEqual(Tokens.Identifier, lexer.NextToken().kind, "Tokens.Identifier"); + Assert.AreEqual(Tokens.EOL, lexer.NextToken().kind, "Tokens.EOL (2)"); + Assert.AreEqual(Tokens.EOF, lexer.NextToken().kind, "Tokens.EOF"); + Assert.AreNotEqual("", lexer.Errors.ErrorOutput); + } + [Test] public void TestStringLiterals() {