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>
This commit is contained in:
parent
341f6afbac
commit
cbe8f87f97
@ -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
|
||||
|
||||
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 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
|
||||
|
||||
|
||||
indent_level = 0
|
||||
|
||||
|
||||
def push_indent(indent_amount=4):
|
||||
global indent_level
|
||||
indent_level += indent_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)
|
||||
|
||||
|
||||
|
@ -18,9 +18,8 @@ from .common import (
|
||||
c_name,
|
||||
gen_endif,
|
||||
gen_if,
|
||||
indent,
|
||||
mcgen,
|
||||
pop_indent,
|
||||
push_indent,
|
||||
)
|
||||
from .gen import QAPISchemaModularCVisitor, ifcontext
|
||||
from .schema import QAPISchemaObjectType
|
||||
@ -69,7 +68,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
|
||||
if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
|
||||
''',
|
||||
name=memb.name, c_name=c_name(memb.name))
|
||||
push_indent()
|
||||
indent.increase()
|
||||
ret += mcgen('''
|
||||
if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) {
|
||||
return false;
|
||||
@ -78,7 +77,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
|
||||
c_type=memb.type.c_name(), name=memb.name,
|
||||
c_name=c_name(memb.name))
|
||||
if memb.optional:
|
||||
pop_indent()
|
||||
indent.decrease()
|
||||
ret += mcgen('''
|
||||
}
|
||||
''')
|
||||
|
Loading…
Reference in New Issue
Block a user