Ejemplo n.º 1
0
 def test_post_order(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar")
     l3 = pytree.Leaf(100, "fooey")
     c1 = pytree.Node(1000, [l1, l2])
     n1 = pytree.Node(1000, [c1, l3])
     self.assertEqual(list(n1.post_order()), [l1, l2, c1, l3, n1])
Ejemplo n.º 2
0
def _InsertPseudoParentheses(node):
  comment_node = None
  if isinstance(node, pytree.Node):
    if node.children[-1].type == token.COMMENT:
      comment_node = node.children[-1].clone()
      node.children[-1].remove()

  first = _GetFirstLeafNode(node)
  last = _GetLastLeafNode(node)

  lparen = pytree.Leaf(token.LPAR,
                       u'(',
                       context=('', (first.get_lineno(), first.column - 1)))
  rparen = pytree.Leaf(token.RPAR,
                       u')',
                       context=('', (last.get_lineno(),
                                     last.column + len(last.value) + 1)))

  lparen.is_pseudo = True
  rparen.is_pseudo = True

  if isinstance(node, pytree.Node):
    node.insert_child(0, lparen)
    node.append_child(rparen)
    if comment_node:
      node.append_child(comment_node)
  else:
    new_node = pytree.Node(syms.atom, [lparen, node.clone(), rparen])
    node.replace(new_node)
Ejemplo n.º 3
0
    def transform(self, node, results):
        single = results.get("single")
        if single:
            # Make a fake listmaker
            fake = pytree.Node(syms.listmaker, [single.clone()])
            single.replace(fake)
            items = fake
        else:
            items = results["items"]

        # Build the contents of the literal
        literal = [pytree.Leaf(token.LBRACE, u"{")]
        literal.extend(n.clone() for n in items.children)
        literal.append(pytree.Leaf(token.RBRACE, u"}"))
        # Set the prefix of the right brace to that of the ')' or ']'
        literal[-1].prefix = items.next_sibling.prefix
        maker = pytree.Node(syms.dictsetmaker, literal)
        maker.prefix = node.prefix

        # If the original was a one tuple, we need to remove the extra comma.
        if len(maker.children) == 4:
            n = maker.children[2]
            n.remove()
            maker.children[-1].prefix = n.prefix

        # Finally, replace the set call with our shiny new literal.
        return maker
Ejemplo n.º 4
0
 def test_wildcard(self):
     # Build a tree for testing
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar")
     l3 = pytree.Leaf(100, "foo")
     n1 = pytree.Node(1000, [l1, l2])
     n2 = pytree.Node(1000, [l3])
     root = pytree.Node(1000, [n1, n2])
     # Build a pattern
     pl = pytree.LeafPattern(100, "foo", name="pl")
     pn = pytree.NodePattern(1000, [pl], name="pn")
     pw = pytree.WildcardPattern([[pn], [pl, pl]], name="pw")
     r = {}
     self.assertFalse(pw.match_seq([root], r))
     self.assertEqual(r, {})
     self.assertFalse(pw.match_seq([n1], r))
     self.assertEqual(r, {})
     self.assertTrue(pw.match_seq([n2], r))
     # These are easier to debug
     self.assertEqual(sorted(r.keys()), ["pl", "pn", "pw"])
     self.assertEqual(r["pl"], l1)
     self.assertEqual(r["pn"], n2)
     self.assertEqual(r["pw"], [n2])
     # But this is equivalent
     self.assertEqual(r, {"pl": l1, "pn": n2, "pw": [n2]})
     r = {}
     self.assertTrue(pw.match_seq([l1, l3], r))
     self.assertEqual(r, {"pl": l3, "pw": [l1, l3]})
     self.assertIs(r["pl"], l3)
     r = {}
Ejemplo n.º 5
0
 def test_basic_patterns(self):
     # Build a tree
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "bar")
     l3 = pytree.Leaf(100, "foo")
     n1 = pytree.Node(1000, [l1, l2])
     n2 = pytree.Node(1000, [l3])
     root = pytree.Node(1000, [n1, n2])
     # Build a pattern matching a leaf
     pl = pytree.LeafPattern(100, "foo", name="pl")
     r = {}
     self.assertFalse(pl.match(root, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pl.match(n1, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pl.match(n2, results=r))
     self.assertEqual(r, {})
     self.assertTrue(pl.match(l1, results=r))
     self.assertEqual(r, {"pl": l1})
     r = {}
     self.assertFalse(pl.match(l2, results=r))
     self.assertEqual(r, {})
     # Build a pattern matching a node
     pn = pytree.NodePattern(1000, [pl], name="pn")
     self.assertFalse(pn.match(root, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pn.match(n1, results=r))
     self.assertEqual(r, {})
     self.assertTrue(pn.match(n2, results=r))
     self.assertEqual(r, {"pn": n2, "pl": l3})
     r = {}
     self.assertFalse(pn.match(l1, results=r))
     self.assertEqual(r, {})
     self.assertFalse(pn.match(l2, results=r))
     self.assertEqual(r, {})
Ejemplo n.º 6
0
    def test_changed(self):
        l1 = pytree.Leaf(100, "f")
        self.assertFalse(l1.was_changed)
        l1.changed()
        self.assertTrue(l1.was_changed)

        l1 = pytree.Leaf(100, "f")
        n1 = pytree.Node(1000, [l1])
        self.assertFalse(n1.was_changed)
        n1.changed()
        self.assertTrue(n1.was_changed)

        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "+")
        l3 = pytree.Leaf(100, "bar")
        n1 = pytree.Node(1000, [l1, l2, l3])
        n2 = pytree.Node(1000, [n1])
        self.assertFalse(l1.was_changed)
        self.assertFalse(n1.was_changed)
        self.assertFalse(n2.was_changed)

        n1.changed()
        self.assertTrue(n1.was_changed)
        self.assertTrue(n2.was_changed)
        self.assertFalse(l1.was_changed)
Ejemplo n.º 7
0
def _InsertPseudoParentheses(node):
    """Insert pseudo parentheses so that dicts can be formatted correctly."""
    comment_node = None
    if isinstance(node, pytree.Node):
        if node.children[-1].type == grammar_token.COMMENT:
            comment_node = node.children[-1].clone()
            node.children[-1].remove()

    first = pytree_utils.FirstLeafNode(node)
    last = pytree_utils.LastLeafNode(node)

    if first == last and first.type == grammar_token.COMMENT:
        # A comment was inserted before the value, which is a pytree.Leaf.
        # Encompass the dictionary's value into an ATOM node.
        last = first.next_sibling
        last_clone = last.clone()
        new_node = pytree.Node(syms.atom, [first.clone(), last_clone])
        for orig_leaf, clone_leaf in zip(last.leaves(), last_clone.leaves()):
            pytree_utils.CopyYapfAnnotations(orig_leaf, clone_leaf)
            if hasattr(orig_leaf, 'is_pseudo'):
                clone_leaf.is_pseudo = orig_leaf.is_pseudo

        node.replace(new_node)
        node = new_node
        last.remove()

        first = pytree_utils.FirstLeafNode(node)
        last = pytree_utils.LastLeafNode(node)

    lparen = pytree.Leaf(grammar_token.LPAR,
                         u'(',
                         context=('', (first.get_lineno(), first.column - 1)))
    last_lineno = last.get_lineno()
    if last.type == grammar_token.STRING and '\n' in last.value:
        last_lineno += last.value.count('\n')

    if last.type == grammar_token.STRING and '\n' in last.value:
        last_column = len(last.value.split('\n')[-1]) + 1
    else:
        last_column = last.column + len(last.value) + 1
    rparen = pytree.Leaf(grammar_token.RPAR,
                         u')',
                         context=('', (last_lineno, last_column)))

    lparen.is_pseudo = True
    rparen.is_pseudo = True

    if isinstance(node, pytree.Node):
        node.insert_child(0, lparen)
        node.append_child(rparen)
        if comment_node:
            node.append_child(comment_node)
        _AppendFirstLeafTokenSubtype(node, subtypes.DICTIONARY_VALUE)
    else:
        clone = node.clone()
        for orig_leaf, clone_leaf in zip(node.leaves(), clone.leaves()):
            pytree_utils.CopyYapfAnnotations(orig_leaf, clone_leaf)
        new_node = pytree.Node(syms.atom, [lparen, clone, rparen])
        node.replace(new_node)
        _AppendFirstLeafTokenSubtype(clone, subtypes.DICTIONARY_VALUE)
Ejemplo n.º 8
0
    def testIsMultilineString(self):
        tok = format_token.FormatToken(pytree.Leaf(token.STRING,
                                                   '"""hello"""'))
        self.assertTrue(tok.is_multiline_string)

        tok = format_token.FormatToken(
            pytree.Leaf(token.STRING, 'r"""hello"""'))
        self.assertTrue(tok.is_multiline_string)
Ejemplo n.º 9
0
    def test_leaf_next_sibling(self):
        l1 = pytree.Leaf(100, "a")
        l2 = pytree.Leaf(100, "b")
        p1 = pytree.Node(1000, [l1, l2])

        self.assertTrue(l1.next_sibling is l2)
        self.assertEqual(l2.next_sibling, None)
        self.assertEqual(p1.next_sibling, None)
Ejemplo n.º 10
0
    def test_leaf_prev_sibling(self):
        l1 = pytree.Leaf(100, "a")
        l2 = pytree.Leaf(100, "b")
        p1 = pytree.Node(1000, [l1, l2])

        self.assertIs(l2.prev_sibling, l1)
        self.assertEqual(l1.prev_sibling, None)
        self.assertEqual(p1.prev_sibling, None)
Ejemplo n.º 11
0
 def test_leaf_equality(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "foo", context=(" ", (1, 0)))
     self.assertEqual(l1, l2)
     l3 = pytree.Leaf(101, "foo")
     l4 = pytree.Leaf(100, "bar")
     self.assertNotEqual(l1, l3)
     self.assertNotEqual(l1, l4)
Ejemplo n.º 12
0
 def test_replace_with_list(self):
     l1 = pytree.Leaf(100, 'foo')
     l2 = pytree.Leaf(100, '+')
     l3 = pytree.Leaf(100, 'bar')
     n1 = pytree.Node(1000, [l1, l2, l3])
     l2.replace([pytree.Leaf(100, '*'), pytree.Leaf(100, '*')])
     self.assertEqual(str(n1), 'foo**bar')
     self.assertIsInstance(n1.children, list)
Ejemplo n.º 13
0
 def test_leaves(self):
     l1 = pytree.Leaf(100, 'foo')
     l2 = pytree.Leaf(100, 'bar')
     l3 = pytree.Leaf(100, 'fooey')
     n2 = pytree.Node(1000, [l1, l2])
     n3 = pytree.Node(1000, [l3])
     n1 = pytree.Node(1000, [n2, n3])
     self.assertEqual(list(n1.leaves()), [l1, l2, l3])
Ejemplo n.º 14
0
 def test_leaf_equality(self):
     l1 = pytree.Leaf(100, 'foo')
     l2 = pytree.Leaf(100, 'foo', context=(' ', (1, 0)))
     self.assertEqual(l1, l2)
     l3 = pytree.Leaf(101, 'foo')
     l4 = pytree.Leaf(100, 'bar')
     self.assertNotEqual(l1, l3)
     self.assertNotEqual(l1, l4)
Ejemplo n.º 15
0
    def test_replace_with_list(self):
        l1 = pytree.Leaf(100, "foo")
        l2 = pytree.Leaf(100, "+")
        l3 = pytree.Leaf(100, "bar")
        n1 = pytree.Node(1000, [l1, l2, l3])

        l2.replace([pytree.Leaf(100, "*"), pytree.Leaf(100, "*")])
        self.assertEqual(str(n1), "foo**bar")
        self.assertIsInstance(n1.children, list)
Ejemplo n.º 16
0
 def test_node_constructor_prefix(self):
     for prefix in ("xyz_", ""):
         l1 = pytree.Leaf(100, "self")
         l2 = pytree.Leaf(100, "foo", prefix="_")
         n1 = pytree.Node(1000, [l1, l2], prefix=prefix)
         self.assertTrue(str(n1), prefix + "self_foo")
         self.assertEqual(n1.prefix, prefix)
         self.assertEqual(l1.prefix, prefix)
         self.assertEqual(l2.prefix, "_")
Ejemplo n.º 17
0
 def test_depth(self):
     l1 = pytree.Leaf(100, 'foo')
     l2 = pytree.Leaf(100, 'bar')
     n2 = pytree.Node(1000, [l1, l2])
     n3 = pytree.Node(1000, [])
     n1 = pytree.Node(1000, [n2, n3])
     self.assertEqual(l1.depth(), 2)
     self.assertEqual(n3.depth(), 1)
     self.assertEqual(n1.depth(), 0)
Ejemplo n.º 18
0
 def test_node_constructor_prefix(self):
     for prefix in ('xyz_', ''):
         l1 = pytree.Leaf(100, 'self')
         l2 = pytree.Leaf(100, 'foo', prefix='_')
         n1 = pytree.Node(1000, [l1, l2], prefix=prefix)
         self.assertTrue(str(n1), prefix + 'self_foo')
         self.assertEqual(n1.prefix, prefix)
         self.assertEqual(l1.prefix, prefix)
         self.assertEqual(l2.prefix, '_')
Ejemplo n.º 19
0
 def test_node_recursive_equality(self):
     l1 = pytree.Leaf(100, 'foo')
     l2 = pytree.Leaf(100, 'foo')
     n1 = pytree.Node(1000, [l1])
     n2 = pytree.Node(1000, [l2])
     self.assertEqual(n1, n2)
     l3 = pytree.Leaf(100, 'bar')
     n3 = pytree.Node(1000, [l3])
     self.assertNotEqual(n1, n3)
Ejemplo n.º 20
0
  def testSimple(self):
    tok = format_token.FormatToken(pytree.Leaf(token.STRING, "'hello world'"))
    self.assertEqual("FormatToken(name=STRING, value='hello world', lineno=0)",
                     str(tok))
    self.assertTrue(tok.is_string)

    tok = format_token.FormatToken(pytree.Leaf(token.COMMENT, '# A comment'))
    self.assertEqual('FormatToken(name=COMMENT, value=# A comment, lineno=0)',
                     str(tok))
    self.assertTrue(tok.is_comment)
Ejemplo n.º 21
0
    def transform(self, node, results):
        if self.skip:
            return
        libmodernize.add_future(node, u'division')

        if node.value == '/':
            return pytree.Leaf(token.DOUBLESLASH, '//', prefix=node.prefix)
        else:
            return pytree.Leaf(token.DOUBLESLASHEQUAL,
                               '//=',
                               prefix=node.prefix)
Ejemplo n.º 22
0
 def test_has_key_example(self):
     pattern = pytree.NodePattern(
         331, (pytree.LeafPattern(7), pytree.WildcardPattern(name='args'),
               pytree.LeafPattern(8)))
     l1 = pytree.Leaf(7, '(')
     l2 = pytree.Leaf(3, 'x')
     l3 = pytree.Leaf(8, ')')
     node = pytree.Node(331, [l1, l2, l3])
     r = {}
     self.assertTrue(pattern.match(node, r))
     self.assertEqual(r['args'], [l2])
Ejemplo n.º 23
0
 def test_node_append_child(self):
     n1 = pytree.Node(1000, [])
     l1 = pytree.Leaf(100, 'foo')
     n1.append_child(l1)
     self.assertEqual(l1.parent, n1)
     self.assertEqual(n1.children, [l1])
     l2 = pytree.Leaf(100, 'bar')
     n1.append_child(l2)
     self.assertEqual(l2.parent, n1)
     self.assertEqual(n1.children, [l1, l2])
     self.assertRaises(Exception, n1.append_child, list)
Ejemplo n.º 24
0
 def test_node_insert_child(self):
     l1 = pytree.Leaf(100, 'foo')
     n1 = pytree.Node(1000, [l1])
     l2 = pytree.Leaf(100, 'bar')
     n1.insert_child(0, l2)
     self.assertEqual(l2.parent, n1)
     self.assertEqual(n1.children, [l2, l1])
     l3 = pytree.Leaf(100, 'abc')
     n1.insert_child(2, l3)
     self.assertEqual(n1.children, [l2, l1, l3])
     self.assertRaises(Exception, n1.insert_child, 0, list)
Ejemplo n.º 25
0
    def _insert_parens(self, node, first_idx, last_idx):
        """ Insert parentheses around children range [first_idx, last_idx]

        For example, this function will change `node` as follows:

            # input subtree
            #
            if_stmt
                "if"
                and_test
                    ...
                ":" prefix=""
                suite prefix=""
                    ...

            # output subtree
            #
            if_stmt
                "if"
                atom
                    "("
                    and_test
                        ...
                    ")"
                ":" prefix=""
                suite prefix=""
                    ...
        """

        assert isinstance(node, pytree.Node)

        def get_column(node):
            if isinstance(node, pytree.Leaf):
                return node.column
            return get_column(node.children[0])

        first = node.children[first_idx]
        last = node.children[last_idx]

        lpar = pytree.Leaf(token.LPAR,
                           '(',
                           context=('', (first.get_lineno(),
                                         get_column(first) - 1)))
        rpar = pytree.Leaf(token.RPAR,
                           ')',
                           context=('', (last.get_lineno(), get_column(last))))

        new_node = pytree.Node(syms.atom, [lpar, rpar])
        children = node.children[first_idx:last_idx + 1]
        for child in children:
            child.remove()
            new_node.insert_child(1, child)

        node.insert_child(first_idx, new_node)
Ejemplo n.º 26
0
 def test_has_key_example(self):
     pattern = pytree.NodePattern(
         331, (pytree.LeafPattern(7), pytree.WildcardPattern(name="args"),
               pytree.LeafPattern(8)))
     l1 = pytree.Leaf(7, "(")
     l2 = pytree.Leaf(3, "x")
     l3 = pytree.Leaf(8, ")")
     node = pytree.Node(331, [l1, l2, l3])
     r = {}
     self.assertTrue(pattern.match(node, r))
     self.assertEqual(r["args"], [l2])
Ejemplo n.º 27
0
 def test_get_suffix(self):
     l1 = pytree.Leaf(100, 'foo', prefix='a')
     l2 = pytree.Leaf(100, 'bar', prefix='b')
     n1 = pytree.Node(1000, [l1, l2])
     self.assertEqual(l1.get_suffix(), l2.prefix)
     self.assertEqual(l2.get_suffix(), '')
     self.assertEqual(n1.get_suffix(), '')
     l3 = pytree.Leaf(100, 'bar', prefix='c')
     n2 = pytree.Node(1000, [n1, l3])
     self.assertEqual(n1.get_suffix(), l3.prefix)
     self.assertEqual(l3.get_suffix(), '')
     self.assertEqual(n2.get_suffix(), '')
Ejemplo n.º 28
0
 def test_replace(self):
     l1 = pytree.Leaf(100, 'foo')
     l2 = pytree.Leaf(100, '+')
     l3 = pytree.Leaf(100, 'bar')
     n1 = pytree.Node(1000, [l1, l2, l3])
     self.assertEqual(n1.children, [l1, l2, l3])
     self.assertIsInstance(n1.children, list)
     self.assertFalse(n1.was_changed)
     l2new = pytree.Leaf(100, '-')
     l2.replace(l2new)
     self.assertEqual(n1.children, [l1, l2new, l3])
     self.assertIsInstance(n1.children, list)
     self.assertTrue(n1.was_changed)
Ejemplo n.º 29
0
def add_version(tree) -> pytree.Leaf:
    """Add a version node"""
    setup_args = _searching.find_setup_args(tree)
    version_node = pytree.Node(
        python_symbols.argument,
        [
            pytree.Leaf(token.NAME, "version"),
            pytree.Leaf(22, "="),
            pytree.Leaf(token.STRING, '""'),
        ],
    )
    add_arg(setup_args, version_node)
    return version_node.children[-1]
Ejemplo n.º 30
0
 def test_replace(self):
     l1 = pytree.Leaf(100, "foo")
     l2 = pytree.Leaf(100, "+")
     l3 = pytree.Leaf(100, "bar")
     n1 = pytree.Node(1000, [l1, l2, l3])
     self.assertEqual(n1.children, [l1, l2, l3])
     self.assertTrue(isinstance(n1.children, list))
     self.assertFalse(n1.was_changed)
     l2new = pytree.Leaf(100, "-")
     l2.replace(l2new)
     self.assertEqual(n1.children, [l1, l2new, l3])
     self.assertTrue(isinstance(n1.children, list))
     self.assertTrue(n1.was_changed)