bool ClangIndexer::parse() { StopWatch sw; assert(!mClangUnit); assert(!mIndex); mIndex = clang_createIndex(0, 1); assert(mIndex); const unsigned int commandLineFlags = Source::FilterBlacklist|Source::IncludeDefines|Source::IncludeIncludepaths; const unsigned int flags = CXTranslationUnit_DetailedPreprocessingRecord; List<CXUnsavedFile> unsavedFiles(mUnsavedFiles.size() + 1); int unsavedIndex = 0; for (const auto &it : mUnsavedFiles) { unsavedFiles[unsavedIndex++] = { it.first.constData(), it.second.constData(), static_cast<unsigned long>(it.second.size()) }; } debug() << "CI::parse: " << mSource.toCommandLine(commandLineFlags) << "\n"; // for (const auto it : mSource.toCommandLine(commandLineFlags)) { // error("[%s]", it.constData()); // } RTags::parseTranslationUnit(mSourceFile, mSource.toCommandLine(commandLineFlags), mClangUnit, mIndex, &unsavedFiles[0], unsavedIndex, flags, &mClangLine); warning() << "CI::parse loading unit " << mClangLine << " " << (mClangUnit != 0); if (mClangUnit) { clang_getInclusions(mClangUnit, ClangIndexer::inclusionVisitor, this); mParseDuration = sw.elapsed(); return true; } error() << "got failure" << mClangLine; for (Hash<uint32_t, bool>::const_iterator it = mData->visited.begin(); it != mData->visited.end(); ++it) { mData->dependencies[it->first].insert(mSource.fileId); addFileSymbol(it->first); } return false; }
bool ClangIndexer::visit() { if (!mClangUnit || !mSource.fileId) { return false; } StopWatch watch; clang_visitChildren(clang_getTranslationUnitCursor(mClangUnit), ClangIndexer::indexVisitor, this); for (Hash<uint32_t, bool>::const_iterator it = mData->visited.begin(); it != mData->visited.end(); ++it) { mData->dependencies[it->first].insert(mSource.fileId); addFileSymbol(it->first); } mVisitDuration = watch.elapsed(); if (testLog(VerboseDebug)) { VerboseVisitorUserData u = { 0, "<VerboseVisitor " + mClangLine + ">\n", this }; clang_visitChildren(clang_getTranslationUnitCursor(mClangUnit), ClangIndexer::verboseVisitor, &u); u.out += "</VerboseVisitor " + mClangLine + ">"; if (getenv("RTAGS_INDEXERJOB_DUMP_TO_FILE")) { char buf[1024]; snprintf(buf, sizeof(buf), "/tmp/%s.log", Location::path(mSource.fileId).fileName()); FILE *f = fopen(buf, "w"); assert(f); fwrite(u.out.constData(), 1, u.out.size(), f); fclose(f); } else { logDirect(VerboseDebug, u.out); } } return true; }