from pychecker2.Check import Check
from pychecker2.Warning import Warning
from pychecker2 import util
from compiler.ast import *
class RedefineCheck(Check):
redefinedScope = Warning('Report redefined scopes',
'Scope (%s) is redefined at line %d')
def check(self, file, unused_checker):
names = {} # map name, parent to this scope
for node, scope in file.scopes.items():
if hasattr(node, 'name'): # classes, functions
key = (scope.parent, node.name)
if names.has_key(key):
# oops, another scope has the same name and parent
first = node
second = names[key]
# but don't warn if the parent node is the same If or Try
if util.try_if_exclusive(first, second):
continue
if first.lineno > second.lineno:
second, first = first, second
file.warning(first, self.redefinedScope,
first.name, second.lineno)
names[key] = node
|