1 # $Id: source.rb,v 1.8 2012/04/17 02:49:40 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/node'
8
9
10 module TmDoc
11
12 module Transformer::ObjectIntoDocument
13
14 module Source
15
16 module_function
17
18 def transform_sources(mo_files, mo_toplevel_module, mo_object_class)
19 ASSERT.kind_of mo_files, MOP::Files
20 ASSERT.kind_of mo_toplevel_module, MOLN::ToplevelModule
21 ASSERT.kind_of mo_object_class, MOLN::Object
22
23 LOG::Progress.log "\tSources"
24
25 return nil if mo_files.empty?
26
27 md_sources = mo_files.sort.map { |mo_file|
28 ASSERT.kind_of mo_file, MOP::File
29
30 LOG::Progress.log "\t\t%s", mo_file.name
31
32 transform mo_file, mo_toplevel_module, mo_object_class
33 }
34 return nil if md_sources.empty?
35
36 MDS::SeqOfSource.new md_sources
37 end
38
39
40 def transform(mo_file, mo_toplevel_module, mo_object_class)
41 ASSERT.kind_of mo_file, MOP::File
42 ASSERT.kind_of mo_toplevel_module, MOLN::ToplevelModule
43 ASSERT.kind_of mo_object_class, MOLN::Object
44
45 name = mo_file.name
46
47 md_toplevel_module_node =
48 Node.transform_module_structure_node(
49 mo_toplevel_module, nil, mo_file
50 ) { |mo_module|
51 ASSERT.kind_of mo_module, MOLA::GenericModule
52
53 mo_module.has_any_module_in_the_source? name
54 }
55
56 md_object_class_node =
57 Node.transform_class_hierarchy_node(
58 mo_object_class, nil, mo_file
59 ) { |mo_class|
60 ASSERT.kind_of mo_class, MOLN::Class
61
62 mo_class.has_any_subclass_in_the_source? name
63 }
64
65 map_of_line_num_to_links =
66 mo_file.map_of_line_num_to_logical_subjects.map {
67 |line_num, mo_subjects|
68
69 md_links = MDL::SeqOfLinkToLogical.new(
70 mo_subjects.sort.map { |mo_subject|
71 case mo_subject
72 when MOLA::GenericModule
73 Link.transform_link_to_module mo_subject
74 when MOLA::Property
75 Link.transform_link_to_property mo_subject
76 else
77 ASSERT.abort(
78 "Unknown sunject: %s", mo_subject.to_s
79 )
80 end
81 }
82 )
83
84 [line_num, md_links]
85 }.inject(MDL::MapOfLineNumToLinks.new) { |map, pair|
86 ASSERT.tuple_of pair, [Integer, MDL::SeqOfLinkToLogical]
87 line_num, md_links = pair
88
89 map.update line_num, md_links
90 }
91
92
93 MDS::Source.new(
94 name,
95
96 if md_toplevel_module_node.below_module_nodes.empty?
97 nil
98 else
99 md_toplevel_module_node
100 end,
101
102 if md_object_class_node.subclass_nodes.empty?
103 nil
104 else
105 md_object_class_node
106 end,
107
108 map_of_line_num_to_links
109 )
110 end
111 end
112
113 end # TmDoc::Transformer::ObjectIntoDocument
114
115 end # TmDoc