From 987f9c89758658f4ba18d8c4ec9a98e4701ef708 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 9 Apr 2011 16:29:52 +0200 Subject: [PATCH] Fixed InsertParenthesesVisitor for casts of negative primitive expressions. --- .../CSharp/InsertParenthesesVisitorTests.cs | 27 ++++++++++++++ .../OutputVisitor/InsertParenthesesVisitor.cs | 35 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs b/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs index ea7a3e43f..dab0c7265 100644 --- a/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs +++ b/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs @@ -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() { diff --git a/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs b/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs index cfa12e17a..8e2e5981b 100644 --- a/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs +++ b/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs @@ -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); }