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 QtQml module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
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 Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 3 requirements |
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
24 | ** |
25 | ** GNU General Public License Usage |
26 | ** Alternatively, this file may be used under the terms of the GNU |
27 | ** General Public License version 2.0 or (at your option) the GNU General |
28 | ** Public license version 3 or any later version approved by the KDE Free |
29 | ** Qt Foundation. The licenses are as published by the Free Software |
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
31 | ** included in the packaging of this file. Please review the following |
32 | ** information to ensure the GNU General Public License requirements will |
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
35 | ** |
36 | ** $QT_END_LICENSE$ |
37 | ** |
38 | ****************************************************************************/ |
39 | |
40 | #ifndef QQMLTYPEDATA_P_H |
41 | #define QQMLTYPEDATA_P_H |
42 | |
43 | // |
44 | // W A R N I N G |
45 | // ------------- |
46 | // |
47 | // This file is not part of the Qt API. It exists purely as an |
48 | // implementation detail. This header file may change from version to |
49 | // version without notice, or even be removed. |
50 | // |
51 | // We mean it. |
52 | // |
53 | |
54 | #include <private/qqmltypeloader_p.h> |
55 | #include <private/qv4executablecompilationunit_p.h> |
56 | |
57 | QT_BEGIN_NAMESPACE |
58 | |
59 | class Q_AUTOTEST_EXPORT QQmlTypeData : public QQmlTypeLoader::Blob |
60 | { |
61 | Q_DECLARE_TR_FUNCTIONS(QQmlTypeData) |
62 | public: |
63 | struct TypeReference |
64 | { |
65 | TypeReference() : majorVersion(0), minorVersion(0), needsCreation(true) {} |
66 | |
67 | QV4::CompiledData::Location location; |
68 | QQmlType type; |
69 | int majorVersion; |
70 | int minorVersion; |
71 | QQmlRefPointer<QQmlTypeData> typeData; |
72 | bool selfReference = false; |
73 | QString prefix; // used by CompositeSingleton types |
74 | QString qualifiedName() const; |
75 | bool needsCreation; |
76 | }; |
77 | |
78 | struct ScriptReference |
79 | { |
80 | QV4::CompiledData::Location location; |
81 | QString qualifier; |
82 | QQmlRefPointer<QQmlScriptBlob> script; |
83 | }; |
84 | |
85 | private: |
86 | friend class QQmlTypeLoader; |
87 | |
88 | QQmlTypeData(const QUrl &, QQmlTypeLoader *); |
89 | template<typename Container> |
90 | void setCompileUnit(const Container &container); |
91 | |
92 | public: |
93 | ~QQmlTypeData() override; |
94 | |
95 | const QList<ScriptReference> &resolvedScripts() const; |
96 | |
97 | QV4::ExecutableCompilationUnit *compilationUnit() const; |
98 | QV4::ExecutableCompilationUnit *compilationUnitForInlineComponent(unsigned int icObjectId) const; |
99 | |
100 | // Used by QQmlComponent to get notifications |
101 | struct TypeDataCallback { |
102 | virtual ~TypeDataCallback(); |
103 | virtual void typeDataProgress(QQmlTypeData *, qreal) {} |
104 | virtual void typeDataReady(QQmlTypeData *) {} |
105 | }; |
106 | void registerCallback(TypeDataCallback *); |
107 | void unregisterCallback(TypeDataCallback *); |
108 | |
109 | CompositeMetaTypeIds typeIds(int objectId = 0) const; |
110 | QByteArray typeClassName() const { return m_typeClassName; } |
111 | |
112 | protected: |
113 | void done() override; |
114 | void completed() override; |
115 | void dataReceived(const SourceCodeData &) override; |
116 | void initializeFromCachedUnit(const QV4::CompiledData::Unit *unit) override; |
117 | void allDependenciesDone() override; |
118 | void downloadProgressChanged(qreal) override; |
119 | |
120 | QString stringAt(int index) const override; |
121 | |
122 | private: |
123 | bool tryLoadFromDiskCache(); |
124 | bool loadFromSource(); |
125 | void restoreIR(QV4::CompiledData::CompilationUnit &&unit); |
126 | void continueLoadFromIR(); |
127 | void resolveTypes(); |
128 | QQmlError buildTypeResolutionCaches( |
129 | QQmlRefPointer<QQmlTypeNameCache> *typeNameCache, |
130 | QV4::ResolvedTypeReferenceMap *resolvedTypeCache |
131 | ) const; |
132 | void compile(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache, |
133 | QV4::ResolvedTypeReferenceMap *resolvedTypeCache, |
134 | const QV4::CompiledData::DependentTypesHasher &dependencyHasher); |
135 | void createTypeAndPropertyCaches(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache, |
136 | const QV4::ResolvedTypeReferenceMap &resolvedTypeCache); |
137 | bool resolveType(const QString &typeName, int &majorVersion, int &minorVersion, |
138 | TypeReference &ref, int lineNumber = -1, int columnNumber = -1, |
139 | bool reportErrors = true, |
140 | QQmlType::RegistrationType registrationType = QQmlType::AnyRegistrationType, |
141 | bool *typeRecursionDetected = nullptr); |
142 | |
143 | void scriptImported(const QQmlRefPointer<QQmlScriptBlob> &blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) override; |
144 | |
145 | SourceCodeData m_backupSourceCode; // used when cache verification fails. |
146 | QScopedPointer<QmlIR::Document> m_document; |
147 | QV4::CompiledData::TypeReferenceMap m_typeReferences; |
148 | |
149 | QList<ScriptReference> m_scripts; |
150 | |
151 | QSet<QString> m_namespaces; |
152 | QList<TypeReference> m_compositeSingletons; |
153 | |
154 | // map from name index to resolved type |
155 | // While this could be a hash, a map is chosen here to provide a stable |
156 | // order, which is used to calculating a check-sum on dependent meta-objects. |
157 | QMap<int, TypeReference> m_resolvedTypes; |
158 | bool m_typesResolved:1; |
159 | |
160 | // Used for self-referencing types, otherwise -1. |
161 | CompositeMetaTypeIds m_typeIds; |
162 | QByteArray m_typeClassName; // used for meta-object later |
163 | |
164 | using ExecutableCompilationUnitPtr = QQmlRefPointer<QV4::ExecutableCompilationUnit>; |
165 | |
166 | QHash<int, InlineComponentData> m_inlineComponentData; |
167 | |
168 | ExecutableCompilationUnitPtr m_compiledData; |
169 | QHash<int, ExecutableCompilationUnitPtr> m_inlineComponentToCompiledData; |
170 | |
171 | QList<TypeDataCallback *> m_callbacks; |
172 | |
173 | bool m_implicitImportLoaded; |
174 | bool loadImplicitImport(); |
175 | }; |
176 | |
177 | QT_END_NAMESPACE |
178 | |
179 | #endif // QQMLTYPEDATA_P_H |
180 | |