diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 42233c80ce..dd7a147ab4 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -2326,6 +2326,30 @@ namespace ICSharpCode.NRefactory.CSharp.Completion yield return factory.CreateNamespaceCompletionData(ns); } } + + void CreateParameterForInvocation(CompletionDataWrapper result, IMethod method, CSharpResolver state, int parameter, HashSet addedEnums, HashSet addedDelegates) + { + if (method.Parameters.Count <= parameter) { + return; + } + var resolvedType = method.Parameters[parameter].Type; + if (resolvedType.Kind == TypeKind.Enum) { + if (addedEnums.Contains(resolvedType.ReflectionName)) { + return; + } + addedEnums.Add(resolvedType.ReflectionName); + AddEnumMembers(result, resolvedType, state); + return; + } + + if (resolvedType.Kind == TypeKind.Delegate) { + if (addedDelegates.Contains(resolvedType.ReflectionName)) + return; + string parameterDefinition = AddDelegateHandlers(result, resolvedType, false); + string varName = "Handle" + method.Parameters[parameter].Type.Name + method.Parameters[parameter].Name; + result.Result.Add(factory.CreateEventCreationCompletionData(varName, resolvedType, null, parameterDefinition, currentMember, currentType)); + } + } IEnumerable CreateParameterCompletion(MethodGroupResolveResult resolveResult, CSharpResolver state, AstNode invocation, SyntaxTree unit, int parameter, bool controlSpace) { @@ -2334,30 +2358,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var addedDelegates = new HashSet(); foreach (var method in resolveResult.Methods) { - if (method.Parameters.Count <= parameter) { - continue; - } - var resolvedType = method.Parameters [parameter].Type; - if (resolvedType.Kind == TypeKind.Enum) { - if (addedEnums.Contains(resolvedType.ReflectionName)) { - continue; - } - addedEnums.Add(resolvedType.ReflectionName); - AddEnumMembers(result, resolvedType, state); - } else if (resolvedType.Kind == TypeKind.Delegate) { - if (addedDelegates.Contains(resolvedType.ReflectionName)) + CreateParameterForInvocation(result, method, state, parameter, addedEnums, addedDelegates); + } + foreach (var methods in resolveResult.GetEligibleExtensionMethods (true)) { + foreach (var method in methods) { + if (resolveResult.Methods.Contains (method)) continue; - string parameterDefinition = AddDelegateHandlers(result, resolvedType, false); - string varName = "Handle" + method.Parameters [parameter].Type.Name + method.Parameters [parameter].Name; - result.Result.Add( - factory.CreateEventCreationCompletionData( - varName, - resolvedType, - null, - parameterDefinition, - currentMember, - currentType) - ); + CreateParameterForInvocation(result, new ReducedExtensionMethod (method), state, parameter, addedEnums, addedDelegates); } } diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index d34a9e8af8..bf4f3d32a6 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -129,11 +129,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } methods.Add (method); } - foreach (var m in methods) + foreach (var m in methods) { yield return m; + } foreach (var extMethods in resolveResult.GetEligibleExtensionMethods (true)) { foreach (var method in extMethods) { - yield return method; + if (methods.Contains (method)) + continue; + yield return new ReducedExtensionMethod (method); } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs index 5c80041138..bcda1753af 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs @@ -1131,6 +1131,46 @@ class TestClass Assert.IsNotNull (provider.Find ("TestEnum.C"), "enum 'TestEnum.C' not found."); } + [Test] + public void TestEnumInExtensionMethod() + { + var provider = CodeCompletionBugTests.CreateCtrlSpaceProvider(@" +public enum TestEnum { A, B, C} +static class Ext { public static void Foo(this object o, TestEnum str) {} } +class Test +{ + public static void Main (string[] args) + { + $args.Foo($ + } +}"); + Assert.IsNotNull (provider.Find ("TestEnum"), "enum 'TestEnum' not found."); + Assert.IsNotNull (provider.Find ("TestEnum.A"), "enum 'TestEnum.A' not found."); + Assert.IsNotNull (provider.Find ("TestEnum.B"), "enum 'TestEnum.B' not found."); + Assert.IsNotNull (provider.Find ("TestEnum.C"), "enum 'TestEnum.C' not found."); + } + + + [Test] + public void TestEnumInExtensionMethodStaticInvocation() + { + var provider = CodeCompletionBugTests.CreateCtrlSpaceProvider(@" +public enum TestEnum { A, B, C} +static class Ext { public static void Foo(this object o, TestEnum str) {} } +class Test +{ + public static void Main (string[] args) + { + $Ext.Foo(args, $ + } +}"); + Assert.IsNotNull (provider.Find ("TestEnum"), "enum 'TestEnum' not found."); + Assert.IsNotNull (provider.Find ("TestEnum.A"), "enum 'TestEnum.A' not found."); + Assert.IsNotNull (provider.Find ("TestEnum.B"), "enum 'TestEnum.B' not found."); + Assert.IsNotNull (provider.Find ("TestEnum.C"), "enum 'TestEnum.C' not found."); + } + + [Test()] public void TestEnumAsParameterCase2 () { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index 2dc952fdaa..6c8ac7fd53 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -1130,5 +1130,36 @@ public class Test Assert.AreEqual (1, provider.Count); } + [Test] + public void TestExtensionMethod() + { + var provider = CreateProvider(@"static class Ext { public static void Foo(this object o, string str) {} } +class Test +{ + public static void Main (string[] args) + { + $args.Foo($ + } +}"); + Assert.AreEqual (1, provider.Count); + Assert.AreEqual (1, provider.GetParameterCount (0)); + } + + + [Test] + public void TestExtensionMethodStaticInvocation() + { + var provider = CreateProvider(@"static class Ext { public static void Foo(this object o, string str) {} } +class Test +{ + public static void Main (string[] args) + { + $Ext.Foo($ + } +}"); + Assert.AreEqual (1, provider.Count); + Assert.AreEqual (2, provider.GetParameterCount (0)); + } + } } \ No newline at end of file