0
@@ -6,14 +6,6 @@ import __builtin__
0
allowed_before_future = (ast.Module, ast.ImportFrom, ast.Expr, ast.Str)
0
defined_names = set(('__file__',))
0
- if hasattr(__builtin__, name):
0
- if name in defined_names:
0
@ivar used: pair of (L{Scope}, line-number) indicating the scope and
0
@@ -78,7 +70,7 @@ class ModuleScope(Scope):
0
class Checker(ast.NodeVisitor):
0
- def __init__(self, tree, filename='(none)'
):
0
+ def __init__(self, tree, filename='(none)'
, builtins = None):
0
ast.NodeVisitor.__init__(self)
0
@@ -87,6 +79,7 @@ class Checker(ast.NodeVisitor):
0
self.filename = filename
0
self.scope_stack = [ModuleScope()]
0
self.futures_allowed = True
0
+ self.builtins = frozenset(builtins or [])
0
for handler, scope in self.deferred:
0
@@ -153,6 +146,8 @@ class Checker(ast.NodeVisitor):
0
Process bindings for loop variables.
0
+ self.visit_nodes(node.iter)
0
for var in self.flatten(node.target):
0
upval = self.scope.get(var.id)
0
if isinstance(upval, Importation) and upval.used:
0
@@ -219,7 +214,7 @@ class Checker(ast.NodeVisitor):
0
self.scope_stack[0][node.id].used = (scope, node.lineno, node.col_offset)
0
- if not import_starred and not
is_builtin(name):
0
+ if not import_starred and not
self.is_builtin(name):
0
self.report(messages.UndefinedName, node.lineno, node.col_offset, name)
0
def assign_vars(self, targets, report_redef=True):
0
@@ -302,7 +297,7 @@ class Checker(ast.NodeVisitor):
0
def visit_excepthandler(self, node):
0
- if node.
name is not None:
0
+ if node.
type is not None:
0
if node.name is not None:
0
self.assign_vars(node.name)
0
@@ -370,3 +365,13 @@ class Checker(ast.NodeVisitor):
0
+ def is_builtin(self, name):
0
+ if hasattr(__builtin__, name):
0
+ if name in defined_names:
0
+ if name in self.builtins: