Skip to content

Commit c6293a7

Browse files
committed
Separate comparison into equality and inequality since inequality has precedence over equality
1 parent bf4df00 commit c6293a7

File tree

11 files changed

+98
-72
lines changed

11 files changed

+98
-72
lines changed

src/binary-operator-printers/comparison.js

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import {
2+
createComparisonOperationPrinter,
3+
createIndentIfNecessaryBuilder
4+
} from './printers/create-comparison-operation-printer.js';
5+
import { logical } from './logical.js';
6+
7+
const equalityPrinter = createComparisonOperationPrinter(
8+
createIndentIfNecessaryBuilder([logical])
9+
);
10+
11+
export const equality = {
12+
match: (op) => ['==', '!='].includes(op),
13+
print: equalityPrinter
14+
};

src/binary-operator-printers/exponentiation.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {
44
createIndentIfNecessaryBuilder
55
} from './printers/create-binary-operation-printer.js';
66
import { addition } from './addition.js';
7+
import { equality } from './equality.js';
8+
import { inequality } from './inequality.js';
79
import { multiplication } from './multiplication.js';
810

911
const { group } = doc.builders;
@@ -12,6 +14,8 @@ const exponentiationPrinter = createBinaryOperationPrinter(
1214
() => (document) => group(document), // always group
1315
createIndentIfNecessaryBuilder([
1416
addition,
17+
equality,
18+
inequality,
1519
multiplication
1620
// `bit` and `shift` should technically be here but they are properly
1721
// parenthesised before reaching this point.

src/binary-operator-printers/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
export * from './addition.js';
22
export * from './assignment.js';
33
export * from './bit.js';
4-
export * from './comparison.js';
4+
export * from './equality.js';
55
export * from './exponentiation.js';
6+
export * from './inequality.js';
67
export * from './logical.js';
78
export * from './multiplication.js';
89
export * from './shift.js';
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import {
2+
createComparisonOperationPrinter,
3+
createIndentIfNecessaryBuilder
4+
} from './printers/create-comparison-operation-printer.js';
5+
import { logical } from './logical.js';
6+
import { equality } from './equality.js';
7+
8+
const inequalityPrinter = createComparisonOperationPrinter(
9+
createIndentIfNecessaryBuilder([logical, equality])
10+
);
11+
12+
export const inequality = {
13+
match: (op) => ['<', '>', '<=', '>='].includes(op),
14+
print: inequalityPrinter
15+
};

src/binary-operator-printers/multiplication.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import {
55
} from './printers/create-binary-operation-printer.js';
66
import { addition } from './addition.js';
77
import { bit } from './bit.js';
8+
import { equality } from './equality.js';
9+
import { inequality } from './inequality.js';
810
import { shift } from './shift.js';
911

10-
const matchers = [addition, bit, shift];
12+
const matchers = [addition, bit, equality, inequality, shift];
1113

1214
const multiplicationPrinter = createBinaryOperationPrinter(
1315
createGroupIfNecessaryBuilder(matchers),
Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import { doc } from 'prettier';
2-
import { comparison } from '../comparison.js';
2+
import { shouldGroupOrIndent } from '../utils/should-group-or-indent.js';
3+
import { equality } from '../equality.js';
4+
import { inequality } from '../inequality.js';
35
import { rightOperandPrinter } from './right-operand-printer.js';
46

57
const { group, indent } = doc.builders;
68

7-
const shouldGroupOrIndent = (node, matchers) =>
8-
matchers.some((matcher) => matcher.match(node.operator));
9+
const comparisonMatchers = [equality, inequality];
910

1011
export const createGroupIfNecessaryBuilder =
1112
(matchers) => (path) => (document) => {
1213
const parentNode = path.getParentNode();
13-
if (
14-
parentNode.type === 'BinaryOperation' &&
15-
!comparison.match(parentNode.operator)
16-
) {
17-
return shouldGroupOrIndent(parentNode, matchers)
18-
? group(document)
19-
: document;
20-
}
21-
return group(document);
14+
if (shouldGroupOrIndent(parentNode, matchers)) return group(document);
15+
return document;
2216
};
2317

2418
export const createIndentIfNecessaryBuilder =
@@ -27,13 +21,7 @@ export const createIndentIfNecessaryBuilder =
2721
for (let i = 0; ; i += 1) {
2822
const parentNode = path.getParentNode(i);
2923
if (parentNode.type === 'ReturnStatement') return document;
30-
if (
31-
parentNode.type !== 'BinaryOperation' ||
32-
comparison.match(parentNode.operator) ||
33-
shouldGroupOrIndent(parentNode, matchers)
34-
) {
35-
return indent(document);
36-
}
24+
if (shouldGroupOrIndent(parentNode, matchers)) return indent(document);
3725
if (node === parentNode.right) return document;
3826
node = parentNode;
3927
}
@@ -52,6 +40,6 @@ export const createBinaryOperationPrinter =
5240
};
5341

5442
export const defaultBinaryOperationPrinter = createBinaryOperationPrinter(
55-
createGroupIfNecessaryBuilder([]),
56-
createIndentIfNecessaryBuilder([])
43+
createGroupIfNecessaryBuilder(comparisonMatchers),
44+
createIndentIfNecessaryBuilder(comparisonMatchers)
5745
);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { doc } from 'prettier';
2+
import { shouldGroupOrIndent } from '../utils/should-group-or-indent.js';
3+
import { rightOperandPrinter } from './right-operand-printer.js';
4+
5+
const { group, indent } = doc.builders;
6+
7+
export const createIndentIfNecessaryBuilder =
8+
(matchers) => (path) => (document) => {
9+
let node = path.getNode();
10+
for (let i = 0; ; i += 1) {
11+
const parentNode = path.getParentNode(i);
12+
if (parentNode.type === 'ReturnStatement') return document;
13+
if (parentNode.type === 'IfStatement') return document;
14+
if (parentNode.type === 'ForStatement') return document;
15+
if (parentNode.type === 'WhileStatement') return document;
16+
if (shouldGroupOrIndent(parentNode, matchers)) return indent(document);
17+
if (node === parentNode.right) return document;
18+
node = parentNode;
19+
}
20+
};
21+
22+
export const createComparisonOperationPrinter =
23+
(indentIfNecessaryBuilder) => (node, path, print, options) => {
24+
const indentIfNecessary = indentIfNecessaryBuilder(path);
25+
26+
return group([
27+
path.call(print, 'left'),
28+
indentIfNecessary(rightOperandPrinter(node, path, print, options))
29+
]);
30+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const shouldGroupOrIndent = ({ type, operator }, matchers) =>
2+
type !== 'BinaryOperation' ||
3+
matchers.some((matcher) => matcher.match(operator));

tests/format/BinaryOperationHierarchy/__snapshots__/jsfmt.spec.js.snap

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2507,19 +2507,19 @@ contract Indent {
25072507
resultBoolean =
25082508
veryVeryVeryExtremelyExtremelyLongBooleanA ==
25092509
veryVeryVeryExtremelyExtremelyLongUint256B <
2510-
veryVeryVeryExtremelyExtremelyLongUint256C;
2510+
veryVeryVeryExtremelyExtremelyLongUint256C;
25112511
resultBoolean =
25122512
veryVeryVeryExtremelyExtremelyLongBooleanA ==
25132513
veryVeryVeryExtremelyExtremelyLongUint256B <=
2514-
veryVeryVeryExtremelyExtremelyLongUint256C;
2514+
veryVeryVeryExtremelyExtremelyLongUint256C;
25152515
resultBoolean =
25162516
veryVeryVeryExtremelyExtremelyLongBooleanA ==
25172517
veryVeryVeryExtremelyExtremelyLongUint256B >
2518-
veryVeryVeryExtremelyExtremelyLongUint256C;
2518+
veryVeryVeryExtremelyExtremelyLongUint256C;
25192519
resultBoolean =
25202520
veryVeryVeryExtremelyExtremelyLongBooleanA ==
25212521
veryVeryVeryExtremelyExtremelyLongUint256B >=
2522-
veryVeryVeryExtremelyExtremelyLongUint256C;
2522+
veryVeryVeryExtremelyExtremelyLongUint256C;
25232523
}
25242524
25252525
function notEqual() public {
@@ -2578,19 +2578,19 @@ contract Indent {
25782578
resultBoolean =
25792579
veryVeryVeryExtremelyExtremelyLongBooleanA !=
25802580
veryVeryVeryExtremelyExtremelyLongUint256B <
2581-
veryVeryVeryExtremelyExtremelyLongUint256C;
2581+
veryVeryVeryExtremelyExtremelyLongUint256C;
25822582
resultBoolean =
25832583
veryVeryVeryExtremelyExtremelyLongBooleanA !=
25842584
veryVeryVeryExtremelyExtremelyLongUint256B <=
2585-
veryVeryVeryExtremelyExtremelyLongUint256C;
2585+
veryVeryVeryExtremelyExtremelyLongUint256C;
25862586
resultBoolean =
25872587
veryVeryVeryExtremelyExtremelyLongBooleanA !=
25882588
veryVeryVeryExtremelyExtremelyLongUint256B >
2589-
veryVeryVeryExtremelyExtremelyLongUint256C;
2589+
veryVeryVeryExtremelyExtremelyLongUint256C;
25902590
resultBoolean =
25912591
veryVeryVeryExtremelyExtremelyLongBooleanA !=
25922592
veryVeryVeryExtremelyExtremelyLongUint256B >=
2593-
veryVeryVeryExtremelyExtremelyLongUint256C;
2593+
veryVeryVeryExtremelyExtremelyLongUint256C;
25942594
}
25952595
25962596
function lessThan() public {
@@ -2640,11 +2640,11 @@ contract Indent {
26402640
veryVeryVeryExtremelyExtremelyLongUint256C;
26412641
resultBoolean =
26422642
veryVeryVeryExtremelyExtremelyLongUint256A <
2643-
veryVeryVeryExtremelyExtremelyLongUint256B ==
2643+
veryVeryVeryExtremelyExtremelyLongUint256B ==
26442644
veryVeryVeryExtremelyExtremelyLongBooleanC;
26452645
resultBoolean =
26462646
veryVeryVeryExtremelyExtremelyLongUint256A <
2647-
veryVeryVeryExtremelyExtremelyLongUint256B !=
2647+
veryVeryVeryExtremelyExtremelyLongUint256B !=
26482648
veryVeryVeryExtremelyExtremelyLongBooleanC;
26492649
}
26502650
@@ -2695,11 +2695,11 @@ contract Indent {
26952695
veryVeryVeryExtremelyExtremelyLongUint256C;
26962696
resultBoolean =
26972697
veryVeryVeryExtremelyExtremelyLongUint256A <=
2698-
veryVeryVeryExtremelyExtremelyLongUint256B ==
2698+
veryVeryVeryExtremelyExtremelyLongUint256B ==
26992699
veryVeryVeryExtremelyExtremelyLongBooleanC;
27002700
resultBoolean =
27012701
veryVeryVeryExtremelyExtremelyLongUint256A <=
2702-
veryVeryVeryExtremelyExtremelyLongUint256B !=
2702+
veryVeryVeryExtremelyExtremelyLongUint256B !=
27032703
veryVeryVeryExtremelyExtremelyLongBooleanC;
27042704
}
27052705
@@ -2750,11 +2750,11 @@ contract Indent {
27502750
veryVeryVeryExtremelyExtremelyLongUint256C;
27512751
resultBoolean =
27522752
veryVeryVeryExtremelyExtremelyLongUint256A >
2753-
veryVeryVeryExtremelyExtremelyLongUint256B ==
2753+
veryVeryVeryExtremelyExtremelyLongUint256B ==
27542754
veryVeryVeryExtremelyExtremelyLongBooleanC;
27552755
resultBoolean =
27562756
veryVeryVeryExtremelyExtremelyLongUint256A >
2757-
veryVeryVeryExtremelyExtremelyLongUint256B !=
2757+
veryVeryVeryExtremelyExtremelyLongUint256B !=
27582758
veryVeryVeryExtremelyExtremelyLongBooleanC;
27592759
}
27602760
@@ -2805,11 +2805,11 @@ contract Indent {
28052805
veryVeryVeryExtremelyExtremelyLongUint256C;
28062806
resultBoolean =
28072807
veryVeryVeryExtremelyExtremelyLongUint256A >=
2808-
veryVeryVeryExtremelyExtremelyLongUint256B ==
2808+
veryVeryVeryExtremelyExtremelyLongUint256B ==
28092809
veryVeryVeryExtremelyExtremelyLongBooleanC;
28102810
resultBoolean =
28112811
veryVeryVeryExtremelyExtremelyLongUint256A >=
2812-
veryVeryVeryExtremelyExtremelyLongUint256B !=
2812+
veryVeryVeryExtremelyExtremelyLongUint256B !=
28132813
veryVeryVeryExtremelyExtremelyLongBooleanC;
28142814
}
28152815

tests/unit/binary-operator-printers/__snapshots__/index.test.js.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ exports[`binary operators printers to match snapshot 1`] = `
55
"addition",
66
"assignment",
77
"bit",
8-
"comparison",
8+
"equality",
99
"exponentiation",
10+
"inequality",
1011
"logical",
1112
"multiplication",
1213
"shift",

0 commit comments

Comments
 (0)