Skip to content

Commit 5c233d0

Browse files
authored
Merge pull request #18 from jogold/fix-prefer-complement
Simplify and fix error reporting for prefer-complement
2 parents 0e6e888 + c6e9bd3 commit 5c233d0

2 files changed

Lines changed: 49 additions & 25 deletions

File tree

rules/prefer-complement.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,40 @@ const ast = require('../ast-helper');
44

55
const isCalling = ast.isCalling;
66
const isRamdaMethod = ast.isRamdaMethod;
7-
const getName = ast.getName;
87

98
const create = context => ({
109
CallExpression(node) {
1110
const matchCompose = isCalling({
1211
name: 'compose',
1312
arguments: R.both(
14-
R.propEq('length', 2),
15-
R.where({
16-
0: isRamdaMethod('not'),
17-
})
13+
R.propEq('length', 2),
14+
R.where({
15+
0: isRamdaMethod('not'),
16+
})
1817
)
1918
});
2019

2120
const matchPipe = isCalling({
2221
name: 'pipe',
2322
arguments: R.both(
24-
R.propEq('length', 2),
25-
R.where({
26-
1: isRamdaMethod('not'),
27-
})
23+
R.propEq('length', 2),
24+
R.where({
25+
1: isRamdaMethod('not'),
26+
})
2827
)
2928
});
3029

3130
if (matchCompose(node)) {
32-
const fn = getName(node.arguments[1]);
3331
context.report({
3432
node,
35-
message: `Instead of \`compose(not, ${fn})\`, prefer \`complement(${fn})\``
33+
message: `Instead of \`compose(not, ...)\`, prefer \`complement(...)\``
3634
});
3735
}
3836

3937
if (matchPipe(node)) {
40-
const fn = getName(node.arguments[0]);
4138
context.report({
4239
node,
43-
message: `Instead of \`pipe(${fn}, not)\`, prefer \`complement(${fn})\``
40+
message: `Instead of \`pipe(..., not)\`, prefer \`complement(...)\``
4441
});
4542
}
4643
}

test/prefer-complement.js

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ const ruleTester = avaRuleTester(test, {
1111
}
1212
});
1313

14-
const instead = (composition, fn) => (composition === 'compose' ? `compose(not, ${fn})` : `pipe(${fn}, not)`);
14+
const instead = {
15+
compose: 'compose(not, ...)',
16+
pipe: 'pipe(..., not)'
17+
};
1518

16-
const error = (composition, fn) => ({
17-
ruleId: 'prefer-complement',
18-
message: `Instead of \`${instead(composition, fn)}\`, prefer \`complement(${fn})\``
19+
const error = composition => ({
20+
ruleId: 'prefer-complement',
21+
message: `Instead of \`${instead[composition]}\`, prefer \`complement(...)\``
1922
});
2023

2124
ruleTester.run('prefer-complement', rule, {
@@ -33,35 +36,59 @@ ruleTester.run('prefer-complement', rule, {
3336
invalid: [
3437
{
3538
code: 'compose(not, isEmpty)',
36-
errors: [error('compose', 'isEmpty')]
39+
errors: [error('compose')]
40+
},
41+
{
42+
code: 'compose(not, xs => xs.length)',
43+
errors: [error('compose')]
3744
},
3845
{
3946
code: 'pipe(isEmpty, not)',
40-
errors: [error('pipe', 'isEmpty')]
47+
errors: [error('pipe')]
48+
},
49+
{
50+
code: 'pipe(function (xs) { return xs.length === 0; }, not)',
51+
errors: [error('pipe')]
4152
},
4253
{
4354
code: 'compose(not, isNil)',
44-
errors: [error('compose', 'isNil')]
55+
errors: [error('compose')]
56+
},
57+
{
58+
code: 'compose(not, R.isNil)',
59+
errors: [error('compose')]
4560
},
4661
{
4762
code: 'pipe(isNil, not)',
48-
errors: [error('pipe', 'isNil')]
63+
errors: [error('pipe')]
64+
},
65+
{
66+
code: 'pipe(R.isNil, not)',
67+
errors: [error('pipe')]
4968
},
5069
{
5170
code: 'compose(not, foo)',
52-
errors: [error('compose', 'foo')]
71+
errors: [error('compose')]
72+
},
73+
{
74+
code: 'compose(not, foo(bar))',
75+
errors: [error('compose')]
5376
},
5477
{
5578
code: 'pipe(foo, not)',
56-
errors: [error('pipe', 'foo')]
79+
errors: [error('pipe')]
80+
},
81+
{
82+
code: 'pipe(foo(bar), not)',
83+
errors: [error('pipe')]
5784
},
5885
{
5986
code: 'propSatisfies(compose(not, isNil))',
60-
errors: [error('compose', 'isNil')]
87+
errors: [error('compose')]
6188
},
6289
{
6390
code: 'propSatisfies(pipe(isNil, not))',
64-
errors: [error('pipe', 'isNil')]
91+
errors: [error('pipe')]
6592
}
6693
]
6794
});

0 commit comments

Comments
 (0)