Skip to content

Commit

Permalink
Ensure that operators that have the same precedence are aligned. (#554)
Browse files Browse the repository at this point in the history
* Ensure that operators that have the same precedence are aligned.

closes #547

* Fixing edge case

Co-authored-by: Lasath Fernando <[email protected]>
  • Loading branch information
belav and shocklateboy92 authored Jan 21, 2022
1 parent 90d6ef5 commit 66369b3
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ class TestClass
+ someMethodCall("with long args")
+ "really long string";

var samePrecedenceAligns =
one_________________________________
+ two_______________________________
- three_____________________________
+ four______________________________;

var coalesceIsSpecial =
someValue_________________________
?? someOtherValue_______________________
Expand Down Expand Up @@ -52,6 +58,10 @@ class TestClass
: someLongValue____________________________________
+ someLongValue____________________________________;

var someValue =
value1__________________ == value2_________________
!= (value3_______________________ == value4___________________);

if (
one == two
|| someValue_______________
Expand Down
40 changes: 26 additions & 14 deletions Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/BinaryExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ private static List<Doc> PrintBinaryExpression(SyntaxNode node)
// This group ensures that something like == 0 does not end up on its own line
var shouldGroup =
binaryExpressionSyntax.Kind() != binaryExpressionSyntax.Parent!.Kind()
&& GetPrecedence(binaryExpressionSyntax)
!= GetPrecedence(binaryExpressionSyntax.Parent!)
&& binaryExpressionSyntax.Left.GetType() != binaryExpressionSyntax.GetType()
&& binaryExpressionSyntax.Right.GetType() != binaryExpressionSyntax.GetType()
&& binaryExpressionSyntax.Left is not IsPatternExpressionSyntax;
Expand Down Expand Up @@ -130,6 +132,16 @@ private static bool ShouldFlatten(SyntaxToken parentToken, SyntaxToken nodeToken
return GetPrecedence(parentToken) == GetPrecedence(nodeToken);
}

private static int GetPrecedence(SyntaxNode node)
{
if (node is BinaryExpressionSyntax binaryExpressionSyntax)
{
return GetPrecedence(binaryExpressionSyntax.OperatorToken);
}

return -1;
}

private static int GetPrecedence(SyntaxToken syntaxToken)
{
return syntaxToken.Kind() switch
Expand All @@ -141,20 +153,20 @@ private static int GetPrecedence(SyntaxToken syntaxToken)
SyntaxKind.CaretToken => 5,
SyntaxKind.AmpersandToken => 6,
SyntaxKind.ExclamationEqualsToken => 7,
SyntaxKind.EqualsEqualsToken => 7,
SyntaxKind.LessThanToken => 8,
SyntaxKind.LessThanEqualsToken => 8,
SyntaxKind.GreaterThanToken => 8,
SyntaxKind.GreaterThanEqualsToken => 8,
SyntaxKind.IsKeyword => 8,
SyntaxKind.AsKeyword => 8,
SyntaxKind.LessThanLessThanToken => 9,
SyntaxKind.GreaterThanGreaterThanToken => 9,
SyntaxKind.MinusToken => 10,
SyntaxKind.PlusToken => 10,
SyntaxKind.AsteriskToken => 11,
SyntaxKind.SlashToken => 11,
SyntaxKind.PercentToken => 11,
SyntaxKind.EqualsEqualsToken => 8,
SyntaxKind.LessThanToken => 9,
SyntaxKind.LessThanEqualsToken => 9,
SyntaxKind.GreaterThanToken => 9,
SyntaxKind.GreaterThanEqualsToken => 9,
SyntaxKind.IsKeyword => 9,
SyntaxKind.AsKeyword => 9,
SyntaxKind.LessThanLessThanToken => 10,
SyntaxKind.GreaterThanGreaterThanToken => 10,
SyntaxKind.MinusToken => 11,
SyntaxKind.PlusToken => 11,
SyntaxKind.AsteriskToken => 12,
SyntaxKind.SlashToken => 12,
SyntaxKind.PercentToken => 12,
_ => throw new Exception($"No precedence defined for {syntaxToken}")
};
}
Expand Down

0 comments on commit 66369b3

Please sign in to comment.