diff --git a/src/language/walker/blockScopeAwareRuleWalker.ts b/src/language/walker/blockScopeAwareRuleWalker.ts index 82903c8b0fe..c61ca7473ac 100644 --- a/src/language/walker/blockScopeAwareRuleWalker.ts +++ b/src/language/walker/blockScopeAwareRuleWalker.ts @@ -76,6 +76,7 @@ export abstract class BlockScopeAwareRuleWalker extends ScopeAwareRuleWalk private isBlockScopeBoundary(node: ts.Node): boolean { return super.isScopeBoundary(node) + || node.kind === ts.SyntaxKind.Block || node.kind === ts.SyntaxKind.DoStatement || node.kind === ts.SyntaxKind.WhileStatement || node.kind === ts.SyntaxKind.ForStatement @@ -83,13 +84,11 @@ export abstract class BlockScopeAwareRuleWalker extends ScopeAwareRuleWalk || node.kind === ts.SyntaxKind.ForOfStatement || node.kind === ts.SyntaxKind.WithStatement || node.kind === ts.SyntaxKind.SwitchStatement - || (node.parent != null - && (node.parent.kind === ts.SyntaxKind.TryStatement - || node.parent.kind === ts.SyntaxKind.IfStatement) - ) - || (node.kind === ts.SyntaxKind.Block && node.parent != null - && (node.parent.kind === ts.SyntaxKind.Block - || node.parent.kind === ts.SyntaxKind.SourceFile) - ); + || isParentKind(node, ts.SyntaxKind.TryStatement) + || isParentKind(node, ts.SyntaxKind.IfStatement); } } + +function isParentKind(node: ts.Node, kind: ts.SyntaxKind) { + return node.parent != null && node.parent.kind === kind; +} diff --git a/src/rules/noShadowedVariableRule.ts b/src/rules/noShadowedVariableRule.ts index 8e9965e6116..8c0df851c7c 100644 --- a/src/rules/noShadowedVariableRule.ts +++ b/src/rules/noShadowedVariableRule.ts @@ -61,7 +61,7 @@ class NoShadowedVariableWalker extends Lint.BlockScopeAwareRuleWalker node.name); + this.handleSingleVariableIdentifier( node.name, false); } super.visitParameterDeclaration(node); @@ -120,38 +120,36 @@ class NoShadowedVariableWalker extends Lint.BlockScopeAwareRuleWalker= 0; + } - if (this.isVarInAnyScope(variableName)) { - this.addFailureOnIdentifier(variableIdentifier); - } - currentScope.varNames.push(variableName); + private inCurrentBlockScope(varName: string) { + return this.getCurrentBlockScope().variableNames.indexOf(varName) >= 0; } - private isVarInAnyScope(varName: string) { - return this.getAllScopes().some((scopeInfo) => scopeInfo.varNames.indexOf(varName) >= 0); + private inPreviousBlockScope(varName: string) { + return this.getAllBlockScopes().some((scopeInfo) => { + return scopeInfo !== this.getCurrentBlockScope() && scopeInfo.variableNames.indexOf(varName) >= 0 ; + }); } private addFailureOnIdentifier(ident: ts.Identifier) { @@ -161,5 +159,5 @@ class NoShadowedVariableWalker extends Lint.BlockScopeAwareRuleWalker