1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
// 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_QMLNATIVETYPE << COMMAND_REIMP << COMMAND_RELATES;
public:
explicit 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);
void processQmlNativeTypeCommand(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
|