From 0e048f1577565119cf686eac4477be64a41b2a08 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Fri, 11 Nov 2022 07:03:07 +1300 Subject: [PATCH] perf: use `Set` instead of iterating, and deduplicate a function (#1278) * perf: use `Set` instead of iterating * test: add case for default import * test: add case for async function call * test: add case for `TSImportEqualsDeclaration` import * refactor: replace `scopeHasLocalReference` with `resolveScope` --- src/rules/no-disabled-tests.ts | 4 +- src/rules/no-jasmine-globals.ts | 4 +- .../utils/__tests__/parseJestFnCall.test.ts | 25 ++++++++++ src/rules/utils/parseJestFnCall.ts | 48 ++++--------------- 4 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/rules/no-disabled-tests.ts b/src/rules/no-disabled-tests.ts index f4300659e..cb8d0c047 100644 --- a/src/rules/no-disabled-tests.ts +++ b/src/rules/no-disabled-tests.ts @@ -2,7 +2,7 @@ import { createRule, getAccessorValue, parseJestFnCall, - scopeHasLocalReference, + resolveScope, } from './utils'; export default createRule({ @@ -80,7 +80,7 @@ export default createRule({ } }, 'CallExpression[callee.name="pending"]'(node) { - if (scopeHasLocalReference(context.getScope(), 'pending')) { + if (resolveScope(context.getScope(), 'pending')) { return; } diff --git a/src/rules/no-jasmine-globals.ts b/src/rules/no-jasmine-globals.ts index f5206ec49..adf34604a 100644 --- a/src/rules/no-jasmine-globals.ts +++ b/src/rules/no-jasmine-globals.ts @@ -3,7 +3,7 @@ import { createRule, getNodeName, isSupportedAccessor, - scopeHasLocalReference, + resolveScope, } from './utils'; export default createRule({ @@ -46,7 +46,7 @@ export default createRule({ calleeName === 'fail' || calleeName === 'pending' ) { - if (scopeHasLocalReference(context.getScope(), calleeName)) { + if (resolveScope(context.getScope(), calleeName)) { // It's a local variable, not a jasmine global. return; } diff --git a/src/rules/utils/__tests__/parseJestFnCall.test.ts b/src/rules/utils/__tests__/parseJestFnCall.test.ts index e4526b791..05a15ba0c 100644 --- a/src/rules/utils/__tests__/parseJestFnCall.test.ts +++ b/src/rules/utils/__tests__/parseJestFnCall.test.ts @@ -441,6 +441,23 @@ ruleTester.run('esm', rule, { `, parserOptions: { sourceType: 'module' }, }, + { + code: dedent` + import ByDefault from './myfile'; + + ByDefault.sayHello(); + `, + parserOptions: { sourceType: 'module' }, + }, + { + code: dedent` + async function doSomething() { + const build = await rollup(config); + build.generate(); + } + `, + parserOptions: { sourceType: 'module', ecmaVersion: 2017 }, + }, ], invalid: [], }); @@ -782,6 +799,14 @@ ruleTester.run('typescript', rule, { parser: require.resolve('@typescript-eslint/parser'), parserOptions: { sourceType: 'module' }, }, + { + code: dedent` + import dedent = require('dedent'); + + dedent(); + `, + parser: require.resolve('@typescript-eslint/parser'), + }, ], invalid: [ { diff --git a/src/rules/utils/parseJestFnCall.ts b/src/rules/utils/parseJestFnCall.ts index 0430b29d7..dffe4ae5f 100644 --- a/src/rules/utils/parseJestFnCall.ts +++ b/src/rules/utils/parseJestFnCall.ts @@ -447,7 +447,7 @@ const findImportSourceNode = ( ): TSESTree.Node | null => { if (node.type === AST_NODE_TYPES.AwaitExpression) { if (node.argument.type === AST_NODE_TYPES.ImportExpression) { - return (node.argument as TSESTree.ImportExpression).source; + return node.argument.source; } return null; @@ -514,15 +514,16 @@ const describePossibleImportDef = (def: TSESLint.Scope.Definition) => { return null; }; -const resolveScope = (scope: TSESLint.Scope.Scope, identifier: string) => { +export const resolveScope = ( + scope: TSESLint.Scope.Scope, + identifier: string, +): ImportDetails | 'local' | null => { let currentScope: TSESLint.Scope.Scope | null = scope; while (currentScope !== null) { - for (const ref of currentScope.variables) { - if (ref.defs.length === 0) { - continue; - } + const ref = currentScope.set.get(identifier); + if (ref && ref.defs.length > 0) { const def = ref.defs[ref.defs.length - 1]; const importDetails = describePossibleImportDef(def); @@ -531,9 +532,7 @@ const resolveScope = (scope: TSESLint.Scope.Scope, identifier: string) => { return importDetails; } - if (ref.name === identifier) { - return 'local'; - } + return 'local'; } currentScope = currentScope.upper; @@ -580,34 +579,3 @@ const resolveToJestFn = ( type: 'global', }; }; - -export const scopeHasLocalReference = ( - scope: TSESLint.Scope.Scope, - referenceName: string, -) => { - let currentScope: TSESLint.Scope.Scope | null = scope; - - while (currentScope !== null) { - for (const ref of currentScope.variables) { - if (ref.defs.length === 0) { - continue; - } - - const def = ref.defs[ref.defs.length - 1]; - - const importDetails = describePossibleImportDef(def); - - // referenceName was found as an imported identifier - if (importDetails?.local === referenceName) { - return true; - } - - // referenceName was found as a local variable or function declaration. - return ref.name === referenceName; - } - - currentScope = currentScope.upper; - } - - return false; -};