@@ -19,7 +19,7 @@ namespace clang {
19
19
namespace mrdox {
20
20
namespace bitcode {
21
21
22
- class Builder : public Corpus ::Visitor
22
+ class MultiFileBuilder : public Corpus ::Visitor
23
23
{
24
24
Corpus const & corpus_;
25
25
Reporter& R_;
@@ -28,7 +28,7 @@ class Builder : public Corpus::Visitor
28
28
Config::WorkGroup wg_;
29
29
30
30
public:
31
- Builder (
31
+ MultiFileBuilder (
32
32
llvm::StringRef outputPath,
33
33
Corpus const & corpus,
34
34
Reporter& R)
@@ -108,14 +108,82 @@ class Builder : public Corpus::Visitor
108
108
109
109
// ------------------------------------------------
110
110
111
+ class SingleFileBuilder : public Corpus ::Visitor
112
+ {
113
+ Corpus const & corpus_;
114
+ Reporter& R_;
115
+ llvm::raw_ostream& os_;
116
+ llvm::raw_fd_ostream* fd_os_;
117
+
118
+ public:
119
+ SingleFileBuilder (
120
+ llvm::raw_ostream& os,
121
+ llvm::raw_fd_ostream* fd_os,
122
+ Corpus const & corpus,
123
+ Reporter& R)
124
+ : corpus_(corpus)
125
+ , R_(R)
126
+ , os_(os)
127
+ , fd_os_(fd_os)
128
+ {
129
+ }
130
+
131
+ llvm::Error
132
+ build ()
133
+ {
134
+ corpus_.visit (globalNamespaceID, *this );
135
+ return llvm::Error::success ();
136
+ }
137
+
138
+ template <class T >
139
+ void build (T const & I)
140
+ {
141
+ auto bc = writeBitcode (I);
142
+ os_.write (bc.data .data (), bc.data .size ());
143
+ }
144
+
145
+ bool visit (NamespaceInfo const & I) override
146
+ {
147
+ corpus_.visit (I.Children , *this );
148
+ return true ;
149
+ }
150
+
151
+ bool visit (RecordInfo const & I) override
152
+ {
153
+ build (I);
154
+ corpus_.visit (I.Children , *this );
155
+ return true ;
156
+ }
157
+
158
+ bool visit (FunctionInfo const & I) override
159
+ {
160
+ build (I);
161
+ return true ;
162
+ }
163
+
164
+ bool visit (TypedefInfo const & I) override
165
+ {
166
+ build (I);
167
+ return true ;
168
+ }
169
+
170
+ bool visit (EnumInfo const & I) override
171
+ {
172
+ build (I);
173
+ return true ;
174
+ }
175
+ };
176
+
177
+ // ------------------------------------------------
178
+
111
179
llvm::Error
112
180
BitcodeGenerator::
113
181
buildPages (
114
182
llvm::StringRef outputPath,
115
183
Corpus const & corpus,
116
184
Reporter& R) const
117
185
{
118
- return Builder (outputPath, corpus, R).build ();
186
+ return MultiFileBuilder (outputPath, corpus, R).build ();
119
187
}
120
188
121
189
llvm::Error
@@ -126,7 +194,7 @@ buildSinglePage(
126
194
Reporter& R,
127
195
llvm::raw_fd_ostream* fd_os) const
128
196
{
129
- return makeError ( " single-page bitcode not supported " );
197
+ return SingleFileBuilder (os, fd_os, corpus, R). build ( );
130
198
}
131
199
132
200
} // xml
0 commit comments