mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
7.6 KiB
230 lines
7.6 KiB
// 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); |
|
} |
|
|
|
/// <remarks>tests http://community.sharpdevelop.net/forums/p/12068/32893.aspx#32893</remarks> |
|
[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 = @"<TestFixture> |
|
Public Class TestContinuation |
|
<Test> |
|
Public Sub TestMethod |
|
Assert.Fail |
|
End Sub |
|
|
|
<Test> _ |
|
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 = "<Assembly: AssemblyTitle(\"My.UnitTests\")>" + Environment.NewLine + |
|
"<Assembly: AssemblyDescription(\"\")>"; |
|
|
|
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 |
|
} |
|
}
|
|
|