From 906f69fd455b83ac2202990c3debe11fa432ba3d Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 28 Apr 2019 17:31:23 +0200 Subject: [PATCH] #1499: Add missing required parentheses around ref expressions. --- .../CSharp/OutputVisitor/InsertParenthesesVisitor.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/OutputVisitor/InsertParenthesesVisitor.cs b/ICSharpCode.Decompiler/CSharp/OutputVisitor/InsertParenthesesVisitor.cs index f792a6aed..4966b06a1 100644 --- a/ICSharpCode.Decompiler/CSharp/OutputVisitor/InsertParenthesesVisitor.cs +++ b/ICSharpCode.Decompiler/CSharp/OutputVisitor/InsertParenthesesVisitor.cs @@ -125,7 +125,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor } if (expr is IsExpression || expr is AsExpression) return RelationalAndTypeTesting; - if (expr is ConditionalExpression) + if (expr is ConditionalExpression || expr is DirectionExpression) return Conditional; if (expr is AssignmentExpression || expr is LambdaExpression) return Assignment; @@ -339,7 +339,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor // (a ? b : c ? d : e) == (a ? b : (c ? d : e)) // (a ? b ? c : d : e) == (a ? (b ? c : d) : e) // Only ((a ? b : c) ? d : e) strictly needs the additional parentheses - if (InsertParenthesesForReadability) { + if (InsertParenthesesForReadability && !IsConditionalRefExpression(conditionalExpression)) { // Precedence of ?: can be confusing; so always put parentheses in nice-looking mode. ParenthesizeIfRequired(conditionalExpression.Condition, NullableRewrap); ParenthesizeIfRequired(conditionalExpression.TrueExpression, NullableRewrap); @@ -351,7 +351,13 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor } base.VisitConditionalExpression(conditionalExpression); } - + + private bool IsConditionalRefExpression(ConditionalExpression conditionalExpression) + { + return conditionalExpression.TrueExpression is DirectionExpression + || conditionalExpression.FalseExpression is DirectionExpression; + } + public override void VisitAssignmentExpression(AssignmentExpression assignmentExpression) { // assignment is right-associative