Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Commit 9cdcb3e

Browse files
authored
Formatter Updates Deprecated Boolean Operator Syntax (#1214)
1 parent 0dabca7 commit 9cdcb3e

File tree

6 files changed

+68
-3
lines changed

6 files changed

+68
-3
lines changed

src/QsFmt/Formatter.Tests/Examples.fs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,21 @@ let ``Array Syntax Expression Size`` =
368368
let t2 = [0.0, size = 2+1];
369369
}
370370
}"""
371+
372+
[<Example(ExampleKind.Update)>]
373+
let ``Updates Binary Boolean Operators`` =
374+
"""namespace Foo {
375+
operation Bar() : Unit {
376+
let t1 = True && False;
377+
let t2 = True||False;
378+
let t3 = !!True;
379+
}
380+
}""",
381+
382+
"""namespace Foo {
383+
operation Bar() : Unit {
384+
let t1 = True and False;
385+
let t2 = True or False;
386+
let t3 = not not True;
387+
}
388+
}"""

src/QsFmt/Formatter/Formatter.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ let versionToUpdateRules (version: Version option) =
8585
simpleRule unitUpdate
8686
simpleRule forParensUpdate
8787
simpleRule arraySyntaxUpdate
88+
simpleRule booleanOperatorUpdate
8889
]
8990

9091
rules |> List.fold (>>) id

src/QsFmt/Formatter/Rules.fs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,3 +323,44 @@ let checkArraySyntax fileName document =
323323
}
324324

325325
reducer.Document document
326+
327+
/// <summary>
328+
/// Insert a whitespace to <paramref name="prefix"/> if it is empty.
329+
/// </summary>
330+
let ensureSpace prefix =
331+
if List.isEmpty prefix then [ spaces 1 ] else prefix
332+
333+
let booleanOperatorUpdate =
334+
{ new Rewriter<_>() with
335+
override _.Expression((), expression) =
336+
let dict =
337+
Map [ ("!", "not")
338+
("&&", "and")
339+
("||", "or") ]
340+
341+
let updated =
342+
match expression with
343+
| PrefixOperator prefixOperator when dict |> Map.containsKey prefixOperator.PrefixOperator.Text ->
344+
{
345+
PrefixOperator =
346+
{ prefixOperator.PrefixOperator with
347+
Text = dict |> Map.find prefixOperator.PrefixOperator.Text
348+
}
349+
Operand = prefixOperator.Operand |> Expression.mapPrefix ensureSpace
350+
}
351+
|> PrefixOperator
352+
| InfixOperator infixOperator when dict |> Map.containsKey infixOperator.InfixOperator.Text ->
353+
{
354+
Left = infixOperator.Left
355+
InfixOperator =
356+
{
357+
Prefix = infixOperator.InfixOperator.Prefix |> ensureSpace
358+
Text = dict |> Map.find infixOperator.InfixOperator.Text
359+
}
360+
Right = infixOperator.Right |> Expression.mapPrefix ensureSpace
361+
}
362+
|> InfixOperator
363+
| _ -> expression
364+
365+
base.Expression((), updated)
366+
}

src/QsFmt/Formatter/Rules.fsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ val arraySyntaxUpdate: unit Rewriter
3434

3535
/// Provides warnings for deprecated array syntax still in the syntax tree.
3636
val checkArraySyntax: string -> Document -> string list
37+
38+
/// Replaces `&&`, `||`, and `!` with `and`, `or`, and `not`, respectively.
39+
val booleanOperatorUpdate : unit Rewriter

src/QsFmt/Parser/QSharpLexer.g4

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,11 @@ Colon : ':';
9090
Comma : ',';
9191
DollarQuote : '$"' -> pushMode(INTERPOLATED);
9292
Dot : '.';
93+
DoubleAmpersand : '&&';
9394
DoubleColon : '::';
9495
DoubleDot : '..';
9596
DoubleEqual : '==';
97+
DoublePipe : '||';
9698
DoubleQuote : '"' -> pushMode(STRING);
9799
Ellipsis : '...';
98100
Equal : '=';

src/QsFmt/Parser/QSharpParser.g4

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ expression
217217
| <assoc=right> functor='Controlled' operation=expression # ControlledExpression
218218
| <assoc=right> functor='Adjoint' operation=expression # AdjointExpression
219219
| callable=expression openParen='(' (arguments+=expression (commas+=',' arguments+=expression)* commas+=','?)? closeParen=')' # CallExpression
220-
| <assoc=right> operator=('-' | 'not' | '~~~') operand=expression # NegationExpression
220+
| <assoc=right> operator=('!' | '-' | 'not' | '~~~') operand=expression # NegationExpression
221221
| <assoc=right> left=expression operator='^' right=expression # ExponentExpression
222222
| left=expression operator=('*' | '/' | '%') right=expression # MultiplyExpression
223223
| left=expression operator=('+' | '-') right=expression # AddExpression
@@ -227,8 +227,8 @@ expression
227227
| left=expression operator='&&&' right=expression # BitwiseAndExpression
228228
| left=expression operator='^^^' right=expression # BitwiseXorExpression
229229
| left=expression operator='|||' right=expression # BitwiseOrExpression
230-
| left=expression operator='and' right=expression # AndExpression
231-
| left=expression operator='or' right=expression # OrExpression
230+
| left=expression operator=('&&' | 'and') right=expression # AndExpression
231+
| left=expression operator=('||' | 'or') right=expression # OrExpression
232232
| <assoc=right> cond=expression question='?' ifTrue=expression pipe='|' ifFalse=expression # ConditionalExpression
233233
| left=expression ellipsis='..' right=expression # RangeExpression
234234
| left=expression ellipsis='...' # RightOpenRangeExpression

0 commit comments

Comments
 (0)