aboutsummaryrefslogtreecommitdiff
path: root/node_modules/tslint/lib/rules/noDuplicateVariableRule.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-08-14 05:01:11 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-08-14 05:02:09 +0200
commit363723fc84f7b8477592e0105aeb331ec9a017af (patch)
tree29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/tslint/lib/rules/noDuplicateVariableRule.js
parent5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff)
node_modules
Diffstat (limited to 'node_modules/tslint/lib/rules/noDuplicateVariableRule.js')
-rw-r--r--node_modules/tslint/lib/rules/noDuplicateVariableRule.js113
1 files changed, 67 insertions, 46 deletions
diff --git a/node_modules/tslint/lib/rules/noDuplicateVariableRule.js b/node_modules/tslint/lib/rules/noDuplicateVariableRule.js
index c828bfbff..757d17e4c 100644
--- a/node_modules/tslint/lib/rules/noDuplicateVariableRule.js
+++ b/node_modules/tslint/lib/rules/noDuplicateVariableRule.js
@@ -20,6 +20,7 @@ var tslib_1 = require("tslib");
var utils = require("tsutils");
var ts = require("typescript");
var Lint = require("../index");
+var OPTION_CHECK_PARAMETERS = "check-parameters";
var Rule = (function (_super) {
tslib_1.__extends(Rule, _super);
function Rule() {
@@ -30,58 +31,78 @@ var Rule = (function (_super) {
return "Duplicate variable: '" + name + "'";
};
Rule.prototype.apply = function (sourceFile) {
- return this.applyWithFunction(sourceFile, walk);
+ return this.applyWithWalker(new NoDuplicateVariableWalker(sourceFile, this.ruleName, {
+ parameters: this.ruleArguments.indexOf(OPTION_CHECK_PARAMETERS) !== -1,
+ }));
+ };
+ /* tslint:disable:object-literal-sort-keys */
+ Rule.metadata = {
+ ruleName: "no-duplicate-variable",
+ description: "Disallows duplicate variable declarations in the same block scope.",
+ descriptionDetails: (_a = ["\n This rule is only useful when using the `var` keyword -\n the compiler will detect redeclarations of `let` and `const` variables."], _a.raw = ["\n This rule is only useful when using the \\`var\\` keyword -\n the compiler will detect redeclarations of \\`let\\` and \\`const\\` variables."], Lint.Utils.dedent(_a)),
+ rationale: (_b = ["\n A variable can be reassigned if necessary -\n there's no good reason to have a duplicate variable declaration."], _b.raw = ["\n A variable can be reassigned if necessary -\n there's no good reason to have a duplicate variable declaration."], Lint.Utils.dedent(_b)),
+ optionsDescription: "You can specify `\"" + OPTION_CHECK_PARAMETERS + "\"` to check for variables with the same name as a paramter.",
+ options: {
+ type: "string",
+ enum: [OPTION_CHECK_PARAMETERS],
+ },
+ optionExamples: [
+ true,
+ [true, OPTION_CHECK_PARAMETERS],
+ ],
+ type: "functionality",
+ typescriptOnly: false,
};
return Rule;
}(Lint.Rules.AbstractRule));
-/* tslint:disable:object-literal-sort-keys */
-Rule.metadata = {
- ruleName: "no-duplicate-variable",
- description: "Disallows duplicate variable declarations in the same block scope.",
- descriptionDetails: (_a = ["\n This rule is only useful when using the `var` keyword -\n the compiler will detect redeclarations of `let` and `const` variables."], _a.raw = ["\n This rule is only useful when using the \\`var\\` keyword -\n the compiler will detect redeclarations of \\`let\\` and \\`const\\` variables."], Lint.Utils.dedent(_a)),
- rationale: (_b = ["\n A variable can be reassigned if necessary -\n there's no good reason to have a duplicate variable declaration."], _b.raw = ["\n A variable can be reassigned if necessary -\n there's no good reason to have a duplicate variable declaration."], Lint.Utils.dedent(_b)),
- optionsDescription: "Not configurable.",
- options: null,
- optionExamples: [true],
- type: "functionality",
- typescriptOnly: false,
-};
exports.Rule = Rule;
-function walk(ctx) {
- var scope = new Set();
- return ts.forEachChild(ctx.sourceFile, function cb(node) {
- if (utils.isFunctionScopeBoundary(node)) {
- var oldScope = scope;
- scope = new Set();
- ts.forEachChild(node, cb);
- scope = oldScope;
- return;
- }
- else if (utils.isVariableDeclaration(node) && !utils.isBlockScopedVariableDeclaration(node)) {
- forEachBoundIdentifier(node.name, function (id) {
- var text = id.text;
- if (scope.has(text)) {
- ctx.addFailureAtNode(id, Rule.FAILURE_STRING(text));
- }
- else {
- scope.add(text);
+var NoDuplicateVariableWalker = (function (_super) {
+ tslib_1.__extends(NoDuplicateVariableWalker, _super);
+ function NoDuplicateVariableWalker() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ NoDuplicateVariableWalker.prototype.walk = function (sourceFile) {
+ var _this = this;
+ this.scope = new Set();
+ var cb = function (node) {
+ if (utils.isFunctionScopeBoundary(node)) {
+ var oldScope = _this.scope;
+ _this.scope = new Set();
+ ts.forEachChild(node, cb);
+ _this.scope = oldScope;
+ return;
+ }
+ if (_this.options.parameters && utils.isParameterDeclaration(node)) {
+ _this.handleBindingName(node.name, false);
+ }
+ else if (utils.isVariableDeclarationList(node) && !utils.isBlockScopedVariableDeclarationList(node)) {
+ for (var _i = 0, _a = node.declarations; _i < _a.length; _i++) {
+ var variable = _a[_i];
+ _this.handleBindingName(variable.name, true);
}
- });
+ }
+ return ts.forEachChild(node, cb);
+ };
+ return ts.forEachChild(sourceFile, cb);
+ };
+ NoDuplicateVariableWalker.prototype.handleBindingName = function (name, check) {
+ if (name.kind === ts.SyntaxKind.Identifier) {
+ if (check && this.scope.has(name.text)) {
+ this.addFailureAtNode(name, Rule.FAILURE_STRING(name.text));
+ }
+ else {
+ this.scope.add(name.text);
+ }
}
- return ts.forEachChild(node, cb);
- });
-}
-function forEachBoundIdentifier(name, action) {
- if (name.kind === ts.SyntaxKind.Identifier) {
- action(name);
- }
- else {
- for (var _i = 0, _a = name.elements; _i < _a.length; _i++) {
- var e = _a[_i];
- if (e.kind !== ts.SyntaxKind.OmittedExpression) {
- forEachBoundIdentifier(e.name, action);
+ else {
+ for (var _i = 0, _a = name.elements; _i < _a.length; _i++) {
+ var e = _a[_i];
+ if (e.kind !== ts.SyntaxKind.OmittedExpression) {
+ this.handleBindingName(e.name, check);
+ }
}
}
- }
-}
+ };
+ return NoDuplicateVariableWalker;
+}(Lint.AbstractWalker));
var _a, _b;