// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; using System.IO; using ICSharpCode.NRefactory.VB.Parser; using NUnit.Framework; namespace ICSharpCode.NRefactory.VB.Tests.Lexer { [TestFixture] public class ImplicitLineContinuationTests { [Test] public void Example1() { string code = @"Module Test Sub Print( Param1 As Integer, Param2 As Integer) If (Param1 < Param2) Or (Param1 > Param2) Then Console.WriteLine(""Not equal"") End If End Sub End Module"; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens(lexer, Tokens.Module, Tokens.Identifier, Tokens.EOL, Tokens.Sub, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.As, Tokens.Integer, Tokens.Comma, Tokens.Identifier, Tokens.As, Tokens.Integer, Tokens.CloseParenthesis, Tokens.EOL, Tokens.If, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.LessThan, Tokens.Identifier, Tokens.CloseParenthesis, Tokens.Or, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.GreaterThan, Tokens.Identifier, Tokens.CloseParenthesis, Tokens.Then, Tokens.EOL, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString, Tokens.CloseParenthesis, Tokens.EOL, Tokens.End, Tokens.If, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Module); } [Test] public void QualifierInWith() { string code = @"Module Test Sub Print With xml Dim a = b. d Dim c = . Count End With End Sub End Module"; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens(lexer, Tokens.Module, Tokens.Identifier, Tokens.EOL, Tokens.Sub, Tokens.Identifier, Tokens.EOL, Tokens.With, Tokens.Identifier, Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.Dot, Tokens.EOL, Tokens.Identifier, Tokens.EOL, Tokens.End, Tokens.With, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Module); } [Test] public void Example2() { string code = @"Module Test Sub Print Dim a = _ y End Sub End Module"; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens(lexer, Tokens.Module, Tokens.Identifier, Tokens.EOL, Tokens.Sub, Tokens.Identifier, Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.EOL, Tokens.Identifier, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Module); } [Test] public void Query() { string code = @"Module Test Sub A Dim q = From x In a Select x End Sub End Module"; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens(lexer, Tokens.Module, Tokens.Identifier, Tokens.EOL, Tokens.Sub, Tokens.Identifier, Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.Select, Tokens.Identifier, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Module); } [Test] public void Query1() { string code = @"Module Test Sub A Dim actions = From a in b Select Sub() Dim i = 1 Select Case i End Select End Sub End Sub End Module"; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens(lexer, Tokens.Module, Tokens.Identifier, Tokens.EOL, Tokens.Sub, Tokens.Identifier, Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.Select, Tokens.Sub, Tokens.OpenParenthesis, Tokens.CloseParenthesis, Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.LiteralInteger, Tokens.EOL, Tokens.Select, Tokens.Case, Tokens.Identifier, Tokens.EOL, Tokens.End, Tokens.Select, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, 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"; VBLexer 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 ); } [Test] public void LineContinuationAfterAttributes() { string code = @" Public Class TestContinuation Public Sub TestMethod Assert.Fail End Sub _ Public Sub TestMethod2 Assert.Fail End Sub End Class"; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens( lexer, Tokens.LessThan, Tokens.Identifier, Tokens.GreaterThan, Tokens.Public, Tokens.Class, Tokens.Identifier, Tokens.EOL, Tokens.LessThan, Tokens.Identifier, Tokens.GreaterThan, Tokens.Public, Tokens.Sub, Tokens.Identifier, Tokens.EOL, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.LessThan, Tokens.Identifier, Tokens.GreaterThan, Tokens.Public, Tokens.Sub, Tokens.Identifier, Tokens.EOL, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Class ); } [Test] public void NoILCAfterGlobalAttributes() { string code = "" + Environment.NewLine + ""; VBLexer lexer = GenerateLexer(new StringReader(code)); CheckTokens( lexer, Tokens.LessThan, Tokens.Assembly, Tokens.Colon, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString, Tokens.CloseParenthesis, Tokens.GreaterThan, Tokens.EOL, Tokens.LessThan, Tokens.Assembly, Tokens.Colon, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString, Tokens.CloseParenthesis, Tokens.GreaterThan ); } #region Helpers VBLexer GenerateLexer(StringReader sr) { return new VBLexer(sr); } void CheckTokens(VBLexer lexer, params int[] tokens) { for (int i = 0; i < tokens.Length; i++) { int token = tokens[i]; Token t = lexer.NextToken(); int next = t.Kind; Assert.AreEqual(token, next, "{2} of {3}: {0} != {1}; at {4}", Tokens.GetTokenString(token), Tokens.GetTokenString(next), i + 1, tokens.Length, t.Location); } } #endregion } }