Browse Source

fix conversion of anonymous delegate-Expressions to VB lambdas

4.0
Siegfried Pammer 15 years ago
parent
commit
ce13878003
  1. 26
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
  2. 40
      src/Libraries/NRefactory/Project/Src/Visitors/ToVBNetConvertVisitor.cs

26
src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs

@ -2512,7 +2512,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2512,7 +2512,7 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public override object TrackedVisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data)
{
OutputAnonymousMethodWithStatementBody(anonymousMethodExpression.Parameters, anonymousMethodExpression.Body);
UnsupportedNode(anonymousMethodExpression);
return null;
}
@ -2988,30 +2988,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2988,30 +2988,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
}
}
void OutputAnonymousMethodWithStatementBody(List<ParameterDeclarationExpression> parameters, Statement body)
{
Error("VB does not support anonymous methods/lambda expressions with a statement body", body.StartLocation);
outputFormatter.PrintToken(Tokens.Function);
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(parameters);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Do);
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
exitTokenStack.Push(Tokens.Function);
body.AcceptVisitor(this, null);
exitTokenStack.Pop();
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Function);
}
public override object TrackedVisitQueryExpressionVB(QueryExpressionVB queryExpression, object data)
{
outputFormatter.IndentationLevel++;

40
src/Libraries/NRefactory/Project/Src/Visitors/ToVBNetConvertVisitor.cs

@ -19,7 +19,7 @@ namespace ICSharpCode.NRefactory.Visitors @@ -19,7 +19,7 @@ namespace ICSharpCode.NRefactory.Visitors
// The following conversions are implemented:
// Conflicting field/property names -> m_field
// Conflicting variable names inside methods
// Anonymous methods are put into new methods
// Anonymous methods are converted to Sub/Function-lambdas
// Simple event handler creation is replaced with AddressOfExpression
// Move Imports-statements out of namespaces
// Parenthesis around Cast expressions remove - these are syntax errors in VB.NET
@ -134,18 +134,48 @@ namespace ICSharpCode.NRefactory.Visitors @@ -134,18 +134,48 @@ namespace ICSharpCode.NRefactory.Visitors
public override object VisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data)
{
base.VisitAnonymousMethodExpression(anonymousMethodExpression, data);
LambdaExpression lambda = new LambdaExpression();
lambda.Parameters = anonymousMethodExpression.Parameters;
if (anonymousMethodExpression.Body.Children.Count == 1) {
ReturnStatement rs = anonymousMethodExpression.Body.Children[0] as ReturnStatement;
if (rs != null) {
LambdaExpression lambda = new LambdaExpression();
if (rs != null)
lambda.ExpressionBody = rs.Expression;
lambda.Parameters = anonymousMethodExpression.Parameters;
ReplaceCurrentNode(lambda);
else {
lambda.StatementBody = anonymousMethodExpression.Body.Children[0] as Statement;
lambda.ReturnType = new TypeReference("System.Void", true);
}
} else {
var visitor = new ReturnStatementVisitor();
anonymousMethodExpression.AcceptVisitor(visitor, null);
lambda.StatementBody = anonymousMethodExpression.Body;
if (!visitor.HasReturn)
lambda.ReturnType = new TypeReference("System.Void", true);
}
ReplaceCurrentNode(lambda);
return null;
}
sealed class ReturnStatementVisitor : AbstractAstVisitor
{
public bool HasReturn { get; private set; }
public override object VisitReturnStatement(ReturnStatement returnStatement, object data)
{
HasReturn = true;
return base.VisitReturnStatement(returnStatement, data);
}
public override object VisitLambdaExpression(LambdaExpression lambdaExpression, object data)
{
return null;
}
public override object VisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data)
{
return null;
}
}
public override object VisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
{
base.VisitAssignmentExpression(assignmentExpression, data);

Loading…
Cancel
Save