diff options
Diffstat (limited to 'src/doxygen.cpp')
-rw-r--r-- | src/doxygen.cpp | 544 |
1 files changed, 284 insertions, 260 deletions
diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 1e5f361..499564e 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * $Id$ + * * * * Copyright (C) 1997-2002 by Dimitri van Heesch. @@ -541,232 +541,232 @@ ArgumentList *getTemplateArgumentsFromName( return ali.current(); } - -//---------------------------------------------------------------------- -// build a list of all classes mentioned in the documentation -// and all classes that have a documentation block before their definition. -static void buildClassList(Entry *root) +static void addClassToContext(Entry *root) { - if ( - ((root->section & Entry::COMPOUNDDOC_MASK) || - ((root->section & Entry::COMPOUND_MASK)) - ) && - !root->name.isEmpty() - ) + QCString fullName=removeRedundantWhiteSpace(root->name); + if (fullName.isEmpty()) { - QCString fullName=removeRedundantWhiteSpace(root->name); - if (fullName.isEmpty()) - { - // this should not be called - warn(root->fileName,root->startLine, - "Warning: invalid class name found!" - ); - goto error; - } - Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data()); + // this should not be called + warn(root->fileName,root->startLine, + "Warning: invalid class name found!" + ); + return; + } + Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data()); - fullName=stripAnonymousNamespaceScope(fullName); - fullName=stripTemplateSpecifiersFromScope(fullName); + fullName=stripAnonymousNamespaceScope(fullName); + fullName=stripTemplateSpecifiersFromScope(fullName); - Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data()); + Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data()); - bool ambig; - ClassDef *cd; - //printf("findFileDef(%s)\n",root->fileName.data()); - FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); + bool ambig; + ClassDef *cd; + //printf("findFileDef(%s)\n",root->fileName.data()); + FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); - if ((cd=getClass(fullName))) - { - Debug::print(Debug::Classes,0," Existing class!\n",fullName.data()); - //if (cd->templateArguments()==0) - //{ - // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); - // cd->setTemplateArguments(tArgList); - //} - if (!root->doc.isEmpty() || !root->brief.isEmpty() || - (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER")) - ) - // block contains something that ends up in the docs - { - if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) - { - warn( - root->fileName,root->startLine, - "Warning: class %s already has a detailed description. " - "Skipping the one found here.", - fullName.data() - ); - } - else if (!root->doc.isEmpty()) - { - cd->setDocumentation(root->doc,root->docFile,root->docLine); - } - if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty()) - { - warn( - root->fileName,root->startLine, - "Warning: class %s already has a brief description\n" - " skipping the one found here.", - fullName.data() - ); - } - else if (!root->brief.isEmpty()) - { - cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - } - if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1) - { - cd->setBodySegment(root->bodyLine,root->endBodyLine); - cd->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig)); - } - cd->addSectionsToDefinition(root->anchors); - cd->setName(fullName); // change name to match docs - } - cd->setFileDef(fd); - if (cd->hasDocumentation()) + if ((cd=getClass(fullName))) + { + Debug::print(Debug::Classes,0," Existing class!\n",fullName.data()); + //if (cd->templateArguments()==0) + //{ + // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); + // cd->setTemplateArguments(tArgList); + //} + if (!root->doc.isEmpty() || !root->brief.isEmpty() || + (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER")) + ) + // block contains something that ends up in the docs + { + if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) { - addIncludeFile(cd,fd,root); + warn( + root->fileName,root->startLine, + "Warning: class %s already has a detailed description. " + "Skipping the one found here.", + fullName.data() + ); } - addNamespace(root,cd); - if (fd && (root->section & Entry::COMPOUND_MASK)) + else if (!root->doc.isEmpty()) { - //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", - // cd->name().data(), - // fd->name().data(), - // root->fileName.data() - // ); - fd->insertClass(cd); + cd->setDocumentation(root->doc,root->docFile,root->docLine); } - addClassToGroups(root,cd); - cd->setRefItems(root->todoId,root->testId,root->bugId); - if (!root->subGrouping) cd->setSubGrouping(FALSE); - - if (cd->templateArguments()==0) + if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty()) { - // this happens if a template class declared with @class is found - // before the actual definition. - ArgumentList *tArgList = - getTemplateArgumentsFromName(fullName,root->tArgLists); - cd->setTemplateArguments(tArgList); + warn( + root->fileName,root->startLine, + "Warning: class %s already has a brief description\n" + " skipping the one found here.", + fullName.data() + ); } - } - else // new class - { - - ClassDef::CompoundType sec=ClassDef::Class; - switch(root->section) + else if (!root->brief.isEmpty()) { - case Entry::UNION_SEC: - case Entry::UNIONDOC_SEC: - sec=ClassDef::Union; break; - case Entry::STRUCT_SEC: - case Entry::STRUCTDOC_SEC: - sec=ClassDef::Struct; break; - case Entry::INTERFACE_SEC: - case Entry::INTERFACEDOC_SEC: - sec=ClassDef::Interface; break; - case Entry::EXCEPTION_SEC: - case Entry::EXCEPTIONDOC_SEC: - sec=ClassDef::Exception; break; + cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); } - Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", - fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); - QCString className; - QCString namespaceName; - extractNamespaceName(fullName,className,namespaceName); - - //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data()); - - QCString tagName; - QCString refFileName; - if (root->tagInfo) + if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1) { - tagName = root->tagInfo->tagName; - refFileName = root->tagInfo->fileName; + cd->setBodySegment(root->bodyLine,root->endBodyLine); + cd->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig)); } - ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec, - tagName,refFileName); - cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition - cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data()); - + cd->addSectionsToDefinition(root->anchors); + cd->setName(fullName); // change name to match docs + } + cd->setFileDef(fd); + if (cd->hasDocumentation()) + { + addIncludeFile(cd,fd,root); + } + addNamespace(root,cd); + if (fd && (root->section & Entry::COMPOUND_MASK)) + { + //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", + // cd->name().data(), + // fd->name().data(), + // root->fileName.data() + // ); + fd->insertClass(cd); + } + addClassToGroups(root,cd); + cd->setRefItems(root->todoId,root->testId,root->bugId); + if (!root->subGrouping) cd->setSubGrouping(FALSE); + if (cd->templateArguments()==0) + { + // this happens if a template class declared with @class is found + // before the actual definition. ArgumentList *tArgList = getTemplateArgumentsFromName(fullName,root->tArgLists); - //printf("class %s template args=%s\n",fullName.data(), - // tArgList ? tempArgListToString(tArgList).data() : "<none>"); cd->setTemplateArguments(tArgList); - cd->setProtection(root->protection); - cd->addSectionsToDefinition(root->anchors); - cd->setIsStatic(root->stat); + } + } + else // new class + { + + ClassDef::CompoundType sec=ClassDef::Class; + switch(root->section) + { + case Entry::UNION_SEC: + case Entry::UNIONDOC_SEC: + sec=ClassDef::Union; break; + case Entry::STRUCT_SEC: + case Entry::STRUCTDOC_SEC: + sec=ClassDef::Struct; break; + case Entry::INTERFACE_SEC: + case Entry::INTERFACEDOC_SEC: + sec=ClassDef::Interface; break; + case Entry::EXCEPTION_SEC: + case Entry::EXCEPTIONDOC_SEC: + sec=ClassDef::Exception; break; + } + Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", + fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); + QCString className; + QCString namespaceName; + extractNamespaceName(fullName,className,namespaceName); - // file definition containing the class cd - cd->setBodySegment(root->bodyLine,root->endBodyLine); - cd->setBodyDef(fd); - if (!root->subGrouping) cd->setSubGrouping(FALSE); + //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data()); - addClassToGroups(root,cd); - cd->setRefItems(root->todoId,root->testId,root->bugId); + QCString tagName; + QCString refFileName; + if (root->tagInfo) + { + tagName = root->tagInfo->tagName; + refFileName = root->tagInfo->fileName; + } + ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec, + tagName,refFileName); + cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition + cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); + //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data()); - // see if the class is found inside a namespace - bool found=addNamespace(root,cd); - cd->setFileDef(fd); - if (cd->hasDocumentation()) - { - addIncludeFile(cd,fd,root); - } + ArgumentList *tArgList = + getTemplateArgumentsFromName(fullName,root->tArgLists); + //printf("class %s template args=%s\n",fullName.data(), + // tArgList ? tempArgListToString(tArgList).data() : "<none>"); + cd->setTemplateArguments(tArgList); + cd->setProtection(root->protection); + cd->addSectionsToDefinition(root->anchors); + cd->setIsStatic(root->stat); - // namespace is part of the class name - if (!found && !namespaceName.isEmpty()) - { - NamespaceDef *nd = getResolvedNamespace(namespaceName); - if (nd) - { - cd->setNamespace(nd); - nd->insertClass(cd); - found=TRUE; - } - } + // file definition containing the class cd + cd->setBodySegment(root->bodyLine,root->endBodyLine); + cd->setBodyDef(fd); + if (!root->subGrouping) cd->setSubGrouping(FALSE); - // if the class is not in a namespace then we insert - // it in the file definition - if (!found && fd && (root->section & Entry::COMPOUND_MASK)) - { - //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", - // cd->name().data(), - // fd->name().data(), - // root->fileName.data() - // ); - fd->insertClass(cd); - } + addClassToGroups(root,cd); + cd->setRefItems(root->todoId,root->testId,root->bugId); - // the empty string test is needed for extract all case - cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - cd->insertUsedFile(root->fileName); + // see if the class is found inside a namespace + bool found=addNamespace(root,cd); - // add class to the list - //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); - Doxygen::classSDict.append(fullName,cd); + cd->setFileDef(fd); + if (cd->hasDocumentation()) + { + addIncludeFile(cd,fd,root); + } - // also add class to the correct structural context - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); - if (d==0) - { - //warn(root->fileName,root->startLine, - // "Warning: Internal inconsistency: scope for class %s not " - // "found!\n",fullName.data() - // ); - } - else + // namespace is part of the class name + if (!found && !namespaceName.isEmpty()) + { + NamespaceDef *nd = getResolvedNamespace(namespaceName); + if (nd) { - //printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data()); - d->addInnerCompound(cd); - cd->setOuterScope(d); + cd->setNamespace(nd); + nd->insertClass(cd); + found=TRUE; } } + + // if the class is not in a namespace then we insert + // it in the file definition + if (!found && fd && (root->section & Entry::COMPOUND_MASK)) + { + //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", + // cd->name().data(), + // fd->name().data(), + // root->fileName.data() + // ); + fd->insertClass(cd); + } + + // the empty string test is needed for extract all case + cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); + cd->insertUsedFile(root->fileName); + + // add class to the list + //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); + Doxygen::classSDict.append(fullName,cd); + + // also add class to the correct structural context + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); + if (d==0) + { + //warn(root->fileName,root->startLine, + // "Warning: Internal inconsistency: scope for class %s not " + // "found!\n",fullName.data() + // ); + } + else + { + //printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data()); + d->addInnerCompound(cd); + cd->setOuterScope(d); + } + } +} + +//---------------------------------------------------------------------- +// build a list of all classes mentioned in the documentation +// and all classes that have a documentation block before their definition. +static void buildClassList(Entry *root) +{ + if ( + (root->section & Entry::COMPOUND_MASK) && !root->name.isEmpty() + ) + { + addClassToContext(root); } -error: EntryListIterator eli(*root->sublist); Entry *e; for (;(e=eli.current());++eli) @@ -775,18 +775,41 @@ error: } } +static void buildClassDocList(Entry *root) +{ + if ( + (root->section & Entry::COMPOUNDDOC_MASK) && !root->name.isEmpty() + ) + { + addClassToContext(root); + } + EntryListIterator eli(*root->sublist); + Entry *e; + for (;(e=eli.current());++eli) + { + buildClassDocList(e); + } +} //---------------------------------------------------------------------- // build a list of all namespaces mentioned in the documentation // and all namespaces that have a documentation block before their definition. static void buildNamespaceList(Entry *root) { if ( - (root->section==Entry::NAMESPACE_SEC) || - (root->section==Entry::NAMESPACEDOC_SEC) && + (root->section==Entry::NAMESPACE_SEC || + root->section==Entry::NAMESPACEDOC_SEC || + root->section==Entry::PACKAGEDOC_SEC + ) && !root->name.isEmpty() ) { - QCString fullName=stripAnonymousNamespaceScope(root->name.copy()); + QCString fullName = root->name; + if (root->section==Entry::PACKAGEDOC_SEC) + { + fullName=substitute(fullName,".","::"); + } + + fullName = stripAnonymousNamespaceScope(fullName); if (!fullName.isEmpty()) { //printf("Found namespace %s in %s at line %d\n",root->name.data(), @@ -5564,50 +5587,50 @@ static void findMainPage(Entry *root) //---------------------------------------------------------------------------- -/*! Search for all Java package statements - */ -static void buildPackageList(Entry *root) -{ - if (root->section == Entry::PACKAGE_SEC || root->section == Entry::PACKAGEDOC_SEC && !root->name.isEmpty()) - { - PackageDef *pd=0; - if ((pd=Doxygen::packageDict.find(root->name))==0) - { - QCString tagName; - if (root->tagInfo) - { - tagName=root->tagInfo->tagName; - } - pd = new PackageDef(root->fileName,root->startLine,root->name,tagName); - Doxygen::packageDict.inSort(root->name,pd); - pd->setDocumentation(root->doc,root->docFile,root->docLine); - pd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - } - else - { - if (!pd->documentation() && !root->doc.isEmpty()) - { - pd->setDocumentation(root->doc,root->docFile,root->docLine); - } - if (!pd->briefDescription() && !root->brief.isEmpty()) - { - pd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - } - } - bool ambig; - FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); - if (fd) - { - fd->setPackageDef(pd); - } - } - EntryListIterator eli(*root->sublist); - Entry *e; - for (;(e=eli.current());++eli) - { - buildPackageList(e); - } -} +///*! Search for all Java package statements +// */ +//static void buildPackageList(Entry *root) +//{ +// if (root->section == Entry::PACKAGE_SEC || root->section == Entry::PACKAGEDOC_SEC && !root->name.isEmpty()) +// { +// PackageDef *pd=0; +// if ((pd=Doxygen::packageDict.find(root->name))==0) +// { +// QCString tagName; +// if (root->tagInfo) +// { +// tagName=root->tagInfo->tagName; +// } +// pd = new PackageDef(root->fileName,root->startLine,root->name,tagName); +// Doxygen::packageDict.inSort(root->name,pd); +// pd->setDocumentation(root->doc,root->docFile,root->docLine); +// pd->setBriefDescription(root->brief,root->briefFile,root->briefLine); +// } +// else +// { +// if (!pd->documentation() && !root->doc.isEmpty()) +// { +// pd->setDocumentation(root->doc,root->docFile,root->docLine); +// } +// if (!pd->briefDescription() && !root->brief.isEmpty()) +// { +// pd->setBriefDescription(root->brief,root->briefFile,root->briefLine); +// } +// } +// bool ambig; +// FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); +// if (fd) +// { +// fd->setPackageDef(pd); +// } +// } +// EntryListIterator eli(*root->sublist); +// Entry *e; +// for (;(e=eli.current());++eli) +// { +// buildPackageList(e); +// } +//} //---------------------------------------------------------------------------- @@ -5814,20 +5837,20 @@ static void generateGroupDocs() //---------------------------------------------------------------------------- -static void generatePackageDocs() -{ - writePackageIndex(*outputList); - - if (Doxygen::packageDict.count()>0) - { - PackageSDict::Iterator pdi(Doxygen::packageDict); - PackageDef *pd; - for (pdi.toFirst();(pd=pdi.current());++pdi) - { - pd->writeDocumentation(*outputList); - } - } -} +//static void generatePackageDocs() +//{ +// writePackageIndex(*outputList); +// +// if (Doxygen::packageDict.count()>0) +// { +// PackageSDict::Iterator pdi(Doxygen::packageDict); +// PackageDef *pd; +// for (pdi.toFirst();(pd=pdi.current());++pdi) +// { +// pd->writeDocumentation(*outputList); +// } +// } +//} //---------------------------------------------------------------------------- // generate module pages @@ -7220,6 +7243,7 @@ void parseInput() msg("Building class list...\n"); buildClassList(root); + buildClassDocList(root); findUsingDeclarations(root); msg("Building example list...\n"); @@ -7268,8 +7292,8 @@ void parseInput() msg("Building page list...\n"); buildPageList(root); - msg("Building package list...\n"); - buildPackageList(root); + //msg("Building package list...\n"); + //buildPackageList(root); msg("Search for main page...\n"); findMainPage(root); @@ -7425,9 +7449,9 @@ void generateOutput() msg("Generating group index...\n"); writeGroupIndex(*outputList); - - msg("Generating package index...\n"); - generatePackageDocs(); + + //msg("Generating package index...\n"); + //generatePackageDocs(); msg("Generating example index...\n"); writeExampleIndex(*outputList); |