forked from cms-sw/cmssw
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclass-composition.py
executable file
·117 lines (111 loc) · 3.83 KB
/
class-composition.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
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
#! /usr/bin/env python3
import networkx as nx
import re
stdcl = re.compile("^std::(.*)[^>]$")
stdptr = re.compile("(.*)_ptr$")
datacl = re.compile("^class ")
bfunc = re.compile("^function ")
mbcl = re.compile("(base|data) class")
farg = re.compile(r"(.*)\(\w+\)")
nsep = re.compile(r"\:\:")
topfunc = re.compile(
r"::(produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream)\(")
baseclass = re.compile(
"edm::(one::|stream::|global::)?ED(Producer|Filter|Analyzer)(Base)?")
getfunc = re.compile(
r"edm::eventsetup::EventSetupRecord::get\<.*\>\((.*)&\) const")
handle = re.compile("(.*),?class edm::ES(.*)Handle<(.*)>")
statics = set()
toplevelfuncs = set()
onefuncs = set()
dataclassfuncs = set()
virtfuncs = set()
virtclasses = set()
badfuncs = set()
badclasses = set()
esdclasses = set()
dataclasses = set()
flaggedclasses = set()
memberclasses = set()
derivedclasses = set()
Gdg = nx.DiGraph()
Hdg = nx.DiGraph()
Idg = nx.DiGraph()
f = open('classes.txt.dumperall')
for line in f:
if mbcl.search(line):
fields = line.split("'")
if fields[2] == ' member data class ':
if not stdcl.search(fields[2]):
Hdg.add_edge(fields[1], fields[3], kind=fields[2])
if fields[2] == ' templated member data class ':
Hdg.add_edge(fields[1], fields[5], kind=fields[3])
if fields[2] == ' base class ':
Hdg.add_edge(fields[1], fields[3], kind=fields[2])
Idg.add_edge(fields[3], fields[1], kind=' derived class')
f.close()
f = open('function-calls-db.txt')
for line in f:
if not bfunc.search(line):
continue
fields = line.split("'")
if fields[2] == ' calls function ':
Gdg.add_edge(fields[1], fields[3], kind=' calls function ')
if getfunc.search(fields[3]):
dataclassfuncs.add(fields[3])
m = getfunc.match(fields[3])
n = handle.match(m.group(1))
if n:
o = n.group(3)
else:
o = m.group(1)
p = re.sub("class ", "", o)
dataclass = re.sub("struct ", "", p)
dataclasses.add(dataclass)
if fields[2] == ' overrides function ':
if baseclass.search(fields[3]):
Gdg.add_edge(fields[1], fields[3], kind=' overrides function ')
if topfunc.search(fields[3]):
toplevelfuncs.add(fields[1])
else:
Gdg.add_edge(fields[3], fields[1], kind=' calls override function ')
if fields[2] == ' static variable ':
Gdg.add_edge(fields[1], fields[3], kind=' static variable ')
statics.add(fields[3])
f.close()
visited = set()
nodes = sorted(dataclasses)
for node in nodes:
if node in visited:
continue
visited.add(node)
stack = []
if node in Hdg:
stack = [(node, iter(Hdg[node]))]
if node in Idg:
Qdg = nx.dfs_preorder_nodes(Idg, node)
for q in Qdg:
print("class '"+q+"'")
if q in Hdg:
stack.append((q, iter(Hdg[q])))
while stack:
parent, children = stack[-1]
print("class '"+parent+"'")
try:
child = next(children)
if child not in visited:
visited.add(child)
if not stdcl.search(child):
print("class '"+child+"'")
stack.append((child, iter(Hdg[child])))
kind = Hdg[parent][child]['kind']
print(parent, kind, child)
if stdptr.search(kind):
if child in Idg:
Qdg = nx.dfs_preorder_nodes(Idg, child)
for q in Qdg:
print("class '"+q+"'")
if q in Hdg:
stack.append((q, iter(Hdg[q])))
except StopIteration:
stack.pop()