Browse Source

[Completion] Fixed wrong delegate signature.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
0eaf61ea30
  1. 33
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 24
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs

33
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -48,7 +48,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
public string EolMarker { get; set; } public string EolMarker { get; set; }
public string IndentString { get; set; } public string IndentString { get; set; }
#endregion #endregion
#region Result properties #region Result properties
public bool AutoCompleteEmptyMatch; public bool AutoCompleteEmptyMatch;
@ -2014,34 +2014,47 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
"delegate", "delegate",
"Creates anonymous delegate.", "Creates anonymous delegate.",
"delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString "delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString
); );
} }
var sb = new StringBuilder("("); var sb = new StringBuilder("(");
var sbWithoutTypes = new StringBuilder("("); var sbWithoutTypes = new StringBuilder("(");
var state = GetState();
var builder = new TypeSystemAstBuilder(state);
for (int k = 0; k < delegateMethod.Parameters.Count; k++) { for (int k = 0; k < delegateMethod.Parameters.Count; k++) {
if (k > 0) { if (k > 0) {
sb.Append(", "); sb.Append(", ");
sbWithoutTypes.Append(", "); sbWithoutTypes.Append(", ");
} }
var parameterType = delegateMethod.Parameters [k].Type; var convertedParameter = builder.ConvertParameter (delegateMethod.Parameters [k]);
sb.Append(GetShortType(parameterType, GetState())); if (convertedParameter.ParameterModifier == ParameterModifier.Params)
sb.Append(" "); convertedParameter.ParameterModifier = ParameterModifier.None;
sb.Append(delegateMethod.Parameters [k].Name); sb.Append(convertedParameter.GetText (FormattingPolicy));
sbWithoutTypes.Append(delegateMethod.Parameters [k].Name); sbWithoutTypes.Append(delegateMethod.Parameters [k].Name);
} }
sb.Append(")"); sb.Append(")");
sbWithoutTypes.Append(")"); sbWithoutTypes.Append(")");
completionList.AddCustom( completionList.AddCustom(
"delegate" + sb, "delegate" + sb,
"Creates anonymous delegate.", "Creates anonymous delegate.",
"delegate" + sb + " {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString "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( completionList.AddCustom(
sbWithoutTypes.ToString(), sbWithoutTypes.ToString(),
"Creates lambda expression.", "Creates lambda expression.",
sbWithoutTypes + " => |" + (addSemicolon ? ";" : "") sbWithoutTypes + " => |" + (addSemicolon ? ";" : "")
); );
} }
/* TODO:Make factory method out of it. /* TODO:Make factory method out of it.
// It's needed to temporarly disable inserting auto matching bracket because the anonymous delegates are selectable with '(' // 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(); return sb.ToString();
} }
bool IsAccessibleFrom(IEntity member, ITypeDefinition calledType, IMember currentMember, bool includeProtected) bool IsAccessibleFrom(IEntity member, ITypeDefinition calledType, IMember currentMember, bool includeProtected)
{ {
if (currentMember == null) { if (currentMember == null) {

24
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs

@ -97,6 +97,30 @@ public class Test
Assert.IsNotNull(provider.Find("(arg1, arg2)")); 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)"));
});
}
} }
} }

Loading…
Cancel
Save