diff options
Diffstat (limited to 'src/doxygen.cpp')
-rw-r--r-- | src/doxygen.cpp | 100 |
1 files changed, 53 insertions, 47 deletions
diff --git a/src/doxygen.cpp b/src/doxygen.cpp index d8436bb..5ac1980 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -159,7 +159,8 @@ bool Doxygen::userComments = FALSE; QCString Doxygen::spaces; bool Doxygen::generatingXmlOutput = FALSE; GenericsSDict *Doxygen::genericsDict; -DefineList Doxygen::macroDefinitions; +DefinesPerFileList Doxygen::macroDefinitions; +bool Doxygen::clangAssistedParsing = FALSE; // locally accessible globals static std::unordered_map< std::string, const Entry* > g_classEntries; @@ -7477,18 +7478,18 @@ static void generateFileSources() if (!Doxygen::inputNameLinkedMap->empty()) { #if USE_LIBCLANG - static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING); - if (clangAssistedParsing) + if (Doxygen::clangAssistedParsing) { - QDict<void> g_processedFiles(10007); + StringUnorderedSet processedFiles; // create a dictionary with files to process - QDict<void> g_filesToProcess(10007); + StringUnorderedSet filesToProcess; + for (const auto &fn : *Doxygen::inputNameLinkedMap) { for (const auto &fd : *fn) { - g_filesToProcess.insert(fd->absFilePath(),(void*)0x8); + filesToProcess.insert(fd->absFilePath().str()); } } // process source files (and their include dependencies) @@ -7515,9 +7516,9 @@ static void generateFileSources() } char *incFile = filesInSameTu.first(); - while (incFile && g_filesToProcess.find(incFile)) + while (incFile && filesToProcess.find(incFile)!=filesToProcess.end()) { - if (fd->absFilePath()!=incFile && !g_processedFiles.find(incFile)) + if (fd->absFilePath()!=incFile && processedFiles.find(incFile)==processedFiles.end()) { QStrList moreFiles; bool ambig; @@ -7536,13 +7537,13 @@ static void generateFileSources() msg(" Parsing code for file %s...\n",ifd->docName().data()); ifd->parseSource(TRUE,moreFiles); } - g_processedFiles.insert(incFile,(void*)0x8); + processedFiles.insert(incFile); } } incFile = filesInSameTu.next(); } fd->finishParsing(); - g_processedFiles.insert(fd->absFilePath(),(void*)0x8); + processedFiles.insert(fd->absFilePath().str()); } } } @@ -7551,7 +7552,7 @@ static void generateFileSources() { for (const auto &fd : *fn) { - if (!g_processedFiles.find(fd->absFilePath())) // not yet processed + if (processedFiles.find(fd->absFilePath().str())==processedFiles.end()) // not yet processed { QStrList filesInSameTu; fd->startParsing(); @@ -7701,28 +7702,35 @@ static void addSourceReferences() // add the macro definitions found during preprocessing as file members static void buildDefineList() { - for (const auto &def : Doxygen::macroDefinitions) + for (const auto &s : g_inputFiles) { - std::unique_ptr<MemberDef> md { createMemberDef( - def->fileName,def->lineNr,def->columnNr, - "#define",def->name,def->args,0, - Public,Normal,FALSE,Member,MemberType_Define, - ArgumentList(),ArgumentList(),"") }; - - if (!def->args.isEmpty()) + auto it = Doxygen::macroDefinitions.find(s); + if (it!=Doxygen::macroDefinitions.end()) { - md->moveArgumentList(stringToArgumentList(SrcLangExt_Cpp, def->args)); - } - md->setInitializer(def->definition); - md->setFileDef(def->fileDef); - md->setDefinition("#define "+def->name); + for (const auto &def : it->second) + { + std::unique_ptr<MemberDef> md { createMemberDef( + def->fileName,def->lineNr,def->columnNr, + "#define",def->name,def->args,0, + Public,Normal,FALSE,Member,MemberType_Define, + ArgumentList(),ArgumentList(),"") }; - MemberName *mn=Doxygen::functionNameLinkedMap->add(def->name); - if (def->fileDef) - { - def->fileDef->insertMember(md.get()); + if (!def->args.isEmpty()) + { + md->moveArgumentList(stringToArgumentList(SrcLangExt_Cpp, def->args)); + } + md->setInitializer(def->definition); + md->setFileDef(def->fileDef); + md->setDefinition("#define "+def->name); + + MemberName *mn=Doxygen::functionNameLinkedMap->add(def->name); + if (def->fileDef) + { + def->fileDef->insertMember(md.get()); + } + mn->push_back(std::move(md)); + } } - mn->push_back(std::move(md)); } } @@ -9056,11 +9064,6 @@ static std::shared_ptr<Entry> parseFile(OutlineParserInterface &parser, FileDef *fd,const char *fn, bool sameTu,QStrList &filesInSameTu) { -#if USE_LIBCLANG - static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING); -#else - static bool clangAssistedParsing = FALSE; -#endif QCString fileName=fn; QCString extension; int ei = fileName.findRev('.'); @@ -9107,7 +9110,7 @@ static std::shared_ptr<Entry> parseFile(OutlineParserInterface &parser, convBuf.addChar('\0'); - if (clangAssistedParsing && !sameTu) + if (Doxygen::clangAssistedParsing && !sameTu) { fd->getAllIncludeFilesRecursively(filesInSameTu); } @@ -9123,16 +9126,15 @@ static std::shared_ptr<Entry> parseFile(OutlineParserInterface &parser, static void parseFiles(const std::shared_ptr<Entry> &root) { #if USE_LIBCLANG - static bool clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING); - if (clangAssistedParsing) + if (Doxygen::clangAssistedParsing) { - QDict<void> g_processedFiles(10007); + StringUnorderedSet processedFiles; // create a dictionary with files to process - QDict<void> g_filesToProcess(10007); + StringUnorderedSet filesToProcess; for (const auto &s : g_inputFiles) { - g_filesToProcess.insert(s.c_str(),(void*)0x8); + filesToProcess.insert(s); } // process source files (and their include dependencies) @@ -9153,9 +9155,9 @@ static void parseFiles(const std::shared_ptr<Entry> &root) // Now process any include files in the same translation unit // first. When libclang is used this is much more efficient. char *incFile = filesInSameTu.first(); - while (incFile && g_filesToProcess.find(incFile)) + while (incFile && filesToProcess.find(incFile)!=filesToProcess.end()) { - if (qstrcmp(incFile,s.c_str()) && !g_processedFiles.find(incFile)) + if (qstrcmp(incFile,s.c_str()) && processedFiles.find(incFile)==processedFiles.end()) { FileDef *ifd=findFileDef(Doxygen::inputNameLinkedMap,incFile,ambig); if (ifd && !ifd->isReference()) @@ -9164,19 +9166,19 @@ static void parseFiles(const std::shared_ptr<Entry> &root) //printf(" Processing %s in same translation unit as %s\n",incFile,s->c_str()); fileRoot = parseFile(*parser.get(),ifd,incFile,TRUE,moreFiles); root->moveToSubEntryAndKeep(fileRoot); - g_processedFiles.insert(incFile,(void*)0x8); + processedFiles.insert(incFile); } } incFile = filesInSameTu.next(); } parser->finishTranslationUnit(); - g_processedFiles.insert(s.c_str(),(void*)0x8); + processedFiles.insert(s); } } // process remaining files for (const auto &s : g_inputFiles) { - if (!g_processedFiles.find(s.c_str())) // not yet processed + if (processedFiles.find(s)==processedFiles.end()) // not yet processed { bool ambig; QStrList filesInSameTu; @@ -9187,7 +9189,7 @@ static void parseFiles(const std::shared_ptr<Entry> &root) std::shared_ptr<Entry> fileRoot = parseFile(*parser.get(),fd,s.c_str(),FALSE,filesInSameTu); root->moveToSubEntryAndKeep(fileRoot); parser->finishTranslationUnit(); - g_processedFiles.insert(s.c_str(),(void*)0x8); + processedFiles.insert(s); } } } @@ -10700,6 +10702,10 @@ void parseInput() { atexit(exitDoxygen); +#if USE_LIBCLANG + Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING); +#endif + // we would like to show the versionString earlier, but we first have to handle the configuration file // to know the value of the QUIET setting. QCString versionString = getFullVersion(); @@ -11578,7 +11584,7 @@ void generateOutput() if (Debug::isFlagSet(Debug::Time)) { msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n", - ((double)Debug::elapsedTime())/1000.0, + ((double)Debug::elapsedTime()), Portable::getSysElapsedTime() ); g_s.print(); |