summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Smith <martin.smith@qt.io>2016-12-06 12:25:10 +0100
committerMartin Smith <martin.smith@qt.io>2017-08-10 07:33:40 +0000
commit54425fbd3de2911bf98a934423ec22e495e8424c (patch)
treeba247ad5cca6e6cce25dcd26fe6231f7dba4c7a3
parent85ddd7d2e36e2f9bd94c4a2fe572fe44c7573a12 (diff)
downloadqttools-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.cpp8
-rw-r--r--src/qdoc/main.cpp3
-rw-r--r--src/qdoc/node.cpp2
-rw-r--r--src/qdoc/qdocindexfiles.cpp2
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())
{