diff mbox series

[ovs-dev,2/3] checkpatch: filter comment contents

Message ID 20180323213142.461-3-aconole@redhat.com
State Superseded
Headers show
Series checkpatch: the comment years! | expand

Commit Message

Aaron Conole March 23, 2018, 9:31 p.m. UTC
For the infix operator whitespace checks, some of these operators are
used within comments.  In those cases, it probably doesn't make sense
to warn about whitespacing.

There may be other checks that could use this kind of filter, but
that can wait for a future commit (and someone ambitious enough to
test each case).

Suggested-by: Jan Scheurich <jan.scheurich@ericsson.com>
Signed-off-by: Aaron Conole <aconole@redhat.com>
---
 utilities/checkpatch.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
index 2bc34db62..469ffb836 100755
--- a/utilities/checkpatch.py
+++ b/utilities/checkpatch.py
@@ -233,6 +233,54 @@  def has_xxx_mark(line):
     return __regex_has_xxx_mark.match(line) is not None
 
 
+def filter_comments(current_line):
+    """remove all of the c-style comments in a line"""
+    STATE_NORMAL = 0
+    STATE_COMMENT_SLASH = 1
+    STATE_COMMENT_CONTENTS = 3
+    STATE_COMMENT_END_SLASH = 4
+
+    state = STATE_NORMAL
+    sanitized_line = ''
+    check_state = STATE_COMMENT_CONTENTS
+    only_whitespace = True
+
+    for c in current_line:
+        if c == '/':
+            if state == STATE_NORMAL:
+                state = STATE_COMMENT_SLASH
+            elif state == STATE_COMMENT_SLASH:
+                # This is for c++ style comments.  We will warn later
+                return sanitized_line[:1]
+            elif state == STATE_COMMENT_END_SLASH:
+                c = ''
+                state = STATE_NORMAL
+        elif c == '*':
+            if only_whitespace:
+                # just assume this is a continuation from the previous line
+                # as a comment
+                state = STATE_COMMENT_CONTENTS
+            if state == STATE_COMMENT_SLASH:
+                state = STATE_COMMENT_CONTENTS
+                sanitized_line = sanitized_line[:1]
+            elif state == STATE_COMMENT_CONTENTS:
+                state = STATE_COMMENT_END_SLASH
+        elif state == STATE_COMMENT_END_SLASH:
+            state = STATE_COMMENT_CONTENTS
+        elif state == STATE_COMMENT_SLASH:
+            state = STATE_NORMAL
+
+        if state == check_state:
+            c = ''
+
+        if not c.isspace():
+            only_whitespace = False
+
+        sanitized_line += c
+
+    return sanitized_line
+
+
 checks = [
     {'regex': None,
      'match_name':
@@ -315,7 +363,7 @@  checks += [
 
 def regex_operator_factory(operator):
     regex = re.compile(r'^[^#][^"\']*[^ "]%s[^ "\'][^"]*' % operator)
-    return lambda x: regex.search(x) is not None
+    return lambda x: regex.search(filter_comments(x)) is not None
 
 
 infix_operators = \