Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Commit bdd8338

Browse files
Improve prefer-immediate-return: keep comments when fixing (#249)
1 parent 6e95742 commit bdd8338

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

src/rules/prefer-immediate-return.ts

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -73,37 +73,33 @@ const rule: Rule.RuleModule = {
7373
context.report({
7474
message: formatMessage(last, returnedIdentifier.name),
7575
node: declaredIdentifier.init,
76-
fix: fixer => fix(fixer, last, lastButOne, declaredIdentifier.init),
76+
fix: fixer =>
77+
fix(fixer, last, lastButOne, declaredIdentifier.init, returnedIdentifier),
7778
});
7879
}
7980
}
8081
}
8182
}
8283

84+
// eslint-disable-next-line max-params
8385
function fix(
8486
fixer: TSESLint.RuleFixer,
8587
last: TSESTree.Statement,
8688
lastButOne: TSESTree.Statement,
87-
expression: TSESTree.Expression,
89+
expressionToReturn: TSESTree.Expression,
90+
returnedExpression: TSESTree.Expression,
8891
): any {
89-
const throwOrReturnKeyword = context.getSourceCode().getFirstToken(last);
90-
91-
if (lastButOne.range && last.range && throwOrReturnKeyword) {
92-
const expressionText = context.getSourceCode().getText(expression);
93-
const fixedRangeStart = lastButOne.range[0];
94-
const fixedRangeEnd = last.range[1];
95-
const semicolonToken = context.getSourceCode().getLastToken(last);
96-
const semicolon = semicolonToken && semicolonToken.value === ';' ? ';' : '';
97-
return [
98-
fixer.removeRange([fixedRangeStart, fixedRangeEnd]),
99-
fixer.insertTextAfterRange(
100-
[1, fixedRangeStart],
101-
`${throwOrReturnKeyword.value} ${expressionText}${semicolon}`,
102-
),
103-
];
104-
} else {
105-
return null;
106-
}
92+
const expressionText = context.getSourceCode().getText(expressionToReturn);
93+
const rangeToRemoveStart = lastButOne.range[0];
94+
const commentsBetweenStatements = context.getSourceCode().getCommentsAfter(lastButOne);
95+
const rangeToRemoveEnd =
96+
commentsBetweenStatements.length > 0
97+
? commentsBetweenStatements[0].range[0]
98+
: last.range[0];
99+
return [
100+
fixer.removeRange([rangeToRemoveStart, rangeToRemoveEnd]),
101+
fixer.replaceText(returnedExpression, expressionText),
102+
];
107103
}
108104

109105
function getOnlyReturnedVariable(node: TSESTree.Statement) {

tests/rules/prefer-immediate-return.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,5 +394,24 @@ ruleTester.run('prefer-immediate-return', rule, {
394394
}
395395
`,
396396
},
397+
{
398+
code: `
399+
function var_returned() {
400+
// comment1
401+
var x /* commentInTheMiddle1 */ = 42; // commentOnTheLine1
402+
// comment2
403+
return /* commentInTheMiddle2 */ x; // commentOnTheLine2
404+
// comment3
405+
}`,
406+
errors: 1,
407+
output: `
408+
function var_returned() {
409+
// comment1
410+
// commentOnTheLine1
411+
// comment2
412+
return /* commentInTheMiddle2 */ 42; // commentOnTheLine2
413+
// comment3
414+
}`,
415+
},
397416
],
398417
});

0 commit comments

Comments
 (0)