diff options
Diffstat (limited to 'src/qdoc/clangcodeparser.cpp')
-rw-r--r-- | src/qdoc/clangcodeparser.cpp | 280 |
1 files changed, 162 insertions, 118 deletions
diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp index 2e96a092d..5e04c344e 100644 --- a/src/qdoc/clangcodeparser.cpp +++ b/src/qdoc/clangcodeparser.cpp @@ -67,7 +67,7 @@ static CXTranslationUnit_Flags flags_ = static_cast<CXTranslationUnit_Flags>(0); static CXIndex index_ = nullptr; #ifndef QT_NO_DEBUG_STREAM -template <class T> +template<class T> static QDebug operator<<(QDebug debug, const std::vector<T> &v) { QDebugStateSaver saver(debug); @@ -90,10 +90,13 @@ static QDebug operator<<(QDebug debug, const std::vector<T> &v) T can be any functor that is callable with a CXCursor parameter and returns a CXChildVisitResult (in other word compatible with function<CXChildVisitResult(CXCursor)> */ -template <typename T> bool visitChildrenLambda(CXCursor cursor, T &&lambda) +template<typename T> +bool visitChildrenLambda(CXCursor cursor, T &&lambda) { - CXCursorVisitor visitor = [](CXCursor c, CXCursor , CXClientData client_data) -> CXChildVisitResult - { return (*static_cast<T *>(client_data))(c); }; + CXCursorVisitor visitor = [](CXCursor c, CXCursor, + CXClientData client_data) -> CXChildVisitResult { + return (*static_cast<T *>(client_data))(c); + }; return clang_visitChildren(cursor, visitor, &lambda); } @@ -107,7 +110,6 @@ static QString fromCXString(CXString &&string) return ret; } - /*! convert a CXSourceLocation to a qdoc Location */ @@ -125,12 +127,17 @@ static Location fromCXSourceLocation(CXSourceLocation location) /*! convert a CX_CXXAccessSpecifier to Node::Access */ -static Node::Access fromCX_CXXAccessSpecifier(CX_CXXAccessSpecifier spec) { +static Node::Access fromCX_CXXAccessSpecifier(CX_CXXAccessSpecifier spec) +{ switch (spec) { - case CX_CXXPrivate: return Node::Private; - case CX_CXXProtected: return Node::Protected; - case CX_CXXPublic: return Node::Public; - default: return Node::Public; + case CX_CXXPrivate: + return Node::Private; + case CX_CXXProtected: + return Node::Protected; + case CX_CXXPublic: + return Node::Public; + default: + return Node::Public; } } @@ -154,7 +161,6 @@ static QString getSpelling(CXSourceRange range) return QString::fromUtf8(file.read(offset2 - offset1)); } - /*! Returns the function name from a given cursor representing a function declaration. This is usually clang_getCursorSpelling, but @@ -163,9 +169,9 @@ static QString getSpelling(CXSourceRange range) QString functionName(CXCursor cursor) { if (clang_getCursorKind(cursor) == CXCursor_ConversionFunction) { - // For a CXCursor_ConversionFunction we don't want the spelling which would be something like - // "operator type-parameter-0-0" or "operator unsigned int". - // we want the actual name as spelled; + // For a CXCursor_ConversionFunction we don't want the spelling which would be something + // like "operator type-parameter-0-0" or "operator unsigned int". we want the actual name as + // spelled; QString type = fromCXString(clang_getTypeSpelling(clang_getCursorResultType(cursor))); if (type.isEmpty()) return fromCXString(clang_getCursorSpelling(cursor)); @@ -185,7 +191,8 @@ QString functionName(CXCursor cursor) Reconstruct the qualified path name of a function that is being overridden. */ -static QString reconstructQualifiedPathForCursor(CXCursor cur) { +static QString reconstructQualifiedPathForCursor(CXCursor cur) +{ QString path; auto kind = clang_getCursorKind(cur); while (!clang_isInvalid(kind) && kind != CXCursor_TranslationUnit) { @@ -219,7 +226,8 @@ static QString reconstructQualifiedPathForCursor(CXCursor cur) { Find the node from the QDocDatabase \a qdb that corrseponds to the declaration represented by the cursor \a cur, if it exists. */ -static Node *findNodeForCursor(QDocDatabase *qdb, CXCursor cur) { +static Node *findNodeForCursor(QDocDatabase *qdb, CXCursor cur) +{ auto kind = clang_getCursorKind(cur); if (clang_isInvalid(kind)) return nullptr; @@ -308,7 +316,8 @@ static Node *findNodeForCursor(QDocDatabase *qdb, CXCursor cur) { corrseponds to the declaration represented by the cursor \a cur, if it exists. */ -static Node *findFunctionNodeForCursor(QDocDatabase *qdb, CXCursor cur) { +static Node *findFunctionNodeForCursor(QDocDatabase *qdb, CXCursor cur) +{ auto kind = clang_getCursorKind(cur); if (clang_isInvalid(kind)) return nullptr; @@ -375,10 +384,13 @@ static Node *findFunctionNodeForCursor(QDocDatabase *qdb, CXCursor cur) { return nullptr; } -class ClangVisitor { +class ClangVisitor +{ public: ClangVisitor(QDocDatabase *qdb, const QHash<QString, QString> &allHeaders) - : qdb_(qdb), parent_(qdb->primaryTreeRoot()), allHeaders_(allHeaders) { } + : qdb_(qdb), parent_(qdb->primaryTreeRoot()), allHeaders_(allHeaders) + { + } QDocDatabase *qdocDB() { return qdb_; } @@ -425,6 +437,7 @@ public: } Node *nodeForCommentAtLocation(CXSourceLocation loc, CXSourceLocation nextCommentLoc); + private: /*! SimpleLoc represents a simple location in the main source file, @@ -433,7 +446,8 @@ private: struct SimpleLoc { unsigned int line, column; - friend bool operator<(const SimpleLoc &a, const SimpleLoc &b) { + friend bool operator<(const SimpleLoc &a, const SimpleLoc &b) + { return a.line != b.line ? a.line < b.line : a.column < b.column; } }; @@ -452,7 +466,8 @@ private: /*! Returns true if the symbol should be ignored for the documentation. */ - bool ignoredSymbol(const QString &symbolName) { + bool ignoredSymbol(const QString &symbolName) + { if (symbolName == QLatin1String("QPrivateSignal")) return true; return false; @@ -464,7 +479,8 @@ private: example: 'QLinkedList::iterator' -> 'iterator' */ - QString adjustTypeName(const QString &typeName) { + QString adjustTypeName(const QString &typeName) + { auto parent = parent_->parent(); if (parent && parent->isClassNode()) { QStringRef typeNameConstRemoved(&typeName); @@ -473,7 +489,7 @@ private: auto parentName = parent->fullName(); if (typeNameConstRemoved.startsWith(parentName) - && typeNameConstRemoved.mid(parentName.size(), 2) == QLatin1String("::")) { + && typeNameConstRemoved.mid(parentName.size(), 2) == QLatin1String("::")) { QString result = typeName; result.remove(typeNameConstRemoved.position(), parentName.size() + 2); return result; @@ -484,7 +500,8 @@ private: CXChildVisitResult visitSource(CXCursor cursor, CXSourceLocation loc); CXChildVisitResult visitHeader(CXCursor cursor, CXSourceLocation loc); - CXChildVisitResult visitFnSignature(CXCursor cursor, CXSourceLocation loc, Node **fnNode, bool &ignoreSignature); + CXChildVisitResult visitFnSignature(CXCursor cursor, CXSourceLocation loc, Node **fnNode, + bool &ignoreSignature); void parseProperty(const QString &spelling, const Location &loc); void readParameterNamesAndAttributes(FunctionNode *fn, CXCursor cursor); Aggregate *getSemanticParent(CXCursor cursor); @@ -524,7 +541,8 @@ Aggregate *ClangVisitor::getSemanticParent(CXCursor cursor) return parent_; } -CXChildVisitResult ClangVisitor::visitFnSignature(CXCursor cursor, CXSourceLocation , Node **fnNode, bool &ignoreSignature) +CXChildVisitResult ClangVisitor::visitFnSignature(CXCursor cursor, CXSourceLocation, Node **fnNode, + bool &ignoreSignature) { switch (clang_getCursorKind(cursor)) { case CXCursor_FunctionDecl: @@ -582,7 +600,8 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l if (!clang_isCursorDefinition(cursor)) return CXChildVisit_Continue; - if (findNodeForCursor(qdb_, cursor)) // Was already parsed, propably in another translation unit + if (findNodeForCursor(qdb_, + cursor)) // Was already parsed, propably in another translation unit return CXChildVisit_Continue; QString className = fromCXString(clang_getCursorSpelling(cursor)); @@ -610,7 +629,6 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l QScopedValueRollback<Aggregate *> setParent(parent_, classe); return visitChildren(cursor); - } case CXCursor_CXXBaseSpecifier: { if (!parent_->isClassNode()) @@ -633,7 +651,8 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l QString namespaceName = fromCXString(clang_getCursorDisplayName(cursor)); NamespaceNode *ns = nullptr; if (parent_) - ns = static_cast<NamespaceNode *>(parent_->findNonfunctionChild(namespaceName, &Node::isNamespace)); + ns = static_cast<NamespaceNode *>( + parent_->findNonfunctionChild(namespaceName, &Node::isNamespace)); if (!ns) { ns = new NamespaceNode(parent_, namespaceName); ns->setAccess(Node::Public); @@ -648,7 +667,8 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l case CXCursor_Constructor: case CXCursor_Destructor: case CXCursor_ConversionFunction: { - if (findNodeForCursor(qdb_, cursor)) // Was already parsed, propably in another translation unit + if (findNodeForCursor(qdb_, + cursor)) // Was already parsed, propably in another translation unit return CXChildVisit_Continue; QString name = functionName(cursor); if (ignoredSymbol(name)) @@ -679,14 +699,16 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l else if (kind == CXCursor_Destructor) fn->setMetaness(FunctionNode::Dtor); else - fn->setReturnType(adjustTypeName(fromCXString( - clang_getTypeSpelling(clang_getResultType(funcType))))); + fn->setReturnType(adjustTypeName( + fromCXString(clang_getTypeSpelling(clang_getResultType(funcType))))); fn->setStatic(clang_CXXMethod_isStatic(cursor)); fn->setConst(clang_CXXMethod_isConst(cursor)); - fn->setVirtualness(!clang_CXXMethod_isVirtual(cursor) ? FunctionNode::NonVirtual - : clang_CXXMethod_isPureVirtual(cursor) ? FunctionNode::PureVirtual - : FunctionNode::NormalVirtual); + fn->setVirtualness(!clang_CXXMethod_isVirtual(cursor) + ? FunctionNode::NonVirtual + : clang_CXXMethod_isPureVirtual(cursor) + ? FunctionNode::PureVirtual + : FunctionNode::NormalVirtual); CXRefQualifierKind refQualKind = clang_Type_getCXXRefQualifier(funcType); if (refQualKind == CXRefQualifier_LValue) fn->setRef(true); @@ -746,7 +768,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l Aggregate *ns = parent_; while (ns && ns->isClassNode()) ns = ns->parent(); - QScopedValueRollback<Aggregate *>setParent(parent_, ns); + QScopedValueRollback<Aggregate *> setParent(parent_, ns); // Visit the friend functions return visitChildren(cursor); } @@ -774,7 +796,6 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l if (clang_getCursorKind(cur) != CXCursor_EnumConstantDecl) return CXChildVisit_Continue; - QString value; visitChildrenLambda(cur, [&](CXCursor cur) { if (clang_isExpression(clang_getCursorKind(cur))) { @@ -799,7 +820,8 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l } case CXCursor_FieldDecl: case CXCursor_VarDecl: { - if (findNodeForCursor(qdb_, cursor)) // Was already parsed, propably in another translation unit + if (findNodeForCursor(qdb_, + cursor)) // Was already parsed, propably in another translation unit return CXChildVisit_Continue; auto access = fromCX_CXXAccessSpecifier(clang_getCXXAccessSpecifier(cursor)); auto var = new VariableNode(parent_, fromCXString(clang_getCursorSpelling(cursor))); @@ -810,7 +832,8 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l return CXChildVisit_Continue; } case CXCursor_TypedefDecl: { - if (findNodeForCursor(qdb_, cursor)) // Was already parsed, propably in another translation unit + if (findNodeForCursor(qdb_, + cursor)) // Was already parsed, propably in another translation unit return CXChildVisit_Continue; TypedefNode *td = new TypedefNode(parent_, fromCXString(clang_getCursorSpelling(cursor))); td->setAccess(fromCX_CXXAccessSpecifier(clang_getCXXAccessSpecifier(cursor))); @@ -818,13 +841,14 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l // Search to see if this is a Q_DECLARE_FLAGS (if the type is QFlags<ENUM>) visitChildrenLambda(cursor, [&](CXCursor cur) { if (clang_getCursorKind(cur) != CXCursor_TemplateRef - || fromCXString(clang_getCursorSpelling(cur)) != QLatin1String("QFlags")) + || fromCXString(clang_getCursorSpelling(cur)) != QLatin1String("QFlags")) return CXChildVisit_Continue; // Found QFlags<XXX> visitChildrenLambda(cursor, [&](CXCursor cur) { if (clang_getCursorKind(cur) != CXCursor_TypeRef) return CXChildVisit_Continue; - auto *en = findNodeForCursor(qdb_, clang_getTypeDeclaration(clang_getCursorType(cur))); + auto *en = + findNodeForCursor(qdb_, clang_getTypeDeclaration(clang_getCursorType(cur))); if (en && en->isEnumType()) static_cast<EnumNode *>(en)->setFlagsType(td); return CXChildVisit_Break; @@ -836,10 +860,10 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l default: if (clang_isDeclaration(kind) && parent_->isClassNode()) { // maybe a static_assert (which is not exposed from the clang API) - QString spelling = getSpelling(clang_getCursorExtent(cursor)); + QString spelling = getSpelling(clang_getCursorExtent(cursor)); if (spelling.startsWith(QLatin1String("Q_PROPERTY")) - || spelling.startsWith(QLatin1String("QDOC_PROPERTY")) - || spelling.startsWith(QLatin1String("Q_OVERRIDE"))) { + || spelling.startsWith(QLatin1String("QDOC_PROPERTY")) + || spelling.startsWith(QLatin1String("Q_OVERRIDE"))) { parseProperty(spelling, fromCXSourceLocation(loc)); } } @@ -907,7 +931,7 @@ void ClangVisitor::parseProperty(const QString &spelling, const Location &loc) QString name = part.at(1); if (name.at(0) == QChar('*')) { type.append(QChar('*')); - name.remove(0,1); + name.remove(0, 1); } auto *property = new PropertyNode(parent_, name); property->setAccess(Node::Public); @@ -923,7 +947,7 @@ void ClangVisitor::parseProperty(const QString &spelling, const Location &loc) property->setFinal(); } if (i < part.size()) { - QString value = part.at(i++); + QString value = part.at(i++); if (key == "READ") { qdb_->addPropertyFunction(property, value, PropertyNode::Getter); } else if (key == "WRITE") { @@ -990,14 +1014,14 @@ Node *ClangVisitor::nodeForCommentAtLocation(CXSourceLocation loc, CXSourceLocat // make sure the previous decl was finished. if (decl_it != declMap_.begin()) { - CXSourceLocation prevDeclEnd = clang_getRangeEnd(clang_getCursorExtent(*(decl_it-1))); + CXSourceLocation prevDeclEnd = clang_getRangeEnd(clang_getCursorExtent(*(decl_it - 1))); unsigned int prevDeclLine; clang_getPresumedLocation(prevDeclEnd, nullptr, &prevDeclLine, nullptr); if (prevDeclLine >= docloc.line) { // The previous declaration was still going. This is only valid if the previous // declaration is a parent of the next declaration. auto parent = clang_getCursorLexicalParent(*decl_it); - if (!clang_equalCursors(parent, *(decl_it-1))) + if (!clang_equalCursors(parent, *(decl_it - 1))) return nullptr; } } @@ -1039,12 +1063,12 @@ void ClangCodeParser::initializeParser(const Config &config) includePaths_.resize(squeezedArgs.size()); std::transform(squeezedArgs.begin(), squeezedArgs.end(), includePaths_.begin(), [](const QString &s) { - QByteArray path(s.toUtf8()); - QFileInfo fi(QDir::current(), s); - if (fi.exists()) - path = fi.canonicalFilePath().toUtf8(); - return path.prepend("-I"); - }); + QByteArray path(s.toUtf8()); + QFileInfo fi(QDir::current(), s); + if (fi.exists()) + path = fi.canonicalFilePath().toUtf8(); + return path.prepend("-I"); + }); CppCodeParser::initializeParser(config); pchFileDir_.reset(nullptr); allHeaders_.clear(); @@ -1073,8 +1097,8 @@ void ClangCodeParser::initializeParser(const Config &config) } } } - qCDebug(lcQdoc).nospace() << __FUNCTION__ << " Clang v" << CINDEX_VERSION_MAJOR - << '.' << CINDEX_VERSION_MINOR; + qCDebug(lcQdoc).nospace() << __FUNCTION__ << " Clang v" << CINDEX_VERSION_MAJOR << '.' + << CINDEX_VERSION_MINOR; } /*! @@ -1096,7 +1120,12 @@ QString ClangCodeParser::language() */ QStringList ClangCodeParser::headerFileNameFilter() { - return QStringList() << "*.ch" << "*.h" << "*.h++" << "*.hh" << "*.hpp" << "*.hxx"; + return QStringList() << "*.ch" + << "*.h" + << "*.h++" + << "*.hh" + << "*.hpp" + << "*.hxx"; } /*! @@ -1105,7 +1134,11 @@ QStringList ClangCodeParser::headerFileNameFilter() */ QStringList ClangCodeParser::sourceFileNameFilter() { - return QStringList() << "*.c++" << "*.cc" << "*.cpp" << "*.cxx" << "*.mm"; + return QStringList() << "*.c++" + << "*.cc" + << "*.cpp" + << "*.cxx" + << "*.mm"; } /*! @@ -1158,8 +1191,8 @@ static QVector<QByteArray> includePathsFromHeaders(const QHash<QString, QString> QVector<QByteArray> result; for (auto it = allHeaders.cbegin(); it != allHeaders.cend(); ++it) { const QByteArray path = "-I" + it.value().toLatin1(); - const QByteArray parent = "-I" - + QDir::cleanPath(it.value() + QLatin1String("/../")).toLatin1(); + const QByteArray parent = + "-I" + QDir::cleanPath(it.value() + QLatin1String("/../")).toLatin1(); if (!result.contains(path)) result.append(path); if (!result.contains(parent)) @@ -1191,7 +1224,8 @@ bool ClangCodeParser::getMoreArgs() of reasonable places to look for include files and use that list instead. */ - Location::logToStdErrAlways("No include paths passed to qdoc; guessing reasonable include paths"); + Location::logToStdErrAlways( + "No include paths passed to qdoc; guessing reasonable include paths"); guessedIncludePaths = true; auto forest = qdb_->searchOrder(); @@ -1199,8 +1233,7 @@ bool ClangCodeParser::getMoreArgs() QString basicIncludeDir = QDir::cleanPath(QString(Config::installDir + "/../include")); moreArgs_ += "-I" + basicIncludeDir.toLatin1(); moreArgs_ += includePathsFromHeaders(allHeaders_); - } - else { + } else { moreArgs_ = includePaths_; } @@ -1217,22 +1250,28 @@ void ClangCodeParser::buildPCH() if (!pchFileDir_ && !moduleHeader().isEmpty()) { pchFileDir_.reset(new QTemporaryDir(QDir::tempPath() + QLatin1String("/qdoc_pch"))); if (pchFileDir_->isValid()) { - //const QByteArray module = qdb_->primaryTreeRoot()->tree()->camelCaseModuleName().toUtf8(); + // const QByteArray module = + // qdb_->primaryTreeRoot()->tree()->camelCaseModuleName().toUtf8(); const QByteArray module = moduleHeader().toUtf8(); QByteArray header; QByteArray privateHeaderDir; Location::logToStdErrAlways("Build & visit PCH for " + moduleHeader()); // A predicate for std::find_if() to locate a path to the module's header // (e.g. QtGui/QtGui) to be used as pre-compiled header - struct FindPredicate { + struct FindPredicate + { enum SearchType { Any, Module, Private }; QByteArray &candidate_; const QByteArray &module_; SearchType type_; - FindPredicate(QByteArray &candidate, const QByteArray &module, SearchType type = Any) - : candidate_(candidate), module_(module), type_(type) {} + FindPredicate(QByteArray &candidate, const QByteArray &module, + SearchType type = Any) + : candidate_(candidate), module_(module), type_(type) + { + } - bool operator()(const QByteArray &p) const { + bool operator()(const QByteArray &p) const + { if (type_ != Any && !p.endsWith(module_)) return false; candidate_ = p + "/"; @@ -1255,27 +1294,25 @@ void ClangCodeParser::buildPCH() // First, search for an include path that contains the module name, then any path QByteArray candidate; - auto it = std::find_if(includePaths_.begin(), - includePaths_.end(), + auto it = std::find_if(includePaths_.begin(), includePaths_.end(), FindPredicate(candidate, module, FindPredicate::Module)); if (it == includePaths_.end()) - it = std::find_if(includePaths_.begin(), - includePaths_.end(), + it = std::find_if(includePaths_.begin(), includePaths_.end(), FindPredicate(candidate, module, FindPredicate::Any)); if (it != includePaths_.end()) header = candidate; // Find the path to module's private headers - currently unused - it = std::find_if(includePaths_.begin(), - includePaths_.end(), + it = std::find_if(includePaths_.begin(), includePaths_.end(), FindPredicate(candidate, module, FindPredicate::Private)); if (it != includePaths_.end()) privateHeaderDir = candidate; if (header.isEmpty()) { qWarning() << "(qdoc) Could not find the module header in include paths for module" - << module << " (include paths: "<< includePaths_ << ")"; - qWarning() << " Artificial module header built from header dirs in qdocconf file"; + << module << " (include paths: " << includePaths_ << ")"; + qWarning() << " Artificial module header built from header dirs in qdocconf " + "file"; } args_.push_back("-xc++"); CXTranslationUnit tu; @@ -1285,11 +1322,11 @@ void ClangCodeParser::buildPCH() QTextStream out(&tmpHeaderFile); if (header.isEmpty()) { for (auto it = allHeaders_.constKeyValueBegin(); - it != allHeaders_.constKeyValueEnd(); ++it) { - if (!(*it).first.endsWith(QLatin1String("_p.h")) && - !(*it).first.startsWith(QLatin1String("moc_"))) { - QString line = QLatin1String("#include \"") + (*it).second + - QLatin1String("/") + (*it).first + QLatin1String("\""); + it != allHeaders_.constKeyValueEnd(); ++it) { + if (!(*it).first.endsWith(QLatin1String("_p.h")) + && !(*it).first.startsWith(QLatin1String("moc_"))) { + QString line = QLatin1String("#include \"") + (*it).second + + QLatin1String("/") + (*it).first + QLatin1String("\""); out << line << "\n"; } } @@ -1306,25 +1343,27 @@ void ClangCodeParser::buildPCH() out << line << "\n"; } } - tmpHeaderFile.close(); + tmpHeaderFile.close(); } if (printParsingErrors_ == 0) - Location::logToStdErrAlways("clang not printing errors; include paths were guessed"); - CXErrorCode err = clang_parseTranslationUnit2(index_, - tmpHeader.toLatin1().data(), - args_.data(), static_cast<int>(args_.size()), nullptr, 0, - flags_ | CXTranslationUnit_ForSerialization, &tu); - qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" - << tmpHeader << args_ << ") returns" << err; + Location::logToStdErrAlways( + "clang not printing errors; include paths were guessed"); + CXErrorCode err = + clang_parseTranslationUnit2(index_, tmpHeader.toLatin1().data(), args_.data(), + static_cast<int>(args_.size()), nullptr, 0, + flags_ | CXTranslationUnit_ForSerialization, &tu); + qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" << tmpHeader << args_ + << ") returns" << err; if (!err && tu) { pchName_ = pchFileDir_->path().toUtf8() + "/" + module + ".pch"; - auto error = clang_saveTranslationUnit(tu, pchName_.constData(), clang_defaultSaveOptions(tu)); + auto error = clang_saveTranslationUnit(tu, pchName_.constData(), + clang_defaultSaveOptions(tu)); if (error) { Location::logToStdErrAlways("Could not save PCH file for " + moduleHeader()); pchName_.clear(); - } - else { - // Visit the header now, as token from pre-compiled header won't be visited later + } else { + // Visit the header now, as token from pre-compiled header won't be visited + // later CXCursor cur = clang_getTranslationUnitCursor(tu); ClangVisitor visitor(qdb_, allHeaders_); visitor.visitChildren(cur); @@ -1351,7 +1390,9 @@ void ClangCodeParser::precompileHeaders() for (const auto &p : qAsConst(moreArgs_)) args_.push_back(p.constData()); - flags_ = static_cast<CXTranslationUnit_Flags>(CXTranslationUnit_Incomplete | CXTranslationUnit_SkipFunctionBodies | CXTranslationUnit_KeepGoing); + flags_ = static_cast<CXTranslationUnit_Flags>(CXTranslationUnit_Incomplete + | CXTranslationUnit_SkipFunctionBodies + | CXTranslationUnit_KeepGoing); // 1 as 2nd parameter tells clang to report parser errors. index_ = clang_createIndex(1, printParsingErrors_); buildPCH(); @@ -1372,7 +1413,7 @@ static float getUnpatchedVersion(QString t) Call matchDocsAndStuff() to do all the parsing and tree building. */ -void ClangCodeParser::parseSourceFile(const Location &/*location*/, const QString &filePath) +void ClangCodeParser::parseSourceFile(const Location & /*location*/, const QString &filePath) { /* The set of open namespaces is cleared before parsing @@ -1380,7 +1421,9 @@ void ClangCodeParser::parseSourceFile(const Location &/*location*/, const QStrin */ qdb_->clearOpenNamespaces(); currentFile_ = filePath; - flags_ = static_cast<CXTranslationUnit_Flags>(CXTranslationUnit_Incomplete | CXTranslationUnit_SkipFunctionBodies | CXTranslationUnit_KeepGoing); + flags_ = static_cast<CXTranslationUnit_Flags>(CXTranslationUnit_Incomplete + | CXTranslationUnit_SkipFunctionBodies + | CXTranslationUnit_KeepGoing); index_ = clang_createIndex(1, 0); getDefaultArgs(); @@ -1394,10 +1437,11 @@ void ClangCodeParser::parseSourceFile(const Location &/*location*/, const QStrin args_.push_back(p.constData()); CXTranslationUnit tu; - CXErrorCode err = clang_parseTranslationUnit2(index_, filePath.toLocal8Bit(), args_.data(), - static_cast<int>(args_.size()), nullptr, 0, flags_, &tu); - qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" - << filePath << args_ << ") returns" << err; + CXErrorCode err = + clang_parseTranslationUnit2(index_, filePath.toLocal8Bit(), args_.data(), + static_cast<int>(args_.size()), nullptr, 0, flags_, &tu); + qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" << filePath << args_ + << ") returns" << err; if (err || !tu) { qWarning() << "(qdoc) Could not parse source file" << filePath << " error code:" << err; clang_disposeIndex(index_); @@ -1422,7 +1466,7 @@ void ClangCodeParser::parseSourceFile(const Location &/*location*/, const QStrin auto loc = fromCXSourceLocation(clang_getTokenLocation(tu, tokens[i])); auto end_loc = fromCXSourceLocation(clang_getRangeEnd(clang_getTokenExtent(tu, tokens[i]))); - Doc::trimCStyleComment(loc,comment); + Doc::trimCStyleComment(loc, comment); // Doc constructor parses the comment. Doc doc(loc, end_loc, comment, commands, topicCommands()); @@ -1442,9 +1486,9 @@ void ClangCodeParser::parseSourceFile(const Location &/*location*/, const QStrin if (i + 1 < numTokens) { // Try to find the next declaration. CXSourceLocation nextCommentLoc = commentLoc; - while (i + 2 < numTokens && clang_getTokenKind(tokens[i+1]) != CXToken_Comment) + while (i + 2 < numTokens && clang_getTokenKind(tokens[i + 1]) != CXToken_Comment) ++i; // already skip all the tokens that are not comments - nextCommentLoc = clang_getTokenLocation(tu, tokens[i+1]); + nextCommentLoc = clang_getTokenLocation(tu, tokens[i + 1]); n = visitor.nodeForCommentAtLocation(commentLoc, nextCommentLoc); } @@ -1464,7 +1508,8 @@ void ClangCodeParser::parseSourceFile(const Location &/*location*/, const QStrin "topic command (e.g., '\\%1', '\\%2') in the " "comment and no function definition following " "the comment.") - .arg(COMMAND_FN).arg(COMMAND_PAGE)); + .arg(COMMAND_FN) + .arg(COMMAND_PAGE)); } } } else { @@ -1498,7 +1543,9 @@ Node *ClangCodeParser::parseFnArg(const Location &location, const QString &fnArg QString tag = fnArg.left(end + 1); fnNode = qdb_->findFunctionNodeForTag(tag); if (!fnNode) { - location.error(ClangCodeParser::tr("tag \\fn %1 not used in any include file in current module").arg(tag)); + location.error(ClangCodeParser::tr( + "tag \\fn %1 not used in any include file in current module") + .arg(tag)); } else { /* The function node was found. Use the formal @@ -1536,9 +1583,9 @@ Node *ClangCodeParser::parseFnArg(const Location &location, const QString &fnArg } return fnNode; } - CXTranslationUnit_Flags flags = static_cast<CXTranslationUnit_Flags>(CXTranslationUnit_Incomplete | - CXTranslationUnit_SkipFunctionBodies | - CXTranslationUnit_KeepGoing); + CXTranslationUnit_Flags flags = static_cast<CXTranslationUnit_Flags>( + CXTranslationUnit_Incomplete | CXTranslationUnit_SkipFunctionBodies + | CXTranslationUnit_KeepGoing); // Change 2nd parameter to 1 to make clang report errors. CXIndex index = clang_createIndex(1, Utilities::debugging() ? 1 : 0); @@ -1558,15 +1605,10 @@ Node *ClangCodeParser::parseFnArg(const Location &location, const QString &fnArg const char *dummyFileName = "/fn_dummyfile.cpp"; CXUnsavedFile unsavedFile { dummyFileName, fn.constData(), static_cast<unsigned long>(fn.size()) }; - CXErrorCode err = clang_parseTranslationUnit2(index, dummyFileName, - args.data(), - args.size(), - &unsavedFile, - 1, - flags, - &tu); - qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" - << dummyFileName << args << ") returns" << err; + CXErrorCode err = clang_parseTranslationUnit2(index, dummyFileName, args.data(), args.size(), + &unsavedFile, 1, flags, &tu); + qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" << dummyFileName << args + << ") returns" << err; if (err || !tu) { location.error(ClangCodeParser::tr("clang could not parse \\fn %1").arg(fnArg)); clang_disposeTranslationUnit(tu); @@ -1609,10 +1651,12 @@ Node *ClangCodeParser::parseFnArg(const Location &location, const QString &fnArg } } if (report) { - location.warning(ClangCodeParser::tr("clang found diagnostics parsing \\fn %1").arg(fnArg)); + location.warning(ClangCodeParser::tr("clang found diagnostics parsing \\fn %1") + .arg(fnArg)); for (unsigned i = 0; i < diagnosticCount; ++i) { CXDiagnostic diagnostic = clang_getDiagnostic(tu, i); - location.report(tr(" %1").arg(fromCXString(clang_formatDiagnostic(diagnostic, 0)))); + location.report(tr(" %1").arg( + fromCXString(clang_formatDiagnostic(diagnostic, 0)))); } } } |