[libcamera-devel] [PATCH 1/2] utils: checkstyle: Add formatter to sort #include statements
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Mar 23 12:46:31 CET 2020
Hi Laurent,
On 23/03/2020 11:41, Laurent Pinchart wrote:
> Hi Kieran,
>
> On Mon, Mar 23, 2020 at 11:35:39AM +0000, Kieran Bingham wrote:
>> On 22/03/2020 12:02, Laurent Pinchart wrote:
>>
>> Ha, I love this :-)
>>
>> One less thing to worry about in reviews!
>>
>>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>> ---
>>> utils/checkstyle.py | 33 +++++++++++++++++++++++++++++++++
>>> 1 file changed, 33 insertions(+)
>>>
>>> diff --git a/utils/checkstyle.py b/utils/checkstyle.py
>>> index 0827a1e6ba0f..5fd63f047781 100755
>>> --- a/utils/checkstyle.py
>>> +++ b/utils/checkstyle.py
>>> @@ -481,6 +481,39 @@ class DoxygenFormatter(Formatter):
>>> return '\n'.join(lines)
>>>
>>>
>>> +class IncludeOrderFormatter(Formatter):
>>> + patterns = ('*.cpp', '*.h')
>>> +
>>> + include_regex = re.compile('^#include ["<]([^">]*)[">]')
>>> +
>>> + @classmethod
>>> + def format(cls, filename, data):
>>> + lines = []
>>> + includes = []
>>> +
>>> + for line in data.split('\n'):
>>> + match = IncludeOrderFormatter.include_regex.match(line)
>>> + if match:
>>> + includes.append((line, match.group(1)))
>>> + continue
>>> +
>>
>> Maybe it's just me, but this seems somehow quite hard to interpret and I
>> found it difficult to work out /how/ the code is parsing the blocks.
>>
>> I'm not yet sure what, but a comment describing what happens somewhere
>> would be useful for the future me...
>>
>> (It didn't help that I missed the continue on my first read, so I didn't
>> realise the code below was only executed for non #include lines).
>>
>> Maybe a top level comment saying:
>> # Parse blocks of #include statements, and output them as a sorted list
>> # when we reach a non #include statement.
>>
>>
>> Perhaps that's verging towards commenting what the code does rather than
>> why, but now that I 'know' that information, it's easier to parse the
>> paths of the code to determine the 'how'...
>
> diff --git a/utils/checkstyle.py b/utils/checkstyle.py
> index 5fd63f047781..b594a19aed5b 100755
> --- a/utils/checkstyle.py
> +++ b/utils/checkstyle.py
> @@ -491,12 +491,18 @@ class IncludeOrderFormatter(Formatter):
> lines = []
> includes = []
>
> + # Parse blocks of #include statements, and output them as a sorted list
> + # when we reach a non #include statement.
> for line in data.split('\n'):
> match = IncludeOrderFormatter.include_regex.match(line)
> if match:
> + # If the current line is an #include statement, add it to the
> + # includes group and continue to the next line.
> includes.append((line, match.group(1)))
> continue
>
> + # The current line is not an #include statement, output the sorted
> + # stashed includes first, and then the current line.
> if len(includes):
> includes.sort(key=lambda i: i[1])
> for include in includes:
> @@ -505,6 +511,8 @@ class IncludeOrderFormatter(Formatter):
>
> lines.append(line)
>
> + # In the unlikely case the file ends with an #include statement, make
> + # sure we output the stashed includes.
> if len(includes):
> includes.sort(key=lambda i: i[1])
> for include in includes:
>
> Does this look good to you ? If so, your Rb tag will be appreciated (for
> the result of squashing the original patch with this change) :-)
Haha - more than I was expecting - but that's helpful in this case I
think :-)
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>>> + if len(includes):
>>> + includes.sort(key=lambda i: i[1])
>>> + for include in includes:
>>> + lines.append(include[0])
>>> + includes = []
>>> +
>>> + lines.append(line)
>>> +
>>> + if len(includes):
>>> + includes.sort(key=lambda i: i[1])
>>> + for include in includes:
>>> + lines.append(include[0])
>>> + includes = []
>>> +
>>> + return '\n'.join(lines)
>>> +
>>> +
>>> class StripTrailingSpaceFormatter(Formatter):
>>> patterns = ('*.c', '*.cpp', '*.h', '*.py', 'meson.build')
>>>
>>>
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list