[Python-checkins] r54648 - in sandbox/trunk/2to3: fixes/util.py tests/test_util.py
collin.winter
python-checkins at python.org
Sun Apr 1 22:46:18 CEST 2007
Author: collin.winter
Date: Sun Apr 1 22:46:14 2007
New Revision: 54648
Modified:
sandbox/trunk/2to3/fixes/util.py
sandbox/trunk/2to3/tests/test_util.py
Log:
Add more tests and nested control structure support to fixes.util.find_binding().
Modified: sandbox/trunk/2to3/fixes/util.py
==============================================================================
--- sandbox/trunk/2to3/fixes/util.py (original)
+++ sandbox/trunk/2to3/fixes/util.py Sun Apr 1 22:46:14 2007
@@ -117,17 +117,38 @@
### The following functions are to find bindings in a suite
###########################################################
+def make_suite(node):
+ if node.type == syms.suite:
+ return node
+ node = node.clone()
+ parent, node.parent = node.parent, None
+ suite = Node(syms.suite, [node])
+ suite.parent = parent
+ return suite
+
_def_syms = set([syms.classdef, syms.funcdef])
def find_binding(name, node):
for child in node.children:
if child.type == syms.for_stmt:
if _find(name, child.children[1]):
return child
- elif _find(name, child.children[-1]):
- return child
+ n = find_binding(name, make_suite(child.children[-1]))
+ if n:
+ return n
elif child.type in (syms.if_stmt, syms.while_stmt):
- if _find(name, child.children[-1]):
- return child
+ n = find_binding(name, make_suite(child.children[-1]))
+ if n:
+ return n
+ elif child.type == syms.try_stmt:
+ n = find_binding(name, make_suite(child.children[2]))
+ if n:
+ return n
+ for i, kid in enumerate(child.children[3:]):
+ if kid.type == token.COLON and kid.value == ":":
+ # i+3 is the colon, i+4 is the suite
+ n = find_binding(name, make_suite(child.children[i+4]))
+ if n:
+ return n
elif child.type in _def_syms and child.children[1].value == name:
return child
elif _is_import_binding(child, name):
Modified: sandbox/trunk/2to3/tests/test_util.py
==============================================================================
--- sandbox/trunk/2to3/tests/test_util.py (original)
+++ sandbox/trunk/2to3/tests/test_util.py Sun Apr 1 22:46:14 2007
@@ -101,7 +101,7 @@
self.failUnless(self.find_binding("a", "(c, (d, a), b) = foo()"))
self.failUnless(self.find_binding("a", "(a, b) = foo().foo.foo[6][foo]"))
self.failIf(self.find_binding("a", "(foo, b) = (b, a)"))
- self.failIf(self.find_binding("a", "(foo, b, c) = (a, b, c)"))
+ self.failIf(self.find_binding("a", "(foo, (b, c)) = (a, b, c)"))
def test_list_assignment(self):
self.failUnless(self.find_binding("a", "[a] = b"))
@@ -109,7 +109,7 @@
self.failUnless(self.find_binding("a", "[c, [d, a], b] = foo()"))
self.failUnless(self.find_binding("a", "[a, b] = foo().foo.foo[a][foo]"))
self.failIf(self.find_binding("a", "[foo, b] = (b, a)"))
- self.failIf(self.find_binding("a", "[foo, b, c] = (a, b, c)"))
+ self.failIf(self.find_binding("a", "[foo, [b, c]] = (a, b, c)"))
def test_invalid_assignments(self):
self.failIf(self.find_binding("a", "foo.a = 5"))
@@ -157,6 +157,12 @@
self.failIf(self.find_binding("a", "def d(a): pass"))
self.failIf(self.find_binding("a", "def d(): a = 7"))
+ s = """
+ def d():
+ def a():
+ pass"""
+ self.failIf(self.find_binding("a", s))
+
def test_class_def(self):
self.failUnless(self.find_binding("a", "class a: pass"))
self.failUnless(self.find_binding("a", "class a(): pass"))
@@ -169,6 +175,12 @@
self.failIf(self.find_binding("a", "class d(b, **a): pass"))
self.failIf(self.find_binding("a", "class d: a = 7"))
+ s = """
+ class d():
+ class a():
+ pass"""
+ self.failIf(self.find_binding("a", s))
+
def test_for(self):
self.failUnless(self.find_binding("a", "for a in r: pass"))
self.failUnless(self.find_binding("a", "for a, b in r: pass"))
@@ -176,14 +188,266 @@
self.failUnless(self.find_binding("a", "for c, (a,) in r: pass"))
self.failUnless(self.find_binding("a", "for c, (a, b) in r: pass"))
self.failUnless(self.find_binding("a", "for c in r: a = c"))
+ self.failIf(self.find_binding("a", "for c in a: pass"))
+
+ def test_for_nested(self):
+ s = """
+ for b in r:
+ for a in b:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for a, c in b:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for (a, c) in b:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for (a,) in b:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for c, (a, d) in b:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for c in b:
+ a = 7"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for c in b:
+ d = a"""
+ self.failIf(self.find_binding("a", s))
+
+ s = """
+ for b in r:
+ for c in a:
+ d = 7"""
+ self.failIf(self.find_binding("a", s))
def test_if(self):
self.failUnless(self.find_binding("a", "if b in r: a = c"))
self.failIf(self.find_binding("a", "if a in r: d = e"))
+
+ def test_if_nested(self):
+ s = """
+ if b in r:
+ if c in d:
+ a = c"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ if b in r:
+ if c in d:
+ c = a"""
+ self.failIf(self.find_binding("a", s))
def test_while(self):
self.failUnless(self.find_binding("a", "while b in r: a = c"))
self.failIf(self.find_binding("a", "while a in r: d = e"))
+
+ def test_while_nested(self):
+ s = """
+ while b in r:
+ while c in d:
+ a = c"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ while b in r:
+ while c in d:
+ c = a"""
+ self.failIf(self.find_binding("a", s))
+
+ def test_try_except(self):
+ s = """
+ try:
+ a = 6
+ except:
+ b = 8"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except:
+ a = 6"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except KeyError:
+ pass
+ except:
+ a = 6"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except:
+ b = 6"""
+ self.failIf(self.find_binding("a", s))
+
+ def test_try_except_nested(self):
+ s = """
+ try:
+ try:
+ a = 6
+ except:
+ pass
+ except:
+ b = 8"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except:
+ try:
+ a = 6
+ except:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except:
+ try:
+ pass
+ except:
+ a = 6"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ try:
+ b = 8
+ except KeyError:
+ pass
+ except:
+ a = 6
+ except:
+ pass"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ pass
+ except:
+ try:
+ b = 8
+ except KeyError:
+ pass
+ except:
+ a = 6"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except:
+ b = 6"""
+ self.failIf(self.find_binding("a", s))
+
+ s = """
+ try:
+ try:
+ b = 8
+ except:
+ c = d
+ except:
+ try:
+ b = 6
+ except:
+ t = 8
+ except:
+ o = y"""
+ self.failIf(self.find_binding("a", s))
+
+ def test_try_except_finally(self):
+ s = """
+ try:
+ c = 6
+ except:
+ b = 8
+ finally:
+ a = 9"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ finally:
+ a = 6"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ finally:
+ b = 6"""
+ self.failIf(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ except:
+ b = 9
+ finally:
+ b = 6"""
+ self.failIf(self.find_binding("a", s))
+
+ def test_try_except_finally_nested(self):
+ s = """
+ try:
+ c = 6
+ except:
+ b = 8
+ finally:
+ try:
+ a = 9
+ except:
+ b = 9
+ finally:
+ c = 9"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ finally:
+ try:
+ pass
+ finally:
+ a = 6"""
+ self.failUnless(self.find_binding("a", s))
+
+ s = """
+ try:
+ b = 8
+ finally:
+ try:
+ b = 6
+ finally:
+ b = 7"""
+ self.failIf(self.find_binding("a", s))
if __name__ == "__main__":
More information about the Python-checkins
mailing list