Browse Source

Rename IsExtensionMethodGroupConversion -> DelegateCapturesFirstArgument.

pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
17c4315974
  1. 5
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs
  2. 27
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ConversionsTest.cs
  3. 25
      ICSharpCode.NRefactory/Semantics/Conversion.cs

5
ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs

@ -1062,10 +1062,11 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var thisRR = rr.TargetResult as ThisResolveResult; var thisRR = rr.TargetResult as ThisResolveResult;
bool isVirtual = method.IsOverridable && !(thisRR != null && thisRR.CausesNonVirtualInvocation); bool isVirtual = method.IsOverridable && !(thisRR != null && thisRR.CausesNonVirtualInvocation);
bool isValid = !or.IsAmbiguous && IsDelegateCompatible(method, invoke, or.IsExtensionMethodInvocation); bool isValid = !or.IsAmbiguous && IsDelegateCompatible(method, invoke, or.IsExtensionMethodInvocation);
bool delegateCapturesFirstArgument = or.IsExtensionMethodInvocation || !method.IsStatic;
if (isValid) if (isValid)
return Conversion.MethodGroupConversion(method, isVirtual, or.IsExtensionMethodInvocation); return Conversion.MethodGroupConversion(method, isVirtual, delegateCapturesFirstArgument);
else else
return Conversion.InvalidMethodGroupConversion(method, isVirtual, or.IsExtensionMethodInvocation); return Conversion.InvalidMethodGroupConversion(method, isVirtual, delegateCapturesFirstArgument);
} else { } else {
return Conversion.None; return Conversion.None;
} }

27
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ConversionsTest.cs

@ -615,6 +615,25 @@ class Test {
var c = GetConversion(program); var c = GetConversion(program);
Assert.IsTrue(c.IsValid); Assert.IsTrue(c.IsValid);
Assert.IsTrue(c.IsMethodGroupConversion); Assert.IsTrue(c.IsMethodGroupConversion);
Assert.IsFalse(c.DelegateCapturesFirstArgument);
Assert.IsNotNull(c.Method);
}
[Test]
public void MethodGroupConversion_Void_InstanceMethod()
{
string program = @"using System;
delegate void D();
class Test {
D d;
public void M() {
d = $M$;
}
}";
var c = GetConversion(program);
Assert.IsTrue(c.IsValid);
Assert.IsTrue(c.IsMethodGroupConversion);
Assert.IsTrue(c.DelegateCapturesFirstArgument);
Assert.IsNotNull(c.Method); Assert.IsNotNull(c.Method);
} }
@ -837,7 +856,7 @@ class Test {
{ {
string program = @"using System; string program = @"using System;
static class Ext { static class Ext {
public void M(this string s, int x) {} public static void M(this string s, int x) {}
} }
class Test { class Test {
delegate void D(int a); delegate void D(int a);
@ -849,7 +868,7 @@ class Test {
var c = GetConversion(program); var c = GetConversion(program);
Assert.IsTrue(c.IsValid); Assert.IsTrue(c.IsValid);
Assert.IsTrue(c.IsMethodGroupConversion); Assert.IsTrue(c.IsMethodGroupConversion);
Assert.IsTrue(c.IsExtensionMethodGroupConversion); Assert.IsTrue(c.DelegateCapturesFirstArgument);
} }
[Test] [Test]
@ -857,7 +876,7 @@ class Test {
{ {
string program = @"using System; string program = @"using System;
static class Ext { static class Ext {
public void M(this string s, int x) {} public static void M(this string s, int x) {}
} }
class Test { class Test {
delegate void D(string s, int a); delegate void D(string s, int a);
@ -868,7 +887,7 @@ class Test {
var c = GetConversion(program); var c = GetConversion(program);
Assert.IsTrue(c.IsValid); Assert.IsTrue(c.IsValid);
Assert.IsTrue(c.IsMethodGroupConversion); Assert.IsTrue(c.IsMethodGroupConversion);
Assert.IsFalse(c.IsExtensionMethodGroupConversion); Assert.IsFalse(c.DelegateCapturesFirstArgument);
} }
[Test] [Test]

25
ICSharpCode.NRefactory/Semantics/Conversion.cs

@ -97,18 +97,18 @@ namespace ICSharpCode.NRefactory.Semantics
return new UserDefinedConv(isImplicit, operatorMethod, conversionBeforeUserDefinedOperator, conversionAfterUserDefinedOperator, isLifted, isAmbiguous); return new UserDefinedConv(isImplicit, operatorMethod, conversionBeforeUserDefinedOperator, conversionAfterUserDefinedOperator, isLifted, isAmbiguous);
} }
public static Conversion MethodGroupConversion(IMethod chosenMethod, bool isVirtualMethodLookup, bool isExtensionMethodGroupConversion) public static Conversion MethodGroupConversion(IMethod chosenMethod, bool isVirtualMethodLookup, bool delegateCapturesFirstArgument)
{ {
if (chosenMethod == null) if (chosenMethod == null)
throw new ArgumentNullException("chosenMethod"); throw new ArgumentNullException("chosenMethod");
return new MethodGroupConv(chosenMethod, isVirtualMethodLookup, isExtensionMethodGroupConversion, isValid: true); return new MethodGroupConv(chosenMethod, isVirtualMethodLookup, delegateCapturesFirstArgument, isValid: true);
} }
public static Conversion InvalidMethodGroupConversion(IMethod chosenMethod, bool isVirtualMethodLookup, bool isExtensionMethodGroupConversion) public static Conversion InvalidMethodGroupConversion(IMethod chosenMethod, bool isVirtualMethodLookup, bool delegateCapturesFirstArgument)
{ {
if (chosenMethod == null) if (chosenMethod == null)
throw new ArgumentNullException("chosenMethod"); throw new ArgumentNullException("chosenMethod");
return new MethodGroupConv(chosenMethod, isVirtualMethodLookup, isExtensionMethodGroupConversion, isValid: false); return new MethodGroupConv(chosenMethod, isVirtualMethodLookup, delegateCapturesFirstArgument, isValid: false);
} }
#endregion #endregion
@ -346,14 +346,14 @@ namespace ICSharpCode.NRefactory.Semantics
{ {
readonly IMethod method; readonly IMethod method;
readonly bool isVirtualMethodLookup; readonly bool isVirtualMethodLookup;
readonly bool isExtensionMethodGroupConversion; readonly bool delegateCapturesFirstArgument;
readonly bool isValid; readonly bool isValid;
public MethodGroupConv(IMethod method, bool isVirtualMethodLookup, bool isExtensionMethodGroupConversion, bool isValid) public MethodGroupConv(IMethod method, bool isVirtualMethodLookup, bool delegateCapturesFirstArgument, bool isValid)
{ {
this.method = method; this.method = method;
this.isVirtualMethodLookup = isVirtualMethodLookup; this.isVirtualMethodLookup = isVirtualMethodLookup;
this.isExtensionMethodGroupConversion = isExtensionMethodGroupConversion; this.delegateCapturesFirstArgument = delegateCapturesFirstArgument;
this.isValid = isValid; this.isValid = isValid;
} }
@ -373,8 +373,8 @@ namespace ICSharpCode.NRefactory.Semantics
get { return isVirtualMethodLookup; } get { return isVirtualMethodLookup; }
} }
public override bool IsExtensionMethodGroupConversion { public override bool DelegateCapturesFirstArgument {
get { return isExtensionMethodGroupConversion; } get { return delegateCapturesFirstArgument; }
} }
public override IMethod Method { public override IMethod Method {
@ -525,9 +525,12 @@ namespace ICSharpCode.NRefactory.Semantics
} }
/// <summary> /// <summary>
/// For method-group conversions, gets whether the conversion is a method group conversion of an extension method performed on an instance (eg. Func&lt;int&gt; f = myEnumerable.Single). /// For method-group conversions, gets whether the conversion captures the first argument.
///
/// For instance methods, this property always returns true for C# method-group conversions.
/// For static methods, this property returns true for method-group conversions of an extension method performed on an instance (eg. <c>Func&lt;int&gt; f = myEnumerable.Single</c>).
/// </summary> /// </summary>
public virtual bool IsExtensionMethodGroupConversion { public virtual bool DelegateCapturesFirstArgument {
get { return false; } get { return false; }
} }

Loading…
Cancel
Save