Browse Source

Merge pull request #67 from erik-kallen/UserDefinedExplicitConversionBetweenReferenceTypes

User defined explicit conversion between reference types
newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
84c092c1eb
  1. 5
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs
  2. 27
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ConversionsTest.cs

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

@ -234,6 +234,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -234,6 +234,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (ExplicitEnumerationConversion(fromType, toType))
return Conversion.EnumerationConversion(false, false);
Conversion c = ExplicitNullableConversion(fromType, toType);
if (c.IsValid)
return c;
c = UserDefinedExplicitConversion(fromType, toType);
if (c.IsValid)
return c;
if (ExplicitReferenceConversion(fromType, toType))
@ -247,7 +250,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -247,7 +250,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
}
if (ExplicitPointerConversion(fromType, toType))
return Conversion.ExplicitPointerConversion;
return UserDefinedExplicitConversion(fromType, toType);
return Conversion.None;
}
#endregion

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

@ -33,15 +33,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -33,15 +33,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
using C = Conversion;
[TestFixture]
public unsafe class ConversionsTest
public unsafe class ConversionsTest : ResolverTestBase
{
ICompilation compilation;
CSharpConversions conversions;
[SetUp]
public void SetUp()
public override void SetUp()
{
compilation = new SimpleCompilation(CecilLoaderTests.Mscorlib);
base.SetUp();
conversions = new CSharpConversions(compilation);
}
@ -512,5 +510,24 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -512,5 +510,24 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
IType type2 = new ParameterizedType(resolvedA, new [] { new ParameterizedType(resolvedB, new[] { compilation.FindType(KnownTypeCode.String) }) });
Assert.IsFalse(conversions.ImplicitConversion(type1, type2).IsValid);
}
[Test]
public void ExplicitUserDefinedConversion() {
var rr = Resolve<ConversionResolveResult>(@"
class C1 {}
class C2 {
public static explicit operator C1(C2 c2) {
return null;
}
}
class C {
public void M() {
var c2 = new C2();
C1 c1 = $(C1)c2$;
}
}");
Assert.IsTrue(rr.Conversion.IsUserDefined);
Assert.AreEqual("op_Explicit", rr.Conversion.Method.Name);
}
}
}

Loading…
Cancel
Save