diff options
author | Martin Smith <martin.smith@qt.io> | 2016-12-06 12:25:10 +0100 |
---|---|---|
committer | Martin Smith <martin.smith@qt.io> | 2017-08-10 07:33:40 +0000 |
commit | 54425fbd3de2911bf98a934423ec22e495e8424c (patch) | |
tree | ba247ad5cca6e6cce25dcd26fe6231f7dba4c7a3 | |
parent | 85ddd7d2e36e2f9bd94c4a2fe572fe44c7573a12 (diff) | |
download | qttools-54425fbd3de2911bf98a934423ec22e495e8424c.tar.gz |
qdoc: fix resolve inheritance bug
clangqdoc was unable to find base class nodes,
when the base class node was in a different module
from the subclass. This was mostly because the
fixInheritance() function, which handles base class
resolution after the headers have been parsed, was
being called before the headers were parsed. This
was caused by the new parsing strategy for clangqdoc,
which is to use the old loop where qdoc used to parse
the header files only to build up a list of all the
required header files and to delay parsing the header
files until clang is called to build the PCH.
The basic fix is to mode the call to resolveInheritance()
from main.cpp into clangcodeparser.cpp right after the
PCH is built. There are also a few other minor changes
in this change that make the base class resolution more
robust by ensuring that as much useful information as
possible is retained in the index file and in the base
class list for a class node.
Change-Id: I51433f618cdf40b37b0687ff1686da03359de111
Reviewed-by: Topi Reiniƶ <topi.reinio@qt.io>
-rw-r--r-- | src/qdoc/clangcodeparser.cpp | 8 | ||||
-rw-r--r-- | src/qdoc/main.cpp | 3 | ||||
-rw-r--r-- | src/qdoc/node.cpp | 2 | ||||
-rw-r--r-- | src/qdoc/qdocindexfiles.cpp | 2 |
4 files changed, 12 insertions, 3 deletions
diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp index f72896dfd..c7bb37120 100644 --- a/src/qdoc/clangcodeparser.cpp +++ b/src/qdoc/clangcodeparser.cpp @@ -416,9 +416,12 @@ CXChildVisitResult ClangVisitor::visitHeader(CXCursor cursor, CXSourceLocation l auto type = clang_getCursorType(cursor); auto baseCursor = clang_getTypeDeclaration(type); auto baseNode = findNodeForCursor(qdb_, baseCursor); - if (!baseNode || !baseNode->isClass()) - return CXChildVisit_Continue; auto classe = static_cast<ClassNode*>(parent_); + if (!baseNode || !baseNode->isClass()) { + QString bcName = fromCXString(clang_getCursorSpelling(baseCursor)); + classe->addUnresolvedBaseClass(access, QStringList(bcName), bcName); + return CXChildVisit_Continue; + } auto baseClasse = static_cast<ClassNode*>(baseNode); classe->addResolvedBaseClass(access, baseClasse); return CXChildVisit_Continue; @@ -1007,6 +1010,7 @@ void ClangCodeParser::parseSourceFile(const Location& /*location*/, const QStrin args.pop_back(); // remove the "-xc++"; } } + qdb_->resolveInheritance(); } args.clear(); args.insert(args.begin(), std::begin(defaultArgs), std::end(defaultArgs)); diff --git a/src/qdoc/main.cpp b/src/qdoc/main.cpp index 5f29f222c..5ba65ac7f 100644 --- a/src/qdoc/main.cpp +++ b/src/qdoc/main.cpp @@ -452,7 +452,8 @@ static void processQdocconfFile(const QString &fileName) ++h; } - qdb->resolveInheritance(); + // Moved into ClangCodeParser after building PCH + //qdb->resolveInheritance(); /* Parse each source text file in the set using the appropriate parser and diff --git a/src/qdoc/node.cpp b/src/qdoc/node.cpp index f1af55ca6..ce86661cf 100644 --- a/src/qdoc/node.cpp +++ b/src/qdoc/node.cpp @@ -1680,6 +1680,8 @@ void ClassNode::fixBaseClasses() // Remove private and duplicate base classes. while (i < bases_.size()) { ClassNode* bc = bases_.at(i).node_; + if (!bc) + bc = QDocDatabase::qdocDB()->findClassNode(bases_.at(i).path_); if (bc && (bc->access() == Node::Private || found.contains(bc))) { RelatedClass rc = bases_.at(i); bases_.removeAt(i); diff --git a/src/qdoc/qdocindexfiles.cpp b/src/qdoc/qdocindexfiles.cpp index 4918fe795..3b2601f6f 100644 --- a/src/qdoc/qdocindexfiles.cpp +++ b/src/qdoc/qdocindexfiles.cpp @@ -1016,6 +1016,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, ClassNode* n = related.node_; if (n) baseStrings.insert(n->fullName()); + else if (!related.path_.isEmpty()) + baseStrings.insert(related.path_.join(QLatin1String("::"))); } if (!baseStrings.isEmpty()) { |