diff options
Diffstat (limited to 'src')
49 files changed, 835 insertions, 415 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index a24ffe5..e7ff73d 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -170,6 +170,11 @@ void ClassDef::addMembersToMemberGroup() ::addMembersToMemberGroup(&dcopMethods,memberGroupSDict,this); ::addMembersToMemberGroup(&pubStaticMethods,memberGroupSDict,this); ::addMembersToMemberGroup(&pubStaticAttribs,memberGroupSDict,this); + ::addMembersToMemberGroup(&pacTypes,memberGroupSDict,this); + ::addMembersToMemberGroup(&pacMethods,memberGroupSDict,this); + ::addMembersToMemberGroup(&pacAttribs,memberGroupSDict,this); + ::addMembersToMemberGroup(&pacStaticMethods,memberGroupSDict,this); + ::addMembersToMemberGroup(&pacStaticAttribs,memberGroupSDict,this); ::addMembersToMemberGroup(&proTypes,memberGroupSDict,this); ::addMembersToMemberGroup(&proMethods,memberGroupSDict,this); ::addMembersToMemberGroup(&proAttribs,memberGroupSDict,this); @@ -247,9 +252,11 @@ void ClassDef::internalInsertMember(MemberDef *md, switch (prot) { case Protected: + case Package: // slots in packages are not possible! proSlots.append(md); md->setSectionList(this,&proSlots); break; + break; case Public: pubSlots.append(md); md->setSectionList(this,&pubSlots); @@ -271,6 +278,10 @@ void ClassDef::internalInsertMember(MemberDef *md, proStaticAttribs.append(md); md->setSectionList(this,&proStaticAttribs); break; + case Package: + pacStaticAttribs.append(md); + md->setSectionList(this,&pacStaticAttribs); + break; case Public: pubStaticAttribs.append(md); md->setSectionList(this,&pubStaticAttribs); @@ -289,6 +300,10 @@ void ClassDef::internalInsertMember(MemberDef *md, proStaticMethods.append(md); md->setSectionList(this,&proStaticMethods); break; + case Package: + pacStaticMethods.append(md); + md->setSectionList(this,&pacStaticMethods); + break; case Public: pubStaticMethods.append(md); md->setSectionList(this,&pubStaticMethods); @@ -310,6 +325,10 @@ void ClassDef::internalInsertMember(MemberDef *md, proAttribs.append(md); md->setSectionList(this,&proAttribs); break; + case Package: + pacAttribs.append(md); + md->setSectionList(this,&pacAttribs); + break; case Public: pubAttribs.append(md); md->setSectionList(this,&pubAttribs); @@ -328,6 +347,10 @@ void ClassDef::internalInsertMember(MemberDef *md, proTypes.append(md); md->setSectionList(this,&proTypes); break; + case Package: + pacTypes.append(md); + md->setSectionList(this,&pacTypes); + break; case Public: pubTypes.append(md); md->setSectionList(this,&pubTypes); @@ -346,6 +369,10 @@ void ClassDef::internalInsertMember(MemberDef *md, proMethods.append(md); md->setSectionList(this,&proMethods); break; + case Package: + pacMethods.append(md); + md->setSectionList(this,&pacMethods); + break; case Public: pubMethods.append(md); md->setSectionList(this,&pubMethods); @@ -401,11 +428,7 @@ void ClassDef::internalInsertMember(MemberDef *md, switch (prot) { case Protected: - if (Config_getBool("SORT_MEMBER_DOCS")) - functionMembers.inSort(md); - else - functionMembers.append(md); - break; + case Package: case Public: if (Config_getBool("SORT_MEMBER_DOCS")) functionMembers.inSort(md); @@ -517,28 +540,32 @@ void ClassDef::computeAnchors() ClassDef *context = Config_getBool("INLINE_INHERITED_MEMB") ? this : 0; setAnchors(context,'a',&pubMethods); setAnchors(context,'b',&proMethods); - setAnchors(context,'c',&priMethods); - setAnchors(context,'d',&pubStaticMethods); - setAnchors(context,'e',&proStaticMethods); - setAnchors(context,'f',&priStaticMethods); - setAnchors(context,'g',&pubSlots); - setAnchors(context,'h',&proSlots); - setAnchors(context,'i',&priSlots); - setAnchors(context,'j',&signals); - setAnchors(context,'k',&related); - setAnchors(context,'l',&friends); - setAnchors(context,'m',&pubAttribs); - setAnchors(context,'n',&proAttribs); - setAnchors(context,'o',&priAttribs); - setAnchors(context,'p',&pubStaticAttribs); - setAnchors(context,'q',&proStaticAttribs); - setAnchors(context,'r',&priStaticAttribs); - setAnchors(context,'s',&pubTypes); - setAnchors(context,'t',&proTypes); - setAnchors(context,'u',&priTypes); - setAnchors(context,'v',&dcopMethods); - setAnchors(context,'w',&properties); - setAnchors(context,'x',&events); + setAnchors(context,'c',&pacMethods); + setAnchors(context,'d',&priMethods); + setAnchors(context,'e',&pubStaticMethods); + setAnchors(context,'f',&proStaticMethods); + setAnchors(context,'g',&pacStaticMethods); + setAnchors(context,'h',&priStaticMethods); + setAnchors(context,'i',&pubSlots); + setAnchors(context,'j',&proSlots); + setAnchors(context,'k',&priSlots); + setAnchors(context,'l',&signals); + setAnchors(context,'m',&related); + setAnchors(context,'n',&friends); + setAnchors(context,'o',&pubAttribs); + setAnchors(context,'p',&proAttribs); + setAnchors(context,'q',&pacAttribs); + setAnchors(context,'r',&priAttribs); + setAnchors(context,'s',&pubStaticAttribs); + setAnchors(context,'t',&proStaticAttribs); + setAnchors(context,'u',&pacStaticAttribs); + setAnchors(context,'v',&priStaticAttribs); + setAnchors(context,'w',&pubTypes); + setAnchors(context,'x',&proTypes); + setAnchors(context,'y',&priTypes); + setAnchors(context,'z',&dcopMethods); + setAnchors(context,'0',&properties); + setAnchors(context,'1',&events); MemberGroupSDict::Iterator mgli(*memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) @@ -574,6 +601,11 @@ void ClassDef::findSectionsInDocumentation() dcopMethods.findSectionsInDocumentation(); pubStaticMethods.findSectionsInDocumentation(); pubStaticAttribs.findSectionsInDocumentation(); + pacTypes.findSectionsInDocumentation(); + pacMethods.findSectionsInDocumentation(); + pacAttribs.findSectionsInDocumentation(); + pacStaticMethods.findSectionsInDocumentation(); + pacStaticAttribs.findSectionsInDocumentation(); proTypes.findSectionsInDocumentation(); proMethods.findSectionsInDocumentation(); proAttribs.findSectionsInDocumentation(); @@ -1155,7 +1187,18 @@ void ClassDef::writeDocumentation(OutputList &ol) proAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trProtectedAttribs(),0); proStaticAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticProtectedAttribs(),0); - // properties + // package types + pacTypes.writeDeclarations(ol,this,0,0,0,theTranslator->trPackageTypes(),0); + + // package methods + pacMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trPackageMembers(),0); + pacStaticMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPackageMembers(),0); + + // package attribs + pacAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trPackageAttribs(),0); + pacStaticAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPackageAttribs(),0); + + // package properties.writeDeclarations(ol,this,0,0,0,theTranslator->trProperties(),0); // events @@ -1463,6 +1506,7 @@ void ClassDef::writeMemberList(OutputList &ol) if (md->isMutable()) sl.append("mutable"); if (prot==Protected) sl.append("protected"); else if (prot==Private) sl.append("private"); + else if (prot==Package) sl.append("package"); if (virt==Virtual) sl.append("virtual"); else if (virt==Pure) sl.append("pure virtual"); if (md->isStatic()) sl.append("static"); @@ -1639,6 +1683,16 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup) proStaticMethods.writePlainDeclarations(ol,this,0,0,0); proStaticAttribs.setInGroup(inGroup); proStaticAttribs.writePlainDeclarations(ol,this,0,0,0); + pacTypes.setInGroup(inGroup); + pacTypes.writePlainDeclarations(ol,this,0,0,0); + pacMethods.setInGroup(inGroup); + pacMethods.writePlainDeclarations(ol,this,0,0,0); + pacAttribs.setInGroup(inGroup); + pacAttribs.writePlainDeclarations(ol,this,0,0,0); + pacStaticMethods.setInGroup(inGroup); + pacStaticMethods.writePlainDeclarations(ol,this,0,0,0); + pacStaticAttribs.setInGroup(inGroup); + pacStaticAttribs.writePlainDeclarations(ol,this,0,0,0); if (Config_getBool("EXTRACT_PRIVATE")) { priTypes.setInGroup(inGroup); @@ -2534,7 +2588,7 @@ QCString ClassDef::className() const void ClassDef::addListReferences() { - addRefItem(specialListItems(), + addRefItem(xrefListItems(), theTranslator->trClass(TRUE,TRUE), getOutputFileBase(),displayName() ); diff --git a/src/classdef.h b/src/classdef.h index 5049d11..022309d 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -199,21 +199,26 @@ class ClassDef : public Definition /* member lists by protection */ MemberList pubMethods; MemberList proMethods; + MemberList pacMethods; MemberList priMethods; MemberList pubStaticMethods; MemberList proStaticMethods; + MemberList pacStaticMethods; MemberList priStaticMethods; MemberList pubSlots; MemberList proSlots; MemberList priSlots; MemberList pubAttribs; MemberList proAttribs; + MemberList pacAttribs; MemberList priAttribs; MemberList pubStaticAttribs; MemberList proStaticAttribs; + MemberList pacStaticAttribs; MemberList priStaticAttribs; MemberList pubTypes; MemberList proTypes; + MemberList pacTypes; MemberList priTypes; MemberList related; MemberList signals; diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 8724d53..41fda43 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -27,12 +27,10 @@ CommandMap cmdMap[] = { "attention", CMD_ATTENTION }, { "author", CMD_AUTHOR }, { "b", CMD_BOLD }, - { "bug", CMD_BUG }, { "c", CMD_CODE }, { "code", CMD_STARTCODE }, { "copydoc", CMD_COPYDOC }, { "date", CMD_DATE }, - { "deprecated", CMD_DEPRECATED }, { "dontinclude", CMD_DONTINCLUDE }, { "dotfile", CMD_DOTFILE }, { "e", CMD_EMPHASIS }, @@ -81,9 +79,8 @@ CommandMap cmdMap[] = { "since", CMD_SINCE }, { "skip", CMD_SKIP }, { "skipline", CMD_SKIPLINE }, - { "test", CMD_TEST }, + { "xrefitem", CMD_XREFITEM }, { "throw", CMD_EXCEPTION }, - { "todo", CMD_TODO }, { "until", CMD_UNTIL }, { "verbatim", CMD_VERBATIM }, { "verbinclude", CMD_VERBINCLUDE }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 989111a..c5cf2ab 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -33,76 +33,73 @@ enum CommandType { CMD_UNKNOWN = 0, CMD_ADDINDEX = 1, - CMD_ANCHOR = 2, - CMD_ATTENTION = 3 | SIMPLESECT_BIT, - CMD_AUTHOR = 4 | SIMPLESECT_BIT, - CMD_BOLD = 5, - CMD_BUG = 6 | SIMPLESECT_BIT, - CMD_CODE = 7, - CMD_COPYDOC = 8, - CMD_DATE = 9 | SIMPLESECT_BIT, - CMD_DEPRECATED = 10 | SIMPLESECT_BIT, - CMD_DONTINCLUDE = 11, - CMD_DOTFILE = 12, - CMD_EMPHASIS = 13, - CMD_ENDCODE = 14, - CMD_ENDHTMLONLY = 15, - CMD_ENDLATEXONLY = 16, - CMD_ENDLINK = 17, - CMD_ENDVERBATIM = 18, - CMD_EXCEPTION = 19 | SIMPLESECT_BIT, - CMD_HTMLINCLUDE = 20, - CMD_HTMLONLY = 21, - CMD_IMAGE = 22, - CMD_INCLUDE = 23, - CMD_INTERNAL = 24, - CMD_INVARIANT = 25 | SIMPLESECT_BIT , - CMD_LATEXONLY = 26, - CMD_LI = 27, - CMD_LINE = 28, - CMD_LINK = 29, - CMD_NOTE = 30 | SIMPLESECT_BIT , - CMD_PAR = 31 | SIMPLESECT_BIT , - CMD_PARAM = 32 | SIMPLESECT_BIT, - CMD_POST = 33 | SIMPLESECT_BIT, - CMD_PRE = 34 | SIMPLESECT_BIT , - CMD_REF = 35, - CMD_SECREFITEM = 36, - CMD_REMARK = 37 | SIMPLESECT_BIT , - CMD_RETURN = 38 | SIMPLESECT_BIT , - CMD_RETVAL = 39 | SIMPLESECT_BIT, - CMD_SA = 40 | SIMPLESECT_BIT , - CMD_SECTION = 41, - CMD_SUBSECTION = 42, - CMD_SUBSUBSECTION= 43, - CMD_PARAGRAPH = 44, - CMD_SINCE = 45 | SIMPLESECT_BIT, - CMD_SKIP = 46, - CMD_SKIPLINE = 47, - CMD_STARTCODE = 48, - CMD_JAVALINK = 49, - CMD_TEST = 50 | SIMPLESECT_BIT, - CMD_TODO = 51 | SIMPLESECT_BIT, - CMD_UNTIL = 52, - CMD_VERBATIM = 53, - CMD_VERBINCLUDE = 54, - CMD_VERSION = 55 | SIMPLESECT_BIT, - CMD_WARNING = 56 | SIMPLESECT_BIT , - CMD_BSLASH = 57, - CMD_AT = 58, - CMD_LESS = 59, - CMD_GREATER = 60, - CMD_AMP = 61, - CMD_DOLLAR = 62, - CMD_HASH = 63, - CMD_PERCENT = 64, - CMD_LINEBREAK = 65, - CMD_FORMULA = 66, - CMD_SECREFLIST = 67, - CMD_ENDSECREFLIST= 68, - CMD_LANGSWITCH = 69, - CMD_AUTHORS = 70 | SIMPLESECT_BIT, - CMD_INTERNALREF = 71 + CMD_AMP = 2, + CMD_ANCHOR = 3, + CMD_AT = 4, + CMD_ATTENTION = 5 | SIMPLESECT_BIT, + CMD_AUTHOR = 6 | SIMPLESECT_BIT, + CMD_AUTHORS = 7 | SIMPLESECT_BIT, + CMD_BOLD = 8, + CMD_BSLASH = 9, + CMD_CODE = 10, + CMD_COPYDOC = 11, + CMD_DATE = 12 | SIMPLESECT_BIT, + CMD_DOLLAR = 13, + CMD_DONTINCLUDE = 14, + CMD_DOTFILE = 15, + CMD_EMPHASIS = 16, + CMD_ENDCODE = 17, + CMD_ENDHTMLONLY = 18, + CMD_ENDLATEXONLY = 19, + CMD_ENDLINK = 20, + CMD_ENDSECREFLIST= 21, + CMD_ENDVERBATIM = 22, + CMD_EXCEPTION = 23 | SIMPLESECT_BIT, + CMD_FORMULA = 24, + CMD_GREATER = 25, + CMD_HASH = 26, + CMD_HTMLINCLUDE = 27, + CMD_HTMLONLY = 28, + CMD_IMAGE = 29, + CMD_INCLUDE = 30, + CMD_INTERNAL = 31, + CMD_INTERNALREF = 32, + CMD_INVARIANT = 33 | SIMPLESECT_BIT , + CMD_LANGSWITCH = 34, + CMD_LATEXONLY = 35, + CMD_LESS = 36, + CMD_LI = 37, + CMD_LINE = 38, + CMD_LINEBREAK = 39, + CMD_LINK = 40, + CMD_NOTE = 41 | SIMPLESECT_BIT, + CMD_PAR = 42 | SIMPLESECT_BIT, + CMD_PARAM = 43 | SIMPLESECT_BIT, + CMD_PERCENT = 44, + CMD_POST = 45 | SIMPLESECT_BIT, + CMD_PRE = 46 | SIMPLESECT_BIT , + CMD_REF = 47, + CMD_SECREFITEM = 48, + CMD_REMARK = 49 | SIMPLESECT_BIT , + CMD_RETURN = 50 | SIMPLESECT_BIT , + CMD_RETVAL = 51 | SIMPLESECT_BIT, + CMD_SA = 52 | SIMPLESECT_BIT , + CMD_SECREFLIST = 53, + CMD_SECTION = 54, + CMD_SUBSECTION = 55, + CMD_SUBSUBSECTION= 56, + CMD_PARAGRAPH = 57, + CMD_SINCE = 58 | SIMPLESECT_BIT, + CMD_SKIP = 59, + CMD_SKIPLINE = 60, + CMD_STARTCODE = 61, + CMD_JAVALINK = 62, + CMD_UNTIL = 63, + CMD_VERBATIM = 64, + CMD_VERBINCLUDE = 65, + CMD_VERSION = 66 | SIMPLESECT_BIT, + CMD_WARNING = 67 | SIMPLESECT_BIT, + CMD_XREFITEM = 68 | SIMPLESECT_BIT }; enum HtmlTagType diff --git a/src/config.l b/src/config.l index 184763d..875f9e6 100644 --- a/src/config.l +++ b/src/config.l @@ -1078,6 +1078,7 @@ void Config::check() filePatternList.append("*.h++"); filePatternList.append("*.idl"); filePatternList.append("*.odl"); + filePatternList.append("*.cs"); } // add default pattern if needed @@ -1527,13 +1528,6 @@ void Config::create() FALSE ); cb = addBool( - "VERBATIM_HEADERS", - "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n" - "will generate a verbatim copy of the header file for each class for \n" - "which an include is specified. Set to NO to disable this. \n", - TRUE - ); - cb = addBool( "SHOW_INCLUDE_FILES", "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n" "will put list of the files that are included by a file in the documentation \n" @@ -1741,7 +1735,7 @@ void Config::create() "and *.h) to filter out the source-files in the directories. If left \n" "blank the following patterns are tested: \n" "*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n" - "*.h++ *.idl *.odl\n" + "*.h++ *.idl *.odl *.cs\n" ); cb = addBool( "RECURSIVE", @@ -1851,6 +1845,13 @@ void Config::create() TRUE ); cb->addDependency("SOURCE_BROWSER"); + cb = addBool( + "VERBATIM_HEADERS", + "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n" + "will generate a verbatim copy of the header file for each class for \n" + "which an include is specified. Set to NO to disable this. \n", + TRUE + ); //----------------------------------------------------------------------------------------------- addInfo( "Index","configuration options related to the alphabetical class index"); //----------------------------------------------------------------------------------------------- diff --git a/src/defgen.cpp b/src/defgen.cpp index 2216dd9..16352b9 100644 --- a/src/defgen.cpp +++ b/src/defgen.cpp @@ -121,6 +121,7 @@ void generateDEFForMember(MemberDef *md, case Public: t << "public;" << endl; break; case Protected: t << "protected;" << endl; break; case Private: t << "private;" << endl; break; + case Package: t << "package;" << endl; break; } if (md->memberType()!=MemberDef::Define && @@ -365,6 +366,7 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t) switch (bcd->prot) { case Public: t << "public;" << endl; break; + case Package: // package scope is not possible case Protected: t << "protected;" << endl; break; case Private: t << "private;" << endl; break; } @@ -392,6 +394,7 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t) switch (bcd->prot) { case Public: t << "public;" << endl; break; + case Package: // packet scope is not possible! case Protected: t << "protected;" << endl; break; case Private: t << "private;" << endl; break; } diff --git a/src/definition.cpp b/src/definition.cpp index 5d64a00..ad50412 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -58,7 +58,7 @@ Definition::Definition(const char *df,int dl, m_deprecatedId=0; m_outerScope=Doxygen::globalScope; m_partOfGroups=0; - m_specialListItems=0; + m_xrefListItems=0; m_briefLine=1; m_briefFile=(QCString)"<"+name+">"; m_docLine=1; @@ -71,7 +71,7 @@ Definition::~Definition() delete m_sourceRefByDict; delete m_sourceRefsDict; delete m_partOfGroups; - delete m_specialListItems; + delete m_xrefListItems; } void Definition::addSectionsToDefinition(QList<QCString> *anchorList) @@ -612,47 +612,47 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli) if (sli) { // deep copy the list - if (m_specialListItems==0) + if (m_xrefListItems==0) { - m_specialListItems=new QList<ListItemInfo>; - m_specialListItems->setAutoDelete(TRUE); + m_xrefListItems=new QList<ListItemInfo>; + m_xrefListItems->setAutoDelete(TRUE); } QListIterator<ListItemInfo> slii(*sli); ListItemInfo *lii; for (slii.toFirst();(lii=slii.current());++slii) { - m_specialListItems->append(new ListItemInfo(*lii)); + m_xrefListItems->append(new ListItemInfo(*lii)); } } } void Definition::mergeRefItems(Definition *d) { - if (d->specialListItems()) + if (d->xrefListItems()) { // deep copy the list - if (m_specialListItems==0) + if (m_xrefListItems==0) { - m_specialListItems=new QList<ListItemInfo>; - m_specialListItems->setAutoDelete(TRUE); + m_xrefListItems=new QList<ListItemInfo>; + m_xrefListItems->setAutoDelete(TRUE); } - QListIterator<ListItemInfo> slii(*d->specialListItems()); + QListIterator<ListItemInfo> slii(*d->xrefListItems()); ListItemInfo *lii; for (slii.toFirst();(lii=slii.current());++slii) { - if (getSpecialListId(lii->type)==-1) + if (getXRefListId(lii->type)==-1) { - m_specialListItems->append(new ListItemInfo(*lii)); + m_xrefListItems->append(new ListItemInfo(*lii)); } } } } -int Definition::getSpecialListId(const char *listName) const +int Definition::getXRefListId(const char *listName) const { - if (m_specialListItems) + if (m_xrefListItems) { - QListIterator<ListItemInfo> slii(*m_specialListItems); + QListIterator<ListItemInfo> slii(*m_xrefListItems); ListItemInfo *lii; for (slii.toFirst();(lii=slii.current());++slii) { @@ -665,9 +665,9 @@ int Definition::getSpecialListId(const char *listName) const return -1; } -const QList<ListItemInfo> *Definition::specialListItems() const +const QList<ListItemInfo> *Definition::xrefListItems() const { - return m_specialListItems; + return m_xrefListItems; } diff --git a/src/definition.h b/src/definition.h index 68b7a92..4c6cff6 100644 --- a/src/definition.h +++ b/src/definition.h @@ -39,7 +39,8 @@ class Definition /*! Types of derived classes */ enum DefType { - TypeClass, TypeMember, TypeFile, TypeGroup, TypeNamespace, TypePackage + TypeClass, TypeMember, TypeFile, TypeGroup, + TypeNamespace, TypePackage, TypePage }; /*! Use this for dynamic inspection of the derived class */ virtual DefType definitionType() = 0; @@ -114,8 +115,7 @@ class Definition //int bugId() const { return m_bugId; } void setRefItems(const QList<ListItemInfo> *sli); void mergeRefItems(Definition *d); - int getSpecialListId(const char *listName) const; - const QList<ListItemInfo> *specialListItems() const; + const QList<ListItemInfo> *xrefListItems() const; /*! returns the file in which this definition was found */ QCString getDefFileName() const { return m_defFileName; } @@ -154,6 +154,7 @@ class Definition private: + int getXRefListId(const char *listName) const; void writeSourceRefList(OutputList &ol,const char *scopeName, const QCString &text,MemberSDict *members,bool); //QCString m_qualifiedName; // name of the definition @@ -171,7 +172,7 @@ class Definition QCString m_docFile; int m_briefLine; QCString m_briefFile; - QList<ListItemInfo> *m_specialListItems; + QList<ListItemInfo> *m_xrefListItems; }; class DefinitionList : public QList<Definition> diff --git a/src/diagram.cpp b/src/diagram.cpp index c1291de..3c9c39e 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -62,6 +62,7 @@ static uint protToMask(Protection p) switch(p) { case Public: return 0xffffffff; + case Package: // package is not possible! case Protected: return 0xcccccccc; case Private: return 0xaaaaaaaa; } @@ -73,6 +74,7 @@ static uint protToColor(Protection p) switch(p) { case Public: return 6; + case Package: // package is not possible! case Protected: return 5; case Private: return 4; } @@ -84,6 +86,7 @@ static QCString protToString(Protection p) switch(p) { case Public: return "solid"; + case Package: // package is not possible! case Protected: return "dashed"; case Private: return "dotted"; } diff --git a/src/docparser.cpp b/src/docparser.cpp index bd50337..27c2d18 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -1361,15 +1361,23 @@ void DocCopy::parse() void DocXRefItem::parse() { QString listName; - switch(m_type) - { - case Bug: listName="bug"; break; - case Test: listName="test"; break; - case Todo: listName="todo"; break; - case Deprecated: listName="deprecated"; break; - } - RefList *refList = Doxygen::specialLists->find(listName); - if (Config_getBool(refList->optionName())) // list is enabled + //switch(m_type) + //{ + // case Bug: listName="bug"; break; + // case Test: listName="test"; break; + // case Todo: listName="todo"; break; + // case Deprecated: listName="deprecated"; break; + //} + RefList *refList = Doxygen::xrefLists->find(m_key); + if (refList && + ( + // either not a built-in list or the list is enabled + (m_key!="todo" || Config_getBool("GENERATE_TODOLIST")) && + (m_key!="test" || Config_getBool("GENERATE_TESTLIST")) && + (m_key!="bug" || Config_getBool("GENERATE_BUGLIST")) && + (m_key!="deprecated" || Config_getBool("GENERATE_DEPRECATEDLIST")) + ) + ) { RefItem *item = refList->getRefItem(m_id); ASSERT(item!=0); @@ -3116,15 +3124,15 @@ int DocPara::handleParamSection(const QString &cmdName,DocParamSect::Type t) return (rv!=TK_NEWPARA) ? rv : RetVal_OK; } -int DocPara::handleXRefItem(DocXRefItem::Type t) +int DocPara::handleXRefItem() { int retval=doctokenizerYYlex(); ASSERT(retval==TK_WHITESPACE); doctokenizerYYsetStateXRefItem(); retval=doctokenizerYYlex(); - if (retval!=0) + if (retval==RetVal_OK) { - DocXRefItem *ref = new DocXRefItem(this,g_token->id,t); + DocXRefItem *ref = new DocXRefItem(this,g_token->id,g_token->name); m_children.append(ref); ref->parse(); } @@ -3601,17 +3609,8 @@ int DocPara::handleCommand(const QString &cmdName) case CMD_EXCEPTION: retval = handleParamSection(cmdName,DocParamSect::Exception); break; - case CMD_BUG: - retval = handleXRefItem(DocXRefItem::Bug); - break; - case CMD_TODO: - retval = handleXRefItem(DocXRefItem::Todo); - break; - case CMD_TEST: - retval = handleXRefItem(DocXRefItem::Test); - break; - case CMD_DEPRECATED: - retval = handleXRefItem(DocXRefItem::Deprecated); + case CMD_XREFITEM: + retval = handleXRefItem(); break; case CMD_LINEBREAK: { @@ -3801,6 +3800,12 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag case HTML_EMPHASIS: handleStyleEnter(this,m_children,DocStyleChange::Italic,&g_token->attribs); break; + case HTML_DIV: + handleStyleEnter(this,m_children,DocStyleChange::Div,&g_token->attribs); + break; + case HTML_SPAN: + handleStyleEnter(this,m_children,DocStyleChange::Span,&g_token->attribs); + break; case HTML_SUB: handleStyleEnter(this,m_children,DocStyleChange::Subscript,&g_token->attribs); break; @@ -4029,6 +4034,12 @@ int DocPara::handleHtmlEndTag(const QString &tagName) case HTML_EMPHASIS: handleStyleLeave(this,m_children,DocStyleChange::Italic,"em"); break; + case HTML_DIV: + handleStyleLeave(this,m_children,DocStyleChange::Div,"div"); + break; + case HTML_SPAN: + handleStyleLeave(this,m_children,DocStyleChange::Span,"span"); + break; case HTML_SUB: handleStyleLeave(this,m_children,DocStyleChange::Subscript,"sub"); break; diff --git a/src/docparser.h b/src/docparser.h index 72c7d9b..d413a5a 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -532,11 +532,11 @@ class DocTitle : public CompAccept<DocTitle>, public DocNode class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode { public: - enum Type { Bug, Test, Todo, Deprecated }; - DocXRefItem(DocNode *parent,int id,Type t) : - m_parent(parent), m_id(id), m_type(t) {} + //enum Type { Bug, Test, Todo, Deprecated }; + DocXRefItem(DocNode *parent,int id,const char *key) : + m_parent(parent), m_id(id), m_key(key) /*, m_type(t)*/ {} Kind kind() const { return Kind_XRefItem; } - Type type() const { return m_type; } + //Type type() const { return m_type; } QString file() const { return m_file; } QString anchor() const { return m_anchor; } QString title() const { return m_title; } @@ -547,7 +547,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode private: DocNode *m_parent; int m_id; - Type m_type; + QString m_key; QString m_file; QString m_anchor; QString m_title; @@ -927,7 +927,7 @@ class DocPara : public CompAccept<DocPara>, public DocNode int handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tagHtmlAttribs); int handleHtmlEndTag(const QString &tagName); int handleSimpleSection(DocSimpleSect::Type t); - int handleXRefItem(DocXRefItem::Type t); + int handleXRefItem(); int handleParamSection(const QString &cmdName,DocParamSect::Type t); void handleIncludeOperator(const QString &cmdName,DocIncOperator::Type t); void handleImage(const QString &cmdName); diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 7655b54..0ed018d 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -314,6 +314,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* %x St_Verbatim %x St_Param %x St_XRefItem +%x St_XRefItem2 %x St_File %x St_Pattern %x St_Link @@ -651,7 +652,13 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* <St_Ref2>"\""|\n { /* " or \n => end of title */ return 0; } -<St_XRefItem>[0-9]+\n { +<St_XRefItem>{ID} { + g_token->name=yytext; + } +<St_XRefItem>" " { + BEGIN(St_XRefItem2); + } +<St_XRefItem2>[0-9]+\n { QString numStr=yytext; numStr=numStr.left(yyleng-1); g_token->id=numStr.toInt(); diff --git a/src/dot.cpp b/src/dot.cpp index 0a10ab9..32a9841 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -46,12 +46,36 @@ static const char *edgeColorMap[] = "orange" // template relation }; +//static const char *arrowStyle[] = +//{ +// "empty", // Public +// "empty", // Protected +// "empty", // Private +// "open", // "use" relation +// 0, // Undocumented +// 0 // template relation +//}; + static const char *edgeStyleMap[] = { "solid", // inheritance "dashed" // usage }; +static void writeGraphHeader(QTextStream &t) +{ + t << "digraph G" << endl; + t << "{" << endl; + t << " edge [fontname=\"Helvetica\",fontsize=10," + "labelfontname=\"Helvetica\",labelfontsize=10];\n"; + t << " node [fontname=\"Helvetica\",fontsize=10,shape=record];\n"; +} + +static void writeGraphFooter(QTextStream &t) +{ + t << "}" << endl; +} + /*! converts the rectangles in a server site image map into a client * site image map. * \param t the stream to which the result is written. @@ -382,14 +406,20 @@ static QCString convertLabel(const QCString &l) char c; while ((c=*p++)) { - if (c=='\\') result+="\\\\"; - else result+=c; + switch(c) + { + case '\\': result+="\\\\"; break; + case '<': result+="\\<"; break; + case '>': result+="\\>"; break; + case '|': result+="\\|"; break; + default: result+=c; break; + } } return result; } void DotNode::writeBox(QTextStream &t, - GraphOutputFormat format, + GraphOutputFormat /*format*/, bool hasNonReachableChildren) { const char *labCol = @@ -397,10 +427,10 @@ void DotNode::writeBox(QTextStream &t, ( (hasNonReachableChildren) ? "red" : "black" ); - t << " Node" << m_number << " [shape=\"box\",label=\"" + t << " Node" << m_number << " [label=\"" << convertLabel(m_label) - << "\",fontsize=10,height=0.2,width=0.4"; - if (format==BITMAP) t << ",fontname=\"Helvetica\""; + << "\",height=0.2,width=0.4"; + //if (format==BITMAP) t << ",fontname=\"Helvetica\""; t << ",color=\"" << labCol << "\""; if (m_isRoot) { @@ -433,6 +463,10 @@ void DotNode::writeArrow(QTextStream &t, { t << ",label=\"" << ei->m_label << "\""; } + //if (arrowStyle[ei->m_color]) + //{ + // if (pointBack) t << ",arrowtail=\"empty\""; else t << ",arrowhead=\"empty\""; + //} if (format==BITMAP) t << ",fontname=\"Helvetica\""; t << "];" << endl; } @@ -768,8 +802,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) QFile f(dotName); if (!f.open(IO_WriteOnly)) return; QTextStream t(&f); - t << "digraph inheritance" << endl; - t << "{" << endl; + writeGraphHeader(t); t << " rankdir=LR;" << endl; QListIterator<DotNode> dnli2(*m_rootNodes); DotNode *node; @@ -778,7 +811,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) if (node->m_subgraphId==n->m_subgraphId) node->write(t,BITMAP,FALSE,TRUE,1000,TRUE); } - t << "}" << endl; + writeGraphFooter(t); f.close(); QCString dotArgs(maxCmdLine); @@ -1203,8 +1236,7 @@ void writeDotGraph(DotNode *root, if (f.open(IO_WriteOnly)) { QTextStream t(&f); - t << "digraph inheritance" << endl; - t << "{" << endl; + writeGraphHeader(t); if (lrRank) { t << " rankdir=LR;" << endl; @@ -1231,7 +1263,7 @@ void writeDotGraph(DotNode *root, pn->write(t,format,TRUE,FALSE,distance,backArrows); } } - t << "}" << endl; + writeGraphFooter(t); f.close(); } } @@ -1725,8 +1757,7 @@ void generateGraphLegend(const char *path) return; } QTextStream dotText(&dotFile); - dotText << "digraph inheritance\n"; - dotText << "{\n"; + writeGraphHeader(dotText); dotText << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",style=\"filled\" fontcolor=\"white\"];\n"; dotText << " Node10 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n"; dotText << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classPublicBase" << Doxygen::htmlFileExtension << "\"];\n"; @@ -1744,7 +1775,7 @@ void generateGraphLegend(const char *path) dotText << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n"; dotText << " Node18 -> Node9 [dir=back,color=\"darkorchid3\",fontsize=10,style=\"dashed\",label=\"m_usedClass\",fontname=\"Helvetica\"];\n"; dotText << " Node18 [shape=\"box\",label=\"Used\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classUsed" << Doxygen::htmlFileExtension << "\"];\n"; - dotText << "}\n"; + writeGraphFooter(dotText); dotFile.close(); QDir d(path); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index f51be68..b3600f7 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -112,7 +112,7 @@ bool Doxygen::insideMainPage = FALSE; // are we generating docs for th QTextStream Doxygen::tagFile; NamespaceDef *Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>"); -QDict<RefList> *Doxygen::specialLists = new QDict<RefList>; // dictionary of cross-referenced item lists +QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists static StringList inputFiles; @@ -2985,6 +2985,12 @@ static void findUsedClassesForClass(Entry *root, QCString typeName = resolveTypeDef(masterCd,usedClassName); //printf("Found resolved class %s\n",typeName.data()); + int si=usedClassName.findRev("::"); + if (si!=-1) + { + // replace any namespace aliases + replaceNamespaceAliases(usedClassName,si); + } // add any template arguments to the class QCString usedName = usedClassName+templSpec; @@ -3341,96 +3347,6 @@ static bool findClassRelation( // cd->name().data(),baseClassName.data(),baseClass); found = baseClass!=0 && baseClass!=cd; -#if 0 - if (fd) - { - // look for the using statement in this file in which the - // class was found - NamespaceList *nl = fd->getUsedNamespaces(); - if (nl) // try to prepend any of the using namespace scopes. - { - NamespaceListIterator nli(*nl); - NamespaceDef *nd; - for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli) - { - QCString fName = nd->name()+"::"+baseClassName; - found = (baseClass=getResolvedClass(cd,fName))!=0 && - baseClass!=cd && - root->name!=fName; - } - } - if (fd && !found) // and in the global namespace - { - ClassList *cl = fd->getUsedClasses(); - if (cl) - { - ClassListIterator cli(*cl); - ClassDef *ucd; - for (cli.toFirst(); (ucd=cli.current()) && !found; ++cli) - { - if (rightScopeMatch(ucd->name(),biName)) - { - baseClass = ucd; - found = TRUE; - } - } - } - } - } - if (!found && nd) // class is inside a namespace - { - NamespaceList *nl = nd->getUsedNamespaces(); - QCString fName = nd->name()+"::"+baseClassName; - found = (baseClass=getResolvedClass(cd,fName))!=0 && root->name!=fName; - if (nl) // try to prepend any of the using namespace scopes. - { - NamespaceListIterator nli(*nl); - NamespaceDef *nd; - for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli) - { - fName = nd->name()+"::"+baseClassName; - found = (baseClass=getResolvedClass(cd,fName))!=0 && - baseClass!=cd && - root->name!=fName; - } - } - if (!found) // also check imported classes within this namespace - { - ClassList *cl = nd->getUsedClasses(); - if (cl) - { - ClassListIterator cli(*cl); - ClassDef *ucd; - for (cli.toFirst(); (ucd=cli.current()) && !found; ++cli) - { - if (rightScopeMatch(ucd->name(),biName)) - { - baseClass = ucd; - found = TRUE; - } - } - } - } - // TODO: check any inbetween namespaces as well! - if (fd && !found) // and in the global namespace - { - ClassList *cl = fd->getUsedClasses(); - if (cl) - { - ClassListIterator cli(*cl); - ClassDef *ucd; - for (cli.toFirst(); (ucd=cli.current()) && !found; ++cli) - { - if (rightScopeMatch(ucd->name(),biName)) - { - baseClass = ucd; - found = TRUE; - } - } - } - } - } -#endif } bool isATemplateArgument = templateNames!=0 && templateNames->find(biName)!=0; if (found) @@ -3832,7 +3748,7 @@ static void addListReferences() { name = pi->getGroupDef()->getOutputFileBase().copy(); } - addRefItem(pi->specialListItems, + addRefItem(pi->xrefListItems, theTranslator->trPage(TRUE,TRUE), name,pi->title); } @@ -5020,9 +4936,11 @@ static void findMemberDocumentation(Entry *root) (i=findFunctionPtr(root->type,&l))!=-1 ) { + //printf("Fixing function pointer!\n"); // fix type and argument - root->args+=root->type.right(root->type.length()-i-l); + root->args.prepend(root->type.right(root->type.length()-i-l)); root->type=root->type.left(i+l); + //printf("Results type=%s,name=%s,args=%s\n",root->type.data(),root->name.data(),root->args.data()); isFunc=FALSE; } else if ((root->type.left(8)=="typedef " && root->args.find('(')!=-1)) @@ -5037,7 +4955,14 @@ static void findMemberDocumentation(Entry *root) //printf("Documentation for inline member `%s' found args=`%s'\n", // root->name.data(),root->args.data()); //if (root->relates.length()) printf(" Relates %s\n",root->relates.data()); - findMember(root,root->name+root->args+root->exception,FALSE,isFunc); + if (root->type.isEmpty()) + { + findMember(root,root->name+root->args+root->exception,FALSE,isFunc); + } + else + { + findMember(root,root->type+" "+root->name+root->args+root->exception,FALSE,isFunc); + } } else if (root->section==Entry::OVERLOADDOC_SEC) { @@ -6171,7 +6096,7 @@ static void resolveUserReferences() // name (not from the todo/test/bug/deprecated list, but from the file in // which they are defined). We correct this here by looking at the // generated section labels! - QDictIterator<RefList> rli(*Doxygen::specialLists); + QDictIterator<RefList> rli(*Doxygen::xrefLists); RefList *rl; for (rli.toFirst();(rl=rli.current());++rli) { @@ -7168,7 +7093,7 @@ void cleanUpDoxygen() delete Doxygen::pageSDict; delete Doxygen::exampleSDict; delete Doxygen::globalScope; - delete Doxygen::specialLists; + delete Doxygen::xrefLists; cleanUpPreprocessor(); Config::deleteInstance(); QTextCodec::deleteAllCodecs(); @@ -7475,40 +7400,42 @@ void readConfiguration(int argc, char **argv) QFileInfo configFileInfo(configName); setPerlModDoxyfile(configFileInfo.absFilePath()); + Doxygen::xrefLists->setAutoDelete(TRUE); +#if 0 /* init the special lists */ - Doxygen::specialLists->setAutoDelete(TRUE); Doxygen::specialLists->insert("todo", new RefList("todo", "GENERATE_TODOLIST", theTranslator->trTodoList(), - theTranslator->trTodo(), - BaseOutputDocInterface::Todo + theTranslator->trTodo() + //,BaseOutputDocInterface::Todo ) ); Doxygen::specialLists->insert("test", new RefList("test", "GENERATE_TESTLIST", theTranslator->trTestList(), - theTranslator->trTest(), - BaseOutputDocInterface::Test + theTranslator->trTest() + //,BaseOutputDocInterface::Test ) ); Doxygen::specialLists->insert("bug", new RefList("bug", "GENERATE_BUGLIST", theTranslator->trBugList(), - theTranslator->trBug(), - BaseOutputDocInterface::Bug + theTranslator->trBug() + //,BaseOutputDocInterface::Bug ) ); Doxygen::specialLists->insert("deprecated", new RefList("deprecated", "GENERATE_DEPRECATEDLIST", theTranslator->trDeprecatedList(), - theTranslator->trDeprecated(), - BaseOutputDocInterface::Deprecated + theTranslator->trDeprecated() + //,BaseOutputDocInterface::Deprecated ) ); +#endif } diff --git a/src/doxygen.h b/src/doxygen.h index 5f0f311..b35a04b 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -91,7 +91,7 @@ class Doxygen static QIntDict<MemberGroupInfo> memGrpInfoDict; static QDict<void> expandAsDefinedDict; static NamespaceDef *globalScope; - static QDict<RefList> *specialLists; // array of special lists: todo, test, bug, deprecated ... + static QDict<RefList> *xrefLists; // array of xref lists: todo, test, bug, deprecated ... static QCString htmlFileExtension; }; diff --git a/src/entry.h b/src/entry.h index 752337e..9b8489e 100644 --- a/src/entry.h +++ b/src/entry.h @@ -21,7 +21,7 @@ #include "qtbc.h" #include <qlist.h> -enum Protection { Public, Protected, Private } ; +enum Protection { Public, Protected, Private, Package } ; enum Specifier { Normal, Virtual, Pure } ; enum MethodTypes { Method, Signal, Slot, DCOP, Property, Event }; diff --git a/src/filedef.cpp b/src/filedef.cpp index b0b2081..0849901 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -734,7 +734,7 @@ bool FileDef::generateSourceFile() const void FileDef::addListReferences() { - addRefItem(specialListItems(), + addRefItem(xrefListItems(), theTranslator->trFile(TRUE,TRUE), getOutputFileBase(),name() ); diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 5a1346b..6f47916 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -783,7 +783,7 @@ QCString GroupDef::getOutputFileBase() const void GroupDef::addListReferences() { - addRefItem(specialListItems(), + addRefItem(xrefListItems(), theTranslator->trGroup(TRUE,TRUE), getOutputFileBase(),name() ); diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 752ea43..353194b 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -272,6 +272,11 @@ void HtmlDocVisitor::visit(DocFormula *f) m_t << "\"middle\""; // assume Windows users use IE or HtmlHelp which on // displays formulas nicely with align == "middle" #endif + m_t << " alt=\""; + filterQuotedCdataAttr(f->text()); + m_t << "\""; + /// @todo cache image dimensions on formula generation and give height/width + /// for faster preloading and better rendering of the page m_t << " src=\"" << f->name() << ".png\">"; if (f->text().at(0)=='\\') m_t << endl << "</center><p>" << endl; @@ -921,6 +926,43 @@ void HtmlDocVisitor::filter(const char *str) } } +/// Escape basic entities to produce a valid CDATA attribute value, +/// assume that the outer quoting will be using the double quote " +void HtmlDocVisitor::filterQuotedCdataAttr(const char* str) +{ + if (str==0) return; + const char *p=str; + char c; + while (*p) + { + c=*p++; + switch(c) + { + case '&': m_t << "&"; break; + case '"': m_t << """; break; + // For SGML compliance, and given the SGML declaration for HTML syntax, + // it's enough to replace these two, provided that the declaration + // for the HTML version we generate (and as supported by the browser) + // specifies that all the other symbols used in rawVal are + // within the right charachter class (i.e., they're not + // some multinational weird charachters not in the BASESET). + // We assume that 1) the browser will support whatever is remaining + // in the formula and 2) the TeX formulae are generally governed + // by even stricter charachter restrictions so it should be enough. + // + // On some incompliant browsers, additional translation of + // '>' and '<' into ">" and "<", respectively, might be needed; + // but I'm unaware of particular modern (last 4 years) versions + // with such problems, so let's not do it for performance. + // Also, some brousers will (wrongly) not process the entity references + // inside the attribute value and show the &...; form instead, + // so we won't create entites unless necessary to minimize clutter there. + // --vassilii + default: m_t << c; + } + } +} + void HtmlDocVisitor::startLink(const QString &ref,const QString &file,const QString &anchor) { QCString *dest; diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index aad92e3..0ba7d34 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -133,6 +133,7 @@ class HtmlDocVisitor : public DocVisitor //-------------------------------------- void filter(const char *str); + void filterQuotedCdataAttr(const char* str); void startLink(const QString &ref,const QString &file, const QString &anchor); void endLink(); diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 20998ad..f33357e 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -214,11 +214,17 @@ void HtmlGenerator::startFile(const char *name,const char *, { HtmlHelp::getInstance()->addIndexFile(fileName); } + QCString dispTitle = title; + QCString projName = Config_getString("PROJECT_NAME"); + if (!projName.isEmpty()) + { + dispTitle.prepend(projName+": "); + } lastFile = fileName; if (g_header.isEmpty()) { - writeDefaultHeaderFile(t,title,external); + writeDefaultHeaderFile(t,dispTitle,external); } else { diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index 0c039ce..f48fc0b 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -66,6 +66,7 @@ HEADERS = bufstr.h \ outputgen.h \ outputlist.h \ page.h \ + pagedef.h \ perlmodgen.h \ pngenc.h \ pre.h \ @@ -161,6 +162,7 @@ SOURCES = ce_lex.cpp \ namespacedef.cpp \ outputgen.cpp \ outputlist.cpp \ + pagedef.cpp \ perlmodgen.cpp \ pngenc.cpp \ pre.cpp \ diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 9e0b2ff..60a9400 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -683,8 +683,9 @@ void MemberDef::writeDeclaration(OutputList &ol, if (prot!=Public) { Doxygen::tagFile << "\" protection=\""; - if (prot==Protected) Doxygen::tagFile << "public"; - else /* Private */ Doxygen::tagFile << "protected"; + if (prot==Protected) Doxygen::tagFile << "public"; + else if (prot==Package) Doxygen::tagFile << "package"; + else /* Private */ Doxygen::tagFile << "protected"; } if (virt!=Normal) { @@ -1226,6 +1227,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (isSettable()) sl.append("set"); if (protection()==Protected) sl.append("protected"); else if (protection()==Private) sl.append("private"); + else if (protection()==Package) sl.append("package"); if (lvirt==Virtual) sl.append("virtual"); else if (lvirt==Pure) sl.append("pure virtual"); if (isSignal()) sl.append("signal"); @@ -1811,7 +1813,7 @@ void MemberDef::addListReference(Definition *d) } } //printf("*** addListReference %s todo=%d test=%d bug=%d\n",name().data(),todoId(),testId(),bugId()); - addRefItem(specialListItems(),memLabel, + addRefItem(xrefListItems(),memLabel, d->getOutputFileBase()+"#"+anchor(),memName,argsString()); } diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index cf9dbb3..b2948ac 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -390,7 +390,7 @@ Definition *NamespaceDef::findInnerCompound(const char *n) void NamespaceDef::addListReferences() { - addRefItem(specialListItems(), + addRefItem(xrefListItems(), theTranslator->trNamespace(TRUE,TRUE), getOutputFileBase(),displayName() ); diff --git a/src/outputgen.h b/src/outputgen.h index 046f47e..508534e 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -78,11 +78,11 @@ class BaseOutputDocInterface : public BaseCodeDocInterface { public: enum ParamListTypes { Param, RetVal, Exception }; - enum SectionTypes { See, Return, Author, Version, + enum SectionTypes { /*See, Return, Author, Version, Since, Date, Bug, Note, Warning, Par, Deprecated, Pre, Post, Invar, Remark, Attention, - Todo, Test, RCS, EnumValues, + Todo, Test, RCS, */ EnumValues, Examples }; @@ -27,7 +27,7 @@ class PageInfo public: PageInfo(const char *f, int l,const char *n,const char *d,const char *t) : defFileName(f), defLine(l), name(n), - doc(d), title(t), context(0),specialListItems(0),m_inGroup(0) + doc(d), title(t), context(0), xrefListItems(0),m_inGroup(0) { sectionDict = new SectionDict(17); } @@ -111,7 +111,7 @@ class PageInfo // is this page part of a group SectionDict *sectionDict; - QList<ListItemInfo> *specialListItems; + QList<ListItemInfo> *xrefListItems; private: GroupDef *m_inGroup; diff --git a/src/pagedef.cpp b/src/pagedef.cpp new file mode 100644 index 0000000..d1e577f --- /dev/null +++ b/src/pagedef.cpp @@ -0,0 +1,14 @@ +#include "pagedef.h" + + +PageDef::PageDef(const char *f,int l,const char *n, + const char *d,const char *t) + : Definition(f,l,n), m_title(t) +{ + setDocumentation(d,f,l); + +} + +PageDef::~PageDef() +{ +} diff --git a/src/pagedef.h b/src/pagedef.h new file mode 100644 index 0000000..371c4f7 --- /dev/null +++ b/src/pagedef.h @@ -0,0 +1,141 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2003 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include "definition.h" +#include "sortdict.h" +//#include "config.h" +//#include "docparser.h" + +//#include "section.h" +//#include "doxygen.h" + +class PageDef : public Definition +{ + public: + PageDef(const char *f,int l,const char *n,const char *d,const char *t); + ~PageDef(); + DefType definitionType() { return TypePage; } + + // functions to get a uniform interface with Definitions + QCString getOutputFileBase() const { return m_fileName; } +#if 0 + + bool isReference() const { return !reference.isEmpty(); } + QCString getReference() const { return reference; } + PageInfo(const char *f, int l,const char *n,const char *d,const char *t) : + defFileName(f), defLine(l), name(n), + doc(d), title(t), context(0), xrefListItems(0),m_inGroup(0) + { + sectionDict = new SectionDict(17); + } + ~PageInfo() + { + delete sectionDict; + } + + // where the page definition was found + QCString defFileName; + int defLine; + + // contents of the page + QCString name; + QCString doc; + QCString title; + + // external reference? if so then this is the tag file name + QCString reference; + QCString fileName; + + // class, file or namespace in which the page was found + Definition *context; + + + //void addSections(QList<QCString> *anchorList) + //{ + // if (anchorList) + // { + // QCString *s=anchorList->first(); + // while (s) + // { + // SectionInfo *si=0; + // if (!s->isEmpty() && (si=Doxygen::sectionDict[*s])) + // { + // //printf("Add section `%s' to definition `%s'\n", + // // si->label.data(),n.data()); + // if (sectionDict==0) + // { + // sectionDict = new SectionDict(17); + // } + // if (sectionDict->find(*s)==0) + // { + // sectionDict->insert(*s,si); + // } + // si->pageRef = this; + // si->fileName = fileName; + // } + // s=anchorList->next(); + // } + // } + //} + void findSectionsInDocumentation() + { + docFindSections(doc,this,0,0,defFileName); + } + + void writeDocAnchorsToTagFile() + { + if (!Config_getString("GENERATE_TAGFILE").isEmpty() && sectionDict) + { + QDictIterator<SectionInfo> sdi(*sectionDict); + SectionInfo *si; + for (;(si=sdi.current());++sdi) + { + if (!si->generated) + { + Doxygen::tagFile << " <docanchor>" << si->label << "</docanchor>" << endl; + } + } + } + } + + + void makePartOfGroup(GroupDef *gd) { m_inGroup = gd; } + GroupDef *getGroupDef() const { return m_inGroup; } + + // is this page part of a group + SectionDict *sectionDict; + QList<ListItemInfo> *xrefListItems; + + private: + GroupDef *m_inGroup; +#endif + private: + QCString m_fileName; + QCString m_title; +}; + +class PageSDict : public SDict<PageDef> +{ + public: + PageSDict(int size) : SDict<PageDef>(size) {} + virtual ~PageSDict() {} + int compareItems(GCI i1,GCI i2) + { + return stricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name()); + } +}; + diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index b11d85c..d889938 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1290,6 +1290,7 @@ static const char *getProtectionName(Protection prot) case Public: return "public"; case Protected: return "protected"; case Private: return "private"; + case Package: return "package"; } return 0; } diff --git a/src/reflist.cpp b/src/reflist.cpp index c3a3951..5293f4e 100644 --- a/src/reflist.cpp +++ b/src/reflist.cpp @@ -20,22 +20,22 @@ /*! Create a list of items that are cross referenced with documentation blocks * @param listName String representing the name of the list. - * @param optionName String representation of the option enabling the list. * @param pageTitle String representing the title of the list page. * @param secTitle String representing the title of the section. - * @param type Type of the section. */ -RefList::RefList(const char *listName,const char *optionName,const char *pageTitle, - const char *secTitle,BaseOutputDocInterface::SectionTypes type) +RefList::RefList(const char *listName, + const char *pageTitle, + const char *secTitle + ) { m_dict = 0; m_dictIterator = 0; m_id = 0; m_listName = listName; - m_optionName = optionName; + //m_optionName = optionName; m_pageTitle = pageTitle; m_secTitle = secTitle; - m_type = type; + /*m_type = type;*/ } /*! Destroy the todo list. Currently not called! */ @@ -95,10 +95,10 @@ QCString RefList::listName() const return m_listName; } -QCString RefList::optionName() const -{ - return m_optionName; -} +//QCString RefList::optionName() const +//{ +// return m_optionName; +//} QCString RefList::pageTitle() const { @@ -110,8 +110,10 @@ QCString RefList::sectionTitle() const return m_secTitle; } -BaseOutputDocInterface::SectionTypes RefList::sectionType() const -{ - return m_type; -} + +//BaseOutputDocInterface::SectionTypes RefList::sectionType() const +//{ +// return m_type; +//} + diff --git a/src/reflist.h b/src/reflist.h index c8d0937..25e7d2a 100644 --- a/src/reflist.h +++ b/src/reflist.h @@ -21,7 +21,7 @@ #include "qtbc.h" #include <qintdict.h> -#include "outputgen.h" +//#include "outputgen.h" /*! This struct represents an item in the list of references. */ struct RefItem @@ -50,26 +50,26 @@ class RefList RefItem *getFirstRefItem(); RefItem *getNextRefItem(); QCString listName() const; - QCString optionName() const; + //QCString optionName() const; QCString pageTitle() const; QCString sectionTitle() const; - BaseOutputDocInterface::SectionTypes sectionType() const; + //BaseOutputDocInterface::SectionTypes sectionType() const; - RefList(const char *listName,const char *optionName, - const char *pageTitle,const char *secTitle, - BaseOutputDocInterface::SectionTypes type + RefList(const char *listName, + const char *pageTitle,const char *secTitle + /*,BaseOutputDocInterface::SectionTypes type*/ ); ~RefList(); private: int m_id; QCString m_listName; - QCString m_optionName; + //QCString m_optionName; QCString m_pageTitle; QCString m_secTitle; QIntDict<RefItem> *m_dict; QIntDictIterator<RefItem> *m_dictIterator; - BaseOutputDocInterface::SectionTypes m_type; + //BaseOutputDocInterface::SectionTypes m_type; }; #endif diff --git a/src/scanner.l b/src/scanner.l index c3da219..62b4c0f 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -153,6 +153,9 @@ static int depthIf; static int initializerSharpCount; static QCString memberGroupRelates; static QCString memberGroupInside; +static QCString xrefItemKey; +static QCString xrefItemTitle; +static QCString xrefListTitle; //----------------------------------------------------------------------------- @@ -185,6 +188,7 @@ static void initParser() static void initEntry() { + if (insideJava) protection = Package; current->protection = protection ; current->mtype = mtype; current->virt = virt; @@ -281,39 +285,17 @@ static void newDocState(); //----------------------------------------------------------------- -#if 0 -static void addSection() +static void addXRefItem(const char *listName,const char *itemTitle,const char *listTitle) { - //printf("New section pageName=%s label=%s title=%s\n", - // current->name.data(),sectionLabel.data(),sectionTitle.data()); - if (current->name.isEmpty() /*|| current->section != Entry::PAGEDOC_SEC */) - { - //warn(yyFileName,yyLineNr,"Warning: found section or anchor with label `%s' " - // "outside of \\page context!\n",sectionLabel.data()); - return; - } - if (sectionLabel.isEmpty()) return; - if (Doxygen::sectionDict.find(sectionLabel)==0) - { - SectionInfo *si=new SectionInfo(current->name,sectionLabel,sectionTitle,sectionType); - //printf("Adding section addr=%p label=`%s' sectionTitle=`%s' fileName=%s\n",si,sectionLabel.data(),sectionTitle.data(),si->fileName.data()); - Doxygen::sectionDict.insert(sectionLabel,si); - current->anchors->append(new QCString(sectionLabel)); - } - else - { - warn(yyFileName,yyLineNr, - "Warning: Duplicate label %s found!",sectionLabel.data()); - } - sectionTitle.resize(0); -} -#endif + if (listName==0) return; -static void addSpecialItem(const char *listName) -{ ListItemInfo *lii=0; - RefList *refList = Doxygen::specialLists->find(listName); - ASSERT(refList!=0); + RefList *refList = Doxygen::xrefLists->find(listName); + if (refList==0) // new list + { + refList = new RefList(listName,listTitle,itemTitle); + Doxygen::xrefLists->insert(listName,refList); + } if (current->sli) { QListIterator<ListItemInfo> slii(*current->sli); @@ -341,22 +323,12 @@ static void addSpecialItem(const char *listName) item->listAnchor = anchorLabel; current->addSpecialListItem(listName,itemId); QCString cmdString; - cmdString.sprintf("\\%s %d\n",listName,itemId); + cmdString.sprintf("\\xrefitem %s %d\n",listName,itemId); current->doc += cmdString; - //current->doc += (QCString)"\\anchor "+anchorLabel+"\n"; - SectionInfo *si=new SectionInfo(listName,anchorLabel, sectionTitle,SectionInfo::Anchor); Doxygen::sectionDict.insert(anchorLabel,si); current->anchors->append(new QCString(anchorLabel)); - - //QCString tmpName = current->name; - //current->name = listName; - //sectionType=SectionInfo::Anchor; - //sectionLabel=anchorLabel; - //addSection(); - //current->name = tmpName; - //printf("%s: text `%s' doc %s\n",listName,item->text.data(),cmdString.data()); } current->brief = slString.copy(); // restore orginial brief desc. } @@ -512,7 +484,7 @@ static int yyread(char *buf,int max_size) /* start command character */ CMD ("\\"|"@") -SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"ingroup"|"latexonly"|"htmlonly"|"{"|"verbatim"|"dotfile"|"defgroup"|"addtogroup"|"weakgroup")|("<"{PRE}">") +SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"latexonly"|"htmlonly"|"{"|"verbatim"|"dotfile"|"defgroup"|"addtogroup"|"weakgroup")|("<"{PRE}">") BN [ \t\n\r] BL [ \t\r]*"\n" B [ \t] @@ -563,6 +535,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] %x Operator %x Array %x ReadBody +%x ReadNSBody %x Using %x UsingDirective %x NameSpaceDocArg1 @@ -642,6 +615,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] %x TestParam %x BugParam %x DeprecatedParam +%x XRefItemParam1 +%x XRefItemParam2 +%x XRefItemParam3 +%x XRefItemParam4 %x SectionLabel %x SectionTitle %x SkipTemplate @@ -1126,15 +1103,17 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] } <NSAliasArg>({ID}"::")*{ID} { //printf("Inserting namespace alias %s::%s->%s\n",current_root->name.data(),aliasName.data(),yytext); - if (current_root->name.isEmpty()) - { + //if (current_root->name.isEmpty()) + //{ + // TODO: namespace aliases are now treated as global entities + // while they should be aware of the scope they are in Doxygen::namespaceAliasDict.insert(aliasName,new QCString(yytext)); - } - else - { - Doxygen::namespaceAliasDict.insert(current_root->name+"::"+aliasName, - new QCString(current_root->name+"::"+yytext)); - } + //} + //else + //{ + // Doxygen::namespaceAliasDict.insert(current_root->name+"::"+aliasName, + // new QCString(current_root->name+"::"+yytext)); + //} } <NSAliasArg>";" { BEGIN( FindMembers ); @@ -1386,7 +1365,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current->bodyLine = yyLineNr; BEGIN( Define ); } -<FindMembers,ReadBody>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */ +<FindMembers,ReadBody,ReadNSBody>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */ yyLineNr = atoi(&yytext[1]); //printf("setting line number to %d\n",yyLineNr); lastPreLineCtrlContext = YY_START; @@ -1905,31 +1884,31 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] /* <FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); } */ -<ReadBody>[^\r\n\#{}"'/]* { current->program += yytext ; } -<ReadBody>"//".* { current->program += yytext ; } -<ReadBody>"#".* { if (! insidePHP) +<ReadBody,ReadNSBody>[^\r\n\#{}"'/]* { current->program += yytext ; } +<ReadBody,ReadNSBody>"//".* { current->program += yytext ; } +<ReadBody,ReadNSBody>"#".* { if (! insidePHP) REJECT; current->program += yytext ; } -<ReadBody>\" { current->program += yytext ; +<ReadBody,ReadNSBody>\" { current->program += yytext ; pCopyQuotedString = ¤t->program; lastStringContext=YY_START; BEGIN( CopyString ); } -<ReadBody>"/*"{B}* { current->program += yytext ; +<ReadBody,ReadNSBody>"/*"{B}* { current->program += yytext ; lastContext = ReadBody ; BEGIN( Comment ) ; } -<ReadBody>"/*"{BL} { current->program += yytext ; +<ReadBody,ReadNSBody>"/*"{BL} { current->program += yytext ; ++yyLineNr ; lastContext = ReadBody ; BEGIN( Comment ) ; } -<ReadBody>{CHARLIT} { current->program += yytext; } -<ReadBody>"{" { current->program += yytext ; +<ReadBody,ReadNSBody>{CHARLIT} { current->program += yytext; } +<ReadBody,ReadNSBody>"{" { current->program += yytext ; ++curlyCount ; } -<ReadBody>"}" { //err("ReadBody count=%d\n",curlyCount); +<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",curlyCount); if ( curlyCount>0 ) { current->program += yytext ; @@ -1966,7 +1945,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current = new Entry(*current); if (current->section==Entry::NAMESPACE_SEC || current->section==Entry::INTERFACE_SEC || - insideJava || insidePHP + insideJava || insidePHP || insideCS ) { // namespaces and interfaces and java classes ends with a closing bracket without semicolon current->reset(); @@ -2143,10 +2122,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] */ <MemberSpecSkip>"," { BEGIN(MemberSpec); } <MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); } -<ReadBody>{BN}+ { current->program += yytext ; +<ReadBody,ReadNSBody>{BN}+ { current->program += yytext ; lineCount() ; } -<ReadBody>. { current->program += yytext ; } +<ReadBody,ReadNSBody>. { current->program += yytext ; } <FindMembers>"("/({BN}*{ID}{BN}*"::")*{ID}{BN}*")"{BN}*"(" | /* typedef void (A::func_t)(args...) */ <FindMembers>("("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+)+ { /* typedef void (A::*ptr_t)(args...) */ @@ -2975,7 +2954,14 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current->name.sprintf("@%d",anonCount++); } curlyCount=0; - BEGIN( ReadBody ) ; + if (current->section==Entry::NAMESPACE_SEC) + { + BEGIN( ReadNSBody ); + } + else + { + BEGIN( ReadBody ) ; + } } <BasesProt>"virtual" { baseVirt = Virtual; } <BasesProt>"public" { baseProt = Public; } @@ -3473,10 +3459,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] } <SkipHtmlComment>"--"[!]?">" { BEGIN(lastSkipHtmlCommentContext); } <SkipHtmlComment>. -<AfterDoc,Doc,ClassDoc,PageDoc>("\\\\"|"@@")("todo"|"test"|"bug"|"deprecated")/[^a-z_A-Z0-9] { +<AfterDoc,Doc,ClassDoc,PageDoc>("\\\\"|"@@")("todo"|"test"|"bug"|"deprecated"|"xrefitem")/[^a-z_A-Z0-9] { current->doc+=yytext; } -<AfterDocLine,LineDoc,JavaDoc>("\\\\"|"@@")("todo"|"test"|"bug"|"deprecated")/[^a-z_A-Z0-9] { +<AfterDocLine,LineDoc,JavaDoc>("\\\\"|"@@")("todo"|"test"|"bug"|"deprecated"|"xrefitem")/[^a-z_A-Z0-9] { current->brief+=yytext; } <AfterDoc,AfterDocLine,LineDoc,Doc,JavaDoc,ClassDoc,PageDoc>{CMD}"todo"/[^a-z_A-Z0-9] { @@ -3507,11 +3493,18 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current->brief.resize(0); BEGIN(ClassDocBrief); } +<AfterDoc,AfterDocLine,LineDoc,Doc,JavaDoc,ClassDoc,PageDoc>{CMD}"xrefitem"/[^a-z_A-Z0-9] { + slStartContext = YY_START; + lastBriefContext = XRefItemParam4; // this is where we will continue at the end of the argument + slString = current->brief.copy(); // these will be swapped later on. + current->brief.resize(0); + BEGIN(XRefItemParam1); + } <TodoParam>\n | <TodoParam>"//" | <TodoParam>"/*" | <TodoParam>. { - addSpecialItem("todo"); + addXRefItem("todo",theTranslator->trTodo(),theTranslator->trTodoList()); int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); BEGIN(slStartContext); } @@ -3519,7 +3512,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] <TestParam>"//" | <TestParam>"/*" | <TestParam>. { - addSpecialItem("test"); + addXRefItem("test",theTranslator->trTest(),theTranslator->trTestList()); int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); BEGIN(slStartContext); } @@ -3527,7 +3520,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] <BugParam>"//" | <BugParam>"/*" | <BugParam>. { - addSpecialItem("bug"); + addXRefItem("bug",theTranslator->trBug(),theTranslator->trBugList()); int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); BEGIN(slStartContext); } @@ -3535,7 +3528,46 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] <DeprecatedParam>"//" | <DeprecatedParam>"/*" | <DeprecatedParam>. { - addSpecialItem("deprecated"); + addXRefItem("deprecated",theTranslator->trDeprecated(),theTranslator->trDeprecatedList()); + int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); + BEGIN(slStartContext); + } +<XRefItemParam1>{ID} { + xrefItemKey=yytext; + BEGIN(XRefItemParam2); + } +<XRefItemParam1>{B}* +<XRefItemParam1>. { + warn(yyFileName,yyLineNr,"Found unexpected character %s while parsing the first argument of \\xrefitem\n",yytext); + unput(*yytext); + BEGIN(slStartContext); + } +<XRefItemParam2>"\""[^\n\"]*"\"" { + xrefItemTitle = stripQuotes(yytext); + BEGIN(XRefItemParam3); + } +<XRefItemParam2>{B}* +<XRefItemParam2>. { + warn(yyFileName,yyLineNr,"Found unexpected character %s while parsing the second argument of \\xrefitem\n",yytext); + unput(*yytext); + BEGIN(slStartContext); + } +<XRefItemParam3>{B}* +<XRefItemParam3>"\""[^\n\"]*"\"" { + xrefListTitle = stripQuotes(yytext); + BEGIN(ClassDocBrief); + } +<XRefItemParam3>. { + warn(yyFileName,yyLineNr,"Found unexpected character %s while parsing the third argument of \\xrefitem\n",yytext); + unput(*yytext); + BEGIN(slStartContext); + } +<XRefItemParam4>{B}* +<XRefItemParam4>\n | +<XRefItemParam4>"//" | +<XRefItemParam4>"/*" | +<XRefItemParam4>. { + addXRefItem(xrefItemKey,xrefItemTitle,xrefListTitle); int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); BEGIN(slStartContext); } @@ -4066,6 +4098,12 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] BEGIN( DeprecatedParam ); } else if (YY_START==ClassDocBrief && + lastBriefContext==XRefItemParam4) + { + unput('/');unput('*'); // make sure we have something to read + BEGIN( XRefItemParam4 ); + } + else if (YY_START==ClassDocBrief && lastBriefContext==Doc) { current->doc += "\n\n"; @@ -4238,7 +4276,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] if (lastBriefContext==TodoParam || lastBriefContext==TestParam || lastBriefContext==BugParam || - lastBriefContext==DeprecatedParam + lastBriefContext==DeprecatedParam || + lastBriefContext==XRefItemParam4 ) { unput('\n'); @@ -4291,6 +4330,16 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] unput('\n'); // make sure we have something to read BEGIN( DeprecatedParam ); } + else if + (lastBriefContext==XRefItemParam4 && + (slStartContext==LineDoc || + slStartContext==AfterDocLine + ) + ) + { + unput('\n'); // make sure we have something to read + BEGIN( XRefItemParam4 ); + } else { current->brief += "\n"; @@ -4350,15 +4399,16 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] copyArgString = ¤t->args; BEGIN( ReadFuncArgType ) ; } -<ClassDocFunc>"("({ID}"::")*({B}*"*")+ { - current->name+=yytext; +<ClassDocFunc>"("({ID}"::")*({B}*"*")+ { + current->type+=current->name+yytext; + current->name.resize(0); BEGIN( ClassDocFuncPtr ); } <ClassDocFuncPtr>{SCOPENAME} { current->name+=yytext; } <ClassDocFuncPtr>")" { - current->name+=')'; + current->type+=')'; BEGIN( ClassDocFunc ); } <ClassDocFuncQual>"{" { @@ -4872,11 +4922,13 @@ static void parseCompounds(Entry *rt) // set default protection based on the compound type if( ce->section==Entry::CLASS_SEC ) // class { - if (ce->fileName.right(5)==".java" || + if ( ce->fileName.right(4)==".php" || ce->fileName.right(4)==".inc" ) - current->protection = protection = Public ; // Actually this should be package scope! + current->protection = protection = Public ; + else if (ce->fileName.right(5)==".java") + current->protection = protection = Package ; else current->protection = protection = Private ; } diff --git a/src/translator.h b/src/translator.h index 5875e6e..ec9f213 100644 --- a/src/translator.h +++ b/src/translator.h @@ -389,6 +389,17 @@ class Translator virtual QCString trEvents() = 0; virtual QCString trEventDocumentation() = 0; + +////////////////////////////////////////////////////////////////////////// +// new since 1.3 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trPackageTypes() = 0; + virtual QCString trPackageMembers() = 0; + virtual QCString trStaticPackageMembers() = 0; + virtual QCString trPackageAttribs() = 0; + virtual QCString trStaticPackageAttribs() = 0; + }; #endif diff --git a/src/translator_adapter.h b/src/translator_adapter.h index 230a4d0..ac44505 100644 --- a/src/translator_adapter.h +++ b/src/translator_adapter.h @@ -40,7 +40,26 @@ class TranslatorAdapterBase : public Translator }; -class TranslatorAdapter_1_2_18 : public TranslatorAdapterBase +class TranslatorAdapter_1_3 : public TranslatorAdapterBase +{ + public: + virtual QCString updateNeededMessage() + { return createUpdateNeededMessage(idLanguage(),"release 1.3"); } + + virtual QCString trPackageTypes() + { return english.trPackageTypes(); } + virtual QCString trPackageMembers() + { return english.trPackageMembers(); } + virtual QCString trStaticPackageMembers() + { return english.trStaticPackageMembers(); } + virtual QCString trPackageAttribs() + { return english.trPackageAttribs(); } + virtual QCString trStaticPackageAttribs() + { return english.trStaticPackageAttribs(); } +}; + + +class TranslatorAdapter_1_2_18 : public TranslatorAdapter_1_3 { public: virtual QCString updateNeededMessage() diff --git a/src/translator_br.h b/src/translator_br.h index 5d686f0..17e2ce9 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -32,7 +32,7 @@ #ifndef TRANSLATOR_BR_H #define TRANSLATOR_BR_H -class TranslatorBrazilian: public Translator +class TranslatorBrazilian: public TranslatorAdapter_1_3 { public: diff --git a/src/translator_cz.h b/src/translator_cz.h index e3b0205..0b2c5e0 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -166,7 +166,7 @@ // probably slightly faster. -class TranslatorCzech : public Translator +class TranslatorCzech : public TranslatorAdapter_1_3 { private: /*! The decode() inline assumes the source written in the diff --git a/src/translator_de.h b/src/translator_de.h index 186d087..08f44a7 100644 --- a/src/translator_de.h +++ b/src/translator_de.h @@ -79,7 +79,7 @@ #ifndef TRANSLATOR_DE_H #define TRANSLATOR_DE_H -class TranslatorGerman : public Translator +class TranslatorGerman : public TranslatorAdapter_1_3 { public: diff --git a/src/translator_dk.h b/src/translator_dk.h index 87d11b2..4657bc6 100644 --- a/src/translator_dk.h +++ b/src/translator_dk.h @@ -71,7 +71,7 @@ #ifndef TRANSLATOR_DK_H #define TRANSLATOR_DK_H -class TranslatorDanish : public Translator +class TranslatorDanish : public TranslatorAdapter_1_3 { public: diff --git a/src/translator_en.h b/src/translator_en.h index 288461b..1b00007 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1433,6 +1433,46 @@ class TranslatorEnglish : public Translator return "Event Documentation"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a heading for a list of Java class types with package scope. + */ + virtual QCString trPackageTypes() + { + return "Package Types"; + } + /*! Used as a heading for a list of Java class functions with package + * scope. + */ + virtual QCString trPackageMembers() + { + return "Package Functions"; + } + /*! Used as a heading for a list of static Java class functions with + * package scope. + */ + virtual QCString trStaticPackageMembers() + { + return "Static Package Functions"; + } + /*! Used as a heading for a list of Java class variables with package + * scope. + */ + virtual QCString trPackageAttribs() + { + return "Package Attributes"; + } + /*! Used as a heading for a list of static Java class variables with + * package scope. + */ + virtual QCString trStaticPackageAttribs() + { + return "Static Package Attributes"; + } + + }; #endif diff --git a/src/translator_fr.h b/src/translator_fr.h index 2641bb7..627614e 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -47,7 +47,7 @@ #ifndef TRANSLATOR_FR_H #define TRANSLATOR_FR_H -class TranslatorFrench : public Translator +class TranslatorFrench : public TranslatorAdapter_1_3 { public: QCString idLanguage() diff --git a/src/translator_hr.h b/src/translator_hr.h index 25e483e..46e5e18 100644 --- a/src/translator_hr.h +++ b/src/translator_hr.h @@ -53,7 +53,7 @@ #ifndef TRANSLATOR_HR_H #define TRANSLATOR_HR_H -class TranslatorCroatian : public Translator +class TranslatorCroatian : public TranslatorAdapter_1_3 { private: /*! to avoid macro redefinition from translator_cz.h */ diff --git a/src/translator_it.h b/src/translator_it.h index 13145fb..d97fc92 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -67,7 +67,7 @@ #ifndef TRANSLATOR_IT_H #define TRANSLATOR_IT_H -class TranslatorItalian : public Translator +class TranslatorItalian : public TranslatorAdapter_1_3 { public: diff --git a/src/translator_jp.h b/src/translator_jp.h index 8348f50..d4286be 100644 --- a/src/translator_jp.h +++ b/src/translator_jp.h @@ -64,7 +64,7 @@ class TranslatorJapaneseEn : public TranslatorEnglish } }; -class TranslatorJapanese : public Translator +class TranslatorJapanese : public TranslatorAdapter_1_3 { private: /*! The decode() can change euc into sjis */ diff --git a/src/translator_kr.h b/src/translator_kr.h index d9a2b44..3134893 100644 --- a/src/translator_kr.h +++ b/src/translator_kr.h @@ -18,7 +18,7 @@ #ifndef TRANSLATOR_KR_H #define TRANSLATOR_KR_H -class TranslatorKorean : public Translator +class TranslatorKorean : public TranslatorAdapter_1_3 { public: diff --git a/src/translator_nl.h b/src/translator_nl.h index 88c157b..5ca923d 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -1030,6 +1030,45 @@ class TranslatorDutch : public Translator return "Event Documentatie"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a heading for a list of Java class types with package scope. + */ + virtual QCString trPackageTypes() + { + return "Package Types"; + } + /*! Used as a heading for a list of Java class functions with package + * scope. + */ + virtual QCString trPackageMembers() + { + return "Package Functies"; + } + /*! Used as a heading for a list of static Java class functions with + * package scope. + */ + virtual QCString trStaticPackageMembers() + { + return "Statische Package Functies"; + } + /*! Used as a heading for a list of Java class variables with package + * scope. + */ + virtual QCString trPackageAttribs() + { + return "Package Attributen"; + } + /*! Used as a heading for a list of static Java class variables with + * package scope. + */ + virtual QCString trStaticPackageAttribs() + { + return "Statische Package Attributen"; + } + }; #endif diff --git a/src/translator_pl.h b/src/translator_pl.h index de612cd..72192d3 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -20,7 +20,7 @@ #ifndef TRANSLATOR_PL_H #define TRANSLATOR_PL_H -class TranslatorPolish : public Translator +class TranslatorPolish : public TranslatorAdapter_1_3 { private: /*! to avoid macro redefinition from translator_pl.h */ diff --git a/src/translator_ru.h b/src/translator_ru.h index 1329d88..39fd1a3 100644 --- a/src/translator_ru.h +++ b/src/translator_ru.h @@ -48,7 +48,7 @@ #ifndef TRANSLATOR_RU_H #define TRANSLATOR_RU_H -class TranslatorRussian : public Translator +class TranslatorRussian : public TranslatorAdapter_1_3 { private: /*! The Decode() inline assumes the source written in the diff --git a/src/util.cpp b/src/util.cpp index 6a5517e..cc4a8aa 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -2934,7 +2934,7 @@ QCString substituteKeywords(const QCString &s,const char *title) */ int getPrefixIndex(const QCString &name) { - //printf("getPrefixIndex(%s) ni=%d\n",name.data(),ni); + if (name.isEmpty()) return 0; QStrList &sl = Config_getList("IGNORE_PREFIX"); char *s = sl.first(); while (s) @@ -3624,16 +3624,16 @@ PageInfo *addRelatedPage(const char *name,const QCString &ptitle, if (sli) { - if (pi->specialListItems==0) + if (pi->xrefListItems==0) { - pi->specialListItems=new QList<ListItemInfo>; - pi->specialListItems->setAutoDelete(TRUE); + pi->xrefListItems=new QList<ListItemInfo>; + pi->xrefListItems->setAutoDelete(TRUE); } QListIterator<ListItemInfo> slii(*sli); ListItemInfo *lii; for (slii.toFirst();(lii=slii.current());++slii) { - pi->specialListItems->append(new ListItemInfo(*lii)); + pi->xrefListItems->append(new ListItemInfo(*lii)); } } @@ -3700,10 +3700,16 @@ void addRefItem(const QList<ListItemInfo> *sli, ListItemInfo *lii; for (slii.toFirst();(lii=slii.current());++slii) { - RefList *refList = Doxygen::specialLists->find(lii->type); - ASSERT(refList!=0); - - if (Config_getBool(refList->optionName())) + RefList *refList = Doxygen::xrefLists->find(lii->type); + if (refList && + ( + // either not a built-in list or the list is enabled + (lii->type!="todo" || Config_getBool("GENERATE_TODOLIST")) && + (lii->type!="test" || Config_getBool("GENERATE_TESTLIST")) && + (lii->type!="bug" || Config_getBool("GENERATE_BUGLIST")) && + (lii->type!="deprecated" || Config_getBool("GENERATE_DEPRECATEDLIST")) + ) + ) { RefItem *item = refList->getRefItem(lii->itemId); ASSERT(item!=0); diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 1062bd2..8e3cef6 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -501,6 +501,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; + case Package: t << "package"; break; } t << "\" static=\""; if (md->isStatic()) t << "yes"; else t << "no"; @@ -685,6 +686,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; + case Package: t << "package"; break; } t << "\">" << endl; t << " <name>"; @@ -791,6 +793,7 @@ static void writeListOfAllMembers(ClassDef *cd,QTextStream &t) case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; + case Package: t << "package"; break; } t << "\" virt=\""; switch(virt) @@ -869,6 +872,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti) case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; + case Package: ASSERT(0); break; } t << "\" virt=\""; switch(bcd->virt) @@ -895,6 +899,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti) case Public: t << "public"; break; case Protected: t << "protected"; break; case Private: t << "private"; break; + case Package: ASSERT(0); break; } t << "\" virt=\""; switch(bcd->virt) |