diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 62ca8d9939..6bfdfff048 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -48,7 +48,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public string EolMarker { get; set; } public string IndentString { get; set; } -#endregion + #endregion #region Result properties public bool AutoCompleteEmptyMatch; @@ -2014,34 +2014,47 @@ namespace ICSharpCode.NRefactory.CSharp.Completion "delegate", "Creates anonymous delegate.", "delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString - ); + ); } var sb = new StringBuilder("("); var sbWithoutTypes = new StringBuilder("("); + var state = GetState(); + var builder = new TypeSystemAstBuilder(state); + for (int k = 0; k < delegateMethod.Parameters.Count; k++) { if (k > 0) { sb.Append(", "); sbWithoutTypes.Append(", "); } - var parameterType = delegateMethod.Parameters [k].Type; - sb.Append(GetShortType(parameterType, GetState())); - sb.Append(" "); - sb.Append(delegateMethod.Parameters [k].Name); + var convertedParameter = builder.ConvertParameter (delegateMethod.Parameters [k]); + if (convertedParameter.ParameterModifier == ParameterModifier.Params) + convertedParameter.ParameterModifier = ParameterModifier.None; + sb.Append(convertedParameter.GetText (FormattingPolicy)); sbWithoutTypes.Append(delegateMethod.Parameters [k].Name); } + sb.Append(")"); sbWithoutTypes.Append(")"); completionList.AddCustom( "delegate" + sb, "Creates anonymous delegate.", "delegate" + sb + " {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString - ); - if (!completionList.Result.Any(data => data.DisplayText == sbWithoutTypes.ToString())) { + ); + + if (!completionList.Result.Any(data => data.DisplayText == sb.ToString())) { + completionList.AddCustom( + sb.ToString(), + "Creates typed lambda expression.", + sb + " => |" + (addSemicolon ? ";" : "") + ); + } + + if (!delegateMethod.Parameters.Any (p => p.IsOut || p.IsRef) && !completionList.Result.Any(data => data.DisplayText == sbWithoutTypes.ToString())) { completionList.AddCustom( sbWithoutTypes.ToString(), "Creates lambda expression.", sbWithoutTypes + " => |" + (addSemicolon ? ";" : "") - ); + ); } /* TODO:Make factory method out of it. // It's needed to temporarly disable inserting auto matching bracket because the anonymous delegates are selectable with '(' @@ -2055,7 +2068,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion }*/ return sb.ToString(); } - + bool IsAccessibleFrom(IEntity member, ITypeDefinition calledType, IMember currentMember, bool includeProtected) { if (currentMember == null) { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs index 7a66ddea77..07c5fec923 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs @@ -97,6 +97,30 @@ public class Test Assert.IsNotNull(provider.Find("(arg1, arg2)")); }); } + + + [Test()] + public void TestRefOutParams() + { + CodeCompletionBugTests.CombinedProviderTest( + @"using System; +public delegate void FooBar (out int foo, ref int bar, params object[] additional); + +public class Test +{ + FooBar foo; + + void TestFoo() + { + $foo = d$ + } +} +", provider => { + Assert.IsFalse(provider.AutoSelect); + Assert.IsNotNull(provider.Find("(out int foo, ref int bar, object[] additional)")); + Assert.IsNull(provider.Find("(foo, bar, additional)")); + }); + } } }