From f7006071143dd83a869d78a2c86bdedd1d9f230d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Tue, 26 Feb 2013 10:14:46 +0100 Subject: [PATCH] SimplifyAnonymousMethodToDelegateIssues now doesn't touch too complex expressions. --- .../SimplifyAnonymousMethodToDelegateIssue.cs | 62 +++++++++---------- ...lifyAnonymousMethodToDelegateIssueTests.cs | 23 ++++++- 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs index a58639e864..3bdbf26142 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs @@ -62,14 +62,27 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring return null; } - public override void VisitLambdaExpression(LambdaExpression lambdaExpression) + static bool IsSimpleTarget(Expression target) { - base.VisitLambdaExpression(lambdaExpression); - var invocation = AnalyzeBody(lambdaExpression.Body); + if (target is IdentifierExpression) + return true; + var mref = target as MemberReferenceExpression; + if (mref != null) + return IsSimpleTarget (mref.Target); + var pref = target as PointerReferenceExpression; + if (pref != null) + return IsSimpleTarget (pref.Target); + return false; + } + + void AnalyzeExpression(AstNode expression, AstNode body, AstNodeCollection parameters) + { + var invocation = AnalyzeBody(body); if (invocation == null) return; - - var lambdaParameters = lambdaExpression.Parameters.ToList(); + if (!IsSimpleTarget (invocation.Target)) + return; + var lambdaParameters = parameters.ToList(); if (lambdaParameters.Count != invocation.Arguments.Count) return; int i = 0; @@ -77,42 +90,25 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring var id = param as IdentifierExpression; if (id == null) return; - if (lambdaParameters [i].Name != id.Identifier) + if (lambdaParameters[i].Name != id.Identifier) return; i++; } - - AddIssue( - lambdaExpression, - ctx.TranslateString("Expression can be reduced to delegate"), - script => { script.Replace (lambdaExpression, invocation.Target.Clone ()); }); + AddIssue(expression, ctx.TranslateString("Expression can be reduced to delegate"), script => { + script.Replace(expression, invocation.Target.Clone()); + }); + } + + public override void VisitLambdaExpression(LambdaExpression lambdaExpression) + { + base.VisitLambdaExpression(lambdaExpression); + AnalyzeExpression(lambdaExpression, lambdaExpression.Body, lambdaExpression.Parameters); } public override void VisitAnonymousMethodExpression(AnonymousMethodExpression anonymousMethodExpression) { base.VisitAnonymousMethodExpression(anonymousMethodExpression); - - var invocation = AnalyzeBody(anonymousMethodExpression.Body); - if (invocation == null) - return; - - var lambdaParameters = anonymousMethodExpression.Parameters.ToList(); - if (lambdaParameters.Count != invocation.Arguments.Count) - return; - int i = 0; - foreach (var param in invocation.Arguments) { - var id = param as IdentifierExpression; - if (id == null) - return; - if (lambdaParameters [i].Name != id.Identifier) - return; - i++; - } - - AddIssue( - anonymousMethodExpression, - ctx.TranslateString("Expression can be reduced to delegate"), - script => { script.Replace (anonymousMethodExpression, invocation.Target.Clone ()); }); + AnalyzeExpression(anonymousMethodExpression, anonymousMethodExpression.Body, anonymousMethodExpression.Parameters); } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs index 5942f35f24..56ee142aac 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs @@ -123,7 +123,28 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues } [Test] - public void TestSimpleInvalidAnonymousMethod () + public void TestSkipComplexCase () + { + var input = @"using System; +using System.Linq; + +class Foo +{ + int MyMethod (int x, int y) { return x * y; } + + void Bar (string str) + { + var action = $() => str.Where (c => c != 'a').ToArray (); + } +}"; + + TestRefactoringContext context; + var issues = GetIssues (new SimplifyAnonymousMethodToDelegateIssue (), input, out context); + Assert.AreEqual (0, issues.Count); + } + + [Test] + public void TestComplexCase () { var input = @"class Foo {