[Python-checkins] r53008 - in sandbox/trunk/2to3: fix_has_key.py fixes/fix_apply.py fixes/fix_has_key.py fixes/fix_print.py pygram.py

guido.van.rossum python-checkins at python.org
Tue Dec 12 16:11:48 CET 2006


Author: guido.van.rossum
Date: Tue Dec 12 16:11:47 2006
New Revision: 53008

Added:
   sandbox/trunk/2to3/fixes/fix_has_key.py   (contents, props changed)
   sandbox/trunk/2to3/fixes/fix_print.py   (contents, props changed)
Removed:
   sandbox/trunk/2to3/fix_has_key.py
Modified:
   sandbox/trunk/2to3/fixes/fix_apply.py
   sandbox/trunk/2to3/pygram.py
Log:
Convert fix_has_key to the new regime.


Deleted: /sandbox/trunk/2to3/fix_has_key.py
==============================================================================
--- /sandbox/trunk/2to3/fix_has_key.py	Tue Dec 12 16:11:47 2006
+++ (empty file)
@@ -1,126 +0,0 @@
-#!/usr/bin/env python2.5
-# Copyright 2006 Google Inc. All Rights Reserved.
-# Licensed to PSF under a Contributor Agreement.
-
-"""Refactoring tool: change 'x.has_key(y)' into 'y in x'."""
-
-__author__ = "Guido van Rossum <guido at python.org>"
-
-# Python imports
-import os
-import sys
-import token
-import logging
-
-import pgen2
-from pgen2 import driver
-
-import pytree
-import patcomp
-
-logging.basicConfig(level=logging.DEBUG)
-
-gr = driver.load_grammar("Grammar.txt") # used by node initializers
-
-class Symbols(object):
-
-    def __init__(self, gr):
-        for name, symbol in gr.symbol2number.iteritems():
-            setattr(self, name, symbol)
-
-syms = Symbols(gr)
-
-def main():
-    args = sys.argv[1:] or ["example.py"]
-
-    dr = driver.Driver(gr, convert=pytree.convert)
-
-    for fn in args:
-        print "Parsing", fn
-        tree = dr.parse_file(fn)
-        refactor(tree)
-        diff(fn, tree)
-
-def refactor(tree):
-    visit(tree, fix_has_key)
-
-def visit(node, func):
-    func(node)
-    for child in node.children:
-        visit(child, func)
-
-# Sample nodes
-n_star = pytree.Leaf(token.STAR, "*")
-n_comma = pytree.Leaf(token.COMMA, ",")
-
-# Tree matching pattern
-pat_compile = patcomp.PatternCompiler().compile_pattern
-p_has_key = pat_compile("""
-power<
-    before=any+
-    trailer< '.' 'has_key' >
-    trailer<
-        '('
-        ( not(arglist | argument<any '=' any>) arg=any
-        | arglist<(not argument<any '=' any>) arg=any ','>
-        )
-        ')'
-    >
-    after=any*
->
-""")
-
-def fix_has_key(node):
-    results = {}
-    if not p_has_key.match(node, results):
-        return
-    prefix = node.get_prefix()
-    before = results["before"]
-    arg = results["arg"]
-    after = results["after"]
-    arg.replace(None)
-    if arg.type in (syms.comparison, syms.not_test, syms.and_test,
-                    syms.or_test, syms.test, syms.lambdef, syms.argument):
-        arg = parenthesize(arg)
-    for n in before:
-        n.replace(None)
-    if len(before) == 1:
-        before = before[0]
-    else:
-        before = pytree.Node(syms.power, before)
-    before.set_prefix(" ")
-    n_in = pytree.Leaf(token.NAME, "in")
-    n_in.set_prefix(" ")
-    new = pytree.Node(syms.comparison, (arg, n_in, before))
-    if after:
-        for n in after:
-            n.replace(None)
-        new = parenthesize(new)
-        new = pytree.Node(syms.power, (new,) + tuple(after))
-    if node.parent.type in (syms.comparison, syms.expr, syms.xor_expr,
-                            syms.and_expr, syms.shift_expr, syms.arith_expr,
-                            syms.term, syms.factor, syms.power):
-        new = parenthesize(new)
-    new.set_prefix(prefix)
-    node.replace(new)
-
-def parenthesize(node):
-    return pytree.Node(syms.atom,
-                       (pytree.Leaf(token.LPAR, "("),
-                        node,
-                        pytree.Leaf(token.RPAR, ")")))
-
-
-def diff(fn, tree):
-    f = open("@", "w")
-    try:
-        f.write(str(tree))
-    finally:
-        f.close()
-    try:
-        return os.system("diff -u %s @" % fn)
-    finally:
-        os.remove("@")
-
-if __name__ == "__main__":
-    main()

Modified: sandbox/trunk/2to3/fixes/fix_apply.py
==============================================================================
--- sandbox/trunk/2to3/fixes/fix_apply.py	(original)
+++ sandbox/trunk/2to3/fixes/fix_apply.py	Tue Dec 12 16:11:47 2006
@@ -9,8 +9,9 @@
 # Local imports
 import pytree
 import patcomp
-from pygram import python_symbols as syms
+import pygram
 
+syms = pygram.python_symbols
 pat_compile = patcomp.PatternCompiler().compile_pattern
 
 PATTERN = """
@@ -41,9 +42,6 @@
     def transform(self, node):
         results = self.match(node)
         assert results
-        if not results:
-            return
-        assert node.children[1].children[1].type == syms.arglist
         func = results["func"]
         args = results["args"]
         kwds = results.get("kwds")
@@ -53,10 +51,7 @@
             (func.type != syms.power or
              func.children[-2].type == token.DOUBLESTAR)):
             # Need to parenthesize
-            func = pytree.Node(syms.atom,
-                               (pytree.Leaf(token.LPAR, "("),
-                                func,
-                                pytree.Leaf(token.RPAR, ")")))
+            func = pygram.parenthesize(func)
         func.set_prefix("")
         args = args.clone()
         args.set_prefix("")

Added: sandbox/trunk/2to3/fixes/fix_has_key.py
==============================================================================
--- (empty file)
+++ sandbox/trunk/2to3/fixes/fix_has_key.py	Tue Dec 12 16:11:47 2006
@@ -0,0 +1,71 @@
+# Copyright 2006 Google, Inc. All Rights Reserved.
+# Licensed to PSF under a Contributor Agreement.
+
+"""Fixer for has_key()."""
+
+# Python imports
+import token
+
+# Local imports
+import pytree
+import patcomp
+import pygram
+
+syms = pygram.python_symbols
+pat_compile = patcomp.PatternCompiler().compile_pattern
+
+PATTERN = """
+power<
+    before=any+
+    trailer< '.' 'has_key' >
+    trailer<
+        '('
+        ( not(arglist | argument<any '=' any>) arg=any
+        | arglist<(not argument<any '=' any>) arg=any ','>
+        )
+        ')'
+    >
+    after=any*
+>
+"""
+
+
+class FixHasKey(object):
+
+    def __init__(self, options):
+        self.options = options
+        self.pattern = pat_compile(PATTERN)
+
+    def match(self, node):
+        results = {}
+        return self.pattern.match(node, results) and results
+
+    def transform(self, node):
+        results = self.match(node)
+        assert results
+        prefix = node.get_prefix()
+        before = [n.clone() for n in results["before"]]
+        arg = results["arg"].clone()
+        after = results["after"]
+        if after:
+            after = [n.clone() for n in after]
+        if arg.type in (syms.comparison, syms.not_test, syms.and_test,
+                        syms.or_test, syms.test, syms.lambdef, syms.argument):
+            arg = pygram.parenthesize(arg)
+        if len(before) == 1:
+            before = before[0]
+        else:
+            before = pytree.Node(syms.power, before)
+        before.set_prefix(" ")
+        n_in = pytree.Leaf(token.NAME, "in")
+        n_in.set_prefix(" ")
+        new = pytree.Node(syms.comparison, (arg, n_in, before))
+        if after:
+            new = pygram.parenthesize(new)
+            new = pytree.Node(syms.power, (new,) + tuple(after))
+        if node.parent.type in (syms.comparison, syms.expr, syms.xor_expr,
+                                syms.and_expr, syms.shift_expr, syms.arith_expr,
+                                syms.term, syms.factor, syms.power):
+            new = pygram.parenthesize(new)
+        new.set_prefix(prefix)
+        return new

Added: sandbox/trunk/2to3/fixes/fix_print.py
==============================================================================
--- (empty file)
+++ sandbox/trunk/2to3/fixes/fix_print.py	Tue Dec 12 16:11:47 2006
@@ -0,0 +1,40 @@
+# Copyright 2006 Google, Inc. All Rights Reserved.
+# Licensed to PSF under a Contributor Agreement.
+
+"""Null fixer.  Use as a template."""
+
+
+class FixNull(object):
+
+    """Fixer class.
+
+    The class name must be FixFooBar where FooBar is the result of
+    removing underscores and capitalizing the words of the fix name.
+    For example, the class name for a fixer named 'has_key' should be
+    FixHasKey.
+    """
+
+    def __init__(self, options):
+        """Initializer.
+
+        The argument is an optparse.Values instance which can be used
+        to inspect the command line options.
+        """
+        self.options = options
+
+    def match(self, node):
+        """Matcher.
+
+        Should return a true or false object (not necessarily a bool).
+        It may return a non-empty dict of matching sub-nodes as
+        returned by a matching pattern.
+        """
+        return None
+
+    def transform(self, node):
+        """Transformer.
+
+        Should return None, or a node that is a modified copy of the
+        argument node.  The argument should not be modified in place.
+        """
+        return None

Modified: sandbox/trunk/2to3/pygram.py
==============================================================================
--- sandbox/trunk/2to3/pygram.py	(original)
+++ sandbox/trunk/2to3/pygram.py	Tue Dec 12 16:11:47 2006
@@ -3,6 +3,11 @@
 
 """Export the Python grammar and symbols."""
 
+# Python imports
+import token
+
+# Local imports
+import pytree
 from pgen2 import driver
 
 
@@ -15,3 +20,10 @@
 
 python_grammar = driver.load_grammar("Grammar.txt")
 python_symbols = Symbols(python_grammar)
+
+
+def parenthesize(node):
+    return pytree.Node(python_symbols.atom,
+                       (pytree.Leaf(token.LPAR, "("),
+                        node,
+                        pytree.Leaf(token.RPAR, ")")))


More information about the Python-checkins mailing list