From 749cc80e9618a40e974fa0956f17222cccdbdeb8 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Fri, 18 Sep 2009 15:01:14 +0200 Subject: [PATCH] somewhat hackish fix for supporting not() in TreePath - needs to be reconsidered ... --- Cython/Compiler/Tests/TestTreePath.py | 5 +++++ Cython/Compiler/TreePath.py | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Cython/Compiler/Tests/TestTreePath.py b/Cython/Compiler/Tests/TestTreePath.py index 296aff6a..8c6e7fe5 100644 --- a/Cython/Compiler/Tests/TestTreePath.py +++ b/Cython/Compiler/Tests/TestTreePath.py @@ -38,6 +38,11 @@ class TestTreePath(TransformTest): t = self._build_tree() self.assertEquals(2, len(find_all(t, "//NameNode[@name]"))) + def test_node_path_attribute_exists_not(self): + t = self._build_tree() + self.assertEquals(0, len(find_all(t, "//NameNode[not(@name)]"))) + self.assertEquals(2, len(find_all(t, "//NameNode[not(@honking)]"))) + def test_node_path_attribute_string_predicate(self): t = self._build_tree() self.assertEquals(1, len(find_all(t, "//NameNode[@name = 'decorator']"))) diff --git a/Cython/Compiler/TreePath.py b/Cython/Compiler/TreePath.py index 81c0a574..30612a50 100644 --- a/Cython/Compiler/TreePath.py +++ b/Cython/Compiler/TreePath.py @@ -49,7 +49,7 @@ def parse_func(next, token): token = next() if token[0] != '(': raise ValueError("Expected '(' after function name '%s'" % name) - predicate = handle_predicate(next, token, end_marker=')') + predicate = handle_predicate(next, token) return name, predicate def handle_func_not(next, token): @@ -60,7 +60,7 @@ def handle_func_not(next, token): def select(result): for node in result: - if _get_first_or_none(predicate(node)) is not None: + if _get_first_or_none(predicate([node])) is None: yield node return select @@ -176,10 +176,10 @@ def parse_path_value(next): raise ValueError("Invalid attribute predicate: '%s'" % value) return value -def handle_predicate(next, token, end_marker=']'): +def handle_predicate(next, token): token = next() selector = [] - while token[0] != end_marker: + while token[0] != ']': selector.append( operations[token[0]](next, token) ) try: token = next() -- 2.26.2