From e4a9cfed86471b0fc0d13bc0d1cb5f9190f83766 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 12 Feb 2020 19:05:47 +0100 Subject: [PATCH] Give parso refactoring tools --- parso/grammar.py | 4 ++++ parso/normalizer.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/parso/grammar.py b/parso/grammar.py index c943a52..647793e 100644 --- a/parso/grammar.py +++ b/parso/grammar.py @@ -13,6 +13,7 @@ from parso.python.parser import Parser as PythonParser from parso.python.errors import ErrorFinderConfig from parso.python import pep8 from parso.file_io import FileIO, KnownContentFileIO +from parso.normalizer import RefactoringNormalizer _loaded_grammars = {} @@ -170,6 +171,9 @@ class Grammar(object): 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): if normalizer_config is None: normalizer_config = self._default_normalizer_config diff --git a/parso/normalizer.py b/parso/normalizer.py index 4e07c86..53193c8 100644 --- a/parso/normalizer.py +++ b/parso/normalizer.py @@ -12,6 +12,9 @@ class _NormalizerMeta(type): class Normalizer(use_metaclass(_NormalizerMeta)): + _rule_type_instances = {} + _rule_value_instances = {} + def __init__(self, grammar, config): self.grammar = grammar self._config = config @@ -181,3 +184,20 @@ class Rule(object): if self.is_issue(node): issue_node = self.get_node(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)