From 3b0fe52dd402e5a3ee9c51c74eed5d5abd031207 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 14 Oct 2010 15:39:20 +0200 Subject: [PATCH] fixed http://community.sharpdevelop.net/forums/p/12068/32893.aspx#32893 --- .../Project/Src/Lexer/VBNet/Lexer.cs | 12 ++++++--- .../VBNet/ImplicitLineContinuationTests.cs | 26 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs index e3445a9c1b..beac28ac61 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs @@ -444,9 +444,15 @@ namespace ICSharpCode.NRefactory.Parser.VB var queryOperators = new int[] { Tokens.From, Tokens.Aggregate, Tokens.Select, Tokens.Distinct, Tokens.Where, Tokens.Order, Tokens.By, Tokens.Ascending, Tokens.Descending, Tokens.Take, Tokens.Skip, Tokens.Let, Tokens.Group, Tokens.Into, Tokens.On, Tokens.While, Tokens.Join }; - if ((queryOperators.Contains(prevTokenKind) || queryOperators.Contains(nextTokenKind)) - && ef.InContext(Context.Query)) - return true; + if (ef.InContext(Context.Query)) { + // Distinct is special case + // fixes http://community.sharpdevelop.net/forums/p/12068/32893.aspx#32893 + if (prevTokenKind == Tokens.Distinct && !queryOperators.Contains(nextTokenKind)) + return false; + + if ((queryOperators.Contains(prevTokenKind) || queryOperators.Contains(nextTokenKind))) + return true; + } // 8th rule // after binary operators (+, -, /, *, etc.) in an expression context diff --git a/src/Libraries/NRefactory/Test/Lexer/VBNet/ImplicitLineContinuationTests.cs b/src/Libraries/NRefactory/Test/Lexer/VBNet/ImplicitLineContinuationTests.cs index 7616ed8326..944d4470d2 100644 --- a/src/Libraries/NRefactory/Test/Lexer/VBNet/ImplicitLineContinuationTests.cs +++ b/src/Libraries/NRefactory/Test/Lexer/VBNet/ImplicitLineContinuationTests.cs @@ -135,6 +135,32 @@ End Module"; Tokens.End, Tokens.Module); } + /// tests http://community.sharpdevelop.net/forums/p/12068/32893.aspx#32893 + [Test] + public void Bug_Thread12068() + { + string code = @"Class MainClass + Public Shared Sub Main() + Dim categoryNames = From p In AList _ + Select p.AFunction(1,2,3) _ + Distinct + End Sub +End Class"; + + ILexer lexer = GenerateLexer(new StringReader(code)); + + CheckTokens( + lexer, Tokens.Class, Tokens.Identifier, Tokens.EOL, + Tokens.Public, Tokens.Shared, Tokens.Sub, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.CloseParenthesis, Tokens.EOL, + Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, + Tokens.Select, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralInteger, + Tokens.Comma, Tokens.LiteralInteger, Tokens.Comma, Tokens.LiteralInteger, Tokens.CloseParenthesis, + Tokens.Distinct, Tokens.EOL, + Tokens.End, Tokens.Sub, Tokens.EOL, + Tokens.End, Tokens.Class + ); + } + #region Helpers ILexer GenerateLexer(StringReader sr) {