From a20e80a09c817f9381a7b259ce6d91d6a26b7fb6 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 12 Feb 2011 02:02:46 +0100 Subject: [PATCH] Add tests for InsertParenthesesVisitor. --- .../CSharp/InsertParenthesesVisitorTests.cs | 44 +++++++++++++++++++ .../Parser/Expression/CastExpressionTests.cs | 2 +- .../CSharp/Ast/Expressions/CastExpression.cs | 2 +- .../CSharp/Ast/Expressions/Expression.cs | 10 +++++ .../Expressions/UnaryOperatorExpression.cs | 10 +++++ .../CSharp/Ast/PrimitiveType.cs | 9 ++++ .../CSharp/Ast/SimpleType.cs | 9 ++++ .../OutputVisitor/InsertParenthesesVisitor.cs | 2 +- .../CSharp/OutputVisitor/OutputVisitor.cs | 2 +- .../CSharp/Resolver/ResolveVisitor.cs | 2 +- 10 files changed, 87 insertions(+), 5 deletions(-) diff --git a/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs index 1d5b0247e7..6cafb6a5a2 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs @@ -43,5 +43,49 @@ namespace ICSharpCode.NRefactory.CSharp Assert.AreEqual("cond = a == b", InsertRequired(expr)); Assert.AreEqual("cond = (a == b)", InsertReadable(expr)); } + + [Test] + public void TrickyCast1() + { + Expression expr = new UnaryOperatorExpression( + UnaryOperatorType.Minus, new IdentifierExpression("a") + ).CastTo(new PrimitiveType("int")); + + Assert.AreEqual("(int)-a", InsertRequired(expr)); + Assert.AreEqual("(int)(-a)", InsertReadable(expr)); + } + + [Test] + public void TrickyCast2() + { + Expression expr = new UnaryOperatorExpression( + UnaryOperatorType.Minus, new IdentifierExpression("a") + ).CastTo(new SimpleType("MyType")); + + Assert.AreEqual("(MyType)(-a)", InsertRequired(expr)); + Assert.AreEqual("(MyType)(-a)", InsertReadable(expr)); + } + + [Test] + public void TrickyCast3() + { + Expression expr = new UnaryOperatorExpression( + UnaryOperatorType.Not, new IdentifierExpression("a") + ).CastTo(new SimpleType("MyType")); + + Assert.AreEqual("(MyType)!a", InsertRequired(expr)); + Assert.AreEqual("(MyType)(!a)", InsertReadable(expr)); + } + + [Test] + public void CastAndInvoke() + { + Expression expr = new IdentifierExpression("a") + .CastTo(new PrimitiveType("string")) + .Member("Length"); + + Assert.AreEqual("((string)a).Length", InsertRequired(expr)); + Assert.AreEqual("((string)a).Length", InsertReadable(expr)); + } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/CastExpressionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/CastExpressionTests.cs index a55d27c3af..57604d083b 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/CastExpressionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/CastExpressionTests.cs @@ -133,7 +133,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.Expression public void IntMaxValueToBigInt() { CastExpression ce = ParseUtilCSharp.ParseExpression("(BigInt)int.MaxValue"); - Assert.AreEqual("BigInt", ce.CastTo.ToString()); + Assert.AreEqual("BigInt", ce.Type.ToString()); Assert.IsTrue(ce.Expression is MemberReferenceExpression); } } diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/CastExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/CastExpression.cs index 67093d44ed..1cf506bb52 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/CastExpression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/CastExpression.cs @@ -35,7 +35,7 @@ namespace ICSharpCode.NRefactory.CSharp get { return GetChildByRole (Roles.LPar); } } - public AstType CastTo { + public AstType Type { get { return GetChildByRole (Roles.Type); } set { SetChildByRole (Roles.Type, value); } } diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/Expression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/Expression.cs index abc1e00d0a..3aa04402b5 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/Expression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/Expression.cs @@ -107,6 +107,16 @@ namespace ICSharpCode.NRefactory.CSharp Arguments = arguments }; } + + public CastExpression CastTo(AstType type) + { + return new CastExpression { Type = type, Expression = this }; + } + + public AsExpression CastAs(AstType type) + { + return new AsExpression { Type = type, Expression = this }; + } #endregion } } diff --git a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/UnaryOperatorExpression.cs b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/UnaryOperatorExpression.cs index d563e63493..ae5a12338a 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/Expressions/UnaryOperatorExpression.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/Expressions/UnaryOperatorExpression.cs @@ -35,6 +35,16 @@ namespace ICSharpCode.NRefactory.CSharp { public readonly static Role OperatorRole = BinaryOperatorExpression.OperatorRole; + public UnaryOperatorExpression() + { + } + + public UnaryOperatorExpression(UnaryOperatorType op, Expression expression) + { + this.Operator = op; + this.Expression = expression; + } + public UnaryOperatorType Operator { get; set; diff --git a/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs b/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs index 5706f9b973..19f2e595f1 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/PrimitiveType.cs @@ -34,6 +34,15 @@ namespace ICSharpCode.NRefactory.CSharp public string Keyword { get; set; } public AstLocation Location { get; set; } + public PrimitiveType() + { + } + + public PrimitiveType(string keyword) + { + this.Keyword = keyword; + } + public override AstLocation StartLocation { get { return Location; diff --git a/ICSharpCode.NRefactory/CSharp/Ast/SimpleType.cs b/ICSharpCode.NRefactory/CSharp/Ast/SimpleType.cs index 7f69868bb9..2111ea533b 100644 --- a/ICSharpCode.NRefactory/CSharp/Ast/SimpleType.cs +++ b/ICSharpCode.NRefactory/CSharp/Ast/SimpleType.cs @@ -33,6 +33,15 @@ namespace ICSharpCode.NRefactory.CSharp { public class SimpleType : AstType { + public SimpleType() + { + } + + public SimpleType(string identifier) + { + this.Identifier = identifier; + } + public string Identifier { get { return GetChildByRole (Roles.Identifier).Name; diff --git a/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs b/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs index 9f7ab8d0f1..0b93f72cc2 100644 --- a/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs @@ -147,7 +147,7 @@ namespace ICSharpCode.NRefactory.CSharp Parenthesize(castExpression.Expression); } else { if (uoe != null && !(uoe.Operator == UnaryOperatorType.BitNot || uoe.Operator == UnaryOperatorType.Not)) { - if (TypeCanBeMisinterpretedAsExpression(castExpression.CastTo)) { + if (TypeCanBeMisinterpretedAsExpression(castExpression.Type)) { Parenthesize(castExpression.Expression); } } diff --git a/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs index c785b13b6a..73fd1b9deb 100644 --- a/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs @@ -463,7 +463,7 @@ namespace ICSharpCode.NRefactory.CSharp StartNode(castExpression); LPar(); Space(policy.WithinCastParentheses); - castExpression.CastTo.AcceptVisitor(this, data); + castExpression.Type.AcceptVisitor(this, data); Space(policy.WithinCastParentheses); RPar(); Space(policy.SpacesAfterTypecast); diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs index 0e1c50fcfb..f950a474ee 100644 --- a/ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs @@ -541,7 +541,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver public override ResolveResult VisitCastExpression(CastExpression castExpression, object data) { if (resolverEnabled) { - return resolver.ResolveCast(ResolveType(castExpression.CastTo), Resolve(castExpression.Expression)); + return resolver.ResolveCast(ResolveType(castExpression.Type), Resolve(castExpression.Expression)); } else { ScanChildren(castExpression); return null;