From 423b10b8244d9ecbb8cc1ea5abb6495d997407f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 10 May 2013 11:55:23 +0200 Subject: [PATCH] Fixed bug in simplify anonymous method issue. --- .../SimplifyAnonymousMethodToDelegateIssue.cs | 18 +++++++++ ...lifyAnonymousMethodToDelegateIssueTests.cs | 37 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs index d70ad46744..64cd9b8334 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SimplifyAnonymousMethodToDelegateIssue.cs @@ -27,6 +27,8 @@ using System; using System.Collections.Generic; using System.Linq; using ICSharpCode.NRefactory.PatternMatching; +using ICSharpCode.NRefactory.CSharp.Resolver; +using ICSharpCode.NRefactory.TypeSystem; namespace ICSharpCode.NRefactory.CSharp.Refactoring { @@ -96,6 +98,22 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring i++; } AddIssue(expression, ctx.TranslateString("Expression can be reduced to delegate"), script => { + var validTypes = CreateFieldAction.GetValidTypes (ctx.Resolver, expression).ToList (); + if (validTypes.Any (t => t.FullName == "System.Func" && t.TypeParameterCount == 1 + parameters.Count) && validTypes.Any (t => t.FullName == "System.Action")) { + var rr = ctx.Resolve (invocation) as CSharpInvocationResolveResult; + if (rr != null && rr.Member.ReturnType.Kind != ICSharpCode.NRefactory.TypeSystem.TypeKind.Void) { + var builder = ctx.CreateTypeSytemAstBuilder (expression); + var type = builder.ConvertType(new TopLevelTypeName("System", "Func", 1)); + var args = type is SimpleType ? ((SimpleType)type).TypeArguments : ((MemberType)type).TypeArguments; + args.Clear (); + foreach (var pde in parameters) { + args.Add (builder.ConvertType (ctx.Resolve (pde).Type)); + } + args.Add (builder.ConvertType (rr.Member.ReturnType)); + script.Replace(expression, new CastExpression (type, invocation.Target.Clone())); + return; + } + } script.Replace(expression, invocation.Target.Clone()); }); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs index 56ee142aac..dbc1b8b7f2 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SimplifyAnonymousMethodToDelegateIssueTests.cs @@ -160,6 +160,43 @@ class Foo var issues = GetIssues (new SimplifyAnonymousMethodToDelegateIssue (), input, out context); Assert.AreEqual (0, issues.Count); } + + /// + /// Bug 12184 - Expression can be reduced to delegate fix can create ambiguity + /// + [Test] + public void TestBug12184 () + { + var input = @"using System; +using System.Threading.Tasks; + +class C +{ + public C GetResponse () { return null; } + + public static void Foo () + { + Task.Factory.StartNew (() => GetResponse()); + } +}"; + + TestRefactoringContext context; + var issues = GetIssues (new SimplifyAnonymousMethodToDelegateIssue (), input, out context); + Assert.AreEqual (1, issues.Count); + CheckFix (context, issues, @"using System; +using System.Threading.Tasks; + +class C +{ + public C GetResponse () { return null; } + + public static void Foo () + { + Task.Factory.StartNew ((Func)GetResponse); + } +}"); + + } } }