diff options
author | John Snow <jsnow@redhat.com> | 2020-10-09 12:15:33 -0400 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2020-10-10 11:37:47 +0200 |
commit | cbe8f87f975264ee5b61795dc86f70915fb5f5f3 (patch) | |
tree | d13a4d82f5a97832712b3861adf1269fe946709f /scripts/qapi/common.py | |
parent | 341f6afbac5afb41eb3291a060332f92bbb0f9c7 (diff) |
qapi/common.py: Add indent manager
Code style tools really dislike the use of global keywords, because it
generally involves re-binding the name at runtime which can have strange
effects depending on when and how that global name is referenced in
other modules.
Make a little indent level manager instead.
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
Message-Id: <20201009161558.107041-12-jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'scripts/qapi/common.py')
-rw-r--r-- | scripts/qapi/common.py | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index cee63eb95c..b35318b72c 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -93,33 +93,50 @@ eatspace = '\033EATSPACE.' pointer_suffix = ' *' + eatspace -def genindent(count): - ret = '' - for _ in range(count): - ret += ' ' - return ret +class Indentation: + """ + Indentation level management. + + :param initial: Initial number of spaces, default 0. + """ + def __init__(self, initial: int = 0) -> None: + self._level = initial + + def __int__(self) -> int: + return self._level + + def __repr__(self) -> str: + return "{}({:d})".format(type(self).__name__, self._level) + def __str__(self) -> str: + """Return the current indentation as a string of spaces.""" + return ' ' * self._level -indent_level = 0 + def __bool__(self) -> bool: + """True when there is a non-zero indentation.""" + return bool(self._level) + def increase(self, amount: int = 4) -> None: + """Increase the indentation level by ``amount``, default 4.""" + self._level += amount -def push_indent(indent_amount=4): - global indent_level - indent_level += indent_amount + def decrease(self, amount: int = 4) -> None: + """Decrease the indentation level by ``amount``, default 4.""" + if self._level < amount: + raise ArithmeticError( + f"Can't remove {amount:d} spaces from {self!r}") + self._level -= amount -def pop_indent(indent_amount=4): - global indent_level - indent_level -= indent_amount +indent = Indentation() # Generate @code with @kwds interpolated. -# Obey indent_level, and strip eatspace. +# Obey indent, and strip eatspace. def cgen(code, **kwds): raw = code % kwds - if indent_level: - indent = genindent(indent_level) - raw = re.sub(r'^(?!(#|$))', indent, raw, flags=re.MULTILINE) + if indent: + raw = re.sub(r'^(?!(#|$))', str(indent), raw, flags=re.MULTILINE) return re.sub(re.escape(eatspace) + r' *', '', raw) |