Browse Source

Improved the handling of delegate contexts.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
2aec1be700
  1. 67
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 77
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs
  3. 3
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

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

@ -397,7 +397,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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<AstNode> ();
csResolver = new CSharpResolver(ctx);
var nodes = new List<AstNode>();
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 @@ -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) {

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

@ -0,0 +1,77 @@ @@ -0,0 +1,77 @@
//
// DelegateContextTests.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// 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
{
/// <summary>
/// Bug 4483 - Completion too aggressive for anonymous methods
/// </summary>
[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"));
});
}
}
}

3
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -265,6 +265,7 @@ @@ -265,6 +265,7 @@
<Compile Include="CSharp\Parser\Bugs\ParserBugTests.cs" />
<Compile Include="FormattingTests\TestKeepReformattingRules.cs" />
<Compile Include="FormattingTests\TestWrapping.cs" />
<Compile Include="CSharp\CodeCompletion\DelegateContextTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Mono.Cecil\Mono.Cecil.csproj">
@ -301,7 +302,7 @@ @@ -301,7 +302,7 @@
<Policies>
<TextStylePolicy TabWidth="4" EolMarker="Unix" inheritsSet="Mono" inheritsScope="text/plain" scope="text/plain" />
<TextStylePolicy FileWidth="120" TabWidth="4" EolMarker="Unix" inheritsSet="Mono" inheritsScope="text/plain" scope="text/x-csharp" />
<CSharpFormattingPolicy inheritsSet="1TBS" inheritsScope="text/x-csharp" scope="text/x-csharp" />
<CSharpFormattingPolicy IndentSwitchBody="True" IfElseBraceForcement="AddBraces" ForBraceForcement="AddBraces" ForEachBraceForcement="AddBraces" WhileBraceForcement="AddBraces" UsingBraceForcement="AddBraces" FixedBraceForcement="AddBraces" BeforeMethodDeclarationParentheses="False" BeforeMethodCallParentheses="False" BeforeConstructorDeclarationParentheses="False" BeforeDelegateDeclarationParentheses="False" NewParentheses="False" inheritsSet="Mono" inheritsScope="text/x-csharp" scope="text/x-csharp" />
</Policies>
</Properties>
</MonoDevelop>

Loading…
Cancel
Save