diff options
-rw-r--r-- | src/qdoc/clangcodeparser.cpp | 16 | ||||
-rw-r--r-- | src/qdoc/clangcodeparser.h | 6 | ||||
-rw-r--r-- | src/qdoc/codeparser.h | 3 | ||||
-rw-r--r-- | src/qdoc/cppcodeparser.cpp | 45 | ||||
-rw-r--r-- | src/qdoc/cppcodeparser.h | 24 | ||||
-rw-r--r-- | src/qdoc/main.cpp | 18 | ||||
-rw-r--r-- | src/qdoc/puredocparser.cpp | 12 | ||||
-rw-r--r-- | src/qdoc/puredocparser.h | 9 | ||||
-rw-r--r-- | src/qdoc/qmlcodeparser.cpp | 2 | ||||
-rw-r--r-- | src/qdoc/qmlcodeparser.h | 2 |
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 ¯oArg) { + 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 ¯oArg); 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); |