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. 38
      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
public override object TrackedVisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data) public override object TrackedVisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data)
{ {
OutputAnonymousMethodWithStatementBody(anonymousMethodExpression.Parameters, anonymousMethodExpression.Body); UnsupportedNode(anonymousMethodExpression);
return null; return null;
} }
@ -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) public override object TrackedVisitQueryExpressionVB(QueryExpressionVB queryExpression, object data)
{ {
outputFormatter.IndentationLevel++; outputFormatter.IndentationLevel++;

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

@ -19,7 +19,7 @@ namespace ICSharpCode.NRefactory.Visitors
// The following conversions are implemented: // The following conversions are implemented:
// Conflicting field/property names -> m_field // Conflicting field/property names -> m_field
// Conflicting variable names inside methods // 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 // Simple event handler creation is replaced with AddressOfExpression
// Move Imports-statements out of namespaces // Move Imports-statements out of namespaces
// Parenthesis around Cast expressions remove - these are syntax errors in VB.NET // Parenthesis around Cast expressions remove - these are syntax errors in VB.NET
@ -134,17 +134,47 @@ namespace ICSharpCode.NRefactory.Visitors
public override object VisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data) public override object VisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression, object data)
{ {
base.VisitAnonymousMethodExpression(anonymousMethodExpression, data); base.VisitAnonymousMethodExpression(anonymousMethodExpression, data);
LambdaExpression lambda = new LambdaExpression();
lambda.Parameters = anonymousMethodExpression.Parameters;
if (anonymousMethodExpression.Body.Children.Count == 1) { if (anonymousMethodExpression.Body.Children.Count == 1) {
ReturnStatement rs = anonymousMethodExpression.Body.Children[0] as ReturnStatement; ReturnStatement rs = anonymousMethodExpression.Body.Children[0] as ReturnStatement;
if (rs != null) { if (rs != null)
LambdaExpression lambda = new LambdaExpression();
lambda.ExpressionBody = rs.Expression; lambda.ExpressionBody = rs.Expression;
lambda.Parameters = anonymousMethodExpression.Parameters; 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); 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; return null;
} }
}
public override object VisitAssignmentExpression(AssignmentExpression assignmentExpression, object data) public override object VisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
{ {

Loading…
Cancel
Save