summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qdoc/clangcodeparser.cpp16
-rw-r--r--src/qdoc/clangcodeparser.h6
-rw-r--r--src/qdoc/codeparser.h3
-rw-r--r--src/qdoc/cppcodeparser.cpp45
-rw-r--r--src/qdoc/cppcodeparser.h24
-rw-r--r--src/qdoc/main.cpp18
-rw-r--r--src/qdoc/puredocparser.cpp12
-rw-r--r--src/qdoc/puredocparser.h9
-rw-r--r--src/qdoc/qmlcodeparser.cpp2
-rw-r--r--src/qdoc/qmlcodeparser.h2
10 files changed, 69 insertions, 68 deletions
diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp
index 4589df9ed..b50c2b718 100644
--- a/src/qdoc/clangcodeparser.cpp
+++ b/src/qdoc/clangcodeparser.cpp
@@ -1196,7 +1196,6 @@ void ClangCodeParser::initializeParser()
}
m_includePaths.erase(std::unique(m_includePaths.begin(), m_includePaths.end()),
m_includePaths.end());
- CppCodeParser::initializeParser();
m_pchFileDir.reset(nullptr);
m_allHeaders.clear();
m_pchName.clear();
@@ -1230,13 +1229,6 @@ void ClangCodeParser::initializeParser()
/*!
*/
-void ClangCodeParser::terminateParser()
-{
- CppCodeParser::terminateParser();
-}
-
-/*!
- */
QString ClangCodeParser::language()
{
return "Clang";
@@ -1519,7 +1511,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, CppCodeParser& cpp_code_parser)
{
/*
The set of open namespaces is cleared before parsing
@@ -1580,7 +1572,7 @@ void ClangCodeParser::parseSourceFile(const Location & /*location*/, const QStri
// Doc constructor parses the comment.
Doc doc(loc, end_loc, comment, commands, CppCodeParser::topic_commands);
- if (hasTooManyTopics(doc))
+ if (cpp_code_parser.hasTooManyTopics(doc))
continue;
DocList docs;
@@ -1634,9 +1626,9 @@ void ClangCodeParser::parseSourceFile(const Location & /*location*/, const QStri
m_namespaceScope << fromCXString(clang_getCursorSpelling(cur));
cur = clang_getCursorLexicalParent(cur);
}
- processTopicArgs(doc, topic, nodes, docs);
+ cpp_code_parser.processTopicArgs(doc, topic, nodes, docs);
}
- processMetaCommands(nodes, docs);
+ cpp_code_parser.processMetaCommands(nodes, docs);
}
clang_disposeTokens(tu, tokens, numTokens);
diff --git a/src/qdoc/clangcodeparser.h b/src/qdoc/clangcodeparser.h
index a6fc94a38..58a340bca 100644
--- a/src/qdoc/clangcodeparser.h
+++ b/src/qdoc/clangcodeparser.h
@@ -13,7 +13,7 @@ typedef struct CXTranslationUnitImpl *CXTranslationUnit;
QT_BEGIN_NAMESPACE
-class ClangCodeParser : public CppCodeParser
+class ClangCodeParser : public CodeParser
{
public:
static const QStringList accepted_header_file_extensions;
@@ -22,11 +22,11 @@ public:
~ClangCodeParser() override = default;
void initializeParser() override;
- void terminateParser() override;
+ void terminateParser() override {}
QString language() override;
QStringList sourceFileNameFilter() override;
void parseHeaderFile(const Location &location, const QString &filePath);
- void parseSourceFile(const Location &location, const QString &filePath) override;
+ void parseSourceFile(const Location &location, const QString &filePath, CppCodeParser&) override;
void precompileHeaders(QString module_header);
Node *parseFnArg(const Location &location, const QString &fnSignature, const QString &idTag) override;
static const QByteArray &fn() { return s_fn; }
diff --git a/src/qdoc/codeparser.h b/src/qdoc/codeparser.h
index b3f4a4d48..7282988f4 100644
--- a/src/qdoc/codeparser.h
+++ b/src/qdoc/codeparser.h
@@ -82,6 +82,7 @@ QT_BEGIN_NAMESPACE
class Location;
class QString;
class QDocDatabase;
+class CppCodeParser;
class CodeParser
{
@@ -104,7 +105,7 @@ public:
virtual void terminateParser();
virtual QString language() = 0;
virtual QStringList sourceFileNameFilter() = 0;
- virtual void parseSourceFile(const Location &location, const QString &filePath) = 0;
+ virtual void parseSourceFile(const Location &location, const QString &filePath, CppCodeParser& cpp_code_parser) = 0;
virtual Node *parseFnArg(const Location &, const QString &, const QString & = QString())
{
return nullptr;
diff --git a/src/qdoc/cppcodeparser.cpp b/src/qdoc/cppcodeparser.cpp
index b15c870de..469410ae6 100644
--- a/src/qdoc/cppcodeparser.cpp
+++ b/src/qdoc/cppcodeparser.cpp
@@ -54,12 +54,7 @@ static const QMap<QString, NodeTypeTestFunc> s_nodeTypeTestFuncMap{
{ COMMAND_VARIABLE, &Node::isVariable },
};
-/*!
- The constructor initializes a map of special node types
- for identifying important nodes. And it initializes
- some filters for identifying and excluding certain kinds of files.
- */
-void CppCodeParser::initializeParser()
+CppCodeParser::CppCodeParser()
{
Config &config = Config::instance();
QStringList exampleFilePatterns{config.get(CONFIG_EXAMPLES
@@ -92,27 +87,20 @@ void CppCodeParser::initializeParser()
/*!
Clear the exclude directories and exclude files sets.
*/
-void CppCodeParser::terminateParser()
+CppCodeParser::~CppCodeParser()
{
m_excludeDirs.clear();
m_excludeFiles.clear();
}
/*!
- Returns a list of extensions for source files, i.e. not
- header files.
- */
-QStringList CppCodeParser::sourceFileNameFilter()
-{
- return QStringList();
-}
-
-/*!
Process the topic \a command found in the \a doc with argument \a arg.
*/
Node *CppCodeParser::processTopicCommand(const Doc &doc, const QString &command,
const ArgPair &arg)
{
+ QDocDatabase* m_qdb = QDocDatabase::qdocDB();
+
if (command == COMMAND_FN) {
Q_UNREACHABLE();
} else if (s_nodeTypeMap.contains(command)) {
@@ -151,7 +139,7 @@ Node *CppCodeParser::processTopicCommand(const Doc &doc, const QString &command,
}
}
if (node == nullptr) {
- if (isWorthWarningAbout(doc)) {
+ if (CodeParser::isWorthWarningAbout(doc)) {
doc.location().warning(
QStringLiteral("Cannot find '%1' specified with '\\%2' in any header file")
.arg(arg.first, command));
@@ -299,6 +287,8 @@ void CppCodeParser::processQmlProperties(const Doc &doc, NodeList &nodes, DocLis
group = property.left(i);
}
+ QDocDatabase* m_qdb = QDocDatabase::qdocDB();
+
NodeList sharedNodes;
QmlTypeNode *qmlType = m_qdb->findQmlType(module, qmlTypeName);
// Note: Constructing a QmlType node by default, as opposed to QmlValueType.
@@ -370,6 +360,8 @@ void CppCodeParser::processQmlProperties(const Doc &doc, NodeList &nodes, DocLis
void CppCodeParser::processMetaCommand(const Doc &doc, const QString &command,
const ArgPair &argPair, Node *node)
{
+ QDocDatabase* m_qdb = QDocDatabase::qdocDB();
+
QString arg = argPair.first;
if (command == COMMAND_INHEADERFILE) {
// TODO: [incorrect-constructs][header-arg]
@@ -410,7 +402,7 @@ void CppCodeParser::processMetaCommand(const Doc &doc, const QString &command,
// qualified name of the overridden function.
// If the name of the overridden function isn't
// set, issue a warning.
- if (fn->overridesThis().isEmpty() && isWorthWarningAbout(doc)) {
+ if (fn->overridesThis().isEmpty() && CodeParser::isWorthWarningAbout(doc)) {
doc.location().warning(
QStringLiteral("Cannot find base function for '\\%1' in %2()")
.arg(COMMAND_REIMP, node->name()),
@@ -463,11 +455,11 @@ void CppCodeParser::processMetaCommand(const Doc &doc, const QString &command,
}
}
} else if (command == COMMAND_NEXTPAGE) {
- setLink(node, Node::NextLink, arg);
+ CodeParser::setLink(node, Node::NextLink, arg);
} else if (command == COMMAND_PREVIOUSPAGE) {
- setLink(node, Node::PreviousLink, arg);
+ CodeParser::setLink(node, Node::PreviousLink, arg);
} else if (command == COMMAND_STARTPAGE) {
- setLink(node, Node::StartLink, arg);
+ CodeParser::setLink(node, Node::StartLink, arg);
} else if (command == COMMAND_QMLINHERITS) {
if (node->name() == arg)
doc.location().warning(QStringLiteral("%1 tries to inherit itself").arg(arg));
@@ -657,6 +649,8 @@ FunctionNode *CppCodeParser::parseOtherFuncArg(const QString &topic, const Locat
}
funcName = colonSplit.last();
+ QDocDatabase* m_qdb = QDocDatabase::qdocDB();
+
Aggregate *aggregate = m_qdb->findQmlType(moduleName, elementName);
if (aggregate == nullptr)
return nullptr;
@@ -687,6 +681,8 @@ FunctionNode *CppCodeParser::parseOtherFuncArg(const QString &topic, const Locat
*/
FunctionNode *CppCodeParser::parseMacroArg(const Location &location, const QString &macroArg)
{
+ QDocDatabase* m_qdb = QDocDatabase::qdocDB();
+
QStringList leftParenSplit = macroArg.split('(');
if (leftParenSplit.isEmpty())
return nullptr;
@@ -812,6 +808,9 @@ bool CppCodeParser::isQMLPropertyTopic(const QString &t)
void CppCodeParser::processTopicArgs(const Doc &doc, const QString &topic, NodeList &nodes,
DocList &docs)
{
+
+ QDocDatabase* m_qdb = QDocDatabase::qdocDB();
+
if (isQMLPropertyTopic(topic)) {
processQmlProperties(doc, nodes, docs);
} else {
@@ -820,7 +819,7 @@ void CppCodeParser::processTopicArgs(const Doc &doc, const QString &topic, NodeL
if (args.size() == 1) {
if (topic == COMMAND_FN) {
if (Config::instance().showInternal() || !doc.isInternal())
- node = parserForLanguage("Clang")->parseFnArg(doc.location(), args[0].first, args[0].second);
+ node = CodeParser::parserForLanguage("Clang")->parseFnArg(doc.location(), args[0].first, args[0].second);
} else if (topic == COMMAND_MACRO) {
node = parseMacroArg(doc.location(), args[0].first);
} else if (isQMLMethodTopic(topic)) {
@@ -840,7 +839,7 @@ void CppCodeParser::processTopicArgs(const Doc &doc, const QString &topic, NodeL
node = nullptr;
if (topic == COMMAND_FN) {
if (Config::instance().showInternal() || !doc.isInternal())
- node = parserForLanguage("Clang")->parseFnArg(doc.location(), arg.first, arg.second);
+ node = CodeParser::parserForLanguage("Clang")->parseFnArg(doc.location(), arg.first, arg.second);
} else if (topic == COMMAND_MACRO) {
node = parseMacroArg(doc.location(), arg.first);
} else if (isQMLMethodTopic(topic)) {
diff --git a/src/qdoc/cppcodeparser.h b/src/qdoc/cppcodeparser.h
index 6cf63f740..b312ee6e9 100644
--- a/src/qdoc/cppcodeparser.h
+++ b/src/qdoc/cppcodeparser.h
@@ -13,7 +13,7 @@ class ExampleNode;
class FunctionNode;
class Aggregate;
-class CppCodeParser : public CodeParser
+class CppCodeParser
{
public:
static inline const QSet<QString> topic_commands{
@@ -34,30 +34,30 @@ public:
<< COMMAND_RELATES;
public:
- CppCodeParser() = default;
+ CppCodeParser();
+ ~CppCodeParser();
- void initializeParser() override;
- void terminateParser() override;
- QString language() override { return QStringLiteral("Cpp"); }
- QStringList sourceFileNameFilter() override;
FunctionNode *parseMacroArg(const Location &location, const QString &macroArg);
FunctionNode *parseOtherFuncArg(const QString &topic, const Location &location,
const QString &funcArg);
static bool isQMLMethodTopic(const QString &t);
static bool isQMLPropertyTopic(const QString &t);
+ [[nodiscard]] bool hasTooManyTopics(const Doc &doc) const;
+
+ void processTopicArgs(const Doc &doc, const QString &topic, NodeList &nodes, DocList &docs);
+
+ void processMetaCommand(const Doc &doc, const QString &command, const ArgPair &argLocPair,
+ Node *node);
+ void processMetaCommands(const Doc &doc, Node *node);
+ void processMetaCommands(NodeList &nodes, DocList &docs);
+
protected:
virtual Node *processTopicCommand(const Doc &doc, const QString &command,
const ArgPair &arg);
void processQmlProperties(const Doc &doc, NodeList &nodes, DocList &docs);
bool splitQmlPropertyArg(const QString &arg, QString &type, QString &module, QString &element,
QString &name, const Location &location);
- void processMetaCommand(const Doc &doc, const QString &command, const ArgPair &argLocPair,
- Node *node);
- void processMetaCommands(const Doc &doc, Node *node);
- void processMetaCommands(NodeList &nodes, DocList &docs);
- void processTopicArgs(const Doc &doc, const QString &topic, NodeList &nodes, DocList &docs);
- [[nodiscard]] bool hasTooManyTopics(const Doc &doc) const;
private:
void setExampleFileLists(ExampleNode *en);
diff --git a/src/qdoc/main.cpp b/src/qdoc/main.cpp
index bc708f177..1179ed3ea 100644
--- a/src/qdoc/main.cpp
+++ b/src/qdoc/main.cpp
@@ -532,14 +532,20 @@ static void processQdocconfFile(const QString &fileName)
*/
if (config.get(CONFIG_LOGPROGRESS).asBool())
qCInfo(lcQdoc) << "Parse source files for" << project;
- for (auto it = sources.cbegin(), end = sources.cend(); it != end; ++it) {
- const auto &key = it.key();
- auto *codeParser = CodeParser::parserForSourceFile(key);
- if (codeParser) {
- qCDebug(lcQdoc, "Parsing %s", qPrintable(key));
- codeParser->parseSourceFile(config.location(), key);
+
+
+ {
+ CppCodeParser cpp_code_parser{};
+ for (auto it = sources.cbegin(), end = sources.cend(); it != end; ++it) {
+ const auto &key = it.key();
+ auto *codeParser = CodeParser::parserForSourceFile(key);
+ if (codeParser) {
+ qCDebug(lcQdoc, "Parsing %s", qPrintable(key));
+ codeParser->parseSourceFile(config.location(), key, cpp_code_parser);
+ }
}
}
+
if (config.get(CONFIG_LOGPROGRESS).asBool())
qCInfo(lcQdoc) << "Source files parsed for" << project;
}
diff --git a/src/qdoc/puredocparser.cpp b/src/qdoc/puredocparser.cpp
index 931ca253c..09dcc4839 100644
--- a/src/qdoc/puredocparser.cpp
+++ b/src/qdoc/puredocparser.cpp
@@ -28,7 +28,7 @@ QStringList PureDocParser::sourceFileNameFilter()
parsed contents to the database. The \a location is used for
reporting errors.
*/
-void PureDocParser::parseSourceFile(const Location &location, const QString &filePath)
+void PureDocParser::parseSourceFile(const Location &location, const QString &filePath, CppCodeParser& cpp_code_parser)
{
QFile in(filePath);
if (!in.open(QIODevice::ReadOnly)) {
@@ -43,7 +43,7 @@ void PureDocParser::parseSourceFile(const Location &location, const QString &fil
*/
m_qdb->clearOpenNamespaces();
- processQdocComments(in);
+ processQdocComments(in, cpp_code_parser);
in.close();
}
@@ -52,7 +52,7 @@ void PureDocParser::parseSourceFile(const Location &location, const QString &fil
and tree building. It only processes qdoc comments. It skips
everything else.
*/
-void PureDocParser::processQdocComments(QFile& input_file)
+void PureDocParser::processQdocComments(QFile& input_file, CppCodeParser& cpp_code_parser)
{
Tokenizer tokenizer(Location{input_file.fileName()}, input_file);
@@ -81,15 +81,15 @@ void PureDocParser::processQdocComments(QFile& input_file)
continue;
}
- if (hasTooManyTopics(doc))
+ if (cpp_code_parser.hasTooManyTopics(doc))
continue;
DocList docs;
NodeList nodes;
QString topic = topics[0].m_topic;
- processTopicArgs(doc, topic, nodes, docs);
- processMetaCommands(nodes, docs);
+ cpp_code_parser.processTopicArgs(doc, topic, nodes, docs);
+ cpp_code_parser.processMetaCommands(nodes, docs);
}
}
diff --git a/src/qdoc/puredocparser.h b/src/qdoc/puredocparser.h
index 376836944..febfca56a 100644
--- a/src/qdoc/puredocparser.h
+++ b/src/qdoc/puredocparser.h
@@ -12,17 +12,20 @@ QT_BEGIN_NAMESPACE
class Location;
-class PureDocParser : public CppCodeParser
+class PureDocParser : public CodeParser
{
public:
PureDocParser() = default;
~PureDocParser() override = default;
+ void initializeParser() override {}
+ QString language() override { return ""; }
+
QStringList sourceFileNameFilter() override;
- void parseSourceFile(const Location &location, const QString &filePath) override;
+ void parseSourceFile(const Location &location, const QString &filePath, CppCodeParser& cpp_code_parser) override;
private:
- void processQdocComments(QFile& input_file);
+ void processQdocComments(QFile& input_file, CppCodeParser& cpp_code_parser);
};
QT_END_NAMESPACE
diff --git a/src/qdoc/qmlcodeparser.cpp b/src/qdoc/qmlcodeparser.cpp
index 65f107154..902000954 100644
--- a/src/qdoc/qmlcodeparser.cpp
+++ b/src/qdoc/qmlcodeparser.cpp
@@ -62,7 +62,7 @@ QStringList QmlCodeParser::sourceFileNameFilter()
If it can't open the file at \a filePath, it reports an error
and returns without doing anything.
*/
-void QmlCodeParser::parseSourceFile(const Location &location, const QString &filePath)
+void QmlCodeParser::parseSourceFile(const Location &location, const QString &filePath, CppCodeParser&)
{
static const QSet<QString> topic_commands{
COMMAND_VARIABLE, COMMAND_QMLCLASS, COMMAND_QMLTYPE, COMMAND_QMLPROPERTY,
diff --git a/src/qdoc/qmlcodeparser.h b/src/qdoc/qmlcodeparser.h
index 61e9d6c6d..91ee64858 100644
--- a/src/qdoc/qmlcodeparser.h
+++ b/src/qdoc/qmlcodeparser.h
@@ -27,7 +27,7 @@ public:
void terminateParser() override;
QString language() override;
QStringList sourceFileNameFilter() override;
- void parseSourceFile(const Location &location, const QString &filePath) override;
+ void parseSourceFile(const Location &location, const QString &filePath, CppCodeParser&) override;
/* Copied from src/declarative/qml/qdeclarativescriptparser.cpp */
void extractPragmas(QString &script);