diff options
Diffstat (limited to 'src/qdoc/qdoc/src/qdoc/cppcodeparser.h')
-rw-r--r-- | src/qdoc/qdoc/src/qdoc/cppcodeparser.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/qdoc/qdoc/src/qdoc/cppcodeparser.h b/src/qdoc/qdoc/src/qdoc/cppcodeparser.h new file mode 100644 index 000000000..621dcf3a8 --- /dev/null +++ b/src/qdoc/qdoc/src/qdoc/cppcodeparser.h @@ -0,0 +1,110 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#ifndef CPPCODEPARSER_H +#define CPPCODEPARSER_H + +#include "clangcodeparser.h" +#include "codeparser.h" +#include "parsererror.h" +#include "utilities.h" + +QT_BEGIN_NAMESPACE + +class ClassNode; +class ExampleNode; +class FunctionNode; +class Aggregate; + +class CppCodeParser +{ +public: + static inline const QSet<QString> topic_commands{ + COMMAND_CLASS, COMMAND_DONTDOCUMENT, COMMAND_ENUM, COMMAND_EXAMPLE, + COMMAND_EXTERNALPAGE, COMMAND_FN, COMMAND_GROUP, COMMAND_HEADERFILE, + COMMAND_MACRO, COMMAND_MODULE, COMMAND_NAMESPACE, COMMAND_PAGE, + COMMAND_PROPERTY, COMMAND_TYPEALIAS, COMMAND_TYPEDEF, COMMAND_VARIABLE, + COMMAND_QMLTYPE, COMMAND_QMLPROPERTY, COMMAND_QMLPROPERTYGROUP, + COMMAND_QMLATTACHEDPROPERTY, COMMAND_QMLSIGNAL, COMMAND_QMLATTACHEDSIGNAL, + COMMAND_QMLMETHOD, COMMAND_QMLATTACHEDMETHOD, COMMAND_QMLVALUETYPE, COMMAND_QMLBASICTYPE, + COMMAND_QMLMODULE, COMMAND_STRUCT, COMMAND_UNION, + }; + + static inline const QSet<QString> meta_commands = QSet<QString>(CodeParser::common_meta_commands) + << COMMAND_COMPARES << COMMAND_COMPARESWITH << COMMAND_INHEADERFILE + << COMMAND_NEXTPAGE << COMMAND_OVERLOAD << COMMAND_PREVIOUSPAGE + << COMMAND_QMLINSTANTIATES << COMMAND_REIMP << COMMAND_RELATES; + +public: + CppCodeParser(FnCommandParser&& parser); + + 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); + + std::pair<std::vector<TiedDocumentation>, std::vector<FnMatchError>> + processTopicArgs(const UntiedDocumentation &untied); + + void processMetaCommand(const Doc &doc, const QString &command, const ArgPair &argLocPair, + Node *node); + void processMetaCommands(const Doc &doc, Node *node); + void processMetaCommands(const std::vector<TiedDocumentation> &tied); + +protected: + virtual Node *processTopicCommand(const Doc &doc, const QString &command, + const ArgPair &arg); + std::vector<TiedDocumentation> processQmlProperties(const UntiedDocumentation& untied); + bool splitQmlPropertyArg(const QString &arg, QString &type, QString &module, QString &element, + QString &name, const Location &location); + +private: + void setExampleFileLists(ExampleNode *en); + static void processComparesCommand(Node *node, const QString &arg, const Location &loc); + +private: + FnCommandParser fn_parser; + QString m_exampleNameFilter; + QString m_exampleImageFilter; + bool m_showLinkErrors { false }; +}; + +/*! + * \internal + * \brief Checks if there are too many topic commands in \a doc. + * + * This method compares the commands used in \a doc with the set of topic + * commands. If zero or one topic command is found, or if all found topic + * commands are {\\qml*}-commands, the method returns \c false. + * + * If more than one topic command is found, QDoc issues a warning and the list + * of topic commands used in \a doc, and the method returns \c true. + */ +[[nodiscard]] inline bool hasTooManyTopics(const Doc &doc) +{ + const QSet<QString> topicCommandsUsed = CppCodeParser::topic_commands & doc.metaCommandsUsed(); + + if (topicCommandsUsed.empty() || topicCommandsUsed.size() == 1) + return false; + if (std::all_of(topicCommandsUsed.cbegin(), topicCommandsUsed.cend(), + [](const auto &cmd) { return cmd.startsWith(QLatin1String("qml")); })) + return false; + + const QStringList commands = topicCommandsUsed.values(); + const QString topicCommands{ std::accumulate( + commands.cbegin(), commands.cend(), QString{}, + [index = qsizetype{ 0 }, numberOfCommands = commands.size()]( + const QString &accumulator, const QString &topic) mutable -> QString { + return accumulator + QLatin1String("\\") + topic + + Utilities::separator(index++, numberOfCommands); + }) }; + + doc.location().warning( + QStringLiteral("Multiple topic commands found in comment: %1").arg(topicCommands)); + return true; +} + +QT_END_NAMESPACE + +#endif |