From 71418ebf71206ae1088908d542fe5ba473082ebc Mon Sep 17 00:00:00 2001 From: Joel Mathew Koshy Date: Thu, 26 Oct 2023 16:12:25 -0400 Subject: [PATCH] Fix method of when to show safe suggestions and fix tests. --- lib/rules/no-console.js | 34 ++++++++++++++---------- tests/lib/rules/no-console.js | 50 ++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/lib/rules/no-console.js b/lib/rules/no-console.js index f36712587277..af8b4e7c139b 100644 --- a/lib/rules/no-console.js +++ b/lib/rules/no-console.js @@ -97,6 +97,22 @@ module.exports = { ); } + /** + * Checks if it is safe to provide suggestions for the specific node. + * @param {ASTNode} node The MemberExpression node to check. + * @returns {boolean} `true` if the node is safe to be fixed via a suggestion + */ + function isSafeToProvideSuggestions(node) { + const isInStatementListParents = astUtils.STATEMENT_LIST_PARENTS.has(node.parent.parent.parent.type); + + return ( + isInStatementListParents && + node.parent.type === "CallExpression" && + node.parent.callee === node && + node.parent.parent.type === "ExpressionStatement" + ); + } + /** * Reports the given reference as a violation. * @param {eslint-scope.Reference} reference The reference to report. @@ -111,25 +127,15 @@ module.exports = { node, loc: node.loc, messageId: "unexpected", - suggest: [ - { + suggest: isSafeToProvideSuggestions(node) + ? [{ messageId: "removeConsole", data: { propertyName }, fix(fixer) { - const copyOfStatementListParents = astUtils.STATEMENT_LIST_PARENTS; - - copyOfStatementListParents.delete("Program"); - - const isNotFixable = copyOfStatementListParents.has(node.parent.parent.parent.type); - - if (isNotFixable) { - return null; - } - return fixer.removeRange(node.parent.parent.range); } - } - ] + }] + : [] }); } diff --git a/tests/lib/rules/no-console.js b/tests/lib/rules/no-console.js index 72da99eb2af1..d30ae79c9dcb 100644 --- a/tests/lib/rules/no-console.js +++ b/tests/lib/rules/no-console.js @@ -40,33 +40,39 @@ ruleTester.run("no-console", rule, { invalid: [ // no options - { code: "console.log(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.error(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.info(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "switch (a) { case 1: console.log(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, - { code: "if (a) { console.warn(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, - { code: "class A { static { console.info(foo) } }", parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "console.log(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] }, + { code: "console.error(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "" }] }] }, + { code: "console.info(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "" }] }] }, + { code: "console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "" }] }] }, + { code: "switch (a) { case 1: console.log(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "switch (a) { case 1: }" }] }] }, + { code: "if (a) { console.warn(foo) }", errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "if (a) { }" }] }] }, + { code: "if (a) console.warn(foo)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "foo(console.log)", errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "class A { static { console.info(foo) } }", parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "class A { static { } }" }] }] }, // one option - { code: "console.log(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.error(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.info(foo)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.warn(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "switch (a) { case 1: console.log(foo) }", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, - { code: "if (a) { console.info(foo) }", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, - { code: "class A { static { console.error(foo) } }", options: [{ allow: ["log"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "console.log(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] }, + { code: "console.error(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "" }] }] }, + { code: "console.info(foo)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "" }] }] }, + { code: "console.warn(foo)", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "" }] }] }, + { code: "switch (a) { case 1: console.log(foo) }", options: [{ allow: ["error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "switch (a) { case 1: }" }] }] }, + { code: "if (a) { console.info(foo) }", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "if (a) { }" }] }] }, + { code: "if (a) console.info(foo)", options: [{ allow: ["warn"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "foo(console.warn)", options: [{ allow: ["log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "class A { static { console.error(foo) } }", options: [{ allow: ["log"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "class A { static { } }" }] }] }, // multiple options - { code: "console.log(foo)", options: [{ allow: ["warn", "info"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.error(foo)", options: [{ allow: ["warn", "info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.info(foo)", options: [{ allow: ["warn", "error", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "console.warn(foo)", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] }, - { code: "switch (a) { case 1: console.error(foo) }", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, - { code: "if (a) { console.log(foo) }", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, - { code: "class A { static { console.info(foo) } }", options: [{ allow: ["log", "error", "warn"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "console.log(foo)", options: [{ allow: ["warn", "info"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] }, + { code: "console.error(foo)", options: [{ allow: ["warn", "info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "" }] }] }, + { code: "console.info(foo)", options: [{ allow: ["warn", "error", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "" }] }] }, + { code: "console.warn(foo)", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "warn" }, output: "" }] }] }, + { code: "switch (a) { case 1: console.error(foo) }", options: [{ allow: ["info", "log"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "error" }, output: "switch (a) { case 1: }" }] }] }, + { code: "if (a) { console.log(foo) }", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "if (a) { }" }] }] }, + { code: "if (a) console.log(foo)", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "foo(console.info)", options: [{ allow: ["warn", "error"] }], errors: [{ messageId: "unexpected", type: "MemberExpression" }] }, + { code: "class A { static { console.info(foo) } }", options: [{ allow: ["log", "error", "warn"] }], parserOptions: { ecmaVersion: "latest" }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "info" }, output: "class A { static { } }" }] }] }, // In case that implicit global variable of 'console' exists - { code: "console.log(foo)", env: { node: true }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", output: "" }] }] } + { code: "console.log(foo)", env: { node: true }, errors: [{ messageId: "unexpected", type: "MemberExpression", suggestions: [{ messageId: "removeConsole", data: { propertyName: "log" }, output: "" }] }] } ] });