Browse Source

Fixed handling of constants in OverloadResolution.GetArgumentsWithConversions().

This fixes IAttribute.PositionalArguments when implicit numeric conversions are involved.
newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
bfafe8b117
  1. 13
      ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs
  2. 6
      ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs
  3. 9
      ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs

13
ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs

@ -753,16 +753,21 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -753,16 +753,21 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var conversions = this.ArgumentConversions;
ResolveResult[] args = new ResolveResult[arguments.Length];
for (int i = 0; i < args.Length; i++) {
if (conversions[i] == Conversion.IdentityConversion || conversions[i] == Conversion.None) {
if (conversions[i] == Conversion.IdentityConversion) {
args[i] = arguments[i];
} else {
int parameterIndex = bestCandidate.ArgumentToParameterMap[i];
IType parameterType;
if (parameterIndex >= 0)
if (parameterIndex >= 0) {
parameterType = bestCandidate.ParameterTypes[parameterIndex];
else
} else {
parameterType = SpecialType.UnknownType;
args[i] = new ConversionResolveResult(parameterType, arguments[i], conversions[i]);
}
if (arguments[i].IsCompileTimeConstant && conversions[i] != Conversion.None) {
args[i] = new CSharpResolver(compilation).ResolveCast(parameterType, arguments[i]);
} else {
args[i] = new ConversionResolveResult(parameterType, arguments[i], conversions[i]);
}
}
}
return args;

6
ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs

@ -46,6 +46,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.TestCase @@ -46,6 +46,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.TestCase
public ParamsAttribute(params object[] x) {}
}
[Double(1)]
public class DoubleAttribute : Attribute
{
public DoubleAttribute(double val) {}
}
public unsafe class DynamicTest
{
public dynamic SimpleProperty { get; set; }

9
ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs

@ -612,5 +612,14 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -612,5 +612,14 @@ namespace ICSharpCode.NRefactory.TypeSystem
Assert.AreEqual("System.String", rr.Input.Type.FullName);
Assert.AreEqual("Test", rr.Input.ConstantValue);
}
[Test]
public void DoubleAttribute_ImplicitNumericConversion()
{
ITypeDefinition type = GetTypeDefinition(typeof(DoubleAttribute)).GetDefinition();
var arg = type.Attributes.Single().PositionalArguments.ElementAt(0);
Assert.AreEqual("System.Double", arg.Type.ReflectionName);
Assert.AreEqual(1.0, arg.ConstantValue);
}
}
}

Loading…
Cancel
Save