From f24cdf468977ce114c6460107823b747034b498c Mon Sep 17 00:00:00 2001 From: sudalqueen Date: Tue, 4 Aug 2020 23:56:33 +0900 Subject: [PATCH 1/3] test: add test case to prefer-includes.test.ts Add test cases for RegExp in prefer-includes.test.ts --- packages/eslint-plugin/tests/rules/prefer-includes.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) 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 From 18d1c1e5ed2271d9190aaf43a6a4a5965f14cf3e Mon Sep 17 00:00:00 2001 From: sudalqueen Date: Thu, 13 Aug 2020 23:02:28 +0900 Subject: [PATCH 2/3] fix: add logic to check the argument type of test method --- .../src/rules/prefer-includes.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/eslint-plugin/src/rules/prefer-includes.ts b/packages/eslint-plugin/src/rules/prefer-includes.ts index 721c53850df..9cc86ddcdce 100644 --- a/packages/eslint-plugin/src/rules/prefer-includes.ts +++ b/packages/eslint-plugin/src/rules/prefer-includes.ts @@ -191,6 +191,25 @@ export default createRule({ return; } + const argument = callNode.arguments[0]; + const tsNode = services.esTreeNodeToTSNodeMap.get(argument); + const argumentDeclarations = types + .getSymbolAtLocation(tsNode) + ?.getDeclarations(); + if (argumentDeclarations == null || argumentDeclarations.length === 0) { + return; + } + + for (const argumentDecl of argumentDeclarations) { + const type = types.getTypeAtLocation(argumentDecl); + const includesMethodDecl = type + .getProperty('includes') + ?.getDeclarations(); + if (includesMethodDecl == null || includesMethodDecl == undefined) { + return; + } + } + context.report({ node: callNode, messageId: 'preferStringIncludes', From d7891a3beeabda814d60513cfc90566a390db971 Mon Sep 17 00:00:00 2001 From: sudalqueen Date: Thu, 13 Aug 2020 23:50:12 +0900 Subject: [PATCH 3/3] fix: edit type checking logic use `getConstrainedTypeAtLocation` method for check argument type of `test` method. --- .../src/rules/prefer-includes.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-includes.ts b/packages/eslint-plugin/src/rules/prefer-includes.ts index 9cc86ddcdce..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,25 +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 argumentDeclarations = types - .getSymbolAtLocation(tsNode) + const type = getConstrainedTypeAtLocation(types, tsNode); + + const includesMethodDecl = type + .getProperty('includes') ?.getDeclarations(); - if (argumentDeclarations == null || argumentDeclarations.length === 0) { + if (includesMethodDecl == null) { return; } - for (const argumentDecl of argumentDeclarations) { - const type = types.getTypeAtLocation(argumentDecl); - const includesMethodDecl = type - .getProperty('includes') - ?.getDeclarations(); - if (includesMethodDecl == null || includesMethodDecl == undefined) { - return; - } - } - context.report({ node: callNode, messageId: 'preferStringIncludes',