diff options
Diffstat (limited to 'src/qdoc/clangcodeparser.cpp')
-rw-r--r-- | src/qdoc/clangcodeparser.cpp | 102 |
1 files changed, 52 insertions, 50 deletions
diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp index b628c4cd1..475becf4d 100644 --- a/src/qdoc/clangcodeparser.cpp +++ b/src/qdoc/clangcodeparser.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -41,23 +41,26 @@ clangcodeparser.cpp */ -#include <qfile.h> -#include <stdio.h> -#include <errno.h> +#include "clangcodeparser.h" + #include "codechunk.h" #include "config.h" -#include "clangcodeparser.h" #include "generator.h" #include "loggingcategory.h" #include "qdocdatabase.h" -#include <qdebug.h> -#include <qscopedvaluerollback.h> -#include <qelapsedtimer.h> -#include <qtemporarydir.h> -#include "generator.h" +#include "utilities.h" + +#include <QtCore/qdebug.h> +#include <QtCore/qelapsedtimer.h> +#include <QtCore/qfile.h> +#include <QtCore/qscopedvaluerollback.h> +#include <QtCore/qtemporarydir.h> #include <clang-c/Index.h> +#include <errno.h> +#include <stdio.h> + QT_BEGIN_NAMESPACE static CXTranslationUnit_Flags flags_ = static_cast<CXTranslationUnit_Flags>(0); @@ -90,7 +93,7 @@ static QDebug operator<<(QDebug debug, const std::vector<T> &v) 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); }; + { return (*static_cast<T *>(client_data))(c); }; return clang_visitChildren(cursor, visitor, &lambda); } @@ -216,7 +219,7 @@ 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; @@ -256,7 +259,7 @@ static Node *findNodeForCursor(QDocDatabase* qdb, CXCursor cur) { for (Node *candidate : qAsConst(candidates)) { if (!candidate->isFunction(Node::CPP)) continue; - auto fn = static_cast<FunctionNode*>(candidate); + auto fn = static_cast<FunctionNode *>(candidate); const Parameters ¶meters = fn->parameters(); const int actualArg = numArg - parameters.isPrivateSignal(); if (parameters.count() != actualArg + isVariadic) @@ -305,7 +308,7 @@ 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; @@ -335,7 +338,7 @@ static Node *findFunctionNodeForCursor(QDocDatabase* qdb, CXCursor cur) { for (Node *candidate : qAsConst(candidates)) { if (!candidate->isFunction(Node::CPP)) continue; - auto fn = static_cast<FunctionNode*>(candidate); + auto fn = static_cast<FunctionNode *>(candidate); const Parameters ¶meters = fn->parameters(); if (parameters.count() != (numArg + isVariadic)) continue; @@ -377,7 +380,7 @@ public: ClangVisitor(QDocDatabase *qdb, const QHash<QString, QString> &allHeaders) : qdb_(qdb), parent_(qdb->primaryTreeRoot()), allHeaders_(allHeaders) { } - QDocDatabase* qdocDB() { return qdb_; } + QDocDatabase *qdocDB() { return qdb_; } CXChildVisitResult visitChildren(CXCursor cursor) { @@ -410,7 +413,7 @@ public: Not sure about all the possibilities, when the cursor location is not in the main file. */ - CXChildVisitResult visitFnArg(CXCursor cursor, Node** fnNode, bool &ignoreSignature) + CXChildVisitResult visitFnArg(CXCursor cursor, Node **fnNode, bool &ignoreSignature) { auto ret = visitChildrenLambda(cursor, [&](CXCursor cur) { auto loc = clang_getCursorLocation(cur); @@ -441,7 +444,7 @@ private: */ QMap<SimpleLoc, CXCursor> declMap_; - QDocDatabase* qdb_; + QDocDatabase *qdb_; Aggregate *parent_; const QHash<QString, QString> allHeaders_; QHash<CXFile, bool> isInterestingCache_; // doing a canonicalFilePath is slow, so keep a cache. @@ -481,9 +484,9 @@ 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); + void readParameterNamesAndAttributes(FunctionNode *fn, CXCursor cursor); Aggregate *getSemanticParent(CXCursor cursor); }; @@ -513,15 +516,15 @@ Aggregate *ClangVisitor::getSemanticParent(CXCursor cursor) CXCursor sp = clang_getCursorSemanticParent(cursor); CXCursor lp = clang_getCursorLexicalParent(cursor); if (!clang_equalCursors(sp, lp) && clang_isDeclaration(clang_getCursorKind(sp))) { - Node* spn = findNodeForCursor(qdb_, sp); + Node *spn = findNodeForCursor(qdb_, sp); if (spn && spn->isAggregate()) { - return static_cast<Aggregate*>(spn); + return static_cast<Aggregate *>(spn); } } 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: @@ -537,7 +540,7 @@ CXChildVisitResult ClangVisitor::visitFnSignature(CXCursor cursor, CXSourceLocat } else { *fnNode = findFunctionNodeForCursor(qdb_, cursor); if (*fnNode && (*fnNode)->isFunction(Node::CPP)) { - FunctionNode* fn = static_cast<FunctionNode*>(*fnNode); + FunctionNode *fn = static_cast<FunctionNode *>(*fnNode); readParameterNamesAndAttributes(fn, cursor); } } @@ -562,7 +565,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l int lastBlank = typeAlias[0].lastIndexOf(QChar(' ')); if (lastBlank > 0) { typeAlias[0] = typeAlias[0].right(typeAlias[0].size() - (lastBlank + 1)); - TypeAliasNode* ta = new TypeAliasNode(parent_, typeAlias[0], typeAlias[1]); + TypeAliasNode *ta = new TypeAliasNode(parent_, typeAlias[0], typeAlias[1]); ta->setAccess(fromCX_CXXAccessSpecifier(clang_getCXXAccessSpecifier(cursor))); ta->setLocation(fromCXSourceLocation(clang_getCursorLocation(cursor))); } @@ -584,7 +587,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l QString className = fromCXString(clang_getCursorSpelling(cursor)); - Aggregate* semanticParent = getSemanticParent(cursor); + Aggregate *semanticParent = getSemanticParent(cursor); if (semanticParent && semanticParent->findNonfunctionChild(className, &Node::isClassNode)) { return CXChildVisit_Continue; } @@ -616,21 +619,21 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l auto type = clang_getCursorType(cursor); auto baseCursor = clang_getTypeDeclaration(type); auto baseNode = findNodeForCursor(qdb_, baseCursor); - auto classe = static_cast<ClassNode*>(parent_); + auto classe = static_cast<ClassNode *>(parent_); if (baseNode == nullptr || !baseNode->isClassNode()) { QString bcName = fromCXString(clang_getCursorSpelling(baseCursor)); classe->addUnresolvedBaseClass(access, QStringList(bcName), bcName); return CXChildVisit_Continue; } - auto baseClasse = static_cast<ClassNode*>(baseNode); + auto baseClasse = static_cast<ClassNode *>(baseNode); classe->addResolvedBaseClass(access, baseClasse); return CXChildVisit_Continue; } case CXCursor_Namespace: { QString namespaceName = fromCXString(clang_getCursorDisplayName(cursor)); - NamespaceNode* ns = nullptr; + 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); @@ -653,7 +656,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l CXType funcType = clang_getCursorType(cursor); - FunctionNode* fn = new FunctionNode(parent_, name); + FunctionNode *fn = new FunctionNode(parent_, name); CXSourceRange range = clang_Cursor_getCommentRange(cursor); if (!clang_Range_isNull(range)) { @@ -743,7 +746,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); } @@ -752,13 +755,13 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l if (findNodeForCursor(qdb_, cursor)) // Was already parsed, propably in another tu return CXChildVisit_Continue; QString enumTypeName = fromCXString(clang_getCursorSpelling(cursor)); - EnumNode* en = nullptr; + EnumNode *en = nullptr; if (enumTypeName.isEmpty()) { enumTypeName = "anonymous"; if (parent_ && (parent_->isClassNode() || parent_->isNamespace())) { - Node* n = parent_->findNonfunctionChild(enumTypeName, &Node::isEnumType); + Node *n = parent_->findNonfunctionChild(enumTypeName, &Node::isEnumType); if (n) - en = static_cast<EnumNode*>(n); + en = static_cast<EnumNode *>(n); } } if (!en) { @@ -809,7 +812,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l case CXCursor_TypedefDecl: { if (findNodeForCursor(qdb_, cursor)) // Was already parsed, propably in another translation unit return CXChildVisit_Continue; - TypedefNode* td = new TypedefNode(parent_, fromCXString(clang_getCursorSpelling(cursor))); + TypedefNode *td = new TypedefNode(parent_, fromCXString(clang_getCursorSpelling(cursor))); td->setAccess(fromCX_CXXAccessSpecifier(clang_getCXXAccessSpecifier(cursor))); td->setLocation(fromCXSourceLocation(clang_getCursorLocation(cursor))); // Search to see if this is a Q_DECLARE_FLAGS (if the type is QFlags<ENUM>) @@ -823,7 +826,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l return CXChildVisit_Continue; auto *en = findNodeForCursor(qdb_, clang_getTypeDeclaration(clang_getCursorType(cur))); if (en && en->isEnumType()) - static_cast<EnumNode*>(en)->setFlagsType(td); + static_cast<EnumNode *>(en)->setFlagsType(td); return CXChildVisit_Break; }); return CXChildVisit_Break; @@ -844,7 +847,7 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l } } -void ClangVisitor::readParameterNamesAndAttributes(FunctionNode* fn, CXCursor cursor) +void ClangVisitor::readParameterNamesAndAttributes(FunctionNode *fn, CXCursor cursor) { Parameters ¶meters = fn->parameters(); // Visit the parameters and attributes @@ -887,7 +890,7 @@ void ClangVisitor::readParameterNamesAndAttributes(FunctionNode* fn, CXCursor cu }); } -void ClangVisitor::parseProperty(const QString& spelling, const Location& loc) +void ClangVisitor::parseProperty(const QString &spelling, const Location &loc) { int lpIdx = spelling.indexOf(QChar('(')); int rpIdx = spelling.lastIndexOf(QChar(')')); @@ -969,7 +972,7 @@ void ClangVisitor::parseProperty(const QString& spelling, const Location& loc) must be inbetween. Returns nullptr if no suitable declaration was found between the two comments. */ -Node* ClangVisitor::nodeForCommentAtLocation(CXSourceLocation loc, CXSourceLocation nextCommentLoc) +Node *ClangVisitor::nodeForCommentAtLocation(CXSourceLocation loc, CXSourceLocation nextCommentLoc) { ClangVisitor::SimpleLoc docloc; clang_getPresumedLocation(loc, nullptr, &docloc.line, &docloc.column); @@ -999,7 +1002,7 @@ Node* ClangVisitor::nodeForCommentAtLocation(CXSourceLocation loc, CXSourceLocat auto *node = findNodeForCursor(qdb_, *decl_it); // borrow the parameter name from the definition if (node && node->isFunction(Node::CPP)) - readParameterNamesAndAttributes(static_cast<FunctionNode*>(node), *decl_it); + readParameterNamesAndAttributes(static_cast<FunctionNode *>(node), *decl_it); return node; } @@ -1121,7 +1124,6 @@ static const char *defaultArgs_[] = { #else "-fms-compatibility-version=19", #endif - "-fno-exceptions", // Workaround for clang bug http://reviews.llvm.org/D17988 "-DQ_QDOC", "-DQ_CLANG_QDOC", "-DQT_DISABLE_DEPRECATED_BEFORE=0", @@ -1369,7 +1371,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 @@ -1429,7 +1431,7 @@ void ClangCodeParser::parseSourceFile(const Location& /*location*/, const QStrin DocList docs; QString topic; NodeList nodes; - const TopicList& topics = doc.topicsUsed(); + const TopicList &topics = doc.topicsUsed(); if (!topics.isEmpty()) topic = topics[0].topic; @@ -1480,9 +1482,9 @@ void ClangCodeParser::parseSourceFile(const Location& /*location*/, const QStrin command. \a location is used for reporting errors. \a fnArg is the string to parse. It is always a function decl. */ -Node* ClangCodeParser::parseFnArg(const Location& location, const QString& fnArg) +Node *ClangCodeParser::parseFnArg(const Location &location, const QString &fnArg) { - Node* fnNode = nullptr; + Node *fnNode = nullptr; /* If the \fn command begins with a tag, then don't try to parse the \fn command with clang. Use the tag to search @@ -1502,7 +1504,7 @@ Node* ClangCodeParser::parseFnArg(const Location& location, const QString& fnArg parameter names from the \FN command, because they will be the names used in the documentation. */ - FunctionNode* fn = static_cast<FunctionNode*>(fnNode); + FunctionNode *fn = static_cast<FunctionNode *>(fnNode); QStringList leftParenSplit = fnArg.split('('); if (leftParenSplit.size() > 1) { QStringList rightParenSplit = leftParenSplit[1].split(')'); @@ -1537,7 +1539,7 @@ Node* ClangCodeParser::parseFnArg(const Location& location, const QString& fnArg CXTranslationUnit_SkipFunctionBodies | CXTranslationUnit_KeepGoing); // Change 2nd parameter to 1 to make clang report errors. - CXIndex index = clang_createIndex(1, Generator::debugging() ? 1 : 0); + CXIndex index = clang_createIndex(1, Utilities::debugging() ? 1 : 0); std::vector<const char *> args(std::begin(defaultArgs_), std::end(defaultArgs_)); // Add the defines from the qdocconf file. @@ -1563,7 +1565,7 @@ Node* ClangCodeParser::parseFnArg(const Location& location, const QString& fnArg flags, &tu); qCDebug(lcQdoc) << __FUNCTION__ << "clang_parseTranslationUnit2(" - << dummyFileName << args_ << ") returns" << err; + << dummyFileName << args << ") returns" << err; if (err || !tu) { location.error(ClangCodeParser::tr("clang could not parse \\fn %1").arg(fnArg)); clang_disposeTranslationUnit(tu); @@ -1600,7 +1602,7 @@ Node* ClangCodeParser::parseFnArg(const Location& location, const QString& fnArg qualifier[i++] = QChar(' '); if (i > 0) qualifier = qualifier.simplified(); - ClassNode* cn = qdb_->findClassNode(QStringList(qualifier)); + ClassNode *cn = qdb_->findClassNode(QStringList(qualifier)); if (cn && cn->isInternal()) report = false; } |