From 9785477f26c1e0f926a5a34ba9170f1784a728c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=98=8A=E5=AE=87?= Date: Fri, 15 Feb 2019 08:46:20 +0800 Subject: [PATCH] Fix false postive in ban rule logic for method calls deeply nested inside objects (#4383) --- src/rules/banRule.ts | 5 +++-- test/rules/ban/test.ts.lint | 4 ++++ test/rules/ban/tslint.json | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/rules/banRule.ts b/src/rules/banRule.ts index a7c0608304d..d4c5d4c23a1 100644 --- a/src/rules/banRule.ts +++ b/src/rules/banRule.ts @@ -94,6 +94,7 @@ export class Rule extends Lint.Rules.AbstractRule { { name: ["it", "only"], message: "don't focus tests" }, { name: ["chai", "assert", "equal"], message: "Use 'strictEqual' instead." }, { name: ["*", "forEach"], message: "Use a regular for loop instead." }, + { name: ["*", "_id", "toString"], message: "Use 'toHexString' instead." }, ], ], type: "functionality", @@ -167,14 +168,14 @@ class BanFunctionWalker extends Lint.AbstractWalker { } private checkForObjectMethodBan(expression: ts.PropertyAccessExpression) { - for (const ban of this.options.methods) { + outer: for (const ban of this.options.methods) { if (expression.name.text !== ban.name) { continue; } let current = expression.expression; for (let i = ban.object.length - 1; i > 0; --i) { if (!isPropertyAccessExpression(current) || current.name.text !== ban.object[i]) { - continue; + continue outer; } current = current.expression; } diff --git a/test/rules/ban/test.ts.lint b/test/rules/ban/test.ts.lint index 078a38b05ea..bc487516a86 100644 --- a/test/rules/ban/test.ts.lint +++ b/test/rules/ban/test.ts.lint @@ -24,6 +24,7 @@ fit("some text", () => {}); someObject.fit() chai.assert.equal(1, "1"); ~~~~~~~~~~~~~~~~~ [err % ('chai.assert.equal', "Use 'strictEqual' instead.")] +chai.equal(1, "1"); assert.equal(1, "1"); foo.assert.equal(1, "1"); someObject.chai.assert.equal(1, "1"); @@ -33,5 +34,8 @@ arr.forEach(() => {}); ~~~~~~~~~~~ [err % ('*.forEach', 'Use a regular for loop instead.')] someObject.someProperty.forEach(() => {}); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [err % ('*.forEach', 'Use a regular for loop instead.')] +someObject._id.toString(); +~~~~~~~~~~~~~~~~~~~~~~~ [err % ('*._id.toString', "Use 'toHexString' instead.")] +someObject.toString(); [err]: Calls to '%s' are not allowed. \ No newline at end of file diff --git a/test/rules/ban/tslint.json b/test/rules/ban/tslint.json index 41b51746478..739ed951c37 100644 --- a/test/rules/ban/tslint.json +++ b/test/rules/ban/tslint.json @@ -10,7 +10,8 @@ {"name": ["_", "map"]}, ["_", "filter", "Use the native JavaScript 'myArray.filter' instead."], {"name": ["*", "forEach"], "message": "Use a regular for loop instead."}, - {"name": ["chai", "assert", "equal"], "message": "Use 'strictEqual' instead."} + {"name": ["chai", "assert", "equal"], "message": "Use 'strictEqual' instead."}, + {"name": ["*", "_id", "toString"], "message": "Use 'toHexString' instead."} ] } }