summaryrefslogtreecommitdiff
path: root/test/CheckComments.py
blob: 9bcfcbb364ee0eae3410e76d01b1e9c97290985b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/env python3

import sys
import re
import os
import argparse

parser = argparse.ArgumentParser( prog='CheckComments')
parser.add_argument('-v', '--debug', dest='debug', action='store_true')
parser.add_argument('-l', '--limit', dest='ok', type=float, default=100.0)
parser.add_argument('path', nargs='+', help='Path to source file to check comments')
args = parser.parse_args()

errors = 0

for path in args.path:
    other_depth   = 0
    brace_depth   = 0
    code_count    = 0
    comment_count = 0
    long_comment  = None
    long_comments = {}
    kind          = "function"
    function_name = "<unknown>"
    ctor_dtor     = False
    linenum       = 0

    print(f'checking {path}')
    fd = open(path, 'r')
    for line in fd.readlines():
        linenum += 1

        match = re.search('/\*\*(.*)', line)
        if match:
            long_comment = re.sub('\s+', '', match.group(1))
            continue
        elif long_comment:
            match = re.search('(.*)\*/', line)
            if match:
                long_comment += re.sub('\s+', '', match.group(1))
                comment_count = len(long_comment)
                long_comment = None
            else:
                long_comment += re.sub('\s+', '', line[:-1])
            continue

        if brace_depth == 0:
            match = re.search('(namespace|enum|class|struct|union)', line)
            if match:
                kind = match.group(1)
                if args.debug: print("kind =", kind)
            elif kind == "function":
                match = re.search('(\S+)\(', line)
                if match:
                    function_name = match.group(1)
                    long_comments[function_name] = comment_count
                    comment_count = 0
                    if args.debug: print("name found %s" % function_name)

        if re.search('{', line) and not re.search('@{', line):
            if kind == "function":
                brace_depth += 1
                if args.debug: print("brace_depth =", brace_depth)
            else:
                other_depth += 1
                kind = "function"
                if args.debug: print("other_depth =", other_depth)

        if re.search('}', line) and not re.search('@}', line):
            if brace_depth > 0:
                brace_depth -= 1
                if args.debug: print("brace_depth =", brace_depth)

                if brace_depth == 0:
                    if args.debug: print("function done")
                    if function_name in long_comments:
                        comment_count += long_comments[function_name]
                    if code_count == 0:
                        percent = args.ok
                        print("%7s  %4d/%4d  %s:%d: %s" % \
                            ("empty", comment_count, code_count,
                             os.path.basename(path), linenum,
                             function_name))
                        errors += 1
                    else:
                        percent = 100.0 * (float(comment_count) /
                                           float(code_count))
                    if percent < args.ok and not ctor_dtor:
                        print("%6.0f%%  %4d/%4d  %s:%d: %s" % \
                            (percent, comment_count, code_count,
                             os.path.basename(path), linenum,
                             function_name))
                        errors += 1
                    code_count    = 0
                    comment_count = 0
                    kind          = "function"
                    function_name = "<unknown>"
                    ctor_dtor     = False
            else:
                other_depth -= 1
                if args.debug: print("other_depth =", other_depth)

        if brace_depth > 0:
            if re.search("TRACE_[CD]TOR", line):
                ctor_dtor = True

            line = re.sub('\s+', '', line[:-1])

            match = re.search('//(.*)', line)
            if match:
                comment = match.group(1)
                line = re.sub('//.*', '', line)
            else:
                comment = None

            if line:
                code_count    += len(line)
            if comment:
                comment_count += len(comment)

sys.exit(errors)