Skip to content

Commit 3ac27cc

Browse files
fix(grainfmt): Add parentheses around some binops for precedence clarity (#1514)
1 parent 8a60985 commit 3ac27cc

File tree

5 files changed

+132
-4
lines changed

5 files changed

+132
-4
lines changed

compiler/src/formatting/format.re

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,55 @@ type expression_parent_type =
2828

2929
let exception_primitives = [|"throw", "fail", "assert"|];
3030

31+
let is_shift_or_concat_op = fn =>
32+
if (String.length(fn) > 1) {
33+
switch (String.sub(fn, 0, 2)) {
34+
| "<<"
35+
| ">>"
36+
| "++"
37+
| "||" => true
38+
| _ => false
39+
};
40+
} else {
41+
false;
42+
};
43+
44+
let is_logic_op = fn =>
45+
if (String.length(fn) > 1) {
46+
switch (String.sub(fn, 0, 2)) {
47+
| "<="
48+
| ">="
49+
| "=="
50+
| "!="
51+
| "is"
52+
| "&&"
53+
| "||" => true
54+
| _ => false
55+
};
56+
} else {
57+
false;
58+
};
59+
let is_math_op = fn =>
60+
if (is_logic_op(fn) || is_shift_or_concat_op(fn)) {
61+
false;
62+
} else if (String.length(fn) > 0) {
63+
switch (fn.[0]) {
64+
| '*'
65+
| '/'
66+
| '%'
67+
| '+'
68+
| '-'
69+
| '<'
70+
| '>'
71+
| '&'
72+
| '^'
73+
| '|' => true
74+
| _ => false
75+
};
76+
} else {
77+
false;
78+
};
79+
3180
let op_precedence = fn => {
3281
let op_precedence = fn =>
3382
switch (fn) {
@@ -1871,6 +1920,7 @@ and print_infix_application =
18711920
this_prec < parent_prec || child_name != function_name;
18721921
| _ => true
18731922
};
1923+
18741924
let right_is_leaf =
18751925
switch (second.pexp_desc) {
18761926
| PExpApp(fn, expr) =>
@@ -1901,7 +1951,23 @@ and print_infix_application =
19011951
| _ => false
19021952
};
19031953

1904-
let left_needs_parens = left_is_if || left_grouping_required;
1954+
// Put parens around different operators for clarity, except
1955+
// math and logic operations where precedence is well-known
1956+
let left_is_different_op =
1957+
switch (first.pexp_desc) {
1958+
| PExpApp(fn1, _) =>
1959+
let fn = get_function_name(fn1);
1960+
if (infixop(fn)) {
1961+
(!is_math_op(function_name) && !is_logic_op(function_name))
1962+
&& fn != function_name;
1963+
} else {
1964+
false;
1965+
};
1966+
| _ => false
1967+
};
1968+
1969+
let left_needs_parens =
1970+
left_is_if || left_grouping_required || left_is_different_op;
19051971
let right_needs_parens = right_is_if || right_grouping_required;
19061972

19071973
let lhs =

compiler/test/formatter_inputs/binops.gr

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,34 @@ let x= fofdfdfdfdfdfdfdfdfdfdfdo &&
1111
if (fofdfdfdfdfdfdfdfdfdfdfdo &&
1212
bafdfdfdfdfdfdddefdfdfdfdfdr &&
1313
badfdfdfdfdfdfdffdffdfdfdz) true
14+
15+
let a = (2 >> 1) << 1
16+
17+
let a1 = ((2 >> 1) << 1) >> 1
18+
19+
let x = 1 * (2 +3)
20+
let y = 1 * 2 + 3
21+
let cond = false && false || false
22+
23+
let z = 1 + 2 + 3
24+
25+
let p = 1 + 2 - 3
26+
27+
let p2 = 1 - 2 + 3
28+
29+
let y = 1 / 2 + 3
30+
31+
let ya = 1 / (2 + 3)
32+
33+
let y1 = 1 + 2 /3
34+
35+
let c = (1 < 2) || (2<3) || (3<4)
36+
37+
let (>>>>>) = (>>)
38+
39+
let a = (2 >>>>> 1) << 1
40+
41+
let (+++) = (+)
42+
let (---) = (-)
43+
44+
let zz = 1 +++ 2 --- 3

compiler/test/formatter_outputs/binops.gr

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,34 @@ if (
1111
bafdfdfdfdfdfdddefdfdfdfdfdr &&
1212
badfdfdfdfdfdfdffdffdfdfdz
1313
) true
14+
15+
let a = (2 >> 1) << 1
16+
17+
let a1 = ((2 >> 1) << 1) >> 1
18+
19+
let x = 1 * (2 + 3)
20+
let y = 1 * 2 + 3
21+
let cond = false && false || false
22+
23+
let z = 1 + 2 + 3
24+
25+
let p = 1 + 2 - 3
26+
27+
let p2 = 1 - 2 + 3
28+
29+
let y = 1 / 2 + 3
30+
31+
let ya = 1 / (2 + 3)
32+
33+
let y1 = 1 + 2 /3
34+
35+
let c = 1 < 2 || 2 < 3 || 3 < 4
36+
37+
let (>>>>>) = (>>)
38+
39+
let a = (2 >>>>> 1) << 1
40+
41+
let (+++) = (+)
42+
let (---) = (-)
43+
44+
let zz = 1 +++ 2 --- 3

stdlib/runtime/bigint.gr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,7 +1339,7 @@ export let shl = (num: WasmI32, places: WasmI32) => {
13391339
let (&) = WasmI64.and
13401340
let a = places / 32n
13411341
let b = places % 32n
1342-
let mask = (1N << WasmI64.extendI32U(b)) - 1N << 64N - WasmI64.extendI32U(b)
1342+
let mask = ((1N << WasmI64.extendI32U(b)) - 1N) << 64N - WasmI64.extendI32U(b)
13431343
let result = init(numLimbs + a)
13441344
setFlag(result, _IS_NEGATIVE, getFlag(num, _IS_NEGATIVE))
13451345
let numHalfLimbs = WasmI32.shl(numLimbs, 1n)
@@ -1350,7 +1350,7 @@ export let shl = (num: WasmI32, places: WasmI32) => {
13501350
setHalfLimb(
13511351
result,
13521352
i + a,
1353-
WasmI32.wrapI64(acc << WasmI64.extendI32U(b) >> 32N)
1353+
WasmI32.wrapI64((acc << WasmI64.extendI32U(b)) >> 32N)
13541354
)
13551355
}
13561356
let (>) = WasmI64.gtU

stdlib/runtime/numberUtils.gr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,7 @@ let genDigits = (buffer, w_frc, mp_frc, mp_exp, delta, sign) => {
12771277
wp_w_frc = WasmI64.mul(
12781278
wp_w_frc,
12791279
WasmI64.extendI32U(
1280-
WasmI32.load(get_POWERS10() + (0n - kappa << 2n), 0n)
1280+
WasmI32.load(get_POWERS10() + ((0n - kappa) << 2n), 0n)
12811281
)
12821282
)
12831283
grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)

0 commit comments

Comments
 (0)