tools: add fixer for prefer-assert-iferror.js

PR-URL: https://github.com/nodejs/node/pull/16648
Refs: https://github.com/nodejs/node/issues/16636
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
Shobhit Chittora 2017-11-01 01:31:02 +05:30 committed by Ruben Bridgewater
parent c0762c2f54
commit d797775fb8
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762
2 changed files with 31 additions and 6 deletions

View File

@ -14,12 +14,18 @@ new RuleTester().run('prefer-assert-iferror', rule, {
],
invalid: [
{
code: 'if (err) throw err;',
errors: [{ message: 'Use assert.ifError(err) instead.' }]
code: 'require("assert");\n' +
'if (err) throw err;',
errors: [{ message: 'Use assert.ifError(err) instead.' }],
output: 'require("assert");\n' +
'assert.ifError(err);'
},
{
code: 'if (error) { throw error; }',
errors: [{ message: 'Use assert.ifError(error) instead.' }]
code: 'require("assert");\n' +
'if (error) { throw error; }',
errors: [{ message: 'Use assert.ifError(error) instead.' }],
output: 'require("assert");\n' +
'assert.ifError(error);'
}
]
});

View File

@ -5,9 +5,12 @@
'use strict';
const utils = require('./rules-utils.js');
module.exports = {
create(context) {
const sourceCode = context.getSourceCode();
var assertImported = false;
function hasSameTokens(nodeA, nodeB) {
const aTokens = sourceCode.getTokens(nodeA);
@ -20,8 +23,15 @@ module.exports = {
});
}
function checkAssertNode(node) {
if (utils.isRequired(node, ['assert'])) {
assertImported = true;
}
}
return {
IfStatement(node) {
'CallExpression': (node) => checkAssertNode(node),
'IfStatement': (node) => {
const firstStatement = node.consequent.type === 'BlockStatement' ?
node.consequent.body[0] :
node.consequent;
@ -30,10 +40,19 @@ module.exports = {
firstStatement.type === 'ThrowStatement' &&
hasSameTokens(node.test, firstStatement.argument)
) {
const argument = sourceCode.getText(node.test);
context.report({
node: firstStatement,
message: 'Use assert.ifError({{argument}}) instead.',
data: { argument: sourceCode.getText(node.test) }
data: { argument },
fix: (fixer) => {
if (assertImported) {
return fixer.replaceText(
node,
`assert.ifError(${argument});`
);
}
}
});
}
}