Browse Source

VB.NET lambda expressions

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3382 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Markus Palme 17 years ago
parent
commit
98f4e6aacc
  1. 1772
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  2. 26
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  3. 53
      src/Libraries/NRefactory/Test/Parser/Expressions/LambdaExpressionTests.cs

1772
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

26
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -1594,8 +1594,9 @@ EventMemberSpecifier<out string name> @@ -1594,8 +1594,9 @@ EventMemberSpecifier<out string name>
.
Expr<out Expression expr>
=
DisjunctionExpr<out expr>
(. expr = null; .) =
DisjunctionExpr<out expr>
| LambdaExpr<out expr>
.
AssignmentOperator<out AssignmentOperatorType op>
@ -1684,7 +1685,7 @@ SimpleNonInvocationExpression<out Expression pexpr> @@ -1684,7 +1685,7 @@ SimpleNonInvocationExpression<out Expression pexpr>
| /* 11.4.5 */ "AddressOf" Expr<out expr> (. pexpr = new AddressOfExpression(expr); .)
| /* 11.5.1 */ "GetType" "(" GetTypeTypeName<out type> ")" (. pexpr = new TypeOfExpression(type); .)
| /* 11.5.2 */ "TypeOf" SimpleExpr<out expr> "Is" TypeName<out type> (. pexpr = new TypeOfIsExpression(expr, type); .)
| /* 11.22 */ IF (la.kind == Tokens.If) ConditionalExpression<out pexpr>
| /* 11.22 */ ConditionalExpression<out pexpr>
)
|
/* this form only occurs in WithStatements*/
@ -1981,6 +1982,24 @@ ObjectCreateExpression<out Expression oce> @@ -1981,6 +1982,24 @@ ObjectCreateExpression<out Expression oce>
]
.
LambdaExpr<out Expression expr>
(.
Expression inner = null;
LambdaExpression lambda = new LambdaExpression();
lambda.StartLocation = la.Location;
.) =
"Function"
[ "(" [ FormalParameterList<lambda.Parameters> ] ")" ]
Expr<out inner>
(.
lambda.ExpressionBody = inner;
lambda.EndLocation = t.EndLocation; // la.Location?
expr = lambda;
.)
.
MemberInitializer<out NamedArgumentExpression memberInitializer>
(.
memberInitializer = new NamedArgumentExpression();
@ -2574,6 +2593,7 @@ EmbeddedStatement<out Statement statement> @@ -2574,6 +2593,7 @@ EmbeddedStatement<out Statement statement>
| /* 10.11 */
"Stop" (. statement = new StopStatement(); .)
| /* 10.8.1 */
IF (la.kind == Tokens.If)
"If" (. Location ifStartLocation = t.Location; .) Expr<out expr> [ "Then" ]
(
/* multiline if statement */

53
src/Libraries/NRefactory/Test/Parser/Expressions/LambdaExpressionTests.cs

@ -16,7 +16,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -16,7 +16,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[TestFixture]
public class LambdaExpressionTests
{
static LambdaExpression Parse(string program)
#region C#
static LambdaExpression ParseCSharp(string program)
{
return ParseUtilCSharp.ParseExpression<LambdaExpression>(program);
}
@ -24,7 +26,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -24,7 +26,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[Test]
public void ImplicitlyTypedExpressionBody()
{
LambdaExpression e = Parse("(x) => x + 1");
LambdaExpression e = ParseCSharp("(x) => x + 1");
Assert.AreEqual("x", e.Parameters[0].ParameterName);
Assert.IsTrue(e.Parameters[0].TypeReference.IsNull);
Assert.IsTrue(e.ExpressionBody is BinaryOperatorExpression);
@ -33,7 +35,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -33,7 +35,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[Test]
public void ImplicitlyTypedExpressionBodyWithoutParenthesis()
{
LambdaExpression e = Parse("x => x + 1");
LambdaExpression e = ParseCSharp("x => x + 1");
Assert.AreEqual("x", e.Parameters[0].ParameterName);
Assert.IsTrue(e.Parameters[0].TypeReference.IsNull);
Assert.IsTrue(e.ExpressionBody is BinaryOperatorExpression);
@ -42,7 +44,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -42,7 +44,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[Test]
public void ImplicitlyTypedStatementBody()
{
LambdaExpression e = Parse("(x) => { return x + 1; }");
LambdaExpression e = ParseCSharp("(x) => { return x + 1; }");
Assert.AreEqual("x", e.Parameters[0].ParameterName);
Assert.IsTrue(e.Parameters[0].TypeReference.IsNull);
Assert.IsTrue(e.StatementBody.Children[0] is ReturnStatement);
@ -51,7 +53,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -51,7 +53,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[Test]
public void ImplicitlyTypedStatementBodyWithoutParenthesis()
{
LambdaExpression e = Parse("x => { return x + 1; }");
LambdaExpression e = ParseCSharp("x => { return x + 1; }");
Assert.AreEqual("x", e.Parameters[0].ParameterName);
Assert.IsTrue(e.Parameters[0].TypeReference.IsNull);
Assert.IsTrue(e.StatementBody.Children[0] is ReturnStatement);
@ -60,7 +62,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -60,7 +62,7 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[Test]
public void ExplicitlyTypedStatementBody()
{
LambdaExpression e = Parse("(int x) => { return x + 1; }");
LambdaExpression e = ParseCSharp("(int x) => { return x + 1; }");
Assert.AreEqual("x", e.Parameters[0].ParameterName);
Assert.AreEqual("int", e.Parameters[0].TypeReference.Type);
Assert.IsTrue(e.StatementBody.Children[0] is ReturnStatement);
@ -69,9 +71,46 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -69,9 +71,46 @@ namespace ICSharpCode.NRefactory.Tests.Ast
[Test]
public void LambdaExpressionContainingConditionalExpression()
{
LambdaExpression e = Parse("rr => rr != null ? rr.ResolvedType : null");
LambdaExpression e = ParseCSharp("rr => rr != null ? rr.ResolvedType : null");
Assert.AreEqual("rr", e.Parameters[0].ParameterName);
Assert.IsTrue(e.ExpressionBody is ConditionalExpression);
}
#endregion
#region VB.NET
static LambdaExpression ParseVBNet(string program)
{
return ParseUtilVBNet.ParseExpression<LambdaExpression>(program);
}
[Test]
public void VBNetLambdaWithParameters()
{
LambdaExpression e = ParseVBNet("Function(x As Boolean) x Or True");
Assert.AreEqual(1, e.Parameters.Count);
Assert.AreEqual("x", e.Parameters[0].ParameterName);
Assert.AreEqual("Boolean", e.Parameters[0].TypeReference.Type);
Assert.IsTrue(e.ExpressionBody is BinaryOperatorExpression);
}
[Test]
public void VBNetLambdaWithoutParameters()
{
LambdaExpression e = ParseVBNet("Function x Or True");
Assert.AreEqual(0, e.Parameters.Count);
Assert.IsTrue(e.ExpressionBody is BinaryOperatorExpression);
}
[Test]
public void VBNetNestedLambda()
{
LambdaExpression e = ParseVBNet("Function(x As Boolean) Function(y As Boolean) x And y");
Assert.AreEqual(1, e.Parameters.Count);
Assert.IsTrue(e.ExpressionBody is LambdaExpression);
}
#endregion
}
}

Loading…
Cancel
Save