Browse Source

Fixed InsertParenthesesVisitor for casts of negative primitive expressions.

pull/124/head
Daniel Grunwald 14 years ago
parent
commit
987f9c8975
  1. 27
      NRefactory/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs
  2. 35
      NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs

27
NRefactory/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs

@ -85,6 +85,33 @@ namespace ICSharpCode.NRefactory.CSharp @@ -85,6 +85,33 @@ namespace ICSharpCode.NRefactory.CSharp
Assert.AreEqual("(MyType)(!a)", InsertReadable(expr));
}
[Test]
public void TrickyCast4()
{
Expression expr = new PrimitiveExpression(int.MinValue).CastTo(new SimpleType("MyType"));
Assert.AreEqual("(MyType)(-2147483648)", InsertRequired(expr));
Assert.AreEqual("(MyType)(-2147483648)", InsertReadable(expr));
}
[Test]
public void TrickyCast5()
{
Expression expr = new PrimitiveExpression(-1.0).CastTo(new SimpleType("MyType"));
Assert.AreEqual("(MyType)(-1.0)", InsertRequired(expr));
Assert.AreEqual("(MyType)(-1.0)", InsertReadable(expr));
}
[Test]
public void TrickyCast6()
{
Expression expr = new PrimitiveExpression(int.MinValue).CastTo(new PrimitiveType("double"));
Assert.AreEqual("(double)-2147483648", InsertRequired(expr));
Assert.AreEqual("(double)-2147483648", InsertReadable(expr));
}
[Test]
public void CastAndInvoke()
{

35
NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs

@ -156,6 +156,41 @@ namespace ICSharpCode.NRefactory.CSharp @@ -156,6 +156,41 @@ namespace ICSharpCode.NRefactory.CSharp
Parenthesize(castExpression.Expression);
}
}
// The above issue can also happen with PrimitiveExpressions representing negative values:
PrimitiveExpression pe = castExpression.Expression as PrimitiveExpression;
if (pe != null && pe.Value != null && TypeCanBeMisinterpretedAsExpression(castExpression.Type)) {
TypeCode typeCode = Type.GetTypeCode(pe.Value.GetType());
switch (typeCode) {
case TypeCode.SByte:
if ((sbyte)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Int16:
if ((short)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Int32:
if ((int)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Int64:
if ((long)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Single:
if ((float)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Double:
if ((double)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Decimal:
if ((decimal)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
}
}
return base.VisitCastExpression(castExpression, data);
}

Loading…
Cancel
Save