diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs index 1f59febb21..9ee7a6b8f8 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs @@ -79,7 +79,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp ch = (char)next; if (ch == '"') { token = ReadVerbatimString(); - } else if (Char.IsLetterOrDigit(ch)) { + } else if (Char.IsLetterOrDigit(ch) || ch == '_') { token = new Token(Tokens.Identifier, x - 1, y, ReadIdent(ch)); } else { errors.Error(y, x, String.Format("Unexpected char in Lexer.Next() : {0}", ch)); diff --git a/src/Libraries/NRefactory/Test/Lexer/CSharp/CustomLexerTests.cs b/src/Libraries/NRefactory/Test/Lexer/CSharp/CustomLexerTests.cs index 386a45dc83..f5864e2db5 100644 --- a/src/Libraries/NRefactory/Test/Lexer/CSharp/CustomLexerTests.cs +++ b/src/Libraries/NRefactory/Test/Lexer/CSharp/CustomLexerTests.cs @@ -41,6 +41,34 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.CSharp Assert.AreEqual("a_Bc05", t.val); } + [Test] + public void TestIdentifierStartingWithUnderscore() + { + ILexer lexer = GenerateLexer(new StringReader("_Bc05")); + Token t = lexer.NextToken(); + Assert.AreEqual(Tokens.Identifier, t.kind); + Assert.AreEqual("_Bc05", t.val); + } + + [Test] + public void TestKeyWordAsIdentifier() + { + ILexer lexer = GenerateLexer(new StringReader("@int")); + Token t = lexer.NextToken(); + Assert.AreEqual(Tokens.Identifier, t.kind); + Assert.AreEqual("int", t.val); + } + + + [Test] + public void TestKeyWordAsIdentifierStartingWithUnderscore() + { + ILexer lexer = GenerateLexer(new StringReader("@_int")); + Token t = lexer.NextToken(); + Assert.AreEqual(Tokens.Identifier, t.kind); + Assert.AreEqual("_int", t.val); + } + [Test] public void TestSkippedEmptyBlock() {