From 212d39b248289930c77dd9f0b290beb84377dac7 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 23 Feb 2011 17:34:35 +0100 Subject: [PATCH 1/4] Fix duplicate reference to Mono.Cecil. --- ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj index 6fdcd0c9f1..a001adbd43 100644 --- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj +++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj @@ -340,16 +340,6 @@ - - - - - - - {D68133BD-1E63-496E-9EDE-4FBDBF77B486} - Mono.Cecil - - {D68133BD-1E63-496E-9EDE-4FBDBF77B486} From 5a34a9c7d0efb863566a192a9d833716f66efc04 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 24 Feb 2011 02:03:28 +0100 Subject: [PATCH 2/4] Fix output of checked and unchecked expressions. --- ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs index cf880653e6..1c67668d04 100644 --- a/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs @@ -566,7 +566,7 @@ namespace ICSharpCode.NRefactory.CSharp WriteKeyword("checked"); LPar(); Space(policy.WithinCheckedExpressionParantheses); - checkedExpression.AcceptVisitor(this, data); + checkedExpression.Expression.AcceptVisitor(this, data); Space(policy.WithinCheckedExpressionParantheses); RPar(); return EndNode(checkedExpression); @@ -933,7 +933,7 @@ namespace ICSharpCode.NRefactory.CSharp WriteKeyword("unchecked"); LPar(); Space(policy.WithinCheckedExpressionParantheses); - uncheckedExpression.AcceptVisitor(this, data); + uncheckedExpression.Expression.AcceptVisitor(this, data); Space(policy.WithinCheckedExpressionParantheses); RPar(); return EndNode(uncheckedExpression); From 2200240ef60fc49f32b89eb85c9f3a8ba796b08d Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 24 Feb 2011 02:03:58 +0100 Subject: [PATCH 3/4] InsertParenthesesVisitor: don't insert parentheses for "a && b && c" --- .../CSharp/InsertParenthesesVisitorTests.cs | 74 ++++++++++++++++++- .../OutputVisitor/InsertParenthesesVisitor.cs | 17 ++++- 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs index fd044068fd..5fa0b54694 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs @@ -159,7 +159,7 @@ namespace ICSharpCode.NRefactory.CSharp public void MethodCallOnQueryExpression() { Expression expr = new QueryExpression { - Clauses = new QueryClause[] { + Clauses = { new QueryFromClause { Identifier = "a", Expression = new IdentifierExpression("b") @@ -178,7 +178,7 @@ namespace ICSharpCode.NRefactory.CSharp public void SumOfQueries() { QueryExpression query = new QueryExpression { - Clauses = new QueryClause[] { + Clauses = { new QueryFromClause { Identifier = "a", Expression = new IdentifierExpression("b") @@ -206,7 +206,7 @@ namespace ICSharpCode.NRefactory.CSharp public void QueryInTypeTest() { Expression expr = new QueryExpression { - Clauses = new QueryClause[] { + Clauses = { new QueryFromClause { Identifier = "a", Expression = new IdentifierExpression("b") @@ -252,5 +252,73 @@ namespace ICSharpCode.NRefactory.CSharp Assert.AreEqual("(++a)++", InsertRequired(expr)); Assert.AreEqual("(++a)++", InsertReadable(expr)); } + + [Test] + public void Logical1() + { + Expression expr = new BinaryOperatorExpression( + new BinaryOperatorExpression( + new IdentifierExpression("a"), + BinaryOperatorType.ConditionalAnd, + new IdentifierExpression("b") + ), + BinaryOperatorType.ConditionalAnd, + new IdentifierExpression("c") + ); + + Assert.AreEqual("a && b && c", InsertRequired(expr)); + Assert.AreEqual("a && b && c", InsertReadable(expr)); + } + + [Test] + public void Logical2() + { + Expression expr = new BinaryOperatorExpression( + new IdentifierExpression("a"), + BinaryOperatorType.ConditionalAnd, + new BinaryOperatorExpression( + new IdentifierExpression("b"), + BinaryOperatorType.ConditionalAnd, + new IdentifierExpression("c") + ) + ); + + Assert.AreEqual("a && (b && c)", InsertRequired(expr)); + Assert.AreEqual("a && (b && c)", InsertReadable(expr)); + } + + [Test] + public void Logical3() + { + Expression expr = new BinaryOperatorExpression( + new IdentifierExpression("a"), + BinaryOperatorType.ConditionalOr, + new BinaryOperatorExpression( + new IdentifierExpression("b"), + BinaryOperatorType.ConditionalAnd, + new IdentifierExpression("c") + ) + ); + + Assert.AreEqual("a || b && c", InsertRequired(expr)); + Assert.AreEqual("a || (b && c)", InsertReadable(expr)); + } + + [Test] + public void Logical4() + { + Expression expr = new BinaryOperatorExpression( + new IdentifierExpression("a"), + BinaryOperatorType.ConditionalAnd, + new BinaryOperatorExpression( + new IdentifierExpression("b"), + BinaryOperatorType.ConditionalOr, + new IdentifierExpression("c") + ) + ); + + Assert.AreEqual("a && (b || c)", InsertRequired(expr)); + Assert.AreEqual("a && (b || c)", InsertReadable(expr)); + } } } diff --git a/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs b/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs index abdd06e630..cfa12e17a7 100644 --- a/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs @@ -186,7 +186,13 @@ namespace ICSharpCode.NRefactory.CSharp } } else { if (InsertParenthesesForReadability && precedence < Equality) { - ParenthesizeIfRequired(binaryOperatorExpression.Left, Equality); + // In readable mode, boost the priority of the left-hand side if the operator + // there isn't the same as the operator on this expression. + if (GetBinaryOperatorType(binaryOperatorExpression.Left) == binaryOperatorExpression.Operator) { + ParenthesizeIfRequired(binaryOperatorExpression.Left, precedence); + } else { + ParenthesizeIfRequired(binaryOperatorExpression.Left, Equality); + } ParenthesizeIfRequired(binaryOperatorExpression.Right, Equality); } else { // all other binary operators are left-associative @@ -197,6 +203,15 @@ namespace ICSharpCode.NRefactory.CSharp return base.VisitBinaryOperatorExpression(binaryOperatorExpression, data); } + BinaryOperatorType? GetBinaryOperatorType(Expression expr) + { + BinaryOperatorExpression boe = expr as BinaryOperatorExpression; + if (boe != null) + return boe.Operator; + else + return null; + } + public override object VisitIsExpression(IsExpression isExpression, object data) { if (InsertParenthesesForReadability) { From 07c8c0c0f30f83495c1524c4a58be3fa46051d7a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 24 Feb 2011 17:09:19 +0100 Subject: [PATCH 4/4] Use newlines in array initializers. --- .../CSharp/OutputVisitor/OutputVisitor.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs index 1c67668d04..88995ee47f 100644 --- a/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs @@ -462,7 +462,17 @@ namespace ICSharpCode.NRefactory.CSharp else style = BraceStyle.EndOfLine; OpenBrace(style); - WriteCommaSeparatedList(arrayInitializerExpression.Children); + bool isFirst = true; + foreach (AstNode node in arrayInitializerExpression.Children) { + if (isFirst) { + isFirst = false; + } else { + Comma(node); + NewLine(); + } + node.AcceptVisitor(this, null); + } + NewLine(); CloseBrace(style); return EndNode(arrayInitializerExpression); }