File: Synopsis/Formatters/HTML/Parts/Inheritance.py 1
2
3
4
5
6
7
8
9from Synopsis.Processor import Parameter
10from Synopsis import ASG
11from Synopsis.Formatters.HTML.Part import Part
12from Synopsis.Formatters.HTML.Fragments import *
13from Synopsis.Formatters.HTML.Tags import *
14
15def short_name(decl):
16 return isinstance(decl, ASG.Function) and decl.real_name[-1] or decl.name[-1]
17
18
19class Inheritance(Part):
20
21 fragments = Parameter([InheritanceFormatter()],
22 '')
23
24 def register(self, view):
25
26 Part.register(self, view)
27 self.__start_list = 0
28
29 def process(self, decl):
30 "Walk the hierarchy to find inherited members to print."
31
32 if not isinstance(decl, (ASG.Class, ASG.ClassTemplate)): return
33 self.write_start()
34 names = [short_name(d) for d in decl.declarations]
35 self._process_superclasses(decl, names)
36 self.write_end()
37
38 def _process_class(self, class_, names):
39 "Prints info for the given class, and calls _process_superclasses after"
40
41 sorter = self.processor.sorter.clone(class_.declarations)
42 child_names = []
43
44
45 for section in sorter:
46
47 heading = section+' Inherited from '+ str(self.scope().prune(class_.name))
48 started = 0
49
50 for child in sorter[section]:
51 child_name = short_name(child)
52 if child_name in names:
53 continue
54
55
56 if child.accessibility == ASG.PRIVATE:
57 continue
58
59 if (isinstance(child, ASG.Function) and
60 child.file.annotations['language'] == 'C++' and
61 len(child.real_name) > 1):
62 if child.real_name[-1] == child.real_name[-2]: continue
63 elif child.real_name[-1] == "~"+child.real_name[-2]: continue
64
65 child_names.append(child_name)
66
67 if not started:
68 started = 1
69 self.write_section_start(heading)
70 child.accept(self)
71
72 if started: self.write_section_end(heading)
73
74 self._process_superclasses(class_, names + child_names)
75
76 def _process_superclasses(self, class_, names):
77 """Iterates through the superclasses of clas and calls _process_clas for
78 each"""
79
80 for inheritance in class_.parents:
81 parent = inheritance.parent
82 if isinstance(parent, ASG.DeclaredTypeId):
83 parent = parent.declaration
84 if isinstance(parent, ASG.Class):
85 self._process_class(parent, names)
86 continue
87
88 pass
89
90 def write_section_start(self, heading):
91 """Creates a table with one row. The row has a td of class 'heading'
92 containing the heading string"""
93
94 self.write('<table width="100%%" summary="%s">\n'%heading)
95 self.write('<tr><td colspan="2" class="heading">' + heading + '</td></tr>\n')
96 self.write('<tr><td class="inherited">')
97 self.__start_list = 1
98
99 def write_section_item(self, text):
100 """Adds a table row"""
101
102 if self.__start_list:
103 self.write(text)
104 self.__start_list = 0
105 else:
106 self.write(',\n'+text)
107
108 def write_section_end(self, heading):
109
110 self.write('</td></tr></table>\n')
111
112
113
Generated on Thu Apr 16 16:27:13 2009 by
synopsis (version devel)