From 1f7197ec164ade83f4d0a7b1d7b64ffb4959bd09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 20 Nov 2018 18:02:40 +0100 Subject: [PATCH] Extract isFromBabelTypes helper --- .../src/rules/no-deprecated-clone.js | 82 ++++--------------- .../src/utils/is-from-babel-types.js | 56 +++++++++++++ 2 files changed, 73 insertions(+), 65 deletions(-) create mode 100644 eslint/babel-eslint-plugin-development/src/utils/is-from-babel-types.js diff --git a/eslint/babel-eslint-plugin-development/src/rules/no-deprecated-clone.js b/eslint/babel-eslint-plugin-development/src/rules/no-deprecated-clone.js index 0d7cda0bc5..08bfef8c9b 100644 --- a/eslint/babel-eslint-plugin-development/src/rules/no-deprecated-clone.js +++ b/eslint/babel-eslint-plugin-development/src/rules/no-deprecated-clone.js @@ -3,21 +3,7 @@ "use strict"; const getReferenceOrigin = require("../utils/get-reference-origin"); -const getExportName = require("../utils/get-export-name"); - -function reportError(context, node, name) { - const isMemberExpression = node.type === "MemberExpression"; - const id = isMemberExpression ? node.property : node; - context.report({ - node: id, - message: `t.${name}() is deprecated. Use t.cloneNode() instead.`, - fix(fixer) { - if (isMemberExpression) { - return fixer.replaceText(id, "cloneNode"); - } - }, - }); -} +const isFromBabelTypes = require("../utils/is-from-babel-types"); module.exports = { meta: { @@ -27,63 +13,29 @@ module.exports = { create(context) { return { CallExpression(node) { + const { callee } = node; const scope = context.getScope(); - const origin = getReferenceOrigin(node.callee, scope); - - const report = () => reportError(context, node.callee, origin.name); + const origin = getReferenceOrigin(callee, scope); if (!origin) return; + const { name } = origin; if ( - origin.kind === "import" && - (origin.name === "clone" || origin.name === "cloneDeep") && - origin.source === "@babel/types" + (name === "clone" || name === "cloneDeep") && + isFromBabelTypes(origin, scope) ) { - // imported from @babel/types - return report(); - } + const isMemberExpression = callee.type === "MemberExpression"; + const id = isMemberExpression ? callee.property : callee; - if ( - origin.kind === "property" && - (origin.path === "clone" || origin.path === "cloneDeep") && - origin.base.kind === "import" && - origin.base.name === "types" && - origin.base.source === "@babel/core" - ) { - // imported from @babel/core - return report(); - } - - if ( - origin.kind === "property" && - (origin.path === "types.clone" || - origin.path === "types.cloneDeep") && - origin.base.kind === "param" && - origin.base.index === 0 - ) { - const { functionNode } = origin.base; - const { parent } = functionNode; - - if (parent.type === "CallExpression") { - const calleeOrigin = getReferenceOrigin(parent.callee, scope); - if ( - calleeOrigin && - calleeOrigin.kind === "import" && - calleeOrigin.name === "declare" && - calleeOrigin.source === "@babel/helper-plugin-utils" - ) { - // Using "declare" from "@babel/helper-plugin-utils" - return report(); - } - } else { - const exportName = getExportName(functionNode); - - if (exportName === "default" || exportName === "module.exports") { - // export default function ({ types: t }) {} - // module.exports = function ({ types: t }) {} - return report(); - } - } + context.report({ + node: id, + message: `t.${name}() is deprecated. Use t.cloneNode() instead.`, + fix(fixer) { + if (isMemberExpression) { + return fixer.replaceText(id, "cloneNode"); + } + }, + }); } }, }; diff --git a/eslint/babel-eslint-plugin-development/src/utils/is-from-babel-types.js b/eslint/babel-eslint-plugin-development/src/utils/is-from-babel-types.js new file mode 100644 index 0000000000..097fb4582c --- /dev/null +++ b/eslint/babel-eslint-plugin-development/src/utils/is-from-babel-types.js @@ -0,0 +1,56 @@ +"use strict"; + +const getReferenceOrigin = require("./get-reference-origin"); +const getExportName = require("./get-export-name"); + +// Check if a ReferenceOrigin (returned by ./get-reference-origin.js) +// is a reference to a @babel/types export. +module.exports = function isFromBabelTypes( + origin /*: ReferenceOrigin */, + scope /*: Scope */, +) { + if (origin.kind === "import" && origin.source === "@babel/types") { + // imported from @babel/types + return true; + } + + if ( + origin.kind === "property" && + origin.base.kind === "import" && + origin.base.name === "types" && + origin.base.source === "@babel/core" + ) { + // imported from @babel/core + return true; + } + + if ( + origin.kind !== "property" || + origin.base.kind !== "param" || + origin.base.index !== 0 + ) { + // Not a parameter of the plugin factory function + return false; + } + + const { functionNode } = origin.base; + const { parent } = functionNode; + + if (parent.type === "CallExpression") { + const calleeOrigin = getReferenceOrigin(parent.callee, scope); + + // Using "declare" from "@babel/helper-plugin-utils" + return !!( + calleeOrigin && + calleeOrigin.kind === "import" && + calleeOrigin.name === "declare" && + calleeOrigin.source === "@babel/helper-plugin-utils" + ); + } + + const exportName = getExportName(functionNode); + + // export default function ({ types: t }) {} + // module.exports = function ({ types: t }) {} + return exportName === "default" || exportName === "module.exports"; +};