Skip to content

Commit bc61cfd

Browse files
authored
Add internal rule to remove unnecessary yield * (#2795)
1 parent 36a6603 commit bc61cfd

File tree

4 files changed

+53
-7
lines changed

4 files changed

+53
-7
lines changed

rules/no-immediate-mutation.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ const arrayMutationSettings = {
244244
: appendListTextToArrayExpressionOrObjectExpression(context, fixer, arrayExpression, text)
245245
);
246246

247-
yield * removeExpressionStatementAfterAssign(
247+
yield removeExpressionStatementAfterAssign(
248248
nextExpressionStatement,
249249
context,
250250
fixer,
@@ -365,7 +365,7 @@ const objectWithAssignmentExpressionSettings = {
365365
`${shouldInsertComma ? ',' : ''} ${text}`,
366366
);
367367

368-
yield * removeExpressionStatementAfterAssign(
368+
yield removeExpressionStatementAfterAssign(
369369
nextExpressionStatement,
370370
context,
371371
fixer,
@@ -473,7 +473,7 @@ const objectWithObjectAssignSettings = {
473473
return;
474474
}
475475

476-
yield * removeExpressionStatementAfterAssign(
476+
yield removeExpressionStatementAfterAssign(
477477
nextExpressionStatement,
478478
context,
479479
fixer,

rules/no-instanceof-builtins.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ const replaceWithFunctionCall = (node, context, functionName) => function * (fix
6161
const tokenStore = getTokenStore(context, node);
6262
const instanceofToken = tokenStore.getTokenAfter(left, isInstanceofToken);
6363

64-
yield * fixSpaceAroundKeyword(fixer, node, context);
64+
yield fixSpaceAroundKeyword(fixer, node, context);
6565

6666
const range = getParenthesizedRange(left, {sourceCode: tokenStore});
6767
yield fixer.insertTextBeforeRange(range, functionName + '(');
6868
yield fixer.insertTextAfterRange(range, ')');
6969

70-
yield * replaceNodeOrTokenAndSpacesBefore(instanceofToken, '', fixer, context, tokenStore);
71-
yield * replaceNodeOrTokenAndSpacesBefore(right, '', fixer, context, tokenStore);
70+
yield replaceNodeOrTokenAndSpacesBefore(instanceofToken, '', fixer, context, tokenStore);
71+
yield replaceNodeOrTokenAndSpacesBefore(right, '', fixer, context, tokenStore);
7272
};
7373

7474
const replaceWithTypeOfExpression = (node, context) => function * (fixer) {
@@ -83,7 +83,7 @@ const replaceWithTypeOfExpression = (node, context) => function * (fixer) {
8383
// Get safe quote
8484
const safeQuote = vueExpressionContainer ? (sourceCode.getText(vueExpressionContainer)[0] === '"' ? '\'' : '"') : '\'';
8585

86-
yield * fixSpaceAroundKeyword(fixer, node, context);
86+
yield fixSpaceAroundKeyword(fixer, node, context);
8787

8888
const leftRange = getParenthesizedRange(left, {sourceCode: tokenStore});
8989
yield fixer.insertTextBeforeRange(leftRange, 'typeof ');

scripts/internal-rules/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import preferNegativeBooleanAttribute from './prefer-negative-boolean-attribute.
55
import preferFixerRemoveRange from './prefer-fixer-remove-range.js';
66
import noRestrictedPropertyAccess from './no-restricted-property-access.js';
77
import noSourceCodeParameter from './no-source-code-parameter.js';
8+
import noFixYieldStar from './no-fix-yield-star.js';
89

910
const pluginName = 'internal';
1011
const PROJECT_ROOT = new URL('../../', import.meta.url);
@@ -31,6 +32,7 @@ const rules = [
3132
{id: 'prefer-fixer-remove-range', directories: RULES_DIRECTORIES, rule: preferFixerRemoveRange},
3233
{id: 'no-restricted-property-access', directories: RULES_DIRECTORIES, rule: noRestrictedPropertyAccess},
3334
{id: 'no-source-code-parameter', directories: UTILITIES_DIRECTORIES, rule: noSourceCodeParameter},
35+
{id: 'no-fix-yield-star', directories: RULES_DIRECTORIES, rule: noFixYieldStar},
3436
];
3537

3638
const createFilePredicate = directories => {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import path from 'node:path';
2+
import {fileURLToPath} from 'node:url';
3+
4+
const messageId = path.basename(fileURLToPath(import.meta.url), '.js');
5+
6+
const config = {
7+
create(context) {
8+
const {sourceCode} = context;
9+
10+
return {
11+
YieldExpression(yieldExpression) {
12+
if (!yieldExpression.delegate) {
13+
return;
14+
}
15+
16+
const scope = sourceCode.getScope(yieldExpression).variableScope;
17+
const functionNode = scope.block;
18+
if (!functionNode.params.some(node => node.type === 'Identifier' && node.name === 'fixer')) {
19+
return;
20+
}
21+
22+
const starToken = sourceCode.getFirstToken(yieldExpression, {skip: 1});
23+
const [start, end] = sourceCode.getRange(starToken);
24+
25+
context.report({
26+
node: starToken,
27+
messageId,
28+
fix: fixer => fixer.removeRange([
29+
start,
30+
end + (sourceCode.text[start - 1] === ' ' && sourceCode.text[end + 1] === ' ' ? 1 : 0),
31+
]),
32+
});
33+
},
34+
};
35+
},
36+
meta: {
37+
fixable: 'code',
38+
messages: {
39+
[messageId]: 'Unnecessary to delegate fixes',
40+
},
41+
},
42+
};
43+
44+
export default config;

0 commit comments

Comments
 (0)