Marc-AndrĂ© Lureau <[email protected]> writes:

> Skip preprocessor lines when adding indentation, since that would
> likely result in invalid code.
>
> Signed-off-by: Marc-AndrĂ© Lureau <[email protected]>
> ---
>  scripts/qapi.py | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index f2b5a7e131..2a8e60e975 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -1862,7 +1862,7 @@ def cgen(code, **kwds):
>      if indent_level:
>          indent = genindent(indent_level)
>          # re.subn() lacks flags support before Python 2.7, use re.compile()
> -        raw = re.subn(re.compile(r'^.', re.MULTILINE),
> +        raw = re.subn(re.compile(r'^[^#\n].', re.MULTILINE),
>                        indent + r'\g<0>', raw)
>          raw = raw[0]
>      return re.sub(re.escape(eatspace) + r' *', '', raw)

Old: we want to indent all non-empty lines.  Such a line starts with a
character other than newline, matched by '.'.  Replace that character by
indent + the character.

New regexp: we want to indent all non-empty lines not starting with '#'.
Such a line starts with a character other than newline and '#', matched
by '[^#\n]'.  But there's a '.' afterwards, and therefore we don't match
*any* lines consisting of just one character:

    >>> cgen('a\n')
    'a\n'

I think you should drop the '.'.

Alternatively, use a negative lookahead assertion:

        raw = re.subn(re.compile(r'^(?!(#|$))', re.MULTILINE),
                      indent, raw)

Reply via email to