1 # $Id: node.rb,v 1.10 2012/04/17 05:30:54 machan Exp $
2
3 require 'tmdoc/tmstd'
4 require 'tmdoc/constant'
5 require 'tmdoc/model/object'
6 require 'tmdoc/model/document'
7 require 'tmdoc/transformer/object-into-document/link'
8
9
10 module TmDoc
11
12 module Transformer::ObjectIntoDocument
13
14 module Node
15
16 module_function
17
18 def transform_module_structure_node(
19 mo_node_module, mo_focus_module = nil, mo_file = nil, &block
20 )
21 ASSERT.kind_of mo_node_module, MOLA::GenericModule
22 ASSERT.opt_kind_of mo_focus_module, MOLA::GenericModule
23 ASSERT.opt_kind_of mo_file, MOP::File
24
25 mo_below_modules = mo_node_module.below_modules.select {
26 |mo_below_module|
27 ASSERT.kind_of mo_below_module, MOLA::GenericModule
28
29 if mo_below_module.suppressable?
30 false
31 else
32 if mo_focus_module && mo_focus_module == mo_below_module
33 true
34 else
35 (
36 if block
37 block.call mo_below_module
38 else
39 true
40 end
41 ) && (
42 if mo_below_module.kind_of?(MOLN::Module) ||
43 mo_below_module.kind_of?(MOLN::Class)
44 true
45 else
46 mo_below_module.descendant_modules_any? {
47 |mo_module|
48 ASSERT.kind_of(
49 mo_module, MOLA::GenericModule
50 )
51
52 mo_module.kind_of?(MOLN::Module) ||
53 mo_module.kind_of?(MOLN::Class)
54 }
55 end
56 )
57 end
58 end
59 }
60
61 md_below_modules = mo_below_modules.sort.map { |mo_below_module|
62 ASSERT.kind_of mo_below_module, MOLA::GenericModule
63
64 transform_module_structure_node(
65 mo_below_module, mo_focus_module, mo_file, &block
66 )
67 }.compact
68
69 md_infobox =
70 if mo_file && (
71 mo_node_module.locations.any? { |location|
72 location.a_file == mo_file
73 }
74 )
75 transform_infobox(
76 mo_node_module,
77 mo_file,
78 mo_node_module.kind_of?(MOLA::GenericClass),
79 true
80 )
81 else
82 nil
83 end
84
85 opts = {
86 :infobox => md_infobox,
87 :is_focused => mo_node_module == mo_focus_module,
88 :links_to_line => transform_locations_to_links(
89 mo_node_module.locations, mo_file
90 )
91 }.reject { |key, val| val.nil? }
92
93 MDN::ModuleStructure.new(
94 Link.transform_link_to_module(mo_node_module),
95 (
96 if md_below_modules.empty?
97 MDN::EMPTY_MODULES
98 else
99 MDN::SeqOfModule.new md_below_modules
100 end
101 ),
102 opts
103 )
104 end
105
106
107
108 def transform_class_hierarchy_node(
109 mo_node_class, mo_focus_module = nil, mo_file = nil, &block
110 )
111 ASSERT.kind_of mo_node_class, MOLA::GenericClass
112 ASSERT.opt_kind_of mo_focus_module, MOLA::GenericModule
113 ASSERT.opt_kind_of mo_file, MOP::File
114
115 mo_subclasses = mo_node_class.subclasses.select { |mo_subclass|
116 ASSERT.kind_of mo_subclass, MOLN::Class
117
118 if mo_subclass.suppressable?
119 false
120 else
121 if block
122 block.call mo_subclass
123 else
124 true
125 end
126 end
127 }
128 md_subclasses = mo_subclasses.sort.map { |mo_subclass|
129 ASSERT.kind_of mo_subclass, MOLN::Class
130
131 transform_class_hierarchy_node(
132 mo_subclass, mo_focus_module, mo_file, &block
133 )
134 }
135
136 is_focused = mo_node_class == mo_focus_module
137
138 md_infobox =
139 if is_focused || (
140 mo_focus_module &&
141 mo_focus_module.kind_of?(MOLN::Class) &&
142 mo_focus_module.ancestor_classes.include?(mo_node_class)
143 )
144 transform_infobox mo_node_class, nil, true
145 else
146 nil
147 end
148
149 is_above_module_equal_to_superclass =
150 if mo_node_class.kind_of?(MOLA::ChildClass)
151 mo_node_class.above_module_equal_to_superclass?
152 else
153 false
154 end
155
156 opts = {
157 :infobox => md_infobox,
158 :is_focused => is_focused,
159 :is_above_module_equal_to_superclass =>
160 is_above_module_equal_to_superclass,
161 :links_to_line => transform_locations_to_links(
162 mo_node_class.locations, mo_file
163 )
164 }.reject { |key, val| val.nil? }
165
166 MDN::ClassHierarchy.new(
167 Link.transform_link_to_module(mo_node_class),
168 (
169 if md_subclasses.empty?
170 MDN::EMPTY_CLASSES
171 else
172 MDN::SeqOfClass.new(md_subclasses)
173 end
174 ),
175 opts
176 )
177 end
178
179
180 def transform_infobox(
181 mo_node_module, mo_file = nil,
182 is_belongs_to_class = false, show_superclass = false
183 )
184 ASSERT.kind_of mo_node_module, MOLA::GenericModule
185 ASSERT.opt_kind_of mo_file, MOP::File
186 ASSERT.boolean is_belongs_to_class
187 ASSERT.boolean show_superclass
188
189 rows = [
190 Module::InfoBox.transform_modules(
191 mo_node_module.extendee_modules,
192 MDM::InfoBox::Row::ExtendeeModules
193 ),
194
195 Module::InfoBox.transform_modules(
196 mo_node_module.includee_modules,
197 MDM::InfoBox::Row::IncludeeModules
198 ),
199
200 if show_superclass && mo_node_module.kind_of?(MOLA::ChildClass)
201 mo_superclass = mo_node_module.a_superclass
202 if mo_superclass
203 Module::InfoBox.transform_module(
204 mo_superclass,
205 MDM::InfoBox::Row::Superclass
206 )
207 else
208 nil
209 end
210 else
211 nil
212 end,
213
214 Module::InfoBox.transform_properties(
215 mo_node_module.properties, is_belongs_to_class, mo_file
216 )
217 ].compact
218
219 md_infobox =
220 unless rows.empty?
221 MDN::InfoBox.new(
222 Path.transform(mo_node_module.above_path),
223 mo_node_module.name,
224 MDM::InfoBox::Row::SeqOfRow.new(rows)
225 )
226 else
227 nil
228 end
229
230 ASSERT.opt_kind_of md_infobox, MDN::InfoBox
231 end
232
233
234 def transform_locations_to_links(mo_locations, mo_file)
235 ASSERT.kind_of mo_locations, MOL::SetOfLocation
236 ASSERT.opt_kind_of mo_file, MOP::File
237
238 return nil unless mo_file
239
240 links_to_line = mo_locations.select { |mo_location|
241 mo_location.a_file == mo_file
242 }.sort.map { |mo_location|
243 Link.transform_link_to_line(mo_location)
244 }
245 return nil if links_to_line.empty?
246
247 MDL::SeqOfLine.new(links_to_line)
248 end
249 end
250
251 end # TmDoc::Transformer::ObjectIntoDocument
252
253 end # TmDoc