tslint-consistent-codestyle
Version:
Additional rules to enforce constistent code style with tslint
171 lines • 15.8 kB
JavaScript
"use strict";
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 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);
};
return Rule;
}(Lint.Rules.AbstractRule));
exports.Rule = Rule;
function walk(ctx) {
var seen = new Set();
var enums = [];
var declarations = [];
var variables = tsutils_1.collectVariableUsage(ctx.sourceFile);
variables.forEach(function (variable, identifier) {
if (identifier.parent.kind !== ts.SyntaxKind.EnumDeclaration || seen.has(identifier))
return;
var track = {
name: identifier.text,
isConst: tsutils_1.hasModifier(identifier.parent.modifiers, ts.SyntaxKind.ConstKeyword),
declarations: [],
members: new Map(),
canBeConst: !variable.inGlobalScope && !variable.exported,
uses: variable.uses,
};
for (var _i = 0, _a = variable.declarations; _i < _a.length; _i++) {
var declaration = _a[_i];
seen.add(declaration);
if (declaration.parent.kind !== ts.SyntaxKind.EnumDeclaration) {
track.canBeConst = false;
}
else {
track.declarations.push(declaration.parent);
declarations.push({
track: track,
declaration: declaration.parent
});
}
}
enums.push(track);
});
declarations.sort(function (a, b) { return a.declaration.pos - b.declaration.pos; });
for (var _i = 0, declarations_1 = declarations; _i < declarations_1.length; _i++) {
var _a = declarations_1[_i], track = _a.track, declaration = _a.declaration;
for (var _b = 0, _c = declaration.members; _b < _c.length; _b++) {
var member = _c[_b];
var isConst = track.isConst ||
member.initializer === undefined ||
isConstInitializer(member.initializer, track.members, findEnum);
track.members.set(tsutils_1.getPropertyName(member.name), {
isConst: isConst,
stringValued: isConst && member.initializer !== undefined && isStringValued(member.initializer, track.members, findEnum),
});
if (!isConst)
track.canBeConst = false;
}
}
for (var _d = 0, enums_1 = enums; _d < enums_1.length; _d++) {
var track = enums_1[_d];
if (track.isConst || !track.canBeConst || !onlyConstUses(track))
continue;
for (var _e = 0, _f = track.declarations; _e < _f.length; _e++) {
var declaration = _f[_e];
ctx.addFailure(declaration.name.pos - 4, declaration.name.end, "Enum '" + track.name + "' can be a 'const enum'.", Lint.Replacement.appendText(declaration.name.pos - 4, 'const '));
}
}
function findEnum(name) {
for (var _i = 0, enums_2 = enums; _i < enums_2.length; _i++) {
var track = enums_2[_i];
if (track.name !== name.text)
continue;
for (var _a = 0, _b = track.uses; _a < _b.length; _a++) {
var use = _b[_a];
if (use.location === name)
return track;
}
}
}
}
function onlyConstUses(track) {
for (var _i = 0, _a = track.uses; _i < _a.length; _i++) {
var use = _a[_i];
if (use.domain & 2 || use.domain === 1)
continue;
if (use.domain & 8)
return false;
var parent = use.location.parent;
switch (parent.kind) {
default:
return false;
case ts.SyntaxKind.ElementAccessExpression:
if (parent.argumentExpression === undefined ||
parent.argumentExpression.kind !== ts.SyntaxKind.StringLiteral)
return false;
break;
case ts.SyntaxKind.PropertyAccessExpression:
}
}
return true;
}
function isConstInitializer(initializer, members, findEnum) {
return (function isConst(node, allowStrings) {
switch (node.kind) {
case ts.SyntaxKind.Identifier:
var member = members.get(node.text);
return member !== undefined && member.isConst && (allowStrings || !member.stringValued);
case ts.SyntaxKind.StringLiteral:
return allowStrings;
case ts.SyntaxKind.NumericLiteral:
return true;
case ts.SyntaxKind.PrefixUnaryExpression:
return isConst(node.operand, false);
case ts.SyntaxKind.ParenthesizedExpression:
return isConst(node.expression, allowStrings);
}
if (tsutils_1.isPropertyAccessExpression(node)) {
if (!tsutils_1.isIdentifier(node.expression))
return false;
var track = findEnum(node.expression);
if (track === undefined)
return false;
var member = track.members.get(node.name.text);
return member !== undefined && member.isConst && (allowStrings || !member.stringValued);
}
if (tsutils_1.isElementAccessExpression(node)) {
if (!tsutils_1.isIdentifier(node.expression) ||
node.argumentExpression === undefined ||
!tsutils_1.isStringLiteral(node.argumentExpression))
return false;
var track = findEnum(node.expression);
if (track === undefined)
return false;
var member = track.members.get(node.argumentExpression.text);
return member !== undefined && member.isConst && (allowStrings || !member.stringValued);
}
if (tsutils_1.isBinaryExpression(node))
return node.operatorToken.kind !== ts.SyntaxKind.AsteriskAsteriskToken &&
node.operatorToken.kind !== ts.SyntaxKind.AmpersandAmpersandToken &&
node.operatorToken.kind !== ts.SyntaxKind.BarBarToken &&
!tsutils_1.isAssignmentKind(node.operatorToken.kind) &&
isConst(node.left, false) && isConst(node.right, false);
return false;
})(initializer, true);
}
function isStringValued(initializer, members, findEnum) {
return (function stringValued(node) {
switch (node.kind) {
case ts.SyntaxKind.ParenthesizedExpression:
return stringValued(node.expression);
case ts.SyntaxKind.Identifier:
return members.get(node.text).stringValued;
case ts.SyntaxKind.PropertyAccessExpression:
return findEnum(node.expression)
.members.get(node.name.text).stringValued;
case ts.SyntaxKind.ElementAccessExpression:
return findEnum(node.expression)
.members.get(node.argumentExpression.text).stringValued;
default:
return true;
}
})(initializer);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyQ29uc3RFbnVtUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByZWZlckNvbnN0RW51bVJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQUMvQixtQ0FHaUI7QUFFakI7SUFBMEIsZ0NBQXVCO0lBQWpEOztJQUlBLENBQUM7SUFIVSxvQkFBSyxHQUFaLFVBQWEsVUFBeUI7UUFDbEMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDTCxXQUFDO0FBQUQsQ0FBQyxBQUpELENBQTBCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUloRDtBQUpZLG9CQUFJO0FBeUJqQixTQUFTLElBQUksQ0FBQyxHQUEyQjtJQUNyQyxJQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUN0QyxJQUFNLEtBQUssR0FBWSxFQUFFLENBQUM7SUFDMUIsSUFBTSxZQUFZLEdBQW1CLEVBQUUsQ0FBQztJQUN4QyxJQUFNLFNBQVMsR0FBRyw4QkFBb0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFDLFFBQVEsRUFBRSxVQUFVO1FBQ25DLElBQUksVUFBVSxDQUFDLE1BQU8sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDakYsT0FBTztRQUNYLElBQU0sS0FBSyxHQUFVO1lBQ2pCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixPQUFPLEVBQUUscUJBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUM5RSxZQUFZLEVBQUUsRUFBRTtZQUNoQixPQUFPLEVBQUUsSUFBSSxHQUFH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