summaryrefslogtreecommitdiffstats
path: root/src/qdoc/clangcodeparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qdoc/clangcodeparser.cpp')
-rw-r--r--src/qdoc/clangcodeparser.cpp102
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 &parameters = 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 &parameters = 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 &parameters = 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;
}