diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs index f288ba109c..90012d636c 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs @@ -2903,7 +2903,11 @@ namespace ICSharpCode.NRefactory.PrettyPrinter public override object TrackedVisitConditionalExpression(ConditionalExpression conditionalExpression, object data) { - TrackVisit(conditionalExpression.Condition, data); + if (conditionalExpression.Condition is ConditionalExpression) { + TrackedVisitParenthesizedExpression(new ParenthesizedExpression(conditionalExpression.Condition), data); + } else { + TrackVisit(conditionalExpression.Condition, data); + } if (this.prettyPrintOptions.ConditionalOperatorBeforeConditionSpace) { outputFormatter.Space(); } diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs index 1687ea65d4..7afe163d6f 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs @@ -778,5 +778,13 @@ static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.Stat { TestStatement("Dim x As Integer = CInt(obj)", "int x = Convert.ToInt32(obj);"); } + + [Test] + public void ConditionalExprPrecedence() + { + TestStatement("Dim x As Integer = If(If(a,b,c),d,e)", "int x = (a ? b : c) ? d : e;"); + TestStatement("Dim x As Integer = If(a,If(b,c,d),e)", "int x = a ? b ? c : d : e;"); + TestStatement("Dim x As Integer = If(a,b,If(c,d,e))", "int x = a ? b : c ? d : e;"); + } } } diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs index 4c323cb0f5..a3b1b0cf83 100644 --- a/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs @@ -88,6 +88,26 @@ namespace ICSharpCode.NRefactory.Tests.Ast Assert.IsTrue(ce.TrueExpression is UnaryOperatorExpression); Assert.IsTrue(ce.FalseExpression is PrimitiveExpression); } + + [Test] + public void CSharpRepeatedConditionalExpr() + { + ConditionalExpression ce = ParseUtilCSharp.ParseExpression("a ? b : c ? d : e"); + + Assert.AreEqual("a", ((IdentifierExpression)ce.Condition).Identifier); + Assert.AreEqual("b", ((IdentifierExpression)ce.TrueExpression).Identifier); + Assert.IsTrue(ce.FalseExpression is ConditionalExpression); + } + + [Test] + public void CSharpNestedConditionalExpr() + { + ConditionalExpression ce = ParseUtilCSharp.ParseExpression("a ? b ? c : d : e"); + + Assert.AreEqual("a", ((IdentifierExpression)ce.Condition).Identifier); + Assert.AreEqual("e", ((IdentifierExpression)ce.FalseExpression).Identifier); + Assert.IsTrue(ce.TrueExpression is ConditionalExpression); + } #endregion #region VB.NET