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
|
pointer_suffix = ' *' + eatspace
|
||||||
|
|
||||||
|
|
||||||
def genindent(count):
|
class Indentation:
|
||||||
ret = ''
|
"""
|
||||||
for _ in range(count):
|
Indentation level management.
|
||||||
ret += ' '
|
|
||||||
return ret
|
: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
|
indent = Indentation()
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
# Generate @code with @kwds interpolated.
|
# Generate @code with @kwds interpolated.
|
||||||
# Obey indent_level, and strip eatspace.
|
# Obey indent, and strip eatspace.
|
||||||
def cgen(code, **kwds):
|
def cgen(code, **kwds):
|
||||||
raw = code % kwds
|
raw = code % kwds
|
||||||
if indent_level:
|
if indent:
|
||||||
indent = genindent(indent_level)
|
raw = re.sub(r'^(?!(#|$))', str(indent), raw, flags=re.MULTILINE)
|
||||||
raw = re.sub(r'^(?!(#|$))', indent, raw, flags=re.MULTILINE)
|
|
||||||
return re.sub(re.escape(eatspace) + r' *', '', raw)
|
return re.sub(re.escape(eatspace) + r' *', '', raw)
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,9 +18,8 @@ from .common import (
|
|||||||
c_name,
|
c_name,
|
||||||
gen_endif,
|
gen_endif,
|
||||||
gen_if,
|
gen_if,
|
||||||
|
indent,
|
||||||
mcgen,
|
mcgen,
|
||||||
pop_indent,
|
|
||||||
push_indent,
|
|
||||||
)
|
)
|
||||||
from .gen import QAPISchemaModularCVisitor, ifcontext
|
from .gen import QAPISchemaModularCVisitor, ifcontext
|
||||||
from .schema import QAPISchemaObjectType
|
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)) {
|
if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
|
||||||
''',
|
''',
|
||||||
name=memb.name, c_name=c_name(memb.name))
|
name=memb.name, c_name=c_name(memb.name))
|
||||||
push_indent()
|
indent.increase()
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) {
|
if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) {
|
||||||
return false;
|
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_type=memb.type.c_name(), name=memb.name,
|
||||||
c_name=c_name(memb.name))
|
c_name=c_name(memb.name))
|
||||||
if memb.optional:
|
if memb.optional:
|
||||||
pop_indent()
|
indent.decrease()
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
}
|
}
|
||||||
''')
|
''')
|
||||||
|
Loading…
Reference in New Issue
Block a user