-
Notifications
You must be signed in to change notification settings - Fork 13
/
check_decls.py
67 lines (49 loc) · 1.96 KB
/
check_decls.py
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
'''
This script checks whether all function definitions match with their declarations
It also checks whether all defined functions have been declared before use (except
for static functions), and whether all functions which are declared, are defined
somewhere.
'''
from sourceparser import LvglSourceParser, pycparser, c_ast
from bindingsgen import generate_c, astnode_equals
import glob
s = LvglSourceParser()
alldecls = {}
alldefs = {}
for filename in glob.glob('lvgl/**', recursive=True):
if not filename.endswith('.c') or filename.startswith('lvgl/micropython'):
continue
ast, defines = s.parse_files([filename])
decls = {}
print(filename)
for item in ast.ext:
d = None
if isinstance(item, c_ast.FuncDef):
d = item.decl
alldefs[d.name] = d
if d.name not in decls and 'static' not in d.storage:
# All non-static functions should be declared
print('Not previously declared:', generate_c(d))
elif isinstance(item, c_ast.Decl) and isinstance(item.type, c_ast.FuncDecl):
d = item
alldecls[d.name] = d
if d:
name = d.name
known = decls.get(name)
if known:
if not astnode_equals(d, known):
print(' ', generate_c(known))
print(' ', generate_c(d))
else:
decls[name] = d
print('The following declared functions are not defined:')
for name, decl in alldecls.items():
if not name in alldefs:
print (generate_c(decl))
print('The following enum items are named inconsistently:')
parseresult = s.parse_sources('lvgl')
for enumname, enum in parseresult.enums.items():
assert enumname.endswith('_t')
inconsistent_names = [k for k in enum if not k.lower().startswith(enumname[:-1])]
if innconsistent_names:
print (enumname, ': ', ','.join(incorrect_names))