Doxygen
Loading...
Searching...
No Matches
defgen.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 *
4 *
5 *
6 * Copyright (C) 1997-2015 by Dimitri van Heesch.
7 *
8 * Permission to use, copy, modify, and distribute this software and its
9 * documentation under the terms of the GNU General Public License is hereby
10 * granted. No representations are made about the suitability of this software
11 * for any purpose. It is provided "as is" without express or implied warranty.
12 * See the GNU General Public License for more details.
13 *
14 * Documents produced by Doxygen are derivative works derived from the
15 * input used in their production; they are not affected by this license.
16 *
17 */
18
19// own header
20#include "defgen.h"
21
22// other includes
23#include "arguments.h"
24#include "classlist.h"
25#include "config.h"
26#include "defargs.h"
27#include "dir.h"
28#include "dotclassgraph.h"
29#include "doxygen.h"
30#include "filedef.h"
31#include "filename.h"
32#include "memberlist.h"
33#include "message.h"
34#include "namespacedef.h"
35#include "portable.h"
36#include "textstream.h"
37#include "util.h"
38
39#define DEF_DB(x)
40
41static inline void writeDEFString(TextStream &t,const DString &s)
42{
43 t << '\'';
44 if (!s.empty())
45 {
46 const char* p=s.data();
47 char c = 0;
48
49 while ((c = *(p++)))
50 {
51 if (c == '\'') t << '\\';
52 t << c;
53 }
54 }
55 t << '\'';
56}
57
58static void generateDEFForMember(const MemberDef *md,
59 TextStream &t,
60 const Definition *def,
61 const DString &prefix)
62{
63 DString memPrefix;
64
65 // + declaration
66 // - reimplements
67 // - reimplementedBy
68 // - exceptions
69 // - const/volatile specifiers
70 // - examples
71 // + source definition
72 // - source references
73 // - source referenced by
74 // - include code
75
76 if (md->memberType()==MemberType::EnumValue) return;
77
78 DString scopeName;
79 if (md->getClassDef())
80 scopeName=md->getClassDef()->name();
81 else if (md->getNamespaceDef())
82 scopeName=md->getNamespaceDef()->name();
83
84 t << " " << prefix << "-member = {\n";
85 memPrefix = " ";
86 memPrefix.append( prefix );
87 memPrefix.append( "-mem-" );
88
89 if (md->memberType() == MemberType::EnumValue) ASSERT(0);
90 bool isFunc=to_isFunction(md->memberType());
91 DString memType = to_string_lower(md->memberType());
92
93 t << memPrefix << "kind = '" << memType << "';\n";
94 t << memPrefix << "id = '"
95 << md->getOutputFileBase() << "_1" << md->anchor()
96 << "';\n";
97
98 t << memPrefix << "virt = " << to_string_lower(md->virtualness()) << ";\n";
99 t << memPrefix << "prot = " << to_string_lower(md->protection()) << ";\n";
100
101 if (md->memberType()!=MemberType::Define &&
102 md->memberType()!=MemberType::Enumeration
103 )
104 {
106 t << memPrefix << "type = <<_EnD_oF_dEf_TeXt_\n" << typeStr << "\n"
107 << "_EnD_oF_dEf_TeXt_;\n";
108 }
109
110 t << memPrefix << "name = '" << md->name() << "';\n";
111
112 if (isFunc) //function
113 {
114 const ArgumentList &defAl = md->argumentList();
116 DString fcnPrefix = " " + memPrefix + "param-";
117
118 auto defIt = defAl.begin();
119 for (const Argument &a : declAl)
120 {
121 const Argument *defArg = nullptr;
122 if (defIt!=defAl.end())
123 {
124 defArg = &(*defIt);
125 ++defIt;
126 }
127 t << memPrefix << "param = {\n";
128 if (!a.attrib.empty())
129 {
130 t << fcnPrefix << "attributes = ";
131 writeDEFString(t,a.attrib);
132 t << ";\n";
133 }
134 if (!a.type.empty())
135 {
136 t << fcnPrefix << "type = <<_EnD_oF_dEf_TeXt_\n"
137 << a.type << "\n_EnD_oF_dEf_TeXt_;\n";
138 }
139 if (!a.name.empty())
140 {
141 t << fcnPrefix << "declname = ";
142 writeDEFString(t,a.name);
143 t << ";\n";
144 }
145 if (defArg && !defArg->name.empty() && defArg->name!=a.name)
146 {
147 t << fcnPrefix << "defname = ";
148 writeDEFString(t,defArg->name);
149 t << ";\n";
150 }
151 if (!a.array.empty())
152 {
153 t << fcnPrefix << "array = ";
154 writeDEFString(t,a.array);
155 t << ";\n";
156 }
157 if (!a.defval.empty())
158 {
159 t << fcnPrefix << "defval = <<_EnD_oF_dEf_TeXt_\n"
160 << a.defval << "\n_EnD_oF_dEf_TeXt_;\n";
161 }
162 t << " }; /*" << fcnPrefix << "-param */\n";
163 }
164 }
165 else if ( md->memberType()==MemberType::Define
166 && md->argsString()!=nullptr)
167 {
168 DString defPrefix = " " + memPrefix + "def-";
169 for (const Argument &a : md->argumentList())
170 {
171 t << memPrefix << "param = {\n";
172 t << defPrefix << "name = '" << a.type << "';\n";
173 t << " }; /*" << defPrefix << "-param */\n";
174 }
175 }
176
177 if (!md->initializer().empty())
178 {
179 t << memPrefix << "initializer = <<_EnD_oF_dEf_TeXt_\n"
180 << md->initializer() << "\n_EnD_oF_dEf_TeXt_;\n";
181 }
182 // TODO: exceptions, const volatile
183 if (md->memberType()==MemberType::Enumeration) // enum
184 {
185 for (const auto &emd : md->enumFieldList())
186 {
187 t << memPrefix << "enum = { enum-name = " << emd->name() << ';';
188 if (!emd->initializer().empty())
189 {
190 t << " enum-value = ";
191 writeDEFString(t,emd->initializer());
192 t << ';';
193 }
194 t << " };\n";
195 }
196 }
197
198 t << memPrefix << "desc-file = '" << md->getDefFileName() << "';\n";
199 t << memPrefix << "desc-line = '" << md->getDefLine() << "';\n";
200 t << memPrefix << "briefdesc = <<_EnD_oF_dEf_TeXt_\n"
201 << md->briefDescription() << "\n_EnD_oF_dEf_TeXt_;\n";
202 t << memPrefix << "documentation = <<_EnD_oF_dEf_TeXt_\n"
203 << md->documentation() << "\n_EnD_oF_dEf_TeXt_;\n";
204
205 //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
206
207 DString refPrefix = " " + memPrefix + "ref-";
208 auto refList = md->getReferencesMembers();
209 for (const auto &rmd : refList)
210 {
211 if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
212 {
213 t << memPrefix << "referenceto = {\n";
214 t << refPrefix << "id = '"
215 << rmd->getBodyDef()->getOutputFileBase()
216 << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
217 << rmd->anchor() << "';\n";
218
219 t << refPrefix << "line = '"
220 << rmd->getStartBodyLine() << "';\n";
221
222 DString scope = rmd->getScopeString();
223 DString name = rmd->name();
224 if (!scope.empty() && scope!=def->name())
225 {
226 name.prepend(scope+"::");
227 }
228
229 t << refPrefix << "name = ";
230 writeDEFString(t,name);
231 t << ';' << "\n };\n";
232 }
233 }
234 auto refByList = md->getReferencedByMembers();
235 for (const auto &rmd : refByList)
236 {
237 if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
238 {
239 t << memPrefix << "referencedby = {\n";
240 t << refPrefix << "id = '"
241 << rmd->getBodyDef()->getOutputFileBase()
242 << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
243 << rmd->anchor() << "';\n";
244
245 t << refPrefix << "line = '"
246 << rmd->getStartBodyLine() << "';\n";
247
248 DString scope = rmd->getScopeString();
249 DString name = rmd->name();
250 if (!scope.empty() && scope!=def->name())
251 {
252 name.prepend(scope+"::");
253 }
254
255 t << refPrefix << "name = ";
256 writeDEFString(t,name);
257 t << ';' << "\n };\n";
258 }
259 }
260
261 t << " }; /* " << prefix << "-member */\n";
262}
263
264
265static void generateDEFClassSection(const ClassDef *cd,
266 TextStream &t,
267 const MemberList *ml,
268 const DString &kind)
269{
270 if (cd && ml && !ml->empty())
271 {
272 t << " cp-section = {\n";
273 t << " sec-kind = '" << kind << "';\n";
274
275 for (const auto &md : *ml)
276 {
277 generateDEFForMember(md,t,cd,"sec");
278 }
279 t << " }; /* cp-section */\n";
280 }
281}
282
283static void generateDEFForClass(const ClassDef *cd,TextStream &t)
284{
285 // + brief description
286 // + detailed description
287 // - template arguments
288 // - include files
289 // + inheritance diagram
290 // + list of direct super classes
291 // + list of direct sub classes
292 // + collaboration diagram
293 // - list of all members
294 // + user defined member sections
295 // + standard member sections
296 // + detailed member documentation
297 // - examples
298
299 if (cd->isReference()) return; // skip external references.
300 if (cd->name().find('@')!=DString::npos) return; // skip anonymous compounds.
301 if (cd->isImplicitTemplateInstance()) return; // skip generated template instances.
302
303 t << cd->compoundTypeString() << " = {\n";
304 t << " cp-id = '" << cd->getOutputFileBase() << "';\n";
305 t << " cp-name = '" << cd->name() << "';\n";
306
307 for (const auto &bcd : cd->baseClasses())
308 {
309 t << " cp-ref = {\n" << " ref-type = base;\n";
310 t << " ref-id = '" << bcd.classDef->getOutputFileBase() << "';\n";
311 t << " ref-prot = " << to_string_lower_class(bcd.prot) << ";\n";
312 t << " ref-virt = " << to_string_lower(bcd.virt) << ";\n";
313 t << " };\n";
314 }
315
316 for (const auto &bcd : cd->subClasses())
317 {
318 t << " cp-ref = {\n" << " ref-type = derived;\n";
319 t << " ref-id = '" << bcd.classDef->getOutputFileBase() << "';\n";
320 t << " ref-prot = " << to_string_lower_class(bcd.prot) << ";\n";
321 t << " ref-virt = " << to_string_lower(bcd.virt) << ";\n";
322 t << " };\n";
323 }
324
325 size_t numMembers = 0;
326 for (const auto &ml : cd->getMemberLists())
327 {
328 if (!ml->listType().isDetailed())
329 {
330 numMembers+=ml->size();
331 }
332 }
333 if (numMembers>0)
334 {
335 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PubTypes()),"public-type");
336 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::Interfaces()),"interfaces");
337 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::Services()),"services");
338 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PubMethods()),"public-func");
339 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PubAttribs()),"public-attrib");
340 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PubSlots()),"public-slot");
341 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::Signals()),"signal");
342 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::DcopMethods()),"dcop-func");
343 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::Properties()),"property");
344 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PubStaticMethods()),"public-static-func");
345 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PubStaticAttribs()),"public-static-attrib");
346 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::ProTypes()),"protected-type");
347 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::ProMethods()),"protected-func");
348 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::ProAttribs()),"protected-attrib");
349 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::ProSlots()),"protected-slot");
350 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::ProStaticMethods()),"protected-static-func");
351 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::ProStaticAttribs()),"protected-static-attrib");
352 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PriTypes()),"private-type");
353 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PriMethods()),"private-func");
354 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PriAttribs()),"private-attrib");
355 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PriSlots()),"private-slot");
356 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PriStaticMethods()),"private-static-func");
357 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::PriStaticAttribs()),"private-static-attrib");
358 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::Friends()),"signal");
359 generateDEFClassSection(cd,t,cd->getMemberList(MemberListType::Related()),"related");
360 }
361
362 t << " cp-filename = '" << cd->getDefFileName() << "';\n";
363 t << " cp-fileline = '" << cd->getDefLine() << "';\n";
364 t << " cp-briefdesc = <<_EnD_oF_dEf_TeXt_\n"
365 << cd->briefDescription() << "\n_EnD_oF_dEf_TeXt_;\n";
366
367 t << " cp-documentation = <<_EnD_oF_dEf_TeXt_\n"
368 << cd->documentation() << "\n_EnD_oF_dEf_TeXt_;\n";
369
370 DotClassGraph inheritanceGraph(cd,GraphType::Inheritance);
371 if (!inheritanceGraph.isTrivial())
372 {
373 t << " cp-inheritancegraph = <<_EnD_oF_dEf_TeXt_\n";
374 inheritanceGraph.writeDEF(t);
375 t << "\n_EnD_oF_dEf_TeXt_;\n";
376 }
377 DotClassGraph collaborationGraph(cd,GraphType::Collaboration);
378 if (!collaborationGraph.isTrivial())
379 {
380 t << " cp-collaborationgraph = <<_EnD_oF_dEf_TeXt_\n";
381 collaborationGraph.writeDEF(t);
382 t << "\n_EnD_oF_dEf_TeXt_;\n";
383 }
384 t << "}; /* " << cd->compoundTypeString() << " */\n";
385}
386
387static void generateDEFSection(const Definition *d,
388 TextStream &t,
389 const MemberList *ml,
390 const DString &kind)
391{
392 if (ml && !ml->empty())
393 {
394 t << " " << kind << " = {\n";
395 for (const auto &md : *ml)
396 {
397 generateDEFForMember(md,t,d,kind);
398 }
399 t << " };\n";
400 }
401}
402
404{
405 if (nd->isReference()) return; // skip external references
406 t << " namespace = {\n";
407 t << " ns-id = '" << nd->getOutputFileBase() << "';\n";
408 t << " ns-name = ";
409 writeDEFString(t,nd->name());
410 t << ";\n";
411
412 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecDefineMembers()),"define");
413 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecProtoMembers()),"prototype");
414 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecTypedefMembers()),"typedef");
415 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecSequenceMembers()),"sequence");
416 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecDictionaryMembers()),"dictionary");
417 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecEnumMembers()),"enum");
418 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecFuncMembers()),"func");
419 generateDEFSection(nd,t,nd->getMemberList(MemberListType::DecVarMembers()),"var");
420
421 t << " ns-filename = '" << nd->getDefFileName() << "';\n";
422 t << " ns-fileline = '" << nd->getDefLine() << "';\n";
423 t << " ns-briefdesc = <<_EnD_oF_dEf_TeXt_\n"
424 << nd->briefDescription() << "\n_EnD_oF_dEf_TeXt_;\n";
425
426 t << " ns-documentation = <<_EnD_oF_dEf_TeXt_\n"
427 << nd->documentation() << "\n_EnD_oF_dEf_TeXt_;\n";
428 t << " };\n";
429}
430
431static void generateDEFForFile(const FileDef *fd,TextStream &t)
432{
433 if (fd->isReference()) return; // skip external references
434
435 t << "file = {\n";
436 t << " file-id = '" << fd->getOutputFileBase() << "';\n";
437 t << " file-name = ";
438 writeDEFString(t,fd->name());
439 t << ";\n";
440
441 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecDefineMembers()),"define");
442 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecProtoMembers()),"prototype");
443 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecTypedefMembers()),"typedef");
444 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecSequenceMembers()),"sequence");
445 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecDictionaryMembers()),"dictionary");
446 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecEnumMembers()),"enum");
447 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecFuncMembers()),"func");
448 generateDEFSection(fd,t,fd->getMemberList(MemberListType::DecVarMembers()),"var");
449
450 t << " file-full-name = '" << fd->getDefFileName() << "';\n";
451 t << " file-first-line = '" << fd->getDefLine() << "';\n";
452
453 t << " file-briefdesc = <<_EnD_oF_dEf_TeXt_\n"
454 << fd->briefDescription() << "\n_EnD_oF_dEf_TeXt_;\n";
455
456 t << " file-documentation = <<_EnD_oF_dEf_TeXt_\n"
457 << fd->documentation() << "\n_EnD_oF_dEf_TeXt_;\n";
458
459 t << "}; /* file */\n";
460}
461
462
464{
465 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY)+"/def";
466 Dir defDir(outputDirectory.str());
467 if (!defDir.exists() && !defDir.mkdir(outputDirectory.str()))
468 {
469 err("Could not create def directory in {}\n",outputDirectory);
470 return;
471 }
472
473 DString fileName=outputDirectory+"/doxygen.def";
474 std::ofstream f = Portable::openOutputStream(fileName);
475 if (!f.is_open())
476 {
477 err("Cannot open file {} for writing!\n",fileName);
478 return;
479 }
480 TextStream t(&f);
481 t << "AutoGen Definitions dummy;\n";
482
483 if (Doxygen::classLinkedMap->size()+
486 {
487 for (const auto &cd : *Doxygen::classLinkedMap)
488 {
489 generateDEFForClass(cd.get(),t);
490 }
491 for (const auto &fn : *Doxygen::inputNameLinkedMap)
492 {
493 for (const auto &fd : *fn)
494 {
495 generateDEFForFile(fd.get(),t);
496 }
497 }
498 for (const auto &nd : *Doxygen::namespaceLinkedMap)
499 {
500 generateDEFForNamespace(nd.get(),t);
501 }
502 }
503 else
504 {
505 t << "dummy_value = true;\n";
506 }
507}
constexpr auto prefix
Definition anchor.cpp:47
This class contains the information about the argument of a function or template.
Definition arguments.h:27
DString name
Definition arguments.h:45
This class represents an function or template argument list.
Definition arguments.h:66
iterator end()
Definition arguments.h:95
iterator begin()
Definition arguments.h:94
A abstract class representing of a compound symbol.
Definition classdef.h:100
virtual const MemberLists & getMemberLists() const =0
Returns the list containing the list of members sorted per type.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual bool isImplicitTemplateInstance() const =0
virtual const BaseClassList & subClasses() const =0
Returns the list of sub classes that directly derive from this class.
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
DString & append(char c)
Definition dstring.h:489
DString & prepend(const char *s)
Definition dstring.h:515
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
const std::string & str() const
Definition dstring.h:645
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:157
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual DString briefDescription(bool abbreviate=false) const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual DString getDefFileName() const =0
virtual DString documentation() const =0
virtual int getDefLine() const =0
virtual const DString & name() const =0
virtual DString anchor() const =0
virtual const MemberVector & getReferencedByMembers() const =0
virtual bool isReference() const =0
virtual const MemberVector & getReferencesMembers() const =0
virtual DString getOutputFileBase() const =0
Class representing a directory in the file system.
Definition dir.h:73
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:301
bool exists() const
Definition dir.cpp:263
Representation of a class inheritance or dependency graph.
bool isTrivial() const
void writeDEF(TextStream &t)
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:108
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:97
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:88
A model of a file symbol.
Definition filedef.h:97
virtual MemberList * getMemberList(MemberListType lt) const =0
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
virtual DString argsString() const =0
virtual const ClassDef * getClassDef() const =0
virtual const DString & initializer() const =0
virtual const MemberVector & enumFieldList() const =0
virtual const ArgumentList & argumentList() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual Protection protection() const =0
virtual MemberType memberType() const =0
virtual DString typeString() const =0
virtual Specifier virtualness(int count=0) const =0
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:126
bool empty() const noexcept
Definition memberlist.h:61
An abstract interface of a namespace symbol.
virtual MemberList * getMemberList(MemberListType lt) const =0
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_getString(name)
Definition config.h:32
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
Definition defargs.l:821
void generateDEF()
Definition defgen.cpp:463
static void generateDEFForClass(const ClassDef *cd, TextStream &t)
Definition defgen.cpp:283
static void generateDEFSection(const Definition *d, TextStream &t, const MemberList *ml, const DString &kind)
Definition defgen.cpp:387
static void writeDEFString(TextStream &t, const DString &s)
Definition defgen.cpp:41
static void generateDEFClassSection(const ClassDef *cd, TextStream &t, const MemberList *ml, const DString &kind)
Definition defgen.cpp:265
static void generateDEFForFile(const FileDef *fd, TextStream &t)
Definition defgen.cpp:431
static void generateDEFForMember(const MemberDef *md, TextStream &t, const Definition *def, const DString &prefix)
Definition defgen.cpp:58
static void generateDEFForNamespace(const NamespaceDef *nd, TextStream &t)
Definition defgen.cpp:403
@ Collaboration
Definition dotgraph.h:31
@ Inheritance
Definition dotgraph.h:31
#define err(fmt,...)
Definition message.h:127
#define ASSERT(x)
Definition message.h:142
std::ofstream openOutputStream(const DString &name, bool append=false)
Definition portable.cpp:681
Portable versions of functions that are platform dependent.
DString replaceAnonymousScopes(const DString &s, const DString &replacement)
Definition util.cpp:155
A bunch of utility functions.