tslint-etc
Version:
More rules for TSLint
41 lines (40 loc) • 1.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Rule = void 0;
const tsquery_1 = require("@phenomnomnominal/tsquery");
const Lint = require("tslint");
const ts = require("typescript");
const support_1 = require("../support");
const mutatorRegExp = /^(fill|reverse|sort|splice)$/;
const creatorRegExp = /^(concat|entries|filter|keys|map|slice|values)$/;
class Rule extends Lint.Rules.TypedRule {
applyWithProgram(sourceFile, program) {
const failures = [];
const typeChecker = program.getTypeChecker();
const callExpressions = tsquery_1.tsquery(sourceFile, `CallExpression[expression.name.text='forEach']`);
callExpressions.forEach((callExpression) => {
const callee = callExpression.expression;
if (!ts.isPropertyAccessExpression(callee)) {
return;
}
const { expression: object, name: property } = callee;
const type = typeChecker.getTypeAtLocation(object);
if (!support_1.couldBeType(type, "Array")) {
return;
}
failures.push(new Lint.RuleFailure(sourceFile, property.getStart(), property.getStart() + property.getWidth(), Rule.FAILURE_STRING, this.ruleName));
});
return failures;
}
}
exports.Rule = Rule;
Rule.metadata = {
description: "Forbids calling forEach on arrays.",
options: null,
optionsDescription: "Not configurable.",
requiresTypeInfo: true,
ruleName: "no-array-foreach",
type: "functionality",
typescriptOnly: true,
};
Rule.FAILURE_STRING = "Calling forEach on arrays is forbidden";