Skip to content

Commit 8deb085

Browse files
authored
Reuse utilities (#2798)
1 parent 347ba63 commit 8deb085

10 files changed

+40
-39
lines changed

rules/ast/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export {default as isArrowFunctionBody} from './is-arrow-function-body.js';
1818
export {default as isDirective} from './is-directive.js';
1919
export {default as isEmptyNode} from './is-empty-node.js';
2020
export {default as isEmptyArrayExpression} from './is-empty-array-expression.js';
21+
export {default as isEmptyObjectExpression} from './is-empty-object-expression.js';
2122
export {default as isExpressionStatement} from './is-expression-statement.js';
2223
export {default as isFunction} from './is-function.js';
2324
export {default as isMemberExpression} from './is-member-expression.js';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const isEmptyArrayExpression = node =>
2+
node.type === 'ObjectExpression'
3+
&& node.properties.length === 0;
4+
5+
export default isEmptyArrayExpression;

rules/consistent-empty-array-spread.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
import {getStaticValue} from '@eslint-community/eslint-utils';
2+
import {
3+
isEmptyArrayExpression,
4+
isEmptyStringLiteral,
5+
} from './ast/index.js';
26

37
const MESSAGE_ID = 'consistent-empty-array-spread';
48
const messages = {
59
[MESSAGE_ID]: 'Prefer using empty {{replacementDescription}} since the {{anotherNodePosition}} is {{anotherNodeDescription}}.',
610
};
711

8-
const isEmptyArrayExpression = node =>
9-
node.type === 'ArrayExpression'
10-
&& node.elements.length === 0;
11-
12-
const isEmptyStringLiteral = node =>
13-
node.type === 'Literal'
14-
&& node.value === '';
15-
1612
const isString = (node, context) => {
1713
const staticValueResult = getStaticValue(node, context.sourceCode.getScope(node));
1814
return typeof staticValueResult?.value === 'string';

rules/no-useless-fallback-in-spread.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {isParenthesized, getParenthesizedRange} from './utils/index.js';
22
import {removeParentheses} from './fix/index.js';
3+
import {isEmptyObjectExpression} from './ast/index.js';
34

45
const MESSAGE_ID = 'no-useless-fallback-in-spread';
56
const messages = {
@@ -10,7 +11,7 @@ const messages = {
1011
const create = context => {
1112
context.on('ObjectExpression', node => {
1213
if (!(
13-
node.properties.length === 0
14+
isEmptyObjectExpression(node)
1415
&& node.parent.type === 'LogicalExpression'
1516
&& node.parent.right === node
1617
&& (node.parent.operator === '||' || node.parent.operator === '??')

rules/no-useless-spread.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import {isCommaToken} from '@eslint-community/eslint-utils';
22
import typedArray from './shared/typed-array.js';
33
import {removeParentheses, fixSpaceAroundKeyword, addParenthesizesToReturnOrThrowExpression} from './fix/index.js';
44
import {isParenthesized, isOnSameLine} from './utils/index.js';
5-
import {isNewExpression, isMethodCall, isCallOrNewExpression} from './ast/index.js';
5+
import {
6+
isNewExpression,
7+
isMethodCall,
8+
isCallOrNewExpression,
9+
isEmptyArrayExpression,
10+
isEmptyObjectExpression,
11+
} from './ast/index.js';
612

713
const SPREAD_IN_LIST = 'spread-in-list';
814
const ITERABLE_TO_ARRAY = 'iterable-to-array';
@@ -179,10 +185,7 @@ const create = context => {
179185

180186
// `[...[], 1]`
181187
// ^
182-
if (
183-
(node.type === 'ArrayExpression' && node.elements.length === 0)
184-
|| (node.type === 'ObjectExpression' && node.properties.length === 0)
185-
) {
188+
if (isEmptyArrayExpression(node) || isEmptyObjectExpression(node)) {
186189
const nextToken = sourceCode.getTokenAfter(spreadElement);
187190
if (isCommaToken(nextToken)) {
188191
yield fixer.remove(nextToken);

rules/prefer-negative-index.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {getNegativeIndexLengthNode, removeLengthNode} from './shared/negative-index.js';
22
import typedArray from './shared/typed-array.js';
3-
import {isLiteral} from './ast/index.js';
3+
import {isEmptyArrayExpression, isLiteral} from './ast/index.js';
44

55
const MESSAGE_ID = 'prefer-negative-index';
66
const messages = {
@@ -115,10 +115,7 @@ function parse(node) {
115115

116116
if (
117117
// `[].{slice,splice,toSpliced,at,with}`
118-
(
119-
parentCallee.type === 'ArrayExpression'
120-
&& parentCallee.elements.length === 0
121-
)
118+
isEmptyArrayExpression(parentCallee)
122119
// `''.slice`
123120
|| (
124121
method === 'slice'

rules/prefer-object-from-entries.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {isCommaToken, isArrowToken, isClosingParenToken} from '@eslint-community/eslint-utils';
2-
import {isMethodCall, isLiteral} from './ast/index.js';
2+
import {isMethodCall, isLiteral, isEmptyObjectExpression} from './ast/index.js';
33
import {removeParentheses} from './fix/index.js';
44
import {
55
getParentheses,
@@ -18,7 +18,7 @@ const messages = {
1818

1919
const isEmptyObject = node =>
2020
// `{}`
21-
(node.type === 'ObjectExpression' && node.properties.length === 0)
21+
isEmptyObjectExpression(node)
2222
// `Object.create(null)`
2323
|| (
2424
isMethodCall(node, {

rules/prefer-prototype-methods.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import {getPropertyName, ReferenceTracker} from '@eslint-community/eslint-utils';
22
import {fixSpaceAroundKeyword} from './fix/index.js';
3-
import {isMemberExpression, isMethodCall} from './ast/index.js';
3+
import {
4+
isEmptyArrayExpression,
5+
isEmptyObjectExpression,
6+
isMemberExpression,
7+
isMethodCall,
8+
} from './ast/index.js';
49

510
const messages = {
611
'known-method': 'Prefer using `{{constructorName}}.prototype.{{methodName}}`.',
@@ -37,10 +42,7 @@ function getConstructorAndMethodName(methodNode, {context, globalReferences}) {
3742

3843
const objectNode = methodNode.object;
3944

40-
if (!(
41-
(objectNode.type === 'ArrayExpression' && objectNode.elements.length === 0)
42-
|| (objectNode.type === 'ObjectExpression' && objectNode.properties.length === 0)
43-
)) {
45+
if (!(isEmptyArrayExpression(objectNode) || isEmptyObjectExpression(objectNode))) {
4446
return;
4547
}
4648

rules/require-module-attributes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {isCommaToken} from '@eslint-community/eslint-utils';
2+
import {isEmptyObjectExpression} from './ast/index.js';
23
import {removeObjectProperty} from './fix/index.js';
34
import {getParentheses} from './utils/index.js';
45

@@ -70,8 +71,7 @@ const create = context => {
7071
&& property.key.value === 'with'
7172
)
7273
)
73-
&& property.value.type === 'ObjectExpression'
74-
&& property.value.properties.length === 0,
74+
&& isEmptyObjectExpression(property.value),
7575
);
7676

7777
const nodeToRemove = optionsNode.properties.length === 0 || (emptyWithProperty && optionsNode.properties.length === 1)

rules/utils/array-or-object-prototype-property.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import {isMemberExpression} from '../ast/index.js';
1+
import {
2+
isMemberExpression,
3+
isEmptyArrayExpression,
4+
isEmptyObjectExpression,
5+
} from '../ast/index.js';
26

37
/**
48
@param {
@@ -39,17 +43,9 @@ function isPrototypeProperty(node, options) {
3943
optional: false,
4044
})
4145
// `[].method`
42-
|| (
43-
object === 'Array'
44-
&& objectNode.type === 'ArrayExpression'
45-
&& objectNode.elements.length === 0
46-
)
46+
|| (object === 'Array' && isEmptyArrayExpression(objectNode))
4747
// `{}.method`
48-
|| (
49-
object === 'Object'
50-
&& objectNode.type === 'ObjectExpression'
51-
&& objectNode.properties.length === 0
52-
)
48+
|| (object === 'Object' && isEmptyObjectExpression(objectNode))
5349
);
5450
}
5551

0 commit comments

Comments
 (0)