diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cite.cpp | 4 | ||||
-rw-r--r-- | src/commentscan.l | 4 | ||||
-rw-r--r-- | src/config.xml | 10 | ||||
-rw-r--r-- | src/context.cpp | 42 | ||||
-rw-r--r-- | src/definition.cpp | 16 | ||||
-rw-r--r-- | src/docbookgen.cpp | 155 | ||||
-rw-r--r-- | src/docbookvisitor.cpp | 121 | ||||
-rw-r--r-- | src/docparser.cpp | 15 | ||||
-rw-r--r-- | src/docparser.h | 2 | ||||
-rw-r--r-- | src/doctokenizer.l | 4 | ||||
-rw-r--r-- | src/dot.cpp | 211 | ||||
-rw-r--r-- | src/dot.h | 16 | ||||
-rw-r--r-- | src/doxygen.cpp | 24 | ||||
-rw-r--r-- | src/entry.h | 4 | ||||
-rw-r--r-- | src/htmldocvisitor.cpp | 2 | ||||
-rw-r--r-- | src/htmlgen.cpp | 10 | ||||
-rw-r--r-- | src/latexdocvisitor.cpp | 2 | ||||
-rw-r--r-- | src/latexgen.cpp | 10 | ||||
-rw-r--r-- | src/memberdef.cpp | 46 | ||||
-rw-r--r-- | src/memberdef.h | 4 | ||||
-rw-r--r-- | src/pre.l | 5 | ||||
-rw-r--r-- | src/printdocvisitor.h | 7 | ||||
-rw-r--r-- | src/rtfdocvisitor.cpp | 2 | ||||
-rw-r--r-- | src/rtfgen.cpp | 8 | ||||
-rw-r--r-- | src/scanner.l | 4 | ||||
-rw-r--r-- | src/tclscanner.l | 326 | ||||
-rw-r--r-- | src/xmldocvisitor.cpp | 7 | ||||
-rw-r--r-- | src/xmlgen.cpp | 16 |
28 files changed, 802 insertions, 275 deletions
diff --git a/src/cite.cpp b/src/cite.cpp index a3056ba..f0580ed 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -58,6 +58,10 @@ static QCString getListOfBibFiles(const QCString &sep,bool namesOnly) { bibFile = bibFile.left(bibFile.length()-4); } + else + { + if (!namesOnly && bibFile.right(4)!=".bib") bibFile += ".bib"; + } if ((i=bibFile.findRev('/'))!=-1) // strip path { bibFile = bibFile.mid(i+1); diff --git a/src/commentscan.l b/src/commentscan.l index bd20bf0..a42f6ce 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -914,7 +914,9 @@ FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#] FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"") ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* -CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]* +CITESCHAR [a-z_A-Z\x80-\xFF] +CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]* +CITEID {CITESCHAR}*{CITEECHAR}+("."{CITESCHAR}*{CITEECHAR}+)* SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?) SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID}) TMPLSPEC "<"{BN}*[^>]+{BN}*">" diff --git a/src/config.xml b/src/config.xml index f228ca4..eed486e 100644 --- a/src/config.xml +++ b/src/config.xml @@ -2763,6 +2763,16 @@ front of it. ]]> </docs> </option> + <option type='bool' id='DOCBOOK_PROGRAMLISTING' defval='0' depends='GENERATE_DOCBOOK'> + <docs> +<![CDATA[ + If the \c DOCBOOK_PROGRAMLISTING tag is set to \c YES doxygen will + include the program listings (including syntax highlighting + and cross-referencing information) to the DOCBOOK output. Note that + enabling this will significantly increase the size of the DOCBOOK output. +]]> + </docs> + </option> </group> <group name='AutoGen' docs='Configuration options for the AutoGen Definitions output'> <option type='bool' id='GENERATE_AUTOGEN_DEF' defval='0'> diff --git a/src/context.cpp b/src/context.cpp index 850f8e8..541cb74 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -1471,7 +1471,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { DotClassGraph *cg = getClassGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,TRUE,g_globals.dynSectionId @@ -1516,7 +1516,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { DotClassGraph *cg = getCollaborationGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,TRUE,g_globals.dynSectionId @@ -2197,7 +2197,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { DotInclDepGraph *cg = getIncludeGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -2228,7 +2228,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { DotInclDepGraph *cg = getIncludedByGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -2766,7 +2766,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> addProperty("isExplicit", this,&Private::isExplicit); addProperty("isMutable", this,&Private::isMutable); addProperty("isGettable", this,&Private::isGettable); + addProperty("isPrivateGettable", this,&Private::isPrivateGettable); + addProperty("isProtectedGettable", this,&Private::isProtectedGettable); addProperty("isSettable", this,&Private::isSettable); + addProperty("isPrivateSettable", this,&Private::isPrivateSettable); + addProperty("isProtectedSettable", this,&Private::isProtectedSettable); addProperty("isReadable", this,&Private::isReadable); addProperty("isWritable", this,&Private::isWritable); addProperty("isAddable", this,&Private::isAddable); @@ -2855,8 +2859,12 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> m_cache.propertyAttrs.reset(TemplateList::alloc()); if (md && md->isProperty()) { - if (md->isGettable()) m_cache.propertyAttrs->append("get"); - if (md->isSettable()) m_cache.propertyAttrs->append("set"); + if (md->isGettable()) m_cache.propertyAttrs->append("get"); + if (md->isPrivateGettable()) m_cache.propertyAttrs->append("private get"); + if (md->isProtectedGettable()) m_cache.propertyAttrs->append("protected get"); + if (md->isSettable()) m_cache.propertyAttrs->append("set"); + if (md->isPrivateSettable()) m_cache.propertyAttrs->append("private set"); + if (md->isProtectedSettable()) m_cache.propertyAttrs->append("protected set"); } m_cache.eventAttrs.reset(TemplateList::alloc()); if (md && md->isEvent()) @@ -2948,12 +2956,28 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> } TemplateVariant isGettable() const { - return m_memberDef->isSettable(); + return m_memberDef->isGettable(); + } + TemplateVariant isPrivateGettable() const + { + return m_memberDef->isPrivateGettable(); + } + TemplateVariant isProtectedGettable() const + { + return m_memberDef->isProtectedGettable(); } TemplateVariant isSettable() const { return m_memberDef->isSettable(); } + TemplateVariant isPrivateSettable() const + { + return m_memberDef->isPrivateSettable(); + } + TemplateVariant isProtectedSettable() const + { + return m_memberDef->isProtectedSettable(); + } TemplateVariant isReadable() const { return m_memberDef->isReadable(); @@ -3634,7 +3658,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> DotCallGraph *cg = getCallGraph(); QGString result; FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -3674,7 +3698,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> DotCallGraph *cg = getCallerGraph(); QGString result; FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId diff --git a/src/definition.cpp b/src/definition.cpp index c4b9f77..8603536 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -1362,13 +1362,21 @@ QCString Definition::qualifiedName() const return m_impl->qualifiedName; }; -void Definition::setOuterScope(Definition *d) +void Definition::setOuterScope(Definition *d) { //printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>"); - if (m_impl->outerScope!=d) - { + Definition *p = m_impl->outerScope; + bool found=false; + // make sure that we are not creating a recursive scope relation. + while (p && !found) + { + found = (p==d); + p = p->m_impl->outerScope; + } + if (!found) + { m_impl->qualifiedName.resize(0); // flush cached scope name - m_impl->outerScope = d; + m_impl->outerScope = d; } m_impl->hidden = m_impl->hidden || d->isHidden(); } diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index 2011333..cabb7ad 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -210,7 +210,7 @@ class DocbookCodeGenerator : public CodeOutputInterface { m_t << "<link linkend=\"" << m_refId << "\">"; } - m_t << m_lineNumber; + m_t << m_lineNumber << " "; if (!m_refId.isEmpty()) { m_t << "</link>"; @@ -228,10 +228,10 @@ class DocbookCodeGenerator : public CodeOutputInterface m_external.resize(0); m_insideCodeLine=FALSE; } - void startFontClass(const char * /*colorClass*/) + void startFontClass(const char *colorClass) { Docbook_DB(("(startFontClass)\n")); - m_t << "<emphasis>"; // non DocBook + m_t << "<emphasis class=\"" << colorClass << "\">"; m_insideSpecialHL=TRUE; } void endFontClass() @@ -453,7 +453,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de if (md->memberType()==MemberType_Enumeration) { MemberList *enumFields = md->enumFieldList(); - t << " <para>" << memType << " <link linkend=\""; + t << " <para><literallayout>" << memType << " <link linkend=\""; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -467,25 +467,25 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { MemberListIterator emli(*enumFields); MemberDef *emd; - t << "{"; + t << " {" << endl; int cnt=0; for (emli.toFirst();(emd=emli.current());++emli) { if (cnt!=0) { - t << ", "; + t << "," << endl; } t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">"; writeDocbookString(t,emd->name()); t << "</link>"; if (!emd->initializer().isEmpty()) { - t << "="; writeDocbookString(t,emd->initializer()); } cnt++; } - t << "}"; + t << endl << "}"; + t << "</literallayout>" << endl; } } else if (md->memberType()==MemberType_Define) @@ -608,10 +608,10 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << " </listitem>" << endl; t << " </itemizedlist>" << endl; t << " </para>" << endl; - } - else + } + else { - if (md->memberType()==MemberType_Enumeration) + if (md->memberType()==MemberType_Enumeration) { MemberList *enumFields = md->enumFieldList(); t << " <section xml:id=\""; @@ -653,20 +653,19 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << " </formalpara>" << endl; t << " <para>"; t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl; - t << " <programlisting>" << endl; + t << " <computeroutput><literallayout>" << endl; t << "{" << endl; for (emli.toFirst();(emd=emli.current());++emli) { writeDocbookString(t,emd->name()); if (!emd->initializer().isEmpty()) { - t << "="; writeDocbookString(t,emd->initializer()); } t << ", " << endl; } t << "}" << convertToXML(md->name()) << ";" << endl; - t << " </programlisting>" << endl; + t << " </literallayout></computeroutput>" << endl; t << " </para>" << endl; t << " </section>" << endl; } @@ -1127,6 +1126,7 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml"; + QCString relPath = relativePathToRoot(fileName); QFile f(fileName); if (!f.open(IO_WriteOnly)) { @@ -1181,6 +1181,20 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) } } + if (Config_getBool("HAVE_DOT") && (Config_getBool("CLASS_DIAGRAMS") || Config_getBool("CLASS_GRAPH"))) + { + t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl; + DotClassGraph inheritanceGraph(cd,DotNode::Inheritance); + inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,TRUE,FALSE); + } + + if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH")) + { + t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl; + DotClassGraph collaborationGraph(cd,DotNode::Collaboration); + collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,TRUE,FALSE); + } + writeInnerClasses(cd->getClassSDict(),t); writeTemplateList(cd,t); @@ -1369,6 +1383,7 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml"; + QCString relPath = relativePathToRoot(fileName); QFile f(fileName); if (!f.open(IO_WriteOnly)) @@ -1413,6 +1428,21 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) t << "</programlisting>" << endl; } } + if (Config_getBool("HAVE_DOT")) + { + if (Config_getBool("INCLUDE_GRAPH")) + { + t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl; + DotInclDepGraph idepGraph(fd, FALSE); + idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } + if (Config_getBool("INCLUDED_BY_GRAPH")) + { + t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl; + DotInclDepGraph ibdepGraph(fd, TRUE); + ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } + } if (fd->getClassSDict()) { @@ -1448,20 +1478,24 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) t << " <title>Detailed Description</title>" << endl; writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation()); - t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl; + if (Config_getBool("FULL_PATH_NAMES")) + { + t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl; + } + else + { + t << " <para>Definition in file " << stripPath(fd->getDefFileName()) << "</para>" << endl; + } t << " </simplesect>" << endl; - /*// TODO: Handling of Program listing for Docbook to be implemented - if (Config_getBool("DOCBOOK_PROGRAMLISTING")) - { - t << " <programlisting>" << endl; + if (Config_getBool("DOCBOOK_PROGRAMLISTING")) + { + t << " <literallayout><computeroutput>" << endl; writeDocbookCodeBlock(t,fd); - t << " </programlisting>" << endl; - } - */ + t << " </computeroutput></literallayout>" << endl; + } t << "</section>" << endl; - } static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) @@ -1489,6 +1523,7 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml"; + QCString relPath = relativePathToRoot(fileName); QFile f(fileName); if (!f.open(IO_WriteOnly)) @@ -1503,6 +1538,13 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl; + if (Config_getBool("GROUP_GRAPHS") && Config_getBool("HAVE_DOT")) + { + t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl; + DotGroupCollaboration collaborationGraph(gd); + collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } + if (gd->briefDescription()) { t << " <simplesect>" << endl; @@ -1570,6 +1612,8 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml"; QFile f(fileName); + QCString relPath = relativePathToRoot(fileName); + if (!f.open(IO_WriteOnly)) { err("Cannot open file %s for writing!\n",fileName.data()); @@ -1584,6 +1628,12 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti) writeDocbookString(t, dd->displayName()); t << " Directory Reference"; t << "</title>" << endl; + if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT")) + { + t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl; + DotDirDeps dirdepGraph(dd); + dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } writeInnerDirs(&dd->subDirs(),t); writeInnerFiles(dd->getFiles(),t); @@ -1628,7 +1678,13 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) FTextStream t(&f); //t.setEncoding(FTextStream::UnicodeUTF8); - if (!pd->hasParentPage()) + if(isExample) + { + QCString fileDocbook=pageName+".xml"; + ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + + if (!pd->hasParentPage() && !isExample) { QCString fileDocbook=pageName+".xml"; //Add the file Documentation info to index file @@ -1654,7 +1710,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) if (isExample) { writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0, - pd->documentation()+"\n<include "+pd->name()+">"); + pd->documentation()+"\n\\include "+pd->name()); } else { @@ -1663,7 +1719,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) } writeInnerPages(pd->getSubPages(),t); - if (!pd->hasParentPage()) + if (!pd->hasParentPage() && !isExample) { t << endl << "</chapter>" << endl; } @@ -1744,7 +1800,6 @@ void generateDocbook() t << " </info>" << endl; // NAMESPACE DOCUMENTATION - NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); NamespaceDef *nd; @@ -1838,35 +1893,39 @@ void generateDocbook() // FILE DOCUMENTATION - FileNameListIterator fnli(*Doxygen::inputNameList); - FileName *fn; - - //File Documentation index header - if (fnli.toFirst()) + static bool showFiles = Config_getBool("SHOW_FILES"); + if (showFiles) { - t << " <chapter>" << endl; - t << " <title>File Documentation</title>" << endl; - } + FileNameListIterator fnli(*Doxygen::inputNameList); + FileName *fn; - for (;(fn=fnli.current());++fnli) - { - FileNameIterator fni(*fn); - FileDef *fd; - for (;(fd=fni.current());++fni) + //File Documentation index header + if (fnli.toFirst()) { - msg("Generating Docbook output for file %s\n",fd->name().data()); - generateDocbookForFile(fd,t); + t << " <chapter>" << endl; + t << " <title>File Documentation</title>" << endl; } - } - //File Documentation index footer - if (fnli.toFirst()) - { - t << " </chapter>" << endl; + for (;(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + { + msg("Generating Docbook output for file %s\n",fd->name().data()); + generateDocbookForFile(fd,t); + } + } + + //File Documentation index footer + if (fnli.toFirst()) + { + t << " </chapter>" << endl; + } } // DIRECTORY DOCUMENTATION - + if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT")) { DirDef *dir; DirSDict::Iterator sdi(*Doxygen::directories); diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index 6867dce..5d7aafd 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -160,16 +160,16 @@ void DocbookDocVisitor::visit(DocVerbatim *s) switch(s->type()) { case DocVerbatim::Code: // fall though - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; Doxygen::parserManager->getParser(m_langExt) ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; break; case DocVerbatim::Verbatim: - m_t << "<programlisting><literallayout>"; + m_t << "<literallayout>"; filter(s->text()); - m_t << "</literallayout></programlisting>"; + m_t << "</literallayout>"; break; case DocVerbatim::HtmlOnly: break; @@ -189,8 +189,10 @@ void DocbookDocVisitor::visit(DocVerbatim *s) { static int dotindex = 1; QCString baseName(4096); + QCString name; QCString stext = s->text(); m_t << "<para>" << endl; + name.sprintf("%s%d", "dot_inline_dotgraph_", dotindex); baseName.sprintf("%s%d", (Config_getString("DOCBOOK_OUTPUT")+"/inline_dotgraph_").data(), dotindex++ @@ -203,7 +205,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s) file.writeBlock( stext, stext.length() ); file.close(); m_t << " <figure>" << endl; - m_t << " <title></title>" << endl; + m_t << " <title>" << name << "</title>" << endl; m_t << " <mediaobject>" << endl; m_t << " <imageobject>" << endl; writeDotFile(baseName); @@ -216,8 +218,10 @@ void DocbookDocVisitor::visit(DocVerbatim *s) case DocVerbatim::Msc: static int mscindex = 1; QCString baseName(4096); + QCString name; QCString stext = s->text(); m_t << "<para>" << endl; + name.sprintf("%s%d", "msc_inline_mscgraph_", mscindex); baseName.sprintf("%s%d", (Config_getString("DOCBOOK_OUTPUT")+"/inline_mscgraph_").data(), mscindex++ @@ -233,7 +237,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s) file.writeBlock( text, text.length() ); file.close(); m_t << " <figure>" << endl; - m_t << " <title></title>" << endl; + m_t << " <title>" << name << "</title>" << endl; m_t << " <mediaobject>" << endl; m_t << " <imageobject>" << endl; writeMscFile(baseName); @@ -259,7 +263,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) { case DocInclude::IncWithLines: { - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() ); Doxygen::parserManager->getParser(inc->extension()) @@ -268,18 +272,18 @@ void DocbookDocVisitor::visit(DocInclude *inc) langExt, inc->isExample(), inc->exampleFile(), &fd); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; } break; case DocInclude::Include: - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), inc->exampleFile()); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; break; case DocInclude::DontInclude: break; @@ -293,7 +297,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) m_t << "</verbatim>"; break; case DocInclude::Snippet: - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci, inc->context(), @@ -302,7 +306,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) inc->isExample(), inc->exampleFile() ); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; break; } } @@ -361,7 +365,7 @@ void DocbookDocVisitor::visit(DocIndexEntry *ie) void DocbookDocVisitor::visit(DocSimpleSectSep *) { - m_t << "<simplesectsep/>"; + m_t << "<simplesect/>"; } void DocbookDocVisitor::visit(DocCite *cite) @@ -818,14 +822,14 @@ void DocbookDocVisitor::visitPost(DocHtmlHeader *) void DocbookDocVisitor::visitPre(DocImage *img) { - if (img->type()==DocImage::Latex) + if (img->type()==DocImage::DocBook) { if (m_hide) return; m_t << endl; m_t << " <figure>" << endl; m_t << " <title>"; - } - else + } + else { pushEnabled(); m_hide=TRUE; @@ -834,7 +838,7 @@ void DocbookDocVisitor::visitPre(DocImage *img) void DocbookDocVisitor::visitPost(DocImage *img) { - if (img->type()==DocImage::Latex) + if (img->type()==DocImage::DocBook) { if (m_hide) return; QCString typevar; @@ -854,13 +858,17 @@ void DocbookDocVisitor::visitPost(DocImage *img) filter(img->width()); m_t << "\""; } - else if (!img->height().isEmpty()) + else + { + m_t << " width=\"50%\""; + } + if (!img->height().isEmpty()) { m_t << " depth=\""; filter(img->height()); m_t << "\""; } - m_t << " align=\"center\" fileref=\"" << baseName << "\">"; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "\">"; m_t << "</imagedata>" << endl; m_t << " </imageobject>" << endl; m_t << " </mediaobject>" << endl; @@ -980,37 +988,23 @@ void DocbookDocVisitor::visitPost(DocSecRefList *) void DocbookDocVisitor::visitPre(DocParamSect *s) { if (m_hide) return; + m_t << endl; + m_t << " <formalpara>" << endl; + m_t << " <title/>" << endl; + m_t << " <table frame=\"all\">" << endl; + m_t << " <title>"; switch(s->type()) { - case DocParamSect::Param: - { - m_t << endl; - m_t << " <formalpara>" << endl; - m_t << " <title/>" << endl; - m_t << " <table frame=\"all\">" << endl; - m_t << " <title>Parameters</title>" << endl; - m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; - m_t << " <tbody>" << endl; - break; - } - case DocParamSect::RetVal: - { - m_t << endl; - m_t << " <formalpara>" << endl; - m_t << " <title/>" << endl; - m_t << " <table frame=\"all\">" << endl; - m_t << " <title>Parameters</title>" << endl; - m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; - m_t << " <tbody>" << endl; - break; - } - case DocParamSect::Exception: - m_t << "exception"; break; - case DocParamSect::TemplateParam: - m_t << "templateparam"; break; + case DocParamSect::Param: m_t << theTranslator->trParameters(); break; + case DocParamSect::RetVal: m_t << theTranslator->trReturnValues(); break; + case DocParamSect::Exception: m_t << theTranslator->trExceptions(); break; + case DocParamSect::TemplateParam: m_t << theTranslator->trTemplateParameters(); break; default: ASSERT(0); } + m_t << " </title>" << endl; + m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; + m_t << " <tbody>" << endl; } void DocbookDocVisitor::visitPost(DocParamSect *) @@ -1029,17 +1023,17 @@ void DocbookDocVisitor::visitPre(DocParamList *pl) QListIterator<DocNode> li(pl->parameters()); DocNode *param; m_t << " <row>" << endl; - if (!li.toFirst()) + if (!li.toFirst()) { m_t << " <entry></entry>" << endl; - } - else + } + else { m_t << " <entry>"; int cnt = 0; for (li.toFirst();(param=li.current());++li) { - if (cnt) + if (cnt) { m_t << ", "; } @@ -1196,7 +1190,8 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName) QCString outDir = Config_getString("DOCBOOK_OUTPUT"); writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP); m_t << " <imagedata"; - m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">"; + m_t << " width=\"50%\""; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << ".png" << "\">"; m_t << "</imagedata>" << endl; } @@ -1231,13 +1226,17 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName, m_t << width; m_t << "\""; } - else if (!height.isEmpty()) + else + { + m_t << " width=\"50%\""; + } + if (!height.isEmpty()) { m_t << " depth=\""; m_t << height; m_t << "\""; } - m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">"; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << ".png" << "\">"; m_t << "</imagedata>" << endl; m_t << " </imageobject>" << endl; if (hasCaption) @@ -1342,9 +1341,12 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName) shortName=shortName.right(shortName.length()-i-1); } QCString outDir = Config_getString("DOCBOOK_OUTPUT"); - writeDotGraphFromFile(baseName+".dot",outDir,shortName,BITMAP); + QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP); m_t << " <imagedata"; - m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">"; + //If no width is specified use default value for PDF rendering + m_t << " width=\"50%\""; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << "." << imgExt << "\">"; m_t << "</imagedata>" << endl; } @@ -1366,7 +1368,8 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, } baseName.prepend("dot_"); QCString outDir = Config_getString("DOCBOOK_OUTPUT"); - writeDotGraphFromFile(fileName,outDir,baseName,BITMAP); + QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP); m_t << "<para>" << endl; m_t << " <figure>" << endl; m_t << " <title></title>" << endl; @@ -1379,13 +1382,17 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, m_t << width; m_t << "\""; } - else if (!height.isEmpty()) + else + { + m_t << " width=\"50%\""; + } + if (!height.isEmpty()) { m_t << " depth=\""; m_t << height; m_t << "\""; } - m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">"; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "." << imgExt << "\">"; m_t << "</imagedata>" << endl; m_t << " </imageobject>" << endl; if (hasCaption) diff --git a/src/docparser.cpp b/src/docparser.cpp index 66a890f..13d333f 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -257,14 +257,18 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) QCString outputDir; switch(type) { - case DocImage::Html: + case DocImage::Html: if (!Config_getBool("GENERATE_HTML")) return result; outputDir = Config_getString("HTML_OUTPUT"); break; - case DocImage::Latex: + case DocImage::Latex: if (!Config_getBool("GENERATE_LATEX")) return result; outputDir = Config_getString("LATEX_OUTPUT"); break; + case DocImage::DocBook: + if (!Config_getBool("GENERATE_DOCBOOK")) return result; + outputDir = Config_getString("DOCBOOK_OUTPUT"); + break; case DocImage::Rtf: if (!Config_getBool("GENERATE_RTF")) return result; outputDir = Config_getString("RTF_OUTPUT"); @@ -5025,9 +5029,10 @@ void DocPara::handleImage(const QCString &cmdName) } DocImage::Type t; QCString imgType = g_token->name.lower(); - if (imgType=="html") t=DocImage::Html; - else if (imgType=="latex") t=DocImage::Latex; - else if (imgType=="rtf") t=DocImage::Rtf; + if (imgType=="html") t=DocImage::Html; + else if (imgType=="latex") t=DocImage::Latex; + else if (imgType=="docbook") t=DocImage::DocBook; + else if (imgType=="rtf") t=DocImage::Rtf; else { warn_doc_error(g_fileName,doctokenizerYYlineno,"image type %s specified as the first argument of " diff --git a/src/docparser.h b/src/docparser.h index fb4f084..17f296b 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -668,7 +668,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode class DocImage : public CompAccept<DocImage>, public DocNode { public: - enum Type { Html, Latex, Rtf }; + enum Type { Html, Latex, Rtf, DocBook }; DocImage(DocNode *parent,const HtmlAttribList &attribs, const QCString &name,Type t,const QCString &url=QCString()); Kind kind() const { return Kind_Image; } diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 7ffbbb3..3bd2058 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -333,7 +333,9 @@ BLANK [ \t\r] ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+ -CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]* +CITESCHAR [a-z_A-Z\x80-\xFF] +CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]* +CITEID {CITESCHAR}*{CITEECHAR}+("."{CITESCHAR}*{CITEECHAR}+)* MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}* LISTITEM {BLANK}*[-]("#")?{WS} diff --git a/src/dot.cpp b/src/dot.cpp index 051a438..c64729a 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -16,11 +16,6 @@ * */ -#ifdef _WIN32 -#include <windows.h> -#define BITMAP W_BITMAP -#endif - #include <stdlib.h> #include <qdir.h> @@ -1812,7 +1807,7 @@ void DotNode::writeBox(FTextStream &t, t << "\",height=0.2,width=0.4"; if (m_isRoot) { - t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\" fontcolor=\"black\""; + t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\", fontcolor=\"black\""; } else { @@ -1896,7 +1891,7 @@ void DotNode::writeArrow(FTextStream &t, t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->m_color] << "\""; } - if (format==BITMAP) t << ",fontname=\"" << FONTNAME << "\""; + if (format==GOF_BITMAP) t << ",fontname=\"" << FONTNAME << "\""; t << "];" << endl; } @@ -2313,7 +2308,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out, { if (node->m_subgraphId==n->m_subgraphId) { - node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,TRUE,TRUE); + node->write(md5stream,DotNode::Hierarchy,GOF_BITMAP,FALSE,TRUE,TRUE,TRUE); } } writeGraphFooter(md5stream); @@ -3080,7 +3075,8 @@ QCString DotClassGraph::diskName() const } QCString DotClassGraph::writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, @@ -3128,19 +3124,19 @@ QCString DotClassGraph::writeGraph(FTextStream &out, if (updateDotGraph(m_startNode, m_graphType, absBaseName, - format, + graphFormat, m_lrRank, m_graphType==DotNode::Inheritance, TRUE, m_startNode->label() ) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; - if (format==BITMAP) // run dot to create a bitmap image + if (graphFormat==GOF_BITMAP) // run dot to create a bitmap image { QCString dotArgs(maxCmdLine); @@ -3151,7 +3147,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, DotManager::instance()->addRun(dotRun); } - else if (format==EPS) // run dot to create a .eps image + else if (graphFormat==GOF_EPS) // run dot to create a .eps image { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -3167,7 +3163,35 @@ QCString DotClassGraph::writeGraph(FTextStream &out, } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) // produce HTML to include the image + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>"; + switch (m_graphType) + { + case DotNode::Collaboration: + out << "Collaboration graph"; + break; + case DotNode::Inheritance: + out << "Inheritance graph"; + break; + default: + ASSERT(0); + break; + } + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) // produce HTML to include the image { QCString mapLabel = escapeCharsInString(m_startNode->m_label,FALSE)+"_"+ escapeCharsInString(mapName,FALSE); @@ -3189,7 +3213,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, { out << "<div class=\"center\">"; out << "<img src=\"" << relPath << baseName << "." - << imgExt << "\" border=\"0\" usemap=\"#" + << imgExt << "\" border=\"0\" usemap=\"#" << mapLabel << "\" alt=\""; switch (m_graphType) { @@ -3202,10 +3226,9 @@ QCString DotClassGraph::writeGraph(FTextStream &out, default: ASSERT(0); break; - } + } out << "\"/>"; out << "</div>" << endl; - if (regenerate || !insertMapFile(out,absMapName,relPath,mapLabel)) { int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath, @@ -3214,7 +3237,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, } } } - else if (format==EPS) // produce tex to include the .eps image + else if (graphFormat==GOF_EPS) // produce tex to include the .eps image { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -3423,7 +3446,8 @@ QCString DotInclDepGraph::diskName() const } QCString DotInclDepGraph::writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, @@ -3458,19 +3482,19 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, if (updateDotGraph(m_startNode, DotNode::Dependency, absBaseName, - format, + graphFormat, FALSE, // lrRank FALSE, // renderParents m_inverse, // backArrows m_startNode->label() ) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; - if (format==BITMAP) + if (graphFormat==GOF_BITMAP) { // run dot to create a bitmap image QCString dotArgs(maxCmdLine); @@ -3479,7 +3503,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName); DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -3491,12 +3515,27 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, dotRun->addJob("ps",absEpsName); } DotManager::instance()->addRun(dotRun); - - } + } } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>Dependency diagram"; + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) { if (imgExt=="svg") // Scalable vector graphics { @@ -3514,9 +3553,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, } else // bitmap graphics { - out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." - << imgExt << "\" border=\"0\" usemap=\"#" - << mapName << "\" alt=\"\"/>"; + out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\"\"/>"; out << "</div>" << endl; QCString absMapName = absBaseName+".map"; @@ -3528,7 +3565,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, } } } - else if (format==EPS) // encapsulated postscript + else if (graphFormat==GOF_EPS) // encapsulated postscript { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -3729,7 +3766,8 @@ DotCallGraph::~DotCallGraph() delete m_usedNodes; } -QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, +QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path,const char *fileName, const char *relPath,bool generateImageMap,int graphId) const @@ -3757,19 +3795,19 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, if (updateDotGraph(m_startNode, DotNode::CallGraph, absBaseName, - format, + graphFormat, TRUE, // lrRank FALSE, // renderParents m_inverse, // backArrows m_startNode->label() ) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; - if (format==BITMAP) + if (graphFormat==GOF_BITMAP) { // run dot to create a bitmap image QCString dotArgs(maxCmdLine); @@ -3779,7 +3817,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { // run dot to create a .eps image DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); @@ -3797,7 +3835,23 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>Call diagram"; + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) { if (imgExt=="svg") // Scalable vector graphics { @@ -3815,7 +3869,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, } else // bitmap graphics { - out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." + out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\""; out << "\"/>"; @@ -3829,7 +3883,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, } } } - else if (format==EPS) // encapsulated postscript + else if (graphFormat==GOF_EPS) // encapsulated postscript { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -3865,7 +3919,8 @@ DotDirDeps::~DotDirDeps() } QCString DotDirDeps::writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, @@ -3901,9 +3956,9 @@ QCString DotDirDeps::writeGraph(FTextStream &out, MD5SigToString(md5_sig,sigStr.data(),33); bool regenerate=FALSE; if (checkAndUpdateMd5Signature(absBaseName,sigStr) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; @@ -3917,7 +3972,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, t << theGraph.data(); f.close(); - if (format==BITMAP) + if (graphFormat==GOF_BITMAP) { // run dot to create a bitmap image QCString dotArgs(maxCmdLine); @@ -3926,7 +3981,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName); DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -3942,7 +3997,23 @@ QCString DotDirDeps::writeGraph(FTextStream &out, } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>Directory Dependency diagram"; + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) { if (imgExt=="svg") // Scalable vector graphics { @@ -3960,7 +4031,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, } else // bitmap graphics { - out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." + out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\""; out << convertToXML(m_dir->displayName()); @@ -3975,7 +4046,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, } } } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -4085,9 +4156,9 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, QCString absOutFile = d.absPath().utf8()+"/"+outFile; DotRunner dotRun(inFile,d.absPath().data(),FALSE,absImgName); - if (format==BITMAP) + if (format==GOF_BITMAP) dotRun.addJob(imgExt,absImgName); - else // format==EPS + else // format==GOF_EPS { if (Config_getBool("USE_PDFLATEX")) { @@ -4105,7 +4176,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, return; } - if (format==BITMAP) checkDotResult(absImgName); + if (format==GOF_BITMAP) checkDotResult(absImgName); Doxygen::indexList->addImageFile(imgName); @@ -4384,7 +4455,8 @@ void DotGroupCollaboration::addCollaborationMember( } -QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat format, +QCString DotGroupCollaboration::writeGraph( FTextStream &t, + GraphOutputFormat graphFormat, EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, bool writeImageMap,int graphId) const { @@ -4411,7 +4483,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo // write other nodes. for (dni.toFirst();(pn=dni.current());++dni) { - pn->write(md5stream,DotNode::Inheritance,format,TRUE,FALSE,FALSE,FALSE); + pn->write(md5stream,DotNode::Inheritance,graphFormat,TRUE,FALSE,FALSE,FALSE); } // write edges @@ -4441,9 +4513,9 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo QCString absEpsName = absBaseName+".eps"; bool regenerate=FALSE; if (checkAndUpdateMd5Signature(absBaseName,sigStr) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP /*&& generateImageMap*/ ? absMapName : QCString()) + graphFormat==GOF_BITMAP /*&& generateImageMap*/ ? absMapName : QCString()) ) { regenerate=TRUE; @@ -4456,7 +4528,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo dotfile.close(); } - if (format==BITMAP) // run dot to create a bitmap image + if (graphFormat==GOF_BITMAP) // run dot to create a bitmap image { QCString dotArgs(maxCmdLine); @@ -4466,7 +4538,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -4481,7 +4553,23 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo } } - if (format==BITMAP && writeImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + t << "<para>" << endl; + t << " <figure>" << endl; + t << " <title>Group Collaboration diagram"; + t << "</title>" << endl; + t << " <mediaobject>" << endl; + t << " <imageobject>" << endl; + t << " <imagedata"; + t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + t << "</imagedata>" << endl; + t << " </imageobject>" << endl; + t << " </mediaobject>" << endl; + t << " </figure>" << endl; + t << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && writeImageMap) { QCString mapLabel = escapeCharsInString(baseName,FALSE); t << "<center><table><tr><td>"; @@ -4503,7 +4591,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo else { t << "<img src=\"" << relPath << imgName - << "\" border=\"0\" alt=\"\" usemap=\"#" + << "\" border=\"0\" alt=\"\" usemap=\"#" << mapLabel << "\"/>" << endl; if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel)) { @@ -4512,10 +4600,9 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo t << "<!-- MAP " << mapId << " -->" << endl; } } - t << "</td></tr></table></center>" << endl; } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { if (regenerate || !writeVecGfxFigure(t,baseName,absBaseName)) { @@ -39,7 +39,8 @@ class GroupDef; class DotGroupCollaboration; class DotRunnerQueue; -enum GraphOutputFormat { BITMAP , EPS }; +enum GraphOutputFormat { GOF_BITMAP, GOF_EPS }; +enum EmbeddedOutputFormat { EOF_Html, EOF_LaTeX, EOF_Rtf, EOF_DocBook }; /** Attributes of an edge of a dot graph */ struct EdgeInfo @@ -165,8 +166,8 @@ class DotClassGraph ~DotClassGraph(); bool isTrivial() const; bool isTooBig() const; - QCString writeGraph(FTextStream &t,GraphOutputFormat f,const char *path, - const char *fileName, const char *relPath, + QCString writeGraph(FTextStream &t,GraphOutputFormat gf,EmbeddedOutputFormat ef, + const char *path, const char *fileName, const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const; void writeXML(FTextStream &t); @@ -196,7 +197,7 @@ class DotInclDepGraph public: DotInclDepGraph(FileDef *fd,bool inverse); ~DotInclDepGraph(); - QCString writeGraph(FTextStream &t, GraphOutputFormat f, + QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const char *path,const char *fileName,const char *relPath, bool writeImageMap=TRUE,int graphId=-1) const; bool isTrivial() const; @@ -222,7 +223,7 @@ class DotCallGraph public: DotCallGraph(MemberDef *md,bool inverse); ~DotCallGraph(); - QCString writeGraph(FTextStream &t, GraphOutputFormat f, + QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const char *path,const char *fileName, const char *relPath,bool writeImageMap=TRUE, int graphId=-1) const; @@ -249,7 +250,8 @@ class DotDirDeps ~DotDirDeps(); bool isTrivial() const; QCString writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat gf, + EmbeddedOutputFormat ef, const char *path, const char *fileName, const char *relPath, @@ -298,7 +300,7 @@ class DotGroupCollaboration DotGroupCollaboration(GroupDef* gd); ~DotGroupCollaboration(); - QCString writeGraph(FTextStream &t, GraphOutputFormat format, + QCString writeGraph(FTextStream &t, GraphOutputFormat gf,EmbeddedOutputFormat ef, const char *path,const char *fileName,const char *relPath, bool writeImageMap=TRUE,int graphId=-1) const; void buildGraph(GroupDef* gd); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 8aba232..bc080a2 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -551,7 +551,7 @@ static void addSTLClasses(EntryNav *rootNav) //---------------------------------------------------------------------------- static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n, - FileDef *fileScope=0); + FileDef *fileScope,TagInfo *tagInfo); static void addPageToContext(PageDef *pd,EntryNav *rootNav) { @@ -564,7 +564,7 @@ static void addPageToContext(PageDef *pd,EntryNav *rootNav) } scope = stripAnonymousNamespaceScope(scope); scope+="::"+pd->name(); - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope); + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo()); if (d) { pd->setPageScope(d); @@ -708,7 +708,7 @@ static void findGroupScope(EntryNav *rootNav) } scope = stripAnonymousNamespaceScope(scope); scope+="::"+gd->name(); - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope); + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo()); if (d) { gd->setGroupScope(d); @@ -996,7 +996,8 @@ static Definition *findScope(Entry *root,int level=0) * full qualified name \a name. Creates an artificial scope if the scope is * not found and set the parent/child scope relation if the scope is found. */ -static Definition *buildScopeFromQualifiedName(const QCString name,int level,SrcLangExt lang,TagInfo *tagInfo) +static Definition *buildScopeFromQualifiedName(const QCString name, + int level,SrcLangExt lang,TagInfo *tagInfo) { //printf("buildScopeFromQualifiedName(%s) level=%d\n",name.data(),level); int i=0; @@ -1018,7 +1019,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src { innerScope = cd; } - else if (nd==0 && cd==0) // scope is not known! + else if (nd==0 && cd==0 && fullScope.find('<')==-1) // scope is not known and could be a namespace! { // introduce bogus namespace //printf("++ adding dummy namespace %s to %s tagInfo=%p\n",nsName.data(),prevScope->name().data(),tagInfo); @@ -1047,7 +1048,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src } static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n, - FileDef *fileScope) + FileDef *fileScope,TagInfo *tagInfo) { //printf("<findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data()); Definition *resultScope=startScope; @@ -1080,7 +1081,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr for (ni.toFirst();((nd=ni.current()) && resultScope==0);++ni) { // restart search within the used namespace - resultScope = findScopeFromQualifiedName(nd,n,fileScope); + resultScope = findScopeFromQualifiedName(nd,n,fileScope,tagInfo); } if (resultScope) { @@ -1112,7 +1113,8 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr // so use this instead. QCString fqn = QCString(ui.currentKey())+ scope.right(scope.length()-p); - resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),startScope->getLanguage(),0); + resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"), + startScope->getLanguage(),0); //printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope); if (resultScope) { @@ -1420,7 +1422,7 @@ static void resolveClassNestingRelations() //printf("processing=%s, iteration=%d\n",cd->name().data(),iteration); // also add class to the correct structural context Definition *d = findScopeFromQualifiedName(Doxygen::globalScope, - name,cd->getFileDef()); + name,cd->getFileDef(),0); if (d) { //printf("****** adding %s to scope %s in iteration %d\n",cd->name().data(),d->name().data(),iteration); @@ -1788,7 +1790,7 @@ static void buildNamespaceList(EntryNav *rootNav) Doxygen::namespaceSDict->inSort(fullName,nd); // also add namespace to the correct structural context - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName,0,tagInfo); //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>"); if (d==0) // we didn't find anything, create the scope artificially // anyway, so we can at least relate scopes properly. @@ -4823,7 +4825,7 @@ static bool findClassRelation( int si = baseClassName.findRev("::"); if (si!=-1) // class is nested { - Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si)); + Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si),0,rootNav->tagInfo()); if (sd==0 || sd==Doxygen::globalScope) // outer scope not found { baseClass->setArtificial(TRUE); // see bug678139 diff --git a/src/entry.h b/src/entry.h index a861906..3e5f3d7 100644 --- a/src/entry.h +++ b/src/entry.h @@ -135,6 +135,10 @@ class Entry static const uint64 Singleton = (1ULL<<14); // UNO IDL // member specifiers (add new items to the beginning) + static const uint64 PrivateGettable = (1ULL<<20); // C# private getter + static const uint64 ProtectedGettable = (1ULL<<21); // C# protected getter + static const uint64 PrivateSettable = (1ULL<<22); // C# private setter + static const uint64 ProtectedSettable = (1ULL<<23); // C# protected setter static const uint64 Inline = (1ULL<<24); static const uint64 Explicit = (1ULL<<25); static const uint64 Mutable = (1ULL<<26); diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 261f739..372bb93 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -1906,7 +1906,7 @@ void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath, } baseName.prepend("dot_"); QCString outDir = Config_getString("HTML_OUTPUT"); - writeDotGraphFromFile(fn,outDir,baseName,BITMAP); + writeDotGraphFromFile(fn,outDir,baseName,GOF_BITMAP); writeDotImageMapFromFile(m_t,fn,outDir,relPath,baseName,context); } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 0d399d3..27091b4 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -2516,7 +2516,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,TRUE,m_sectionCount); if (generateLegend && !umlLook) { t << "<center><span class=\"legend\">["; @@ -2542,7 +2542,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; @@ -2560,7 +2560,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; @@ -2578,7 +2578,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; @@ -2596,7 +2596,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index eed36bc..0edb459 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -1587,7 +1587,7 @@ void LatexDocVisitor::startDotFile(const QCString &fileName, baseName.prepend("dot_"); QCString outDir = Config_getString("LATEX_OUTPUT"); QCString name = fileName; - writeDotGraphFromFile(name,outDir,baseName,EPS); + writeDotGraphFromFile(name,outDir,baseName,GOF_EPS); if (hasCaption) { m_t << "\n\\begin{DoxyImage}\n"; diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 10e50de..086e012 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -1814,7 +1814,7 @@ void LatexGenerator::startDotGraph() void LatexGenerator::endDotGraph(const DotClassGraph &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startInclDepGraph() @@ -1823,7 +1823,7 @@ void LatexGenerator::startInclDepGraph() void LatexGenerator::endInclDepGraph(const DotInclDepGraph &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startGroupCollaboration() @@ -1832,7 +1832,7 @@ void LatexGenerator::startGroupCollaboration() void LatexGenerator::endGroupCollaboration(const DotGroupCollaboration &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startCallGraph() @@ -1841,7 +1841,7 @@ void LatexGenerator::startCallGraph() void LatexGenerator::endCallGraph(const DotCallGraph &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startDirDepGraph() @@ -1850,7 +1850,7 @@ void LatexGenerator::startDirDepGraph() void LatexGenerator::endDirDepGraph(const DotDirDeps &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startDescription() diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 9ef3515..1069b3b 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -1729,15 +1729,27 @@ void MemberDef::writeDeclaration(OutputList &ol, ol.docify(" [implementation]"); ol.endTypewriter(); } + + bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); - if (isProperty() && (isSettable() || isGettable())) + if (isProperty() && (isSettable() || isGettable() || + isPrivateSettable() || isPrivateGettable() || + isProtectedSettable() || isProtectedGettable())) { ol.writeLatexSpacing(); ol.startTypewriter(); ol.docify(" ["); QStrList sl; - if (isGettable()) sl.append("get"); - if (isSettable()) sl.append("set"); + + if (isGettable()) sl.append("get"); + if (isProtectedGettable()) sl.append("protected get"); + if (isSettable()) sl.append("set"); + if (isProtectedSettable()) sl.append("protected set"); + if (extractPrivate) + { + if (isPrivateGettable()) sl.append("private get"); + if (isPrivateSettable()) sl.append("private set"); + } const char *s=sl.first(); while (s) { @@ -1940,6 +1952,7 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const //ol.docify(" ["); SrcLangExt lang = getLanguage(); bool optVhdl = lang==SrcLangExt_VHDL; + bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); if (optVhdl) { sl.append(VhdlDocGen::trTypeString(getMemberSpecifiers())); @@ -1955,7 +1968,14 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const if (isMutable()) sl.append("mutable"); if (isStatic()) sl.append("static"); if (isGettable()) sl.append("get"); + if (isProtectedGettable()) sl.append("protected get"); if (isSettable()) sl.append("set"); + if (isProtectedSettable()) sl.append("protected set"); + if (extractPrivate) + { + if (isPrivateGettable()) sl.append("private get"); + if (isPrivateSettable()) sl.append("private set"); + } if (isAddable()) sl.append("add"); if (!isUNOProperty() && isRemovable()) sl.append("remove"); if (isRaisable()) sl.append("raise"); @@ -4193,11 +4213,31 @@ bool MemberDef::isGettable() const return (m_impl->memSpec&Entry::Gettable)!=0; } +bool MemberDef::isPrivateGettable() const +{ + return (m_impl->memSpec&Entry::PrivateGettable)!=0; +} + +bool MemberDef::isProtectedGettable() const +{ + return (m_impl->memSpec&Entry::ProtectedGettable)!=0; +} + bool MemberDef::isSettable() const { return (m_impl->memSpec&Entry::Settable)!=0; } +bool MemberDef::isPrivateSettable() const +{ + return (m_impl->memSpec&Entry::PrivateSettable)!=0; +} + +bool MemberDef::isProtectedSettable() const +{ + return (m_impl->memSpec&Entry::ProtectedSettable)!=0; +} + bool MemberDef::isAddable() const { return (m_impl->memSpec&Entry::Addable)!=0; diff --git a/src/memberdef.h b/src/memberdef.h index 3259102..b3c671f 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -123,7 +123,11 @@ class MemberDef : public Definition bool isExplicit() const; bool isMutable() const; bool isGettable() const; + bool isPrivateGettable() const; + bool isProtectedGettable() const; bool isSettable() const; + bool isPrivateSettable() const; + bool isProtectedSettable() const; bool isReadable() const; bool isWritable() const; bool isAddable() const; @@ -886,8 +886,9 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int } // PHASE 2: apply the macro function - if (argCount==def->nargs || - (argCount>def->nargs && def->varArgs)) // matching parameters lists + if (argCount==def->nargs || // same number of arguments + (argCount>=def->nargs-1 && def->varArgs)) // variadic macro with at least as many + // params as the non-variadic part (see bug731985) { uint k=0; // substitution of all formal arguments diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 0381c93..ee2ae3f 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -476,9 +476,10 @@ class PrintDocVisitor : public DocVisitor printf("<image src=\"%s\" type=\"",img->name().data()); switch(img->type()) { - case DocImage::Html: printf("html"); break; - case DocImage::Latex: printf("latex"); break; - case DocImage::Rtf: printf("rtf"); break; + case DocImage::Html: printf("html"); break; + case DocImage::Latex: printf("latex"); break; + case DocImage::Rtf: printf("rtf"); break; + case DocImage::DocBook: printf("docbook"); break; } printf("\" width=%s height=%s>\n",img->width().data(),img->height().data()); } diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index b90b5a8..0d17208 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -1653,7 +1653,7 @@ void RTFDocVisitor::writeDotFile(const QCString &fileName) baseName=baseName.right(baseName.length()-i-1); } QCString outDir = Config_getString("RTF_OUTPUT"); - writeDotGraphFromFile(fileName,outDir,baseName,BITMAP); + writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP); if (!m_lastIsPara) m_t << "\\par" << endl; m_t << "{" << endl; m_t << rtf_Style_Reset; diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 8699c4e..ccdadcf 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -2409,7 +2409,7 @@ void RTFGenerator::endDotGraph(const DotClassGraph &g) newParagraph(); QCString fn = - g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE); + g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE); // display the file t << "{" << endl; @@ -2431,7 +2431,7 @@ void RTFGenerator::endInclDepGraph(const DotInclDepGraph &g) { newParagraph(); - QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"), fileName,relPath,FALSE); // display the file @@ -2461,7 +2461,7 @@ void RTFGenerator::endCallGraph(const DotCallGraph &g) { newParagraph(); - QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"), fileName,relPath,FALSE); // display the file @@ -2483,7 +2483,7 @@ void RTFGenerator::endDirDepGraph(const DotDirDeps &g) { newParagraph(); - QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"), fileName,relPath,FALSE); // display the file diff --git a/src/scanner.l b/src/scanner.l index a39d02e..50e3b18 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -6129,6 +6129,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(FindMembers); } } +<CSAccessorDecl>"private "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::PrivateSettable; } +<CSAccessorDecl>"protected "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::ProtectedSettable; } +<CSAccessorDecl>"private "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::PrivateGettable; } +<CSAccessorDecl>"protected "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::ProtectedGettable; } <CSAccessorDecl>"set" { if (curlyCount==0) current->spec |= Entry::Settable; } <CSAccessorDecl>"get" { if (curlyCount==0) current->spec |= Entry::Gettable; } <CSAccessorDecl>"add" { if (curlyCount==0) current->spec |= Entry::Addable; } diff --git a/src/tclscanner.l b/src/tclscanner.l index 48e8214..88e3d1d 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -534,6 +534,24 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q } } +//! Check name. Strip namespace qualifiers from name0 if inside inlined code segment. +// @return 'ns' and 'name' of given current 'ns0' and 'name0' +static void tcl_name_SnippetAware(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name) +{ + // If we are inside an inlined code snippet then ns0 + // already containes the complete namespace path. + // Any namespace qualifiers in name0 are redundant. + int i = name0.findRev("::"); + if (i>=0 && tcl.memberdef) + { + tcl_name(ns0, name0.mid(i+2), ns, name); + } + else + { + tcl_name(ns0, name0, ns, name); + } +} + // Check and return namespace entry. // @return namespace entry Entry* tcl_entry_namespace(const QCString ns) @@ -714,6 +732,40 @@ static void tcl_codify_cmd(const char *s,int i) { tcl_codify(s,(*tcl.list_commandwords.at(i)).utf8()); } +//! codify a string token +// +// codifies string according to type. +// Starts a new scan context if needed (*myScan==0 and type == "script"). +// Returns NULL or the created scan context. +// +static tcl_scan *tcl_codify_token(tcl_scan *myScan, const QCString type, const QCString string) +{ + if (myScan != NULL) + { + if (type != NULL) + { + myScan->after << type << string; + } + else + { + myScan->after << "NULL" << string; + } + } + else + { + if (qstrcmp(type, "script") == 0) + { + myScan = tcl.scan.at(0); + myScan = tcl_scan_start('?', string, + myScan->ns, myScan->entry_cl, myScan->entry_fn); + } + else + { + tcl_codify((const char*)type, string); + } + } + return myScan; +} //----------------------------------------------------------------------------- #undef YY_INPUT @@ -1716,14 +1768,7 @@ static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOu if (i%2 != 0) { // handle white space - if (myScan!=NULL) - { - myScan->after << "NULL" << myName; - } - else - { - tcl_codify(NULL,myName); - } + myScan = tcl_codify_token(myScan, "NULL", myName); } else { @@ -1766,29 +1811,13 @@ static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOu { // the first opening bracket, output what we have so far myStr+=c; - if (myScan!=NULL) - { - myScan->after << "NULL" << myStr; - } - else - { - tcl_codify(NULL,myStr); - } + myScan = tcl_codify_token(myScan, "NULL", myStr); myStr=""; } else if (c==']' && !backslashed && insideBrackets==0 && insideBraces==0) { // the last closing bracket, start recursion, switch to deferred - if (myScan!=NULL) - { - myScan->after << "script" << myStr; - } - else - { - myScan=tcl.scan.at(0); - myScan = tcl_scan_start('?',myStr, - myScan->ns,myScan->entry_cl,myScan->entry_fn); - } + myScan = tcl_codify_token(myScan, "script", myStr); myStr=""; myStr+=c; } @@ -1797,23 +1826,174 @@ static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOu myStr+=c; } } - if (myScan!=NULL) + if (i == 0 && myScan == NULL) { - myScan->after << "NULL" << myStr; + tcl_codify_link(myStr); } else { - if (i==0) + myScan = tcl_codify_token(myScan, "NULL", myStr); + } + } + return (myScan); +} + +//! Handle internal tcl commands. +// "eval arg ?arg ...?" +static void tcl_command_EVAL() +{ +D + tcl_codify_cmd("keyword", 0); + tcl_scan *myScan = tcl.scan.at(0); + QCString myString = ""; + // we simply rescan the line without the eval + // we include leading whitespace because tcl_scan_start will examine + // the first char. If it finds a bracket it will assume one expression in brackets. + // Example: eval [list set] [list NotInvoked] [Invoked NotInvoked] + for (unsigned int i = 1; i < tcl.list_commandwords.count(); i++) + { + myString += (*tcl.list_commandwords.at(i)).utf8(); + } + myScan = tcl_scan_start('?', myString, + myScan->ns, myScan->entry_cl, myScan->entry_fn); +} + +//! Handle internal tcl commands. +// switch ?options? string pattern body ?pattern body ...? +// switch ?options? string {pattern body ?pattern body ...?} +static void tcl_command_SWITCH() +{ +D + tcl_codify_cmd("keyword",0); + tcl_codify_cmd(NULL,1); + tcl_scan *myScan=NULL; + unsigned int i; + QCString token; + // first: find the last option token + unsigned int lastOptionIndex = 0; + for (i = 2; i<tcl.list_commandwords.count(); i += 2) + { + token = (*tcl.list_commandwords.at(i)).utf8(); + if (token == "--") + { + lastOptionIndex = i; + break; + } + if (token[0] == '-' && i - lastOptionIndex == 2) + { + // options start with dash and should form a continuous chain + lastOptionIndex = i; + } + } + // second: eat up options + for (i = 2; i <= lastOptionIndex; i++) + { + myScan = tcl_command_ARG(myScan, i, false); + } + // third: how many tokens are left? + if (tcl.list_commandwords.count() - lastOptionIndex == 5) + { + //printf("syntax: switch ?options? string {pattern body ?pattern body ...?}\n"); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 3, false); + // walk trough the list step by step + // this way we can preserve whitespace + bool inBraces = false; + bool nextIsPattern = true; + int size; + const char *elem; + const char *next; + token = (*tcl.list_commandwords.at(lastOptionIndex + 4)).utf8(); + if (token[0] == '{') + { + inBraces = true; + token = token.mid(1, token.length() - 2); + myScan = tcl_codify_token(myScan, "NULL", QCString("{")); + } + // ToDo: check if multibyte chars are handled correctly + while (token.length() > 0) + { + TclFindElement((const char*)token, token.length(), &elem, &next, &size, NULL); + //printf("%s\nstart=%d, elem=%d, next=%d, size=%d, brace=%d\n", + // (const char*) token, (const char*) token, elem, next, size, brace); + // + // handle leading whitespace/opening brace/double quotes + if (elem - token > 0) { - tcl_codify_link(myStr); + myScan = tcl_codify_token(myScan, "NULL", token.left(elem - token)); } - else + // handle actual element without braces/double quotes + if (nextIsPattern) + { + myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token,size)); + //printf("pattern=%s\n",(const char*) token.mid(elem - token, size)); + } + else { + myScan = tcl_codify_token(myScan, "script", token.mid(elem - token, size)); + //printf("script =%s\n", (const char*) token.mid(elem - token, size)); + } + // handle trailing whitespace/closing brace/double quotes + if (next - elem - size > 0) { - tcl_codify(NULL,myStr); + myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token + size, next - elem - size)); } + nextIsPattern = !nextIsPattern; + token = token.mid(next - token); + } + if (inBraces) + { + myScan = tcl_codify_token(myScan, "NULL", QCString("}")); + } + if (!nextIsPattern) + { + tcl_war("Invalid switch syntax: last token is not a list of even elements.\n"); + //tcl_war("%s\n", tcl.list_commandwords.join(" ").ascii()); } } - return (myScan); + else if ((tcl.list_commandwords.count() - lastOptionIndex > 6) && + ((tcl.list_commandwords.count() - lastOptionIndex-3) % 4 == 0)) + { + //printf("detected: switch ?options? string pattern body ?pattern body ...?\n"); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false); + //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)).utf8()); + for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4) + { + myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace + myScan = tcl_command_ARG(myScan, i + 1, false); // pattern + myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace + myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3)).utf8()); // script + //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)).utf8()); + //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)).utf8()); + } + } + else + { + // not properly detected syntax + tcl_war("Invalid switch syntax: %d options followed by %d tokens.\n", + lastOptionIndex / 2, (tcl.list_commandwords.count() - 1) / 2 - lastOptionIndex / 2); + for (i = lastOptionIndex + 1; i <= tcl.list_commandwords.count(); i++) + { + myScan = tcl_command_ARG(myScan, i, false); + } + } +} + +//! Handle internal tcl commands. +// "catch script ?resultVarName? ?optionsVarName?" +static void tcl_command_CATCH() +{ +D + tcl_codify_cmd("keyword", 0); + tcl_codify_cmd(NULL, 1); + tcl_scan *myScan = tcl.scan.at(0); + myScan = tcl_scan_start('?', *tcl.list_commandwords.at(2), + myScan->ns, myScan->entry_cl, myScan->entry_fn); + for (unsigned int i = 3; i < tcl.list_commandwords.count(); i++) + { + myScan = tcl_command_ARG(myScan, i, false); + } } //! Handle internal tcl commands. @@ -1937,7 +2117,7 @@ D tcl_codify_cmd(NULL,3); tcl_codify_cmd(NULL,4); tcl_codify_cmd(NULL,5); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); if (myNs.length()) { myEntryNs = tcl_entry_namespace(myNs); @@ -2195,15 +2375,62 @@ D } myEntryCl = tcl_entry_class(myName); myStr = (*tcl.list_commandwords.at(4)).utf8(); - if (tcl.list_commandwords.count() > 5) + // + // special cases first + // oo::define classname method methodname args script + // oo::define classname constructor argList bodyScript + // oo::define classname destructor bodyScript + unsigned int n =tcl.list_commandwords.count(); + if ((myStr == "method" && n == 11) || + (myStr == "constructor" && n == 9) || + (myStr == "destructor" && n == 7)) + { + for (unsigned int i = 4; i < n-1; i++) + { + tcl_codify_cmd("NULL",i); + } + Entry *myEntry; + QCString myMethod; + tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)).utf8(),myNs,myMethod); + // code snippet taken from tcl_command_METHOD()/tcl_command_CONSTRUCTOR + tcl.fn.remove(myMethod); + tcl.entry_current->section = Entry::FUNCTION_SEC; + tcl.entry_current->mtype = Method; + tcl.entry_current->name = myMethod; + tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->bodyLine = tcl.line_body0; + tcl.entry_current->endBodyLine = tcl.line_body1; + tcl_protection(tcl.entry_current); + if (n==11) + { + tcl_command_ARGLIST(*tcl.list_commandwords.at(8)); + } + else if (n==9) + { + tcl_command_ARGLIST(*tcl.list_commandwords.at(6)); + } + if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current); + tcl.fn.insert(myMethod,tcl.entry_current); + myEntry = tcl.entry_current; + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(n-1), + myNs, myEntryCl, myEntry); + } + else { - for (uint i=5;i<tcl.list_commandwords.count();i++) + // The general case + // Simply concat all arguments into a script. + // Note: all documentation collected just before the + // oo::define command is lost + if (tcl.list_commandwords.count() > 5) { - myStr.append((*tcl.list_commandwords.at(i)).utf8()); + for (uint i=5;i<tcl.list_commandwords.count();i++) + { + myStr.append((*tcl.list_commandwords.at(i)).utf8()); + } + tcl.word_is=' '; } - tcl.word_is=' '; + myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL); } - myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL); } //! Handle \c variable statements. @@ -2458,9 +2685,26 @@ tcl_inf("->\n"); } /* * Start of internal tcl keywords - * Ready: if, for, foreach, while - * TODO: switch, eval, ? + * Ready: switch, eval, catch, if, for, foreach, while */ + if (myStr=="switch") + { + if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;} + tcl_command_SWITCH(); + goto command_end; + } + if (myStr=="eval") + { + if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} + tcl_command_EVAL(); + goto command_end; + } + if (myStr=="catch") + { + if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} + tcl_command_CATCH(); + goto command_end; + } if (myStr=="for") { if (tcl.list_commandwords.count() != 9) {myLine=__LINE__;goto command_warn;} diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index f74a6a2..c36042b 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -678,9 +678,10 @@ void XmlDocVisitor::visitPre(DocImage *img) m_t << "<image type=\""; switch(img->type()) { - case DocImage::Html: m_t << "html"; break; - case DocImage::Latex: m_t << "latex"; break; - case DocImage::Rtf: m_t << "rtf"; break; + case DocImage::Html: m_t << "html"; break; + case DocImage::Latex: m_t << "latex"; break; + case DocImage::Rtf: m_t << "rtf"; break; + case DocImage::DocBook: m_t << "docbook"; break; } m_t << "\""; diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index efddcd4..2bb5734 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -727,10 +727,26 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De if (md->isGettable()) t << "yes"; else t << "no"; t << "\""; + t << " privategettable=\""; + if (md->isPrivateGettable()) t << "yes"; else t << "no"; + t << "\""; + + t << " protectedgettable=\""; + if (md->isProtectedGettable()) t << "yes"; else t << "no"; + t << "\""; + t << " settable=\""; if (md->isSettable()) t << "yes"; else t << "no"; t << "\""; + t << " privatesettable=\""; + if (md->isPrivateSettable()) t << "yes"; else t << "no"; + t << "\""; + + t << " protectedsettable=\""; + if (md->isProtectedSettable()) t << "yes"; else t << "no"; + t << "\""; + if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak()) { t << " accessor=\""; |