diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:01:11 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:02:09 +0200 |
commit | 363723fc84f7b8477592e0105aeb331ec9a017af (patch) | |
tree | 29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/tslint/lib/rules/noDuplicateVariableRule.js | |
parent | 5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff) |
node_modules
Diffstat (limited to 'node_modules/tslint/lib/rules/noDuplicateVariableRule.js')
-rw-r--r-- | node_modules/tslint/lib/rules/noDuplicateVariableRule.js | 113 |
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; |