tslint-consistent-codestyle
Version:
Additional rules to enforce constistent code style with tslint
126 lines • 10.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var ts = require("typescript");
var Lint = require("tslint");
var tsutils_1 = require("tsutils");
var utils_1 = require("../src/utils");
var OPTION_ALLOW_DESTRUCTURING = 'allow-destructuring';
var Rule = (function (_super) {
tslib_1.__extends(Rule, _super);
function Rule() {
return _super !== null && _super.apply(this, arguments) || this;
}
Rule.prototype.apply = function (sourceFile) {
return this.applyWithFunction(sourceFile, walk, {
allowDestructuring: this.ruleArguments.indexOf(OPTION_ALLOW_DESTRUCTURING) !== -1,
});
};
return Rule;
}(Lint.Rules.AbstractRule));
exports.Rule = Rule;
function walk(ctx) {
var variables;
return ts.forEachChild(ctx.sourceFile, cbNode, cbNodeArray);
function isUnused(node) {
if (variables === undefined)
variables = tsutils_1.collectVariableUsage(ctx.sourceFile);
return variables.get(node).uses.length === 1;
}
function cbNode(node) {
return ts.forEachChild(node, cbNode, cbNodeArray);
}
function cbNodeArray(nodes) {
if (nodes.length === 0)
return;
ts.forEachChild(nodes[0], cbNode, cbNodeArray);
for (var i = 1; i < nodes.length; ++i) {
var node = nodes[i];
if (tsutils_1.isReturnStatement(node)) {
if (node.expression === undefined)
continue;
if (!tsutils_1.isIdentifier(node.expression)) {
ts.forEachChild(node.expression, cbNode, cbNodeArray);
continue;
}
var previous = nodes[i - 1];
if (tsutils_1.isVariableStatement(previous) && declaresVariable(previous, node.expression.text, isUnused, ctx.options))
ctx.addFailureAtNode(node.expression, "don't declare variable " + node.expression.text + " to return it immediately");
}
else {
ts.forEachChild(node, cbNode, cbNodeArray);
}
}
}
}
function declaresVariable(statement, name, isUnused, options) {
var declarations = statement.declarationList.declarations;
var lastDeclaration = declarations[declarations.length - 1].name;
if (lastDeclaration.kind === ts.SyntaxKind.Identifier)
return lastDeclaration.text === name && isUnused(lastDeclaration);
return !options.allowDestructuring && isSimpleDestructuringForName(lastDeclaration, name, isUnused);
}
function isSimpleDestructuringForName(pattern, name, isUnused) {
var identifiersSeen = new Set();
var inArray = 0;
var dependsOnVar = 0;
return recur(pattern) === true;
function recur(p) {
if (p.kind === ts.SyntaxKind.ArrayBindingPattern) {
++inArray;
for (var _i = 0, _a = p.elements; _i < _a.length; _i++) {
var element = _a[_i];
if (element.kind !== ts.SyntaxKind.OmittedExpression) {
var result = handleBindingElement(element);
if (result !== undefined)
return result;
}
}
--inArray;
}
else {
for (var _b = 0, _c = p.elements; _b < _c.length; _b++) {
var element = _c[_b];
var result = handleBindingElement(element);
if (result !== undefined)
return result;
}
}
}
function handleBindingElement(element) {
if (element.name.kind !== ts.SyntaxKind.Identifier) {
if (dependsOnPrevious(element)) {
++dependsOnVar;
var result = recur(element.name);
--dependsOnVar;
return result;
}
return recur(element.name);
}
if (element.name.text !== name)
return void identifiersSeen.add(element.name.text);
if (dependsOnVar !== 0)
return false;
if (element.dotDotDotToken) {
if (element.parent.elements.length > 1 ||
inArray > (element.parent.kind === ts.SyntaxKind.ArrayBindingPattern ? 1 : 0))
return false;
}
else if (inArray !== 0) {
return false;
}
if (element.initializer !== undefined && !utils_1.isUndefined(element.initializer))
return false;
return !dependsOnPrevious(element) && isUnused(element.name);
}
function dependsOnPrevious(element) {
if (element.propertyName === undefined || element.propertyName.kind !== ts.SyntaxKind.ComputedPropertyName)
return false;
if (tsutils_1.isIdentifier(element.propertyName.expression))
return identifiersSeen.has(element.propertyName.expression.text);
if (tsutils_1.isLiteralExpression(element.propertyName.expression))
return false;
return true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9WYXJCZWZvcmVSZXR1cm5SdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm9WYXJCZWZvcmVSZXR1cm5SdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFpQztBQUNqQyw2QkFBK0I7QUFDL0IsbUNBQXVJO0FBRXZJLHNDQUEyQztBQUUzQyxJQUFNLDBCQUEwQixHQUFHLHFCQUFxQixDQUFDO0FBTXpEO0lBQTBCLGdDQUF1QjtJQUFqRDs7SUFNQSxDQUFDO0lBTFUsb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDNUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEYsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNMLFdBQUM7QUFBRCxDQUFDLEFBTkQsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBTWhEO0FBTlksb0JBQUk7QUFRakIsU0FBUyxJQUFJLENBQUMsR0FBK0I7SUFDekMsSUFBSSxTQUF1RCxDQUFDO0lBQzVELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUU1RCxTQUFTLFFBQVEsQ0FBQyxJQUFtQjtRQUNqQyxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQ3ZCLFNBQVMsR0FBRyw4QkFBb0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxTQUFTLE1BQU0sQ0FBQyxJQUFhO1FBQ3pCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFdB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