mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Merged revisions 61598-61599,61601 via svnmerge from
svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r61598 | david.wolever | 2008-03-18 23:58:33 -0500 (Di, 18 Mär 2008) | 1 line Added fixer for zip, and refactored a bit of code in the process. Closing #2171. ........ r61599 | david.wolever | 2008-03-19 00:04:26 -0500 (Mi, 19 Mär 2008) | 3 lines Removed a bunch of duplicate code -- it's in util now. ........ r61601 | martin.v.loewis | 2008-03-19 00:21:12 -0500 (Mi, 19 Mär 2008) | 2 lines Fix whitespace. ........
This commit is contained in:
		
							parent
							
								
									aad2b61f44
								
							
						
					
					
						commit
						ab41b370a3
					
				
					 24 changed files with 249 additions and 174 deletions
				
			
		| 
						 | 
					@ -39,7 +39,7 @@ class FixExcept(basefix.BaseFix):
 | 
				
			||||||
    try_stmt< 'try' ':' suite
 | 
					    try_stmt< 'try' ':' suite
 | 
				
			||||||
                  cleanup=((except_clause ':' suite)+ ['else' ':' suite]
 | 
					                  cleanup=((except_clause ':' suite)+ ['else' ':' suite]
 | 
				
			||||||
                                                      ['finally' ':' suite]
 | 
					                                                      ['finally' ':' suite]
 | 
				
			||||||
	                       | 'finally' ':' suite) >
 | 
					                               | 'finally' ':' suite) >
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def transform(self, node, results):
 | 
					    def transform(self, node, results):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,11 +14,9 @@
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Local imports
 | 
					# Local imports
 | 
				
			||||||
from .. import pytree
 | 
					 | 
				
			||||||
from .. import patcomp
 | 
					 | 
				
			||||||
from ..pgen2 import token
 | 
					from ..pgen2 import token
 | 
				
			||||||
from . import basefix
 | 
					from . import basefix
 | 
				
			||||||
from .util import Name, Call, ListComp, attr_chain, does_tree_import
 | 
					from .util import Name, Call, ListComp, does_tree_import, in_special_context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FixFilter(basefix.BaseFix):
 | 
					class FixFilter(basefix.BaseFix):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,35 +83,3 @@ def transform(self, node, results):
 | 
				
			||||||
            new = Call(Name("list"), [new])
 | 
					            new = Call(Name("list"), [new])
 | 
				
			||||||
        new.set_prefix(node.get_prefix())
 | 
					        new.set_prefix(node.get_prefix())
 | 
				
			||||||
        return new
 | 
					        return new
 | 
				
			||||||
 | 
					 | 
				
			||||||
P0 = """for_stmt< 'for' any 'in' node=any ':' any* >
 | 
					 | 
				
			||||||
        | comp_for< 'for' any 'in' node=any any* >
 | 
					 | 
				
			||||||
     """
 | 
					 | 
				
			||||||
p0 = patcomp.compile_pattern(P0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
P1 = """
 | 
					 | 
				
			||||||
power<
 | 
					 | 
				
			||||||
    ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
 | 
					 | 
				
			||||||
      'any' | 'all' | (any* trailer< '.' 'join' >) )
 | 
					 | 
				
			||||||
    trailer< '(' node=any ')' >
 | 
					 | 
				
			||||||
    any*
 | 
					 | 
				
			||||||
>
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
p1 = patcomp.compile_pattern(P1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
P2 = """
 | 
					 | 
				
			||||||
power<
 | 
					 | 
				
			||||||
    'sorted'
 | 
					 | 
				
			||||||
    trailer< '(' arglist<node=any any*> ')' >
 | 
					 | 
				
			||||||
    any*
 | 
					 | 
				
			||||||
>
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
p2 = patcomp.compile_pattern(P2)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def in_special_context(node):
 | 
					 | 
				
			||||||
    patterns = [p0, p1, p2]
 | 
					 | 
				
			||||||
    for pattern, parent in zip(patterns, attr_chain(node, "parent")):
 | 
					 | 
				
			||||||
        results = {}
 | 
					 | 
				
			||||||
        if pattern.match(parent, results) and results["node"] is node:
 | 
					 | 
				
			||||||
            return True
 | 
					 | 
				
			||||||
    return False
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,4 +13,3 @@ class FixFuture(basefix.BaseFix):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def transform(self, node, results):
 | 
					    def transform(self, node, results):
 | 
				
			||||||
        return BlankLine()
 | 
					        return BlankLine()
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,4 +86,4 @@ def transform(self, node, results):
 | 
				
			||||||
            bare_name = bare_name[0]
 | 
					            bare_name = bare_name[0]
 | 
				
			||||||
            new_name = self.replace.get(bare_name.value)
 | 
					            new_name = self.replace.get(bare_name.value)
 | 
				
			||||||
            if new_name:
 | 
					            if new_name:
 | 
				
			||||||
              bare_name.replace(Name(new_name, prefix=bare_name.get_prefix()))
 | 
					                bare_name.replace(Name(new_name, prefix=bare_name.get_prefix()))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,11 +20,9 @@
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Local imports
 | 
					# Local imports
 | 
				
			||||||
from .. import pytree
 | 
					 | 
				
			||||||
from .. import patcomp
 | 
					 | 
				
			||||||
from ..pgen2 import token
 | 
					from ..pgen2 import token
 | 
				
			||||||
from . import basefix
 | 
					from . import basefix
 | 
				
			||||||
from .util import Name, Call, ListComp, attr_chain, does_tree_import
 | 
					from .util import Name, Call, ListComp, does_tree_import, in_special_context
 | 
				
			||||||
from ..pygram import python_symbols as syms
 | 
					from ..pygram import python_symbols as syms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FixMap(basefix.BaseFix):
 | 
					class FixMap(basefix.BaseFix):
 | 
				
			||||||
| 
						 | 
					@ -92,35 +90,3 @@ def transform(self, node, results):
 | 
				
			||||||
            new = Call(Name("list"), [new])
 | 
					            new = Call(Name("list"), [new])
 | 
				
			||||||
        new.set_prefix(node.get_prefix())
 | 
					        new.set_prefix(node.get_prefix())
 | 
				
			||||||
        return new
 | 
					        return new
 | 
				
			||||||
 | 
					 | 
				
			||||||
P0 = """for_stmt< 'for' any 'in' node=any ':' any* >
 | 
					 | 
				
			||||||
        | comp_for< 'for' any 'in' node=any any* >
 | 
					 | 
				
			||||||
     """
 | 
					 | 
				
			||||||
p0 = patcomp.compile_pattern(P0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
P1 = """
 | 
					 | 
				
			||||||
power<
 | 
					 | 
				
			||||||
    ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
 | 
					 | 
				
			||||||
      'any' | 'all' | (any* trailer< '.' 'join' >) )
 | 
					 | 
				
			||||||
    trailer< '(' node=any ')' >
 | 
					 | 
				
			||||||
    any*
 | 
					 | 
				
			||||||
>
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
p1 = patcomp.compile_pattern(P1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
P2 = """
 | 
					 | 
				
			||||||
power<
 | 
					 | 
				
			||||||
    'sorted'
 | 
					 | 
				
			||||||
    trailer< '(' arglist<node=any any*> ')' >
 | 
					 | 
				
			||||||
    any*
 | 
					 | 
				
			||||||
>
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
p2 = patcomp.compile_pattern(P2)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def in_special_context(node):
 | 
					 | 
				
			||||||
    patterns = [p0, p1, p2]
 | 
					 | 
				
			||||||
    for pattern, parent in zip(patterns, attr_chain(node, "parent")):
 | 
					 | 
				
			||||||
        results = {}
 | 
					 | 
				
			||||||
        if pattern.match(parent, results) and results["node"] is node:
 | 
					 | 
				
			||||||
            return True
 | 
					 | 
				
			||||||
    return False
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,6 @@ def match(self, node):
 | 
				
			||||||
        return node.type == token.NOTEQUAL and node.value == "<>"
 | 
					        return node.type == token.NOTEQUAL and node.value == "<>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def transform(self, node, results):
 | 
					    def transform(self, node, results):
 | 
				
			||||||
      new = pytree.Leaf(token.NOTEQUAL, "!=")
 | 
					        new = pytree.Leaf(token.NOTEQUAL, "!=")
 | 
				
			||||||
      new.set_prefix(node.get_prefix())
 | 
					        new.set_prefix(node.get_prefix())
 | 
				
			||||||
      return new
 | 
					        return new
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,12 +47,12 @@ def transform(self, node, results):
 | 
				
			||||||
        mod = results.get("mod")
 | 
					        mod = results.get("mod")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if base:
 | 
					        if base:
 | 
				
			||||||
          if self.shadowed_next:
 | 
					            if self.shadowed_next:
 | 
				
			||||||
              attr.replace(Name("__next__", prefix=attr.get_prefix()))
 | 
					                attr.replace(Name("__next__", prefix=attr.get_prefix()))
 | 
				
			||||||
          else:
 | 
					            else:
 | 
				
			||||||
              base = [n.clone() for n in base]
 | 
					                base = [n.clone() for n in base]
 | 
				
			||||||
              base[0].set_prefix("")
 | 
					                base[0].set_prefix("")
 | 
				
			||||||
              node.replace(Call(Name("next", prefix=node.get_prefix()), base))
 | 
					                node.replace(Call(Name("next", prefix=node.get_prefix()), base))
 | 
				
			||||||
        elif name:
 | 
					        elif name:
 | 
				
			||||||
            n = Name("__next__", prefix=name.get_prefix())
 | 
					            n = Name("__next__", prefix=name.get_prefix())
 | 
				
			||||||
            name.replace(n)
 | 
					            name.replace(n)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Change:
 | 
					Change:
 | 
				
			||||||
    'print'          into 'print()'
 | 
					    'print'          into 'print()'
 | 
				
			||||||
    'print ...'	     into 'print(...)'
 | 
					    'print ...'      into 'print(...)'
 | 
				
			||||||
    'print ... ,'    into 'print(..., end=" ")'
 | 
					    'print ... ,'    into 'print(..., end=" ")'
 | 
				
			||||||
    'print >>x, ...' into 'print(..., file=x)'
 | 
					    'print >>x, ...' into 'print(..., file=x)'
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,11 +48,11 @@ def transform(self, node, results):
 | 
				
			||||||
        # Since Python 3 will not support this, we recurse down any tuple
 | 
					        # Since Python 3 will not support this, we recurse down any tuple
 | 
				
			||||||
        # literals, always taking the first element.
 | 
					        # literals, always taking the first element.
 | 
				
			||||||
        if is_tuple(exc):
 | 
					        if is_tuple(exc):
 | 
				
			||||||
          while is_tuple(exc):
 | 
					            while is_tuple(exc):
 | 
				
			||||||
              # exc.children[1:-1] is the unparenthesized tuple
 | 
					                # exc.children[1:-1] is the unparenthesized tuple
 | 
				
			||||||
              # exc.children[1].children[0] is the first element of the tuple
 | 
					                # exc.children[1].children[0] is the first element of the tuple
 | 
				
			||||||
              exc = exc.children[1].children[0].clone()
 | 
					                exc = exc.children[1].children[0].clone()
 | 
				
			||||||
          exc.set_prefix(" ")
 | 
					            exc.set_prefix(" ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if "val" not in results:
 | 
					        if "val" not in results:
 | 
				
			||||||
            # One-argument raise
 | 
					            # One-argument raise
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,4 +67,3 @@ def transform(self, node, results):
 | 
				
			||||||
        if mod_name and attr_name:
 | 
					        if mod_name and attr_name:
 | 
				
			||||||
            new_attr = LOOKUP[(mod_name.value, attr_name.value)]
 | 
					            new_attr = LOOKUP[(mod_name.value, attr_name.value)]
 | 
				
			||||||
            attr_name.replace(Name(new_attr, prefix=attr_name.get_prefix()))
 | 
					            attr_name.replace(Name(new_attr, prefix=attr_name.get_prefix()))
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,8 +15,8 @@ class FixRepr(basefix.BaseFix):
 | 
				
			||||||
              """
 | 
					              """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def transform(self, node, results):
 | 
					    def transform(self, node, results):
 | 
				
			||||||
      expr = results["expr"].clone()
 | 
					        expr = results["expr"].clone()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if expr.type == self.syms.testlist1:
 | 
					        if expr.type == self.syms.testlist1:
 | 
				
			||||||
          expr = self.parenthesize(expr)
 | 
					            expr = self.parenthesize(expr)
 | 
				
			||||||
      return Call(Name("repr"), [expr], prefix=node.get_prefix())
 | 
					        return Call(Name("repr"), [expr], prefix=node.get_prefix())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,21 +8,21 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FixUnicode(basefix.BaseFix):
 | 
					class FixUnicode(basefix.BaseFix):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PATTERN = "STRING | NAME<'unicode' | 'unichr'>"
 | 
					    PATTERN = "STRING | NAME<'unicode' | 'unichr'>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def transform(self, node, results):
 | 
					    def transform(self, node, results):
 | 
				
			||||||
    if node.type == token.NAME:
 | 
					        if node.type == token.NAME:
 | 
				
			||||||
      if node.value == "unicode":
 | 
					            if node.value == "unicode":
 | 
				
			||||||
        new = node.clone()
 | 
					                new = node.clone()
 | 
				
			||||||
        new.value = "str"
 | 
					                new.value = "str"
 | 
				
			||||||
        return new
 | 
					                return new
 | 
				
			||||||
      if node.value == "unichr":
 | 
					            if node.value == "unichr":
 | 
				
			||||||
        new = node.clone()
 | 
					                new = node.clone()
 | 
				
			||||||
        new.value = "chr"
 | 
					                new.value = "chr"
 | 
				
			||||||
        return new
 | 
					                return new
 | 
				
			||||||
      # XXX Warn when __unicode__ found?
 | 
					            # XXX Warn when __unicode__ found?
 | 
				
			||||||
    elif node.type == token.STRING:
 | 
					        elif node.type == token.STRING:
 | 
				
			||||||
      if re.match(r"[uU][rR]?[\'\"]", node.value):
 | 
					            if re.match(r"[uU][rR]?[\'\"]", node.value):
 | 
				
			||||||
        new = node.clone()
 | 
					                new = node.clone()
 | 
				
			||||||
        new.value = new.value[1:]
 | 
					                new.value = new.value[1:]
 | 
				
			||||||
        return new
 | 
					                return new
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,29 +11,29 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FixWsComma(basefix.BaseFix):
 | 
					class FixWsComma(basefix.BaseFix):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  explicit = True # The user must ask for this fixers
 | 
					    explicit = True # The user must ask for this fixers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PATTERN = """
 | 
					    PATTERN = """
 | 
				
			||||||
  any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]>
 | 
					    any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]>
 | 
				
			||||||
  """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  COMMA = pytree.Leaf(token.COMMA, ",")
 | 
					    COMMA = pytree.Leaf(token.COMMA, ",")
 | 
				
			||||||
  COLON = pytree.Leaf(token.COLON, ":")
 | 
					    COLON = pytree.Leaf(token.COLON, ":")
 | 
				
			||||||
  SEPS = (COMMA, COLON)
 | 
					    SEPS = (COMMA, COLON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def transform(self, node, results):
 | 
					    def transform(self, node, results):
 | 
				
			||||||
    new = node.clone()
 | 
					        new = node.clone()
 | 
				
			||||||
    comma = False
 | 
					 | 
				
			||||||
    for child in new.children:
 | 
					 | 
				
			||||||
      if child in self.SEPS:
 | 
					 | 
				
			||||||
        prefix = child.get_prefix()
 | 
					 | 
				
			||||||
        if prefix.isspace() and "\n" not in prefix:
 | 
					 | 
				
			||||||
          child.set_prefix("")
 | 
					 | 
				
			||||||
        comma = True
 | 
					 | 
				
			||||||
      else:
 | 
					 | 
				
			||||||
        if comma:
 | 
					 | 
				
			||||||
          prefix = child.get_prefix()
 | 
					 | 
				
			||||||
          if not prefix:
 | 
					 | 
				
			||||||
            child.set_prefix(" ")
 | 
					 | 
				
			||||||
        comma = False
 | 
					        comma = False
 | 
				
			||||||
    return new
 | 
					        for child in new.children:
 | 
				
			||||||
 | 
					            if child in self.SEPS:
 | 
				
			||||||
 | 
					                prefix = child.get_prefix()
 | 
				
			||||||
 | 
					                if prefix.isspace() and "\n" not in prefix:
 | 
				
			||||||
 | 
					                    child.set_prefix("")
 | 
				
			||||||
 | 
					                comma = True
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                if comma:
 | 
				
			||||||
 | 
					                    prefix = child.get_prefix()
 | 
				
			||||||
 | 
					                    if not prefix:
 | 
				
			||||||
 | 
					                        child.set_prefix(" ")
 | 
				
			||||||
 | 
					                comma = False
 | 
				
			||||||
 | 
					        return new
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										43
									
								
								Lib/lib2to3/fixes/fix_zip.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Lib/lib2to3/fixes/fix_zip.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Fixer that changes zip(seq0, seq1, ...) into list(zip(seq0, seq1, ...)
 | 
				
			||||||
 | 
					unless there exists a 'from future_builtins import zip' statement in the
 | 
				
			||||||
 | 
					top-level namespace.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We avoid the transformation if the zip() call is directly contained in
 | 
				
			||||||
 | 
					iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or for V in <>:.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Local imports
 | 
				
			||||||
 | 
					from . import basefix
 | 
				
			||||||
 | 
					from .util import Name, Call, does_tree_import, in_special_context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FixZip(basefix.BaseFix):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    PATTERN = """
 | 
				
			||||||
 | 
					    power< 'zip' args=trailer< '(' [any] ')' >
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def start_tree(self, *args):
 | 
				
			||||||
 | 
					        super(FixZip, self).start_tree(*args)
 | 
				
			||||||
 | 
					        self._future_zip_found = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def has_future_zip(self, node):
 | 
				
			||||||
 | 
					        if self._future_zip_found is not None:
 | 
				
			||||||
 | 
					            return self._future_zip_found
 | 
				
			||||||
 | 
					        self._future_zip_found = does_tree_import('future_builtins', 'zip', node)
 | 
				
			||||||
 | 
					        return self._future_zip_found
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def transform(self, node, results):
 | 
				
			||||||
 | 
					        if self.has_future_zip(node):
 | 
				
			||||||
 | 
					            # If a future zip has been imported for this file, we won't
 | 
				
			||||||
 | 
					            # be making any modifications
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if in_special_context(node):
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					        new = node.clone()
 | 
				
			||||||
 | 
					        new.set_prefix("")
 | 
				
			||||||
 | 
					        new = Call(Name("list"), [new])
 | 
				
			||||||
 | 
					        new.set_prefix(node.get_prefix())
 | 
				
			||||||
 | 
					        return new
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
from ..pgen2 import token
 | 
					from ..pgen2 import token
 | 
				
			||||||
from ..pytree import Leaf, Node
 | 
					from ..pytree import Leaf, Node
 | 
				
			||||||
from ..pygram import python_symbols as syms
 | 
					from ..pygram import python_symbols as syms
 | 
				
			||||||
 | 
					from .. import patcomp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###########################################################
 | 
					###########################################################
 | 
				
			||||||
| 
						 | 
					@ -180,6 +181,44 @@ def attr_chain(obj, attr):
 | 
				
			||||||
        yield next
 | 
					        yield next
 | 
				
			||||||
        next = getattr(next, attr)
 | 
					        next = getattr(next, attr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					p0 = """for_stmt< 'for' any 'in' node=any ':' any* >
 | 
				
			||||||
 | 
					        | comp_for< 'for' any 'in' node=any any* >
 | 
				
			||||||
 | 
					     """
 | 
				
			||||||
 | 
					p1 = """
 | 
				
			||||||
 | 
					power<
 | 
				
			||||||
 | 
					    ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
 | 
				
			||||||
 | 
					      'any' | 'all' | (any* trailer< '.' 'join' >) )
 | 
				
			||||||
 | 
					    trailer< '(' node=any ')' >
 | 
				
			||||||
 | 
					    any*
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					p2 = """
 | 
				
			||||||
 | 
					power<
 | 
				
			||||||
 | 
					    'sorted'
 | 
				
			||||||
 | 
					    trailer< '(' arglist<node=any any*> ')' >
 | 
				
			||||||
 | 
					    any*
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					pats_built = False
 | 
				
			||||||
 | 
					def in_special_context(node):
 | 
				
			||||||
 | 
					    """ Returns true if node is in an environment where all that is required
 | 
				
			||||||
 | 
					        of it is being itterable (ie, it doesn't matter if it returns a list
 | 
				
			||||||
 | 
					        or an itterator).
 | 
				
			||||||
 | 
					        See test_map_nochange in test_fixers.py for some examples and tests.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					    global p0, p1, p2, pats_built
 | 
				
			||||||
 | 
					    if not pats_built:
 | 
				
			||||||
 | 
					        p1 = patcomp.compile_pattern(p1)
 | 
				
			||||||
 | 
					        p0 = patcomp.compile_pattern(p0)
 | 
				
			||||||
 | 
					        p2 = patcomp.compile_pattern(p2)
 | 
				
			||||||
 | 
					        pats_built = True
 | 
				
			||||||
 | 
					    patterns = [p0, p1, p2]
 | 
				
			||||||
 | 
					    for pattern, parent in zip(patterns, attr_chain(node, "parent")):
 | 
				
			||||||
 | 
					        results = {}
 | 
				
			||||||
 | 
					        if pattern.match(parent, results) and results["node"] is node:
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###########################################################
 | 
					###########################################################
 | 
				
			||||||
### The following functions are to find bindings in a suite
 | 
					### The following functions are to find bindings in a suite
 | 
				
			||||||
###########################################################
 | 
					###########################################################
 | 
				
			||||||
| 
						 | 
					@ -240,8 +279,8 @@ def find_binding(name, node, package=None):
 | 
				
			||||||
        elif child.type == syms.simple_stmt:
 | 
					        elif child.type == syms.simple_stmt:
 | 
				
			||||||
            ret = find_binding(name, child, package)
 | 
					            ret = find_binding(name, child, package)
 | 
				
			||||||
        elif child.type == syms.expr_stmt:
 | 
					        elif child.type == syms.expr_stmt:
 | 
				
			||||||
                if _find(name, child.children[0]):
 | 
					            if _find(name, child.children[0]):
 | 
				
			||||||
                    ret = child
 | 
					                ret = child
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ret:
 | 
					        if ret:
 | 
				
			||||||
            if not package:
 | 
					            if not package:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -523,4 +523,4 @@ def diff_texts(a, b, filename):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
  sys.exit(main())
 | 
					    sys.exit(main())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2493,6 +2493,69 @@ def test_future_builtins(self):
 | 
				
			||||||
        a = "from future_builtins import *; map(f, 'ham')"
 | 
					        a = "from future_builtins import *; map(f, 'ham')"
 | 
				
			||||||
        self.unchanged(a)
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Test_zip(FixerTestCase):
 | 
				
			||||||
 | 
					    fixer = "zip"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def check(self, b, a):
 | 
				
			||||||
 | 
					        self.unchanged("from future_builtins import zip; " + b, a)
 | 
				
			||||||
 | 
					        FixerTestCase.check(self, b, a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_zip_basic(self):
 | 
				
			||||||
 | 
					        b = """x = zip(a, b, c)"""
 | 
				
			||||||
 | 
					        a = """x = list(zip(a, b, c))"""
 | 
				
			||||||
 | 
					        self.check(b, a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        b = """x = len(zip(a, b))"""
 | 
				
			||||||
 | 
					        a = """x = len(list(zip(a, b)))"""
 | 
				
			||||||
 | 
					        self.check(b, a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_zip_nochange(self):
 | 
				
			||||||
 | 
					        a = """b.join(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """(a + foo(5)).join(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """iter(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """list(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """list(zip(a, b))[0]"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """set(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """set(zip(a, b)).pop()"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """tuple(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """any(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """all(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """sum(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """sorted(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """sorted(zip(a, b), key=blah)"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """sorted(zip(a, b), key=blah)[0]"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """for i in zip(a, b): pass"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """[x for x in zip(a, b)]"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					        a = """(x for x in zip(a, b))"""
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_future_builtins(self):
 | 
				
			||||||
 | 
					        a = "from future_builtins import spam, zip, eggs; zip(a, b)"
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        b = """from future_builtins import spam, eggs; x = zip(a, b)"""
 | 
				
			||||||
 | 
					        a = """from future_builtins import spam, eggs; x = list(zip(a, b))"""
 | 
				
			||||||
 | 
					        self.check(b, a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        a = "from future_builtins import *; zip(a, b)"
 | 
				
			||||||
 | 
					        self.unchanged(a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Test_standarderror(FixerTestCase):
 | 
					class Test_standarderror(FixerTestCase):
 | 
				
			||||||
    fixer = "standarderror"
 | 
					    fixer = "standarderror"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -407,10 +407,10 @@ def testGenerateMatches(self):
 | 
				
			||||||
        pe = pytree.LeafPattern(1, "e", "pe")
 | 
					        pe = pytree.LeafPattern(1, "e", "pe")
 | 
				
			||||||
        pf = pytree.LeafPattern(1, "f", "pf")
 | 
					        pf = pytree.LeafPattern(1, "f", "pf")
 | 
				
			||||||
        pw = pytree.WildcardPattern([[pa, pb, pc], [pd, pe],
 | 
					        pw = pytree.WildcardPattern([[pa, pb, pc], [pd, pe],
 | 
				
			||||||
	                             [pa, pb], [pc, pd], [pe, pf]],
 | 
					                                     [pa, pb], [pc, pd], [pe, pf]],
 | 
				
			||||||
                                    min=1, max=4, name="pw")
 | 
					                                    min=1, max=4, name="pw")
 | 
				
			||||||
        self.assertEqual([x[0] for x in pw.generate_matches(leaves)],
 | 
					        self.assertEqual([x[0] for x in pw.generate_matches(leaves)],
 | 
				
			||||||
	                 [3, 5, 2, 4, 6])
 | 
					                         [3, 5, 2, 4, 6])
 | 
				
			||||||
        pr = pytree.NodePattern(type=1000, content=[pw], name="pr")
 | 
					        pr = pytree.NodePattern(type=1000, content=[pw], name="pr")
 | 
				
			||||||
        matches = list(pytree.generate_matches([pr], [root]))
 | 
					        matches = list(pytree.generate_matches([pr], [root]))
 | 
				
			||||||
        self.assertEqual(len(matches), 1)
 | 
					        self.assertEqual(len(matches), 1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue