diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 1026dd96a9..eccaae6025 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -397,7 +397,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } methodGroup = invocationResult.Item1 as MethodGroupResolveResult; if (methodGroup != null) { - return CreateParameterCompletion(methodGroup, invocationResult.Item2, invoke.Node, invoke.Unit, currentParameter, controlSpace); + return CreateParameterCompletion( + methodGroup, + invocationResult.Item2, + invoke.Node, + invoke.Unit, + currentParameter, + controlSpace); } return null; case "=": @@ -415,7 +421,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (resolveResult.Item1.Type.Kind == TypeKind.Enum) { var wrapper = new CompletionDataWrapper(this); - AddContextCompletion(wrapper, resolveResult.Item2, expressionOrVariableDeclaration.Node, expressionOrVariableDeclaration.Unit); + AddContextCompletion( + wrapper, + resolveResult.Item2, + expressionOrVariableDeclaration.Node, + expressionOrVariableDeclaration.Unit); AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); AutoCompleteEmptyMatch = false; return wrapper.Result; @@ -484,7 +494,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (token == "+=") { string parameterDefinition = AddDelegateHandlers(wrapper, delegateType); string varName = GetPreviousMemberReferenceExpression(tokenIndex); - wrapper.Result.Add(factory.CreateEventCreationCompletionData(varName, delegateType, evt, parameterDefinition, currentMember, currentType)); + wrapper.Result.Add( + factory.CreateEventCreationCompletionData( + varName, + delegateType, + evt, + parameterDefinition, + currentMember, + currentType)); } return wrapper.Result; @@ -498,7 +515,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return HandleEnumContext(); var wrapper = new CompletionDataWrapper(this); - AddTypesAndNamespaces(wrapper, GetState(), null, t => currentType != null && !currentType.ReflectionName.Equals(t.ReflectionName) ? t : null); + AddTypesAndNamespaces( + wrapper, + GetState(), + null, + t => currentType != null && !currentType.ReflectionName.Equals(t.ReflectionName) ? t : null); return wrapper.Result; } return null; @@ -549,7 +570,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (identifierStart.Node is MemberReferenceExpression) { - return HandleMemberReferenceCompletion(new ExpressionResult(((MemberReferenceExpression)identifierStart.Node).Target, identifierStart.Unit)); + return HandleMemberReferenceCompletion( + new ExpressionResult(((MemberReferenceExpression)identifierStart.Node).Target, identifierStart.Unit)); } if (identifierStart.Node is Identifier) { @@ -631,6 +653,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } + + var astResolver = new CSharpAstResolver(GetState(), identifierStart.Unit, CSharpParsedFile); + + foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)n)) { + if (type.Kind == TypeKind.Delegate) { + AddDelegateHandlers(contextList, type, false, false); + AutoSelect = false; + AutoCompleteEmptyMatch = false; + } + } } // Handle object/enumerable initialzer expressions: "new O () { P$" @@ -669,12 +701,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AutoSelect = false; AutoCompleteEmptyMatch = false; } - } } } } - + if (n != null && n.Parent is ObjectCreateExpression) { var invokeResult = ResolveExpression(n.Parent, identifierStart.Unit); var mgr = invokeResult != null ? invokeResult.Item1 as ResolveResult : null; @@ -763,16 +794,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (n is MemberType) { resolveResult = ResolveExpression(((MemberType)n).Target, identifierStart.Unit); - return CreateTypeAndNamespaceCompletionData(location, resolveResult.Item1, ((MemberType)n).Target, resolveResult.Item2); + return CreateTypeAndNamespaceCompletionData( + location, + resolveResult.Item1, + ((MemberType)n).Target, + resolveResult.Item2 + ); } if (n != null/* && !(identifierStart.Item2 is TypeDeclaration)*/) { - csResolver = new CSharpResolver (ctx); - var nodes = new List (); + csResolver = new CSharpResolver(ctx); + var nodes = new List(); nodes.Add(n); if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { nodes.Add(n.Parent); } - var astResolver = new CSharpAstResolver (csResolver, identifierStart.Unit, CSharpParsedFile); + var astResolver = new CSharpAstResolver(csResolver, identifierStart.Unit, CSharpParsedFile); astResolver.ApplyNavigator(new NodeListResolveVisitorNavigator (nodes)); try { csResolver = astResolver.GetResolverStateBefore(n); @@ -2023,7 +2059,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion continue; string parameterDefinition = AddDelegateHandlers(result, resolvedType); string varName = "Handle" + method.Parameters [parameter].Type.Name + method.Parameters [parameter].Name; - result.Result.Add(factory.CreateEventCreationCompletionData(varName, resolvedType, null, parameterDefinition, currentMember, currentType)); + result.Result.Add( + factory.CreateEventCreationCompletionData( + varName, + resolvedType, + null, + parameterDefinition, + currentMember, + currentType)); } } if (!controlSpace) { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs new file mode 100644 index 0000000000..7a75d65b30 --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs @@ -0,0 +1,77 @@ +// +// DelegateContextTests.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using NUnit.Framework; + +namespace ICSharpCode.NRefactory.CSharp.CodeCompletion +{ + [TestFixture()] + public class DelegateContextTests : TestBase + { + /// + /// Bug 4483 - Completion too aggressive for anonymous methods + /// + [Test()] + public void TestBug4483() + { + // note 'string bar = new Test ().ToString ()' would be valid. + CodeCompletionBugTests.CombinedProviderTest( +@"using System; + +public class Test +{ + void TestFoo() + { + $Action act = a$ + } +} +", provider => { + Assert.IsFalse(provider.AutoSelect); + }); + } + + [Test()] + public void TestParameterContext() + { + // note 'string bar = new Test ().ToString ()' would be valid. + CodeCompletionBugTests.CombinedProviderTest( +@"using System; + +public class Test +{ + void TestFoo(Action act) + { + $TestFoo(a$ + } +} +", provider => { + Assert.IsFalse(provider.AutoSelect); + Assert.IsNotNull(provider.Find("delegate")); + }); + } + } +} + diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index 44348062d4..6f5f685bbb 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -265,6 +265,7 @@ + @@ -301,7 +302,7 @@ - +