From 71c4c729e90e308e0afd70af7db5e9d9ff238527 Mon Sep 17 00:00:00 2001 From: sudalqueen <38751423+sudalqueen@users.noreply.github.com> Date: Fri, 14 Aug 2020 01:25:04 +0900 Subject: [PATCH] fix(eslint-plugin): [prefer-includes] don't auto fix when `test` method's argument type doesn't have an 'includes' method (#2391) --- .../src/rules/prefer-includes.ts | 19 ++++++++++++++++++- .../tests/rules/prefer-includes.test.ts | 6 ++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/prefer-includes.ts b/packages/eslint-plugin/src/rules/prefer-includes.ts index 721c53850df..fb34951611b 100644 --- a/packages/eslint-plugin/src/rules/prefer-includes.ts +++ b/packages/eslint-plugin/src/rules/prefer-includes.ts @@ -4,7 +4,12 @@ import { } from '@typescript-eslint/experimental-utils'; import { AST as RegExpAST, parseRegExpLiteral } from 'regexpp'; import * as ts from 'typescript'; -import { createRule, getParserServices, getStaticValue } from '../util'; +import { + createRule, + getParserServices, + getStaticValue, + getConstrainedTypeAtLocation, +} from '../util'; export default createRule({ name: 'prefer-includes', @@ -191,6 +196,18 @@ export default createRule({ return; } + //check the argument type of test methods + const argument = callNode.arguments[0]; + const tsNode = services.esTreeNodeToTSNodeMap.get(argument); + const type = getConstrainedTypeAtLocation(types, tsNode); + + const includesMethodDecl = type + .getProperty('includes') + ?.getDeclarations(); + if (includesMethodDecl == null) { + return; + } + context.report({ node: callNode, messageId: 'preferStringIncludes', diff --git a/packages/eslint-plugin/tests/rules/prefer-includes.test.ts b/packages/eslint-plugin/tests/rules/prefer-includes.test.ts index 17a05d08c4c..c72488a4937 100644 --- a/packages/eslint-plugin/tests/rules/prefer-includes.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-includes.test.ts @@ -115,6 +115,12 @@ ruleTester.run('prefer-includes', rule, { something.test(a) } `, + ` + const pattern = new RegExp("bar") + function f(a) { + return pattern.test(a) + } + `, ]), invalid: addOptional([ // positive