1 /****************************************************************************
2 **
3 ** Copyright (C) 2019 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the tools applications of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #ifndef CODEPARSER_H
30 #define CODEPARSER_H
31 
32 #include "node.h"
33 
34 #include <QtCore/qset.h>
35 
36 QT_BEGIN_NAMESPACE
37 
38 class Location;
39 class QString;
40 class QDocDatabase;
41 
42 class CodeParser
43 {
44     Q_DECLARE_TR_FUNCTIONS(QDoc::CppCodeParser)
45 
46 public:
47     CodeParser();
48     virtual ~CodeParser();
49 
50     virtual void initializeParser();
51     virtual void terminateParser();
52     virtual QString language() = 0;
53     virtual QStringList headerFileNameFilter();
54     virtual QStringList sourceFileNameFilter() = 0;
55     virtual void parseHeaderFile(const Location &location, const QString &filePath);
56     virtual void parseSourceFile(const Location &location, const QString &filePath) = 0;
precompileHeaders()57     virtual void precompileHeaders() {}
parseFnArg(const Location &,const QString &)58     virtual Node *parseFnArg(const Location &, const QString &) { return nullptr; }
59 
60     bool isParsingH() const;
61     bool isParsingCpp() const;
62     bool isParsingQdoc() const;
currentFile()63     const QString &currentFile() const { return currentFile_; }
moduleHeader()64     const QString &moduleHeader() const { return moduleHeader_; }
setModuleHeader(const QString & t)65     void setModuleHeader(const QString &t) { moduleHeader_ = t; }
66     void checkModuleInclusion(Node *n);
67 
68     static void initialize();
69     static void terminate();
70     static CodeParser *parserForLanguage(const QString &language);
71     static CodeParser *parserForHeaderFile(const QString &filePath);
72     static CodeParser *parserForSourceFile(const QString &filePath);
73     static void setLink(Node *node, Node::LinkType linkType, const QString &arg);
74     static bool isWorthWarningAbout(const Doc &doc);
75 
76 protected:
77     const QSet<QString> &commonMetaCommands();
78     static void extractPageLinkAndDesc(const QString &arg, QString *link, QString *desc);
showInternal()79     static bool showInternal() { return showInternal_; }
80     QString moduleHeader_;
81     QString currentFile_;
82     QDocDatabase *qdb_;
83 
84 private:
85     static QVector<CodeParser *> parsers;
86     static bool showInternal_;
87     static bool singleExec_;
88 };
89 
90 #define COMMAND_ABSTRACT Doc::alias(QLatin1String("abstract"))
91 #define COMMAND_AUDIENCE Doc::alias(QLatin1String("audience"))
92 #define COMMAND_AUTHOR Doc::alias(QLatin1String("author"))
93 #define COMMAND_CATEGORY Doc::alias(QLatin1String("category"))
94 #define COMMAND_CLASS Doc::alias(QLatin1String("class"))
95 #define COMMAND_COMPONENT Doc::alias(QLatin1String("component"))
96 #define COMMAND_CONTENTSPAGE Doc::alias(QLatin1String("contentspage"))
97 #define COMMAND_COPYRHOLDER Doc::alias(QLatin1String("copyrholder"))
98 #define COMMAND_COPYRYEAR Doc::alias(QLatin1String("copyryear"))
99 #define COMMAND_DEPRECATED Doc::alias(QLatin1String("deprecated")) // ### don't document
100 #define COMMAND_DONTDOCUMENT Doc::alias(QLatin1String("dontdocument"))
101 #define COMMAND_DITAMAP Doc::alias(QLatin1String("ditamap"))
102 #define COMMAND_ENUM Doc::alias(QLatin1String("enum"))
103 #define COMMAND_EXAMPLE Doc::alias(QLatin1String("example"))
104 #define COMMAND_EXTERNALPAGE Doc::alias(QLatin1String("externalpage"))
105 #define COMMAND_FN Doc::alias(QLatin1String("fn"))
106 #define COMMAND_GROUP Doc::alias(QLatin1String("group"))
107 #define COMMAND_HEADERFILE Doc::alias(QLatin1String("headerfile"))
108 #define COMMAND_INGROUP Doc::alias(QLatin1String("ingroup"))
109 #define COMMAND_INHEADERFILE Doc::alias(QLatin1String("inheaderfile"))
110 #define COMMAND_INJSMODULE Doc::alias(QLatin1String("injsmodule"))
111 #define COMMAND_INMODULE Doc::alias(QLatin1String("inmodule")) // ### don't document
112 #define COMMAND_INPUBLICGROUP Doc::alias(QLatin1String("inpublicgroup"))
113 #define COMMAND_INQMLMODULE Doc::alias(QLatin1String("inqmlmodule"))
114 #define COMMAND_INTERNAL Doc::alias(QLatin1String("internal"))
115 #define COMMAND_JSATTACHEDMETHOD Doc::alias(QLatin1String("jsattachedmethod"))
116 #define COMMAND_JSATTACHEDPROPERTY Doc::alias(QLatin1String("jsattachedproperty"))
117 #define COMMAND_JSATTACHEDSIGNAL Doc::alias(QLatin1String("jsattachedsignal"))
118 #define COMMAND_JSBASICTYPE Doc::alias(QLatin1String("jsbasictype"))
119 #define COMMAND_JSMETHOD Doc::alias(QLatin1String("jsmethod"))
120 #define COMMAND_JSMODULE Doc::alias(QLatin1String("jsmodule"))
121 #define COMMAND_JSPROPERTY Doc::alias(QLatin1String("jsproperty"))
122 #define COMMAND_JSPROPERTYGROUP Doc::alias(QLatin1String("jspropertygroup"))
123 #define COMMAND_JSSIGNAL Doc::alias(QLatin1String("jssignal"))
124 #define COMMAND_JSTYPE Doc::alias(QLatin1String("jstype"))
125 #define COMMAND_LICENSEDESCRIPTION Doc::alias(QLatin1String("licensedescription"))
126 #define COMMAND_LICENSENAME Doc::alias(QLatin1String("licensename"))
127 #define COMMAND_LICENSEYEAR Doc::alias(QLatin1String("licenseyear"))
128 #define COMMAND_LIFECYCLEVERSION Doc::alias(QLatin1String("lifecycleversion"))
129 #define COMMAND_LIFECYCLEWSTATUS Doc::alias(QLatin1String("lifecyclestatus"))
130 #define COMMAND_MACRO Doc::alias(QLatin1String("macro"))
131 #define COMMAND_MAINCLASS Doc::alias(QLatin1String("mainclass"))
132 #define COMMAND_MODULE Doc::alias(QLatin1String("module"))
133 #define COMMAND_NAMESPACE Doc::alias(QLatin1String("namespace"))
134 #define COMMAND_NEXTPAGE Doc::alias(QLatin1String("nextpage"))
135 #define COMMAND_NOAUTOLIST Doc::alias(QLatin1String("noautolist"))
136 #define COMMAND_NONREENTRANT Doc::alias(QLatin1String("nonreentrant"))
137 #define COMMAND_OBSOLETE Doc::alias(QLatin1String("obsolete"))
138 #define COMMAND_OVERLOAD Doc::alias(QLatin1String("overload"))
139 #define COMMAND_PAGE Doc::alias(QLatin1String("page"))
140 #define COMMAND_PERMISSIONS Doc::alias(QLatin1String("permissions"))
141 #define COMMAND_PRELIMINARY Doc::alias(QLatin1String("preliminary"))
142 #define COMMAND_PREVIOUSPAGE Doc::alias(QLatin1String("previouspage"))
143 #define COMMAND_PRODNAME Doc::alias(QLatin1String("prodname"))
144 #define COMMAND_PROPERTY Doc::alias(QLatin1String("property"))
145 #define COMMAND_PUBLISHER Doc::alias(QLatin1String("publisher"))
146 #define COMMAND_QMLABSTRACT Doc::alias(QLatin1String("qmlabstract"))
147 #define COMMAND_QMLATTACHEDMETHOD Doc::alias(QLatin1String("qmlattachedmethod"))
148 #define COMMAND_QMLATTACHEDPROPERTY Doc::alias(QLatin1String("qmlattachedproperty"))
149 #define COMMAND_QMLATTACHEDSIGNAL Doc::alias(QLatin1String("qmlattachedsignal"))
150 #define COMMAND_QMLBASICTYPE Doc::alias(QLatin1String("qmlbasictype"))
151 #define COMMAND_QMLCLASS Doc::alias(QLatin1String("qmlclass"))
152 #define COMMAND_QMLDEFAULT Doc::alias(QLatin1String("default"))
153 #define COMMAND_QMLINHERITS Doc::alias(QLatin1String("inherits"))
154 #define COMMAND_QMLINSTANTIATES Doc::alias(QLatin1String("instantiates"))
155 #define COMMAND_QMLMETHOD Doc::alias(QLatin1String("qmlmethod"))
156 #define COMMAND_QMLMODULE Doc::alias(QLatin1String("qmlmodule"))
157 #define COMMAND_QMLPROPERTY Doc::alias(QLatin1String("qmlproperty"))
158 #define COMMAND_QMLPROPERTYGROUP Doc::alias(QLatin1String("qmlpropertygroup"))
159 #define COMMAND_QMLREADONLY Doc::alias(QLatin1String("readonly"))
160 #define COMMAND_QMLSIGNAL Doc::alias(QLatin1String("qmlsignal"))
161 #define COMMAND_QMLTYPE Doc::alias(QLatin1String("qmltype"))
162 #define COMMAND_QTVARIABLE Doc::alias(QLatin1String("qtvariable"))
163 #define COMMAND_REENTRANT Doc::alias(QLatin1String("reentrant"))
164 #define COMMAND_REIMP Doc::alias(QLatin1String("reimp"))
165 #define COMMAND_RELATES Doc::alias(QLatin1String("relates"))
166 #define COMMAND_RELEASEDATE Doc::alias(QLatin1String("releasedate"))
167 #define COMMAND_SINCE Doc::alias(QLatin1String("since"))
168 #define COMMAND_STRUCT Doc::alias(QLatin1String("struct"))
169 #define COMMAND_SUBTITLE Doc::alias(QLatin1String("subtitle"))
170 #define COMMAND_STARTPAGE Doc::alias(QLatin1String("startpage"))
171 #define COMMAND_THREADSAFE Doc::alias(QLatin1String("threadsafe"))
172 #define COMMAND_TITLE Doc::alias(QLatin1String("title"))
173 #define COMMAND_TYPEALIAS Doc::alias(QLatin1String("typealias"))
174 #define COMMAND_TYPEDEF Doc::alias(QLatin1String("typedef"))
175 #define COMMAND_VARIABLE Doc::alias(QLatin1String("variable"))
176 #define COMMAND_VERSION Doc::alias(QLatin1String("version"))
177 #define COMMAND_UNION Doc::alias(QLatin1String("union"))
178 #define COMMAND_WRAPPER Doc::alias(QLatin1String("wrapper"))
179 
180 QT_END_NAMESPACE
181 
182 #endif
183