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);
+ }
+}");
+
+ }
}
}