5 Commits

Author SHA1 Message Date
Dave Halter
7ba49a9695 Prepare the 0.6.2 release 2020-02-27 02:10:06 +01:00
Dave Halter
53da7e8e6b Fix get_next_sibling on module, fixes #102 2020-02-21 18:31:13 +01:00
Dave Halter
6dd29c8efb Fix ExprStmt.get_rhs for annotations 2020-02-21 18:31:13 +01:00
Dave Halter
e4a9cfed86 Give parso refactoring tools 2020-02-21 18:31:13 +01:00
Joe Antonakakis
a7f4499644 Add venv to .gitignore (#101) 2020-02-14 14:28:07 +01:00
7 changed files with 55 additions and 4 deletions

1
.gitignore vendored
View File

@@ -11,3 +11,4 @@ parso.egg-info/
/.cache/ /.cache/
/.pytest_cache /.pytest_cache
test/fuzz-redo.pickle test/fuzz-redo.pickle
/venv/

View File

@@ -3,6 +3,12 @@
Changelog Changelog
--------- ---------
0.6.2 (2020-02-27)
++++++++++++++++++
- Bugfixes
- Add Grammar.refactor (might still be subject to change until 0.7.0)
0.6.1 (2020-02-03) 0.6.1 (2020-02-03)
++++++++++++++++++ ++++++++++++++++++

View File

@@ -43,7 +43,7 @@ from parso.grammar import Grammar, load_grammar
from parso.utils import split_lines, python_bytes_to_unicode from parso.utils import split_lines, python_bytes_to_unicode
__version__ = '0.6.1' __version__ = '0.6.2'
def parse(code=None, **kwargs): def parse(code=None, **kwargs):

View File

@@ -13,6 +13,7 @@ from parso.python.parser import Parser as PythonParser
from parso.python.errors import ErrorFinderConfig from parso.python.errors import ErrorFinderConfig
from parso.python import pep8 from parso.python import pep8
from parso.file_io import FileIO, KnownContentFileIO from parso.file_io import FileIO, KnownContentFileIO
from parso.normalizer import RefactoringNormalizer
_loaded_grammars = {} _loaded_grammars = {}
@@ -170,6 +171,9 @@ class Grammar(object):
return self._get_normalizer_issues(node, self._error_normalizer_config) return self._get_normalizer_issues(node, self._error_normalizer_config)
def refactor(self, base_node, node_to_str_map):
return RefactoringNormalizer(node_to_str_map).walk(base_node)
def _get_normalizer(self, normalizer_config): def _get_normalizer(self, normalizer_config):
if normalizer_config is None: if normalizer_config is None:
normalizer_config = self._default_normalizer_config normalizer_config = self._default_normalizer_config

View File

@@ -12,6 +12,9 @@ class _NormalizerMeta(type):
class Normalizer(use_metaclass(_NormalizerMeta)): class Normalizer(use_metaclass(_NormalizerMeta)):
_rule_type_instances = {}
_rule_value_instances = {}
def __init__(self, grammar, config): def __init__(self, grammar, config):
self.grammar = grammar self.grammar = grammar
self._config = config self._config = config
@@ -181,3 +184,20 @@ class Rule(object):
if self.is_issue(node): if self.is_issue(node):
issue_node = self.get_node(node) issue_node = self.get_node(node)
self.add_issue(issue_node) self.add_issue(issue_node)
class RefactoringNormalizer(Normalizer):
def __init__(self, node_to_str_map):
self._node_to_str_map = node_to_str_map
def visit(self, node):
try:
return self._node_to_str_map[node]
except KeyError:
return super(RefactoringNormalizer, self).visit(node)
def visit_leaf(self, leaf):
try:
return self._node_to_str_map[leaf]
except KeyError:
return super(RefactoringNormalizer, self).visit_leaf(leaf)

View File

@@ -1081,7 +1081,13 @@ class ExprStmt(PythonBaseNode, DocstringMixin):
def get_rhs(self): def get_rhs(self):
"""Returns the right-hand-side of the equals.""" """Returns the right-hand-side of the equals."""
return self.children[-1] node = self.children[-1]
if node.type == 'annassign':
if len(node.children) == 4:
node = node.children[3]
else:
node = node.children[1]
return node
def yield_operators(self): def yield_operators(self):
""" """

View File

@@ -45,8 +45,12 @@ class NodeOrLeaf(object):
Returns the node immediately following this node in this parent's Returns the node immediately following this node in this parent's
children list. If this node does not have a next sibling, it is None children list. If this node does not have a next sibling, it is None
""" """
parent = self.parent
if parent is None:
return None
# Can't use index(); we need to test by identity # Can't use index(); we need to test by identity
for i, child in enumerate(self.parent.children): for i, child in enumerate(parent.children):
if child is self: if child is self:
try: try:
return self.parent.children[i + 1] return self.parent.children[i + 1]
@@ -59,8 +63,12 @@ class NodeOrLeaf(object):
children list. If this node does not have a previous sibling, it is children list. If this node does not have a previous sibling, it is
None. None.
""" """
parent = self.parent
if parent is None:
return None
# Can't use index(); we need to test by identity # Can't use index(); we need to test by identity
for i, child in enumerate(self.parent.children): for i, child in enumerate(parent.children):
if child is self: if child is self:
if i == 0: if i == 0:
return None return None
@@ -71,6 +79,9 @@ class NodeOrLeaf(object):
Returns the previous leaf in the parser tree. Returns the previous leaf in the parser tree.
Returns `None` if this is the first element in the parser tree. Returns `None` if this is the first element in the parser tree.
""" """
if self.parent is None:
return None
node = self node = self
while True: while True:
c = node.parent.children c = node.parent.children
@@ -94,6 +105,9 @@ class NodeOrLeaf(object):
Returns the next leaf in the parser tree. Returns the next leaf in the parser tree.
Returns None if this is the last element in the parser tree. Returns None if this is the last element in the parser tree.
""" """
if self.parent is None:
return None
node = self node = self
while True: while True:
c = node.parent.children c = node.parent.children