From 24cdcd19583c810b5c30863bd282ef1c8cefbc93 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 18 Feb 2011 22:00:37 +0100 Subject: [PATCH] Use lambda expressions for anonymous methods that contain only a single return statement. --- .../Ast/Transforms/DelegateConstruction.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs b/ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs index 23c9fcd4c..4906cc97c 100644 --- a/ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs +++ b/ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs @@ -106,20 +106,34 @@ namespace Decompiler.Transforms body.AcceptVisitor(this, null); AnonymousMethodExpression ame = new AnonymousMethodExpression(); + bool isLambda = false; if (method.Parameters.All(p => string.IsNullOrEmpty(p.Name))) { ame.HasParameterList = false; } else { ame.HasParameterList = true; ame.Parameters.AddRange(AstBuilder.MakeParameters(method.Parameters)); + if (ame.Parameters.All(p => p.ParameterModifier == ParameterModifier.None)) { + isLambda = (body.Statements.Count == 1 && body.Statements.Single() is ReturnStatement); + } } - ame.Body = body; + // Replace all occurrences of 'this' in the method body with the delegate's target: foreach (AstNode node in body.Descendants) { if (node is ThisReferenceExpression) node.ReplaceWith(target.Clone()); } - objectCreateExpression.ReplaceWith(ame); + if (isLambda) { + LambdaExpression lambda = new LambdaExpression(); + ame.Parameters.MoveTo(lambda.Parameters); + Expression returnExpr = ((ReturnStatement)body.Statements.Single()).Expression; + returnExpr.Remove(); + lambda.Body = returnExpr; + objectCreateExpression.ReplaceWith(lambda); + } else { + ame.Body = body; + objectCreateExpression.ReplaceWith(ame); + } return true; }