File indexing completed on 2024-12-01 23:40:44
0001
0002 import networkx as nx
0003 import re
0004 stdcl = re.compile("^std::(.*)[^>]$")
0005 stdptr = re.compile("(.*)_ptr$")
0006 datacl = re.compile("^class ")
0007 bfunc = re.compile("^function ")
0008 mbcl = re.compile("(base|data) class")
0009 farg = re.compile(r"(.*)\(\w+\)")
0010 nsep = re.compile(r"\:\:")
0011 topfunc = re.compile(
0012 r"::(produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream)\(")
0013 baseclass = re.compile(
0014 "edm::(one::|stream::|global::)?ED(Producer|Filter|Analyzer)(Base)?")
0015 getfunc = re.compile(
0016 r"edm::eventsetup::EventSetupRecord::get\<.*\>\((.*)&\) const")
0017 handle = re.compile("(.*),?class edm::ES(.*)Handle<(.*)>")
0018 statics = set()
0019 toplevelfuncs = set()
0020 onefuncs = set()
0021 dataclassfuncs = set()
0022 virtfuncs = set()
0023 virtclasses = set()
0024 badfuncs = set()
0025 badclasses = set()
0026 esdclasses = set()
0027 dataclasses = set()
0028 flaggedclasses = set()
0029 memberclasses = set()
0030 derivedclasses = set()
0031
0032 Gdg = nx.DiGraph()
0033 Hdg = nx.DiGraph()
0034 Idg = nx.DiGraph()
0035
0036
0037 f = open('classes.txt.dumperall')
0038 for line in f:
0039 if mbcl.search(line):
0040 fields = line.split("'")
0041 if fields[2] == ' member data class ':
0042 if not stdcl.search(fields[2]):
0043 Hdg.add_edge(fields[1], fields[3], kind=fields[2])
0044 if fields[2] == ' templated member data class ':
0045 Hdg.add_edge(fields[1], fields[5], kind=fields[3])
0046 if fields[2] == ' base class ':
0047 Hdg.add_edge(fields[1], fields[3], kind=fields[2])
0048 Idg.add_edge(fields[3], fields[1], kind=' derived class')
0049 f.close()
0050
0051 f = open('function-calls-db.txt')
0052
0053 for line in f:
0054 if not bfunc.search(line):
0055 continue
0056 fields = line.split("'")
0057 if fields[2] == ' calls function ':
0058 Gdg.add_edge(fields[1], fields[3], kind=' calls function ')
0059 if getfunc.search(fields[3]):
0060 dataclassfuncs.add(fields[3])
0061 m = getfunc.match(fields[3])
0062 n = handle.match(m.group(1))
0063 if n:
0064 o = n.group(3)
0065 else:
0066 o = m.group(1)
0067 p = re.sub("class ", "", o)
0068 dataclass = re.sub("struct ", "", p)
0069 dataclasses.add(dataclass)
0070 if fields[2] == ' overrides function ':
0071 if baseclass.search(fields[3]):
0072 Gdg.add_edge(fields[1], fields[3], kind=' overrides function ')
0073 if topfunc.search(fields[3]):
0074 toplevelfuncs.add(fields[1])
0075 else:
0076 Gdg.add_edge(fields[3], fields[1], kind=' calls override function ')
0077 if fields[2] == ' static variable ':
0078 Gdg.add_edge(fields[1], fields[3], kind=' static variable ')
0079 statics.add(fields[3])
0080 f.close()
0081
0082 visited = set()
0083 nodes = sorted(dataclasses)
0084 for node in nodes:
0085 if node in visited:
0086 continue
0087 visited.add(node)
0088 stack = []
0089 if node in Hdg:
0090 stack = [(node, iter(Hdg[node]))]
0091 if node in Idg:
0092 Qdg = nx.dfs_preorder_nodes(Idg, node)
0093 for q in Qdg:
0094 print("class '"+q+"'")
0095 if q in Hdg:
0096 stack.append((q, iter(Hdg[q])))
0097 while stack:
0098 parent, children = stack[-1]
0099 print("class '"+parent+"'")
0100 try:
0101 child = next(children)
0102 if child not in visited:
0103 visited.add(child)
0104 if not stdcl.search(child):
0105 print("class '"+child+"'")
0106 stack.append((child, iter(Hdg[child])))
0107 kind = Hdg[parent][child]['kind']
0108 print(parent, kind, child)
0109 if stdptr.search(kind):
0110 if child in Idg:
0111 Qdg = nx.dfs_preorder_nodes(Idg, child)
0112 for q in Qdg:
0113 print("class '"+q+"'")
0114 if q in Hdg:
0115 stack.append((q, iter(Hdg[q])))
0116 except StopIteration:
0117 stack.pop()