Browse Source

Use specialized method for MethodGroupConversion. icsharpcode/NRefactory#21

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
24d2d195f9
  1. 2
      ICSharpCode.NRefactory.CSharp/Resolver/Conversions.cs
  2. 2
      ICSharpCode.NRefactory.CSharp/Resolver/TypeInference.cs
  3. 22
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

2
ICSharpCode.NRefactory.CSharp/Resolver/Conversions.cs

@ -804,7 +804,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -804,7 +804,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
}
var or = rr.PerformOverloadResolution(compilation, args, allowExpandingParams: false, conversions: this);
if (or.FoundApplicableCandidate)
return Conversion.MethodGroupConversion((IMethod)or.BestCandidate);
return Conversion.MethodGroupConversion((IMethod)or.GetBestCandidateWithSubstitutedTypeArguments());
else
return Conversion.None;
}

2
ICSharpCode.NRefactory.CSharp/Resolver/TypeInference.cs

@ -513,7 +513,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -513,7 +513,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
allowExtensionMethods: false,
allowExpandingParams: false);
if (or.FoundApplicableCandidate && or.BestCandidateAmbiguousWith == null) {
IType returnType = or.BestCandidate.ReturnType;
IType returnType = or.GetBestCandidateWithSubstitutedTypeArguments().ReturnType;
MakeLowerBoundInference(returnType, m.ReturnType);
}
}

22
ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

@ -19,10 +19,10 @@ @@ -19,10 +19,10 @@
using System;
using System.IO;
using System.Linq;
using ICSharpCode.NRefactory.CSharp.TypeSystem;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.Resolver
@ -343,5 +343,25 @@ class Derived<T> : Base where T : Derived<T> @@ -343,5 +343,25 @@ class Derived<T> : Base where T : Derived<T>
Assert.IsFalse(rr.IsError);
Assert.AreEqual(0, rr.Member.Parameters.Count);
}
[Test]
public void MethodGroupConversionForGenericMethodHasSpecializedMethod()
{
string program = @"using System;
class TestClass {
void F<T>(T x) {}
public void M() {
System.Action<int> f;
f = $F$;
}
}";
var conversion = GetConversion(program);
Assert.IsTrue(conversion.IsValid);
Assert.IsTrue(conversion.IsMethodGroupConversion);
Assert.IsInstanceOf<SpecializedMethod>(conversion.Method);
Assert.AreEqual(
new[] { "System.Int32" },
((SpecializedMethod)conversion.Method).TypeArguments.Select(t => t.ReflectionName).ToArray());
}
}
}

Loading…
Cancel
Save