aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/abstractmetabuilder_p.h
blob: d7aaba5b0092bbf5f4ac3c26d45166fb25f93c01 (plain)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#ifndef ABSTRACTMETABUILDER_P_H
#define ABSTRACTMETABUILDER_P_H

#include "abstractmetabuilder.h"
#include "dependency.h"
#include "parser/codemodel_fwd.h"
#include "abstractmetalang.h"
#include "abstractmetatype.h"
#include "include.h"
#include "typeparser.h"
#include "modifications_typedefs.h"
#include "typesystem_typedefs.h"

#include <QtCore/QFileInfo>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QMultiHash>
#include <QtCore/QSet>

#include <optional>
#include <set>

class TypeDatabase;

struct RejectEntry
{
    AbstractMetaBuilder::RejectReason reason;
    QString signature;
    QString sortkey;
    QString message;
};

bool operator<(const RejectEntry &re1, const RejectEntry &re2);

class AbstractMetaBuilderPrivate
{
public:
    struct TypeClassEntry
    {
        AbstractMetaType type;
        AbstractMetaClassCPtr klass;
    };

    using TranslateTypeFlags = AbstractMetaBuilder::TranslateTypeFlags;

    Q_DISABLE_COPY(AbstractMetaBuilderPrivate)

    AbstractMetaBuilderPrivate();

    static FileModelItem buildDom(QByteArrayList arguments,
                                  bool addCompilerSupportArguments,
                                  LanguageLevel level,
                                  unsigned clangFlags);
    void traverseDom(const FileModelItem &dom, ApiExtractorFlags flags);

    void dumpLog() const;

    static AbstractMetaClassList
        classesTopologicalSorted(const AbstractMetaClassList &classList,
                                 const Dependencies &additionalDependencies = {});
    static AbstractMetaClassCList
        classesTopologicalSorted(const AbstractMetaClassCList &classList,
                                 const Dependencies &additionalDependencies = {});

    NamespaceModelItem popScope() { return m_scopes.takeLast(); }

    void pushScope(const NamespaceModelItem &item);

    NamespaceModelItem currentScope() const { return m_scopes.constLast(); }

    AbstractMetaClassPtr argumentToClass(const ArgumentModelItem &,
                                       const AbstractMetaClassCPtr &currentClass);

    void addAbstractMetaClass(const AbstractMetaClassPtr &cls, const _CodeModelItem *item);
    AbstractMetaClassPtr traverseTypeDef(const FileModelItem &dom,
                                       const TypeDefModelItem &typeDef,
                                       const AbstractMetaClassPtr &currentClass);
    AbstractMetaClassPtr traverseTypeDefHelper(const FileModelItem &dom,
                                               const TypeDefModelItem &typeDef,
                                               const AbstractMetaClassPtr &currentClass);
    void traverseTypesystemTypedefs();
    AbstractMetaClassPtr traverseClass(const FileModelItem &dom,
                                     const ClassModelItem &item,
                                     const AbstractMetaClassPtr &currentClass);
    void traverseScopeMembers(const ScopeModelItem &item,
                              const AbstractMetaClassPtr &metaClass);
    void traverseClassMembers(const ClassModelItem &scopeItem);
    void traverseUsingMembers(const AbstractMetaClassPtr &metaClass) const;
    void traverseNamespaceMembers(const NamespaceModelItem &scopeItem);
    bool setupInheritance(const AbstractMetaClassPtr &metaClass);
    AbstractMetaClassPtr traverseNamespace(const FileModelItem &dom,
                                         const NamespaceModelItem &item);
    std::optional<AbstractMetaEnum> traverseEnum(const EnumModelItem &item,
                                                 const AbstractMetaClassPtr &enclosing,
                                                 const QSet<QString> &enumsDeclarations);
    void traverseEnums(const ScopeModelItem &item, const AbstractMetaClassPtr &parent,
                       const QStringList &enumsDeclarations);
    AbstractMetaFunctionRawPtrList classFunctionList(const ScopeModelItem &scopeItem,
                                                     AbstractMetaClass::Attributes *constructorAttributes,
                                                     const AbstractMetaClassPtr &currentClass);
    void traverseFunctions(const ScopeModelItem& item,
                           const AbstractMetaClassPtr &parent);
    static void applyFunctionModifications(AbstractMetaFunction *func);
    void traverseFields(const ScopeModelItem &item, const AbstractMetaClassPtr &parent);
    bool traverseStreamOperator(const FunctionModelItem &functionItem,
                                const AbstractMetaClassPtr &currentClass);
    void traverseOperatorFunction(const FunctionModelItem &item,
                                  const AbstractMetaClassPtr &currentClass);
    AbstractMetaFunction *traverseAddedFunctionHelper(const AddedFunctionPtr &addedFunc,
                                                      const AbstractMetaClassPtr &metaClass,
                                                      QString *errorMessage);
    bool traverseAddedGlobalFunction(const AddedFunctionPtr &addedFunc,
                                     QString *errorMessage);
    bool traverseAddedMemberFunction(const AddedFunctionPtr &addedFunc,
                                     const AbstractMetaClassPtr &metaClass,
                                     QString *errorMessage);
    void rejectFunction(const FunctionModelItem &functionItem,
                        const AbstractMetaClassPtr &currentClass,
                        AbstractMetaBuilder::RejectReason reason,
                        const QString &rejectReason);
        AbstractMetaFunction *traverseFunction(const FunctionModelItem &function,
                                           const AbstractMetaClassPtr &currentClass);
    std::optional<AbstractMetaField> traverseField(const VariableModelItem &field,
                                                   const AbstractMetaClassCPtr &cls);
    void checkFunctionModifications() const;
    void registerHashFunction(const FunctionModelItem &functionItem,
                              const AbstractMetaClassPtr &currentClass);
    void registerToStringCapabilityIn(const NamespaceModelItem &namespaceItem);
    void registerToStringCapability(const FunctionModelItem &functionItem,
                                    const AbstractMetaClassPtr &currentClass);

    /**
     *   A conversion operator function should not have its owner class as
     *   its return type, but unfortunately it does. This function fixes the
     *   return type of operator functions of this kind making the return type
     *   be the same as it is supposed to generate when used in C++.
     *   If the returned type is a wrapped C++ class, this method also adds the
     *   conversion operator to the collection of external conversions of the
     *   said class.
     *   \param metaFunction conversion operator function to be fixed.
     */
    static void fixReturnTypeOfConversionOperator(AbstractMetaFunction *metaFunction);

    void parseQ_Properties(const AbstractMetaClassPtr &metaClass,
                           const QStringList &declarations);
    void setupEquals(const AbstractMetaClassPtr &metaClass);
    void setupComparable(const AbstractMetaClassPtr &metaClass);
    void setupExternalConversion(const AbstractMetaClassCPtr &cls);

    static bool isQualifiedCppIdentifier(QStringView e);
    QString fixDefaultValue(QString expr, const AbstractMetaType &type,
                            const AbstractMetaClassCPtr &) const;
    QString fixSimpleDefaultValue(QStringView expr,
                                  const AbstractMetaClassCPtr &klass) const;

    QString fixEnumDefault(const AbstractMetaType &type, const QString &expr,
                           const AbstractMetaClassCPtr &) const;
    /// Qualify a static field name for default value expressions
    static QString qualifyStaticField(const AbstractMetaClassCPtr &c, QStringView field);

    std::optional<AbstractMetaType>
        translateType(const TypeInfo &type, const AbstractMetaClassCPtr &currentClass,
                      TranslateTypeFlags flags = {}, QString *errorMessage = nullptr);
    static std::optional<AbstractMetaType>
        translateTypeStatic(const TypeInfo &type, const AbstractMetaClassCPtr &current,
                            AbstractMetaBuilderPrivate *d = nullptr, TranslateTypeFlags flags = {},
                            QString *errorMessageIn = nullptr);
    static TypeEntryCList findTypeEntriesHelper(const QString &qualifiedName, const QString &name,
                                                TranslateTypeFlags flags = {},
                                                const AbstractMetaClassCPtr &currentClass = {},
                                                AbstractMetaBuilderPrivate *d = nullptr);
    static TypeEntryCList findTypeEntries(const QString &qualifiedName, const QString &name,
                                          TranslateTypeFlags flags = {},
                                          const AbstractMetaClassCPtr &currentClass = {},
                                          AbstractMetaBuilderPrivate *d = nullptr,
                                          QString *errorMessage = nullptr);

    qint64 findOutValueFromString(const QString &stringValue, bool &ok);

    AbstractMetaClassPtr findTemplateClass(const QString& name, const AbstractMetaClassCPtr &context,
                                         TypeInfo *info = nullptr,
                                         ComplexTypeEntryPtr *baseContainerType = nullptr) const;
    AbstractMetaClassCList getBaseClasses(const AbstractMetaClassCPtr &metaClass) const;

    static bool inheritTemplate(const AbstractMetaClassPtr &subclass,
                                const AbstractMetaClassCPtr &templateClass,
                                const TypeInfo &info);
    static bool inheritTemplate(const AbstractMetaClassPtr &subclass,
                                const AbstractMetaClassCPtr &templateClass,
                                const AbstractMetaTypeList &templateTypes,
                                InheritTemplateFlags flags = {});

    static AbstractMetaFunctionPtr
        inheritTemplateFunction(const AbstractMetaFunctionCPtr &function,
                                const AbstractMetaTypeList &templateTypes);

    static AbstractMetaFunctionPtr
        inheritTemplateMember(const AbstractMetaFunctionCPtr &function,
                              const AbstractMetaTypeList &templateTypes,
                              const AbstractMetaClassCPtr &templateClass,
                              const AbstractMetaClassPtr &subclass);

    static void inheritTemplateFunctions(const AbstractMetaClassPtr &subclass);
    static std::optional<AbstractMetaType>
        inheritTemplateType(const AbstractMetaTypeList &templateTypes,
                            const AbstractMetaType &metaType);

    static bool isQObject(const FileModelItem &dom, const QString &qualifiedName);
    static bool isEnum(const FileModelItem &dom, const QStringList &qualifiedName);

    void sortLists();
    void setInclude(const TypeEntryPtr &te, const QString &path) const;
    static void fixArgumentNames(AbstractMetaFunction *func, const FunctionModificationList &mods);

    void fillAddedFunctions(const AbstractMetaClassPtr &metaClass);
    AbstractMetaClassCPtr resolveTypeSystemTypeDef(const AbstractMetaType &t) const;

    void fixSmartPointers();

    AbstractMetaBuilder *q = nullptr;
    AbstractMetaClassList m_metaClasses;
    AbstractMetaClassList m_templates;
    AbstractMetaClassList m_smartPointers;
    QHash<const _CodeModelItem *, AbstractMetaClassPtr > m_itemToClass;
    QHash<AbstractMetaClassCPtr, const _CodeModelItem *> m_classToItem;
    AbstractMetaFunctionCList m_globalFunctions;
    AbstractMetaEnumList m_globalEnums;

    using RejectSet = std::set<RejectEntry>;

    RejectSet m_rejectedClasses;
    RejectSet m_rejectedEnums;
    RejectSet m_rejectedFunctions;
    RejectSet m_rejectedFields;

    QHash<TypeEntryCPtr, AbstractMetaEnum> m_enums;

    QList<NamespaceModelItem> m_scopes;

    QString m_logDirectory;
    QFileInfoList m_globalHeaders;
    QStringList m_headerPaths;
    mutable QHash<QString, Include> m_resolveIncludeHash;
    QMultiHash<QString, QString> m_typedefTargetToName;
    QList<TypeClassEntry> m_typeSystemTypeDefs; // look up metatype->class for type system typedefs
    ApiExtractorFlags m_apiExtractorFlags;
    bool m_skipDeprecated = false;
    static bool m_useGlobalHeader;
    static bool m_codeModelTestMode;
};

#endif // ABSTRACTMETBUILDER_P_H