Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-12-01 23:40:44

0001 #! /usr/bin/env python3
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()