[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