summaryrefslogtreecommitdiff
path: root/utils/checkstyle.py
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-10-20 04:25:44 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-11-08 00:11:09 +0200
commit6cd1baa28d8ab0babb766de7a59d10f38fbd786d (patch)
tree1a66b45140ac9ab7b0a31e0cfea41a2805635d1e /utils/checkstyle.py
parentfa63d428aef62bacf0a6ad1622a7965b3ff2ba2f (diff)
utils: checkstyle.py: Add d-pointer formatter
Add a formatter to ensure consistent naming of 'd' and 'o' variables related to the d-pointer design pattern, as implemented by the Extensible class. The formatter also ensures that the pointer is always const. const-correctness issues related to the data pointed to will be caught by the compiler, and thus don't need to be checked here. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'utils/checkstyle.py')
-rwxr-xr-xutils/checkstyle.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/utils/checkstyle.py b/utils/checkstyle.py
index d5dc26c0..7225cac4 100755
--- a/utils/checkstyle.py
+++ b/utils/checkstyle.py
@@ -481,6 +481,38 @@ class DoxygenFormatter(Formatter):
return '\n'.join(lines)
+class DPointerFormatter(Formatter):
+ # Ensure consistent naming of variables related to the d-pointer design
+ # pattern.
+ patterns = ('*.cpp', '*.h')
+
+ # The clang formatter runs first, we can thus rely on appropriate coding
+ # style.
+ declare_regex = re.compile(r'^(\t*)(const )?([a-zA-Z0-9_]+) \*( ?const )?([a-zA-Z0-9_]+) = (LIBCAMERA_[DO]_PTR)\(([a-zA-Z0-9_]+)\);$')
+
+ @classmethod
+ def format(cls, filename, data):
+ lines = []
+
+ for line in data.split('\n'):
+ match = cls.declare_regex.match(line)
+ if match:
+ indent = match.group(1) or ''
+ const = match.group(2) or ''
+ macro = match.group(6)
+ klass = match.group(7)
+ if macro == 'LIBCAMERA_D_PTR':
+ var = 'Private *const d'
+ else:
+ var = f'{klass} *const o'
+
+ line = f'{indent}{const}{var} = {macro}({klass});'
+
+ lines.append(line)
+
+ return '\n'.join(lines)
+
+
class IncludeOrderFormatter(Formatter):
patterns = ('*.cpp', '*.h')