CMS 3D CMS Logo

class-composition.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 from __future__ import print_function
3 import re
4 stdcl = re.compile("^std::(.*)[^>]$")
5 stdptr = re.compile("(.*)_ptr$")
6 datacl = re.compile("^class ")
7 bfunc = re.compile("^function ")
8 mbcl = re.compile("(base|data) class")
9 farg = re.compile("(.*)\(\w+\)")
10 nsep = re.compile("\:\:")
11 topfunc = re.compile("::(produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream)\(")
12 baseclass = re.compile("edm::(one::|stream::|global::)?ED(Producer|Filter|Analyzer)(Base)?")
13 getfunc = re.compile("edm::eventsetup::EventSetupRecord::get<.*>\((.*)&\) const")
14 handle = re.compile("(.*),?class edm::ES(.*)Handle<(.*)>")
15 statics = set()
16 toplevelfuncs = set()
17 onefuncs = set()
18 dataclassfuncs = set()
19 virtfuncs = set()
20 virtclasses = set()
21 badfuncs = set()
22 badclasses = set()
23 esdclasses = set()
24 dataclasses = set()
25 flaggedclasses = set()
26 memberclasses = set()
27 derivedclasses = set()
28 
29 import networkx as nx
30 G=nx.DiGraph()
31 H=nx.DiGraph()
32 I=nx.DiGraph()
33 
34 
35 f = open('classes.txt.dumperall')
36 for line in f :
37  if mbcl.search(line) :
38  fields = line.split("'")
39  if fields[2] == ' member data class ':
40  if not stdcl.search(fields[2]) : H.add_edge(fields[1],fields[3],kind=fields[2])
41  if fields[2] == ' templated member data class ':
42  H.add_edge(fields[1],fields[5],kind=fields[3])
43  if fields[2] == ' base class ':
44  H.add_edge(fields[1],fields[3],kind=fields[2])
45  I.add_edge(fields[3],fields[1],kind=' derived class')
46 f.close()
47 
48 f = open('function-calls-db.txt')
49 
50 for line in f :
51  if not bfunc.search(line) : continue
52  fields = line.split("'")
53  if fields[2] == ' calls function ' :
54  G.add_edge(fields[1],fields[3],kind=' calls function ')
55  if getfunc.search(fields[3]) :
56  dataclassfuncs.add(fields[3])
57  m = getfunc.match(fields[3])
58  n = handle.match(m.group(1))
59  if n : o = n.group(3)
60  else : o = m.group(1)
61  p = re.sub("class ","",o)
62  dataclass = re.sub("struct ","",p)
63  dataclasses.add(dataclass)
64  if fields[2] == ' overrides function ' :
65  if baseclass.search(fields[3]) :
66  G.add_edge(fields[1],fields[3],kind=' overrides function ')
67  if topfunc.search(fields[3]) : toplevelfuncs.add(fields[1])
68  else : G.add_edge(fields[3],fields[1], kind=' calls override function ')
69  if fields[2] == ' static variable ' :
70  G.add_edge(fields[1],fields[3],kind=' static variable ')
71  statics.add(fields[3])
72 f.close()
73 
74 visited = set()
75 nodes = sorted(dataclasses)
76 for node in nodes:
77  if node in visited:
78  continue
79  visited.add(node)
80  if node in H : stack = [(node,iter(H[node]))]
81  if node in I :
82  Q=nx.dfs_preorder_nodes(I,node)
83  for q in Q:
84  print("class '"+q+"'")
85  if q in H :
86  stack.append( ( q, iter( H[q] ) ) )
87  while stack:
88  parent,children = stack[-1]
89  print("class '"+parent+"'")
90  try:
91  child = next(children)
92  if child not in visited:
93  visited.add(child)
94  if not stdcl.search(child):
95  print("class '"+child+"'")
96  stack.append( ( child, iter( H[child] ) ) )
97  kind=H[parent][child]['kind']
98  print(parent, kind, child)
99  if stdptr.search(kind):
100  if child in I :
101  Q=nx.dfs_preorder_nodes(I,child)
102  for q in Q :
103  print("class '"+q+"'")
104  if q in H :
105  stack.append( ( q, iter( H[q] ) ) )
106  except StopIteration:
107  stack.pop()
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66