tslint-consistent-codestyle
Version:
Additional rules to enforce constistent code style with tslint
169 lines • 16.5 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyQ29uc3RFbnVtUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByZWZlckNvbnN0RW51bVJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQUMvQixtQ0FHaUI7QUFFakI7SUFBMEIsZ0NBQXVCO0lBQWpEOztJQUlBLENBQUM7SUFIVSxvQkFBSyxHQUFaLFVBQWEsVUFBeUI7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNMLFdBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBSWhEO0FBSlksb0JBQUk7QUF5QmpCLGNBQWMsR0FBMkI7SUFDckMsSUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFDdEMsSUFBTSxLQUFLLEdBQVksRUFBRSxDQUFDO0lBQzFCLElBQU0sWUFBWSxHQUFtQixFQUFFLENBQUM7SUFDeEMsSUFBTSxTQUFTLEdBQUcsOEJBQW9CLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQyxRQUFRLEVBQUUsVUFBVTtRQUNuQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sQ0FBQztRQUNYLElBQU0sS0FBSyxHQUFVO1lBQ2pCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixPQUFPLEVBQUUscUJBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUM5RSxZQUFZLEVBQUUsRUFBRTtZQUNoQixPQUFP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