Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmljstyperesolver_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef QQMLJSTYPERESOLVER_P_H
5#define QQMLJSTYPERESOLVER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16
17#include <memory>
18#include <qtqmlcompilerexports.h>
19
20#include <private/qqmlirbuilder_p.h>
21#include <private/qqmljsast_p.h>
22#include "qqmljsimporter_p.h"
23#include "qqmljslogger_p.h"
26#include "qqmljsscope_p.h"
27#include "qqmljsscopesbyid_p.h"
28
30
32class Q_QMLCOMPILER_EXPORT QQmlJSTypeResolver
33{
34public:
35 enum ParentMode { UseDocumentParent, UseParentProperty };
36 enum CloneMode { CloneTypes, DoNotCloneTypes };
37 enum ListMode { UseListProperty, UseQObjectList };
38
40
41 // Note: must be called after the construction to read the QML program
43
44 QQmlJSScope::ConstPtr voidType() const { return m_voidType; }
45 QQmlJSScope::ConstPtr emptyType() const { return m_emptyType; }
46 QQmlJSScope::ConstPtr nullType() const { return m_nullType; }
47 QQmlJSScope::ConstPtr realType() const { return m_realType; }
48 QQmlJSScope::ConstPtr floatType() const { return m_floatType; }
49 QQmlJSScope::ConstPtr int8Type() const { return m_int8Type; }
50 QQmlJSScope::ConstPtr uint8Type() const { return m_uint8Type; }
51 QQmlJSScope::ConstPtr int16Type() const { return m_int16Type; }
52 QQmlJSScope::ConstPtr uint16Type() const { return m_uint16Type; }
53 QQmlJSScope::ConstPtr int32Type() const { return m_int32Type; }
54 QQmlJSScope::ConstPtr uint32Type() const { return m_uint32Type; }
55 QQmlJSScope::ConstPtr int64Type() const { return m_int64Type; }
56 QQmlJSScope::ConstPtr uint64Type() const { return m_uint64Type; }
57 QQmlJSScope::ConstPtr sizeType() const { return m_sizeType; }
58 QQmlJSScope::ConstPtr boolType() const { return m_boolType; }
59 QQmlJSScope::ConstPtr stringType() const { return m_stringType; }
60 QQmlJSScope::ConstPtr stringListType() const { return m_stringListType; }
61 QQmlJSScope::ConstPtr byteArrayType() const { return m_byteArrayType; }
62 QQmlJSScope::ConstPtr urlType() const { return m_urlType; }
63 QQmlJSScope::ConstPtr dateTimeType() const { return m_dateTimeType; }
64 QQmlJSScope::ConstPtr dateType() const { return m_dateType; }
65 QQmlJSScope::ConstPtr timeType() const { return m_timeType; }
66 QQmlJSScope::ConstPtr variantListType() const { return m_variantListType; }
67 QQmlJSScope::ConstPtr variantMapType() const { return m_variantMapType; }
68 QQmlJSScope::ConstPtr varType() const { return m_varType; }
69 QQmlJSScope::ConstPtr jsValueType() const { return m_jsValueType; }
70 QQmlJSScope::ConstPtr jsPrimitiveType() const { return m_jsPrimitiveType; }
71 QQmlJSScope::ConstPtr listPropertyType() const { return m_listPropertyType; }
72 QQmlJSScope::ConstPtr metaObjectType() const { return m_metaObjectType; }
73 QQmlJSScope::ConstPtr functionType() const { return m_functionType; }
74 QQmlJSScope::ConstPtr jsGlobalObject() const { return m_jsGlobalObject; }
75 QQmlJSScope::ConstPtr qObjectType() const { return m_qObjectType; }
76 QQmlJSScope::ConstPtr qObjectListType() const { return m_qObjectListType; }
77 QQmlJSScope::ConstPtr arrayPrototype() const { return m_arrayPrototype; }
78 QQmlJSScope::ConstPtr forInIteratorPtr() const { return m_forInIteratorPtr; }
79 QQmlJSScope::ConstPtr forOfIteratorPtr() const { return m_forOfIteratorPtr; }
80
81 QQmlJSScope::ConstPtr mathObject() const;
82 QQmlJSScope::ConstPtr consoleObject() const;
83
84 QQmlJSScope::ConstPtr scopeForLocation(const QV4::CompiledData::Location &location) const;
85
86 bool isPrefix(const QString &name) const
87 {
88 return m_imports.hasType(name) && !m_imports.type(name).scope;
89 }
90
91 const QHash<QString, QQmlJS::ImportedScope<QQmlJSScope::ConstPtr>> &importedTypes() const
92 {
93 return m_imports.types();
94 }
96 {
97 return m_imports.type(name).scope;
98 }
100 {
101 return m_imports.name(originalType(type));
102 }
103
104 QQmlJSScope::ConstPtr typeFromAST(QQmlJS::AST::Type *type) const;
105 QQmlJSScope::ConstPtr typeForConst(QV4::ReturnedValue rv) const;
106 QQmlJSRegisterContent typeForBinaryOperation(QSOperator::Op oper,
108 const QQmlJSRegisterContent &right) const;
109
110 enum class UnaryOperator { Not, Plus, Minus, Increment, Decrement, Complement };
111 QQmlJSRegisterContent typeForArithmeticUnaryOperation(
112 UnaryOperator op, const QQmlJSRegisterContent &operand) const;
113
114 bool isPrimitive(const QQmlJSRegisterContent &type) const;
115 bool isPrimitive(const QQmlJSScope::ConstPtr &type) const;
116
117 bool isNumeric(const QQmlJSRegisterContent &type) const;
118 bool isIntegral(const QQmlJSRegisterContent &type) const;
119
120 bool canConvertFromTo(const QQmlJSScope::ConstPtr &from, const QQmlJSScope::ConstPtr &to) const;
121 bool canConvertFromTo(const QQmlJSRegisterContent &from, const QQmlJSRegisterContent &to) const;
123 const QQmlJSRegisterContent &b) const;
124
125 enum class ComponentIsGeneric { No, Yes };
127 genericType(const QQmlJSScope::ConstPtr &type,
128 ComponentIsGeneric allowComponent = ComponentIsGeneric::No) const;
129
130 QQmlJSRegisterContent builtinType(const QQmlJSScope::ConstPtr &type) const;
131 QQmlJSRegisterContent globalType(const QQmlJSScope::ConstPtr &type) const;
132 QQmlJSRegisterContent scopedType(const QQmlJSScope::ConstPtr &scope, const QString &name,
134 QQmlJSScopesByIdOptions options = Default) const;
135 QQmlJSRegisterContent memberType(
136 const QQmlJSRegisterContent &type, const QString &name,
137 int lookupIndex = QQmlJSRegisterContent::InvalidLookupIndex) const;
138 QQmlJSRegisterContent valueType(const QQmlJSRegisterContent &list) const;
139 QQmlJSRegisterContent returnType(
141 const QQmlJSScope::ConstPtr &scope) const;
142
143 QQmlJSRegisterContent iteratorPointer(
145 int lookupIndex) const;
146
147 bool registerIsStoredIn(const QQmlJSRegisterContent &reg,
148 const QQmlJSScope::ConstPtr &type) const;
149 bool registerContains(const QQmlJSRegisterContent &reg,
150 const QQmlJSScope::ConstPtr &type) const;
151 QQmlJSScope::ConstPtr containedType(const QQmlJSRegisterContent &container) const;
152 QString containedTypeName(const QQmlJSRegisterContent &container,
153 bool useFancyName = false) const;
154
156 QQmlJSRegisterContent original(const QQmlJSRegisterContent &type) const;
157
158 QQmlJSScope::ConstPtr trackedContainedType(const QQmlJSRegisterContent &container) const;
159 QQmlJSScope::ConstPtr originalContainedType(const QQmlJSRegisterContent &container) const;
160
161 [[nodiscard]] bool adjustTrackedType(
162 const QQmlJSScope::ConstPtr &tracked, const QQmlJSScope::ConstPtr &conversion) const;
163 [[nodiscard]] bool adjustTrackedType(
164 const QQmlJSScope::ConstPtr &tracked,
165 const QList<QQmlJSScope::ConstPtr> &conversions) const;
166 void adjustOriginalType(
167 const QQmlJSScope::ConstPtr &tracked, const QQmlJSScope::ConstPtr &conversion) const;
168 void generalizeType(const QQmlJSScope::ConstPtr &type) const;
169
170 void setParentMode(ParentMode mode) { m_parentMode = mode; }
171 ParentMode parentMode() const { return m_parentMode; }
172
173 void setCloneMode(CloneMode mode) { m_cloneMode = mode; }
174 bool cloneMode() const { return m_cloneMode; }
175
176 QQmlJSScope::ConstPtr storedType(const QQmlJSScope::ConstPtr &type) const;
177 QQmlJSScope::ConstPtr originalType(const QQmlJSScope::ConstPtr &type) const;
178 QQmlJSScope::ConstPtr trackedType(const QQmlJSScope::ConstPtr &type) const;
179 QQmlJSScope::ConstPtr comparableType(const QQmlJSScope::ConstPtr &type) const;
180
181 const QQmlJSScopesById &objectsById() const { return m_objectsById; }
182 bool canCallJSFunctions() const { return m_objectsById.signaturesAreEnforced(); }
183 bool canAddressValueTypes() const { return m_objectsById.valueTypesAreAddressable(); }
184
185 const QHash<QQmlJS::SourceLocation, QQmlJSMetaSignalHandler> &signalHandlers() const
186 {
187 return m_signalHandlers;
188 }
189
190 bool equals(const QQmlJSScope::ConstPtr &a, const QQmlJSScope::ConstPtr &b) const;
191
193 const QQmlJSRegisterContent &from, const QQmlJSRegisterContent &to) const;
195 const QQmlJSRegisterContent &from, const QQmlJSScope::ConstPtr &to) const;
196
198 const QQmlJSScope::ConstPtr &b) const;
199
200 bool canHoldUndefined(const QQmlJSRegisterContent &content) const;
201 bool isOptionalType(const QQmlJSRegisterContent &content) const;
202 QQmlJSScope::ConstPtr extractNonVoidFromOptionalType(
203 const QQmlJSRegisterContent &content) const;
204
205 bool isNumeric(const QQmlJSScope::ConstPtr &type) const;
206 bool isIntegral(const QQmlJSScope::ConstPtr &type) const;
207 bool isSignedInteger(const QQmlJSScope::ConstPtr &type) const;
208 bool isUnsignedInteger(const QQmlJSScope::ConstPtr &type) const;
209 bool isNativeArrayIndex(const QQmlJSScope::ConstPtr &type) const;
210
211 bool canHold(const QQmlJSScope::ConstPtr &container,
212 const QQmlJSScope::ConstPtr &contained) const;
213
214 bool canPopulate(
216 bool *isExtension) const;
217
218 QQmlJSMetaMethod selectConstructor(
220 bool *isExtension) const;
221
222 bool areEquivalentLists(const QQmlJSScope::ConstPtr &a, const QQmlJSScope::ConstPtr &b) const;
223
224 bool isTriviallyCopyable(const QQmlJSScope::ConstPtr &type) const;
225
227
228protected:
229
230 QQmlJSRegisterContent memberType(
231 const QQmlJSScope::ConstPtr &type, const QString &name,
232 int baseLookupIndex, int resultLookupIndex) const;
234 const QString &name) const;
235 bool checkEnums(const QQmlJSScope::ConstPtr &scope, const QString &name,
237 bool canPrimitivelyConvertFromTo(
238 const QQmlJSScope::ConstPtr &from, const QQmlJSScope::ConstPtr &to) const;
239 QQmlJSRegisterContent lengthProperty(bool isWritable, const QQmlJSScope::ConstPtr &scope) const;
240 QQmlJSRegisterContent transformed(
241 const QQmlJSRegisterContent &origin,
242 QQmlJSScope::ConstPtr (QQmlJSTypeResolver::*op)(const QQmlJSScope::ConstPtr &) const) const;
243
244 QQmlJSRegisterContent registerContentForName(
245 const QString &name,
246 const QQmlJSScope::ConstPtr &scopeType = QQmlJSScope::ConstPtr(),
247 bool hasObjectModuelPrefix = false) const;
248
249
288
290 QHash<QV4::CompiledData::Location, QQmlJSScope::ConstPtr> m_objectsByLocation;
292 QHash<QQmlJS::SourceLocation, QQmlJSMetaSignalHandler> m_signalHandlers;
293
294 ParentMode m_parentMode = UseParentProperty;
295 CloneMode m_cloneMode = CloneTypes;
296 QQmlJSLogger *m_logger = nullptr;
297
299 {
300 // The type originally found via type analysis.
302
303 // Any later replacement used to overwrite the contents of the clone.
305
306 // A clone of original, used to track the type,
307 // contents possibly overwritten by replacement.
309 };
310
311 std::unique_ptr<QHash<QQmlJSScope::ConstPtr, TrackedType>> m_trackedTypes;
312};
313
322{
323 std::shared_ptr<QQmlJSImporter> importer;
324 std::shared_ptr<QQmlJSResourceFileMapper> mapper;
325};
326
328
329#endif // QQMLJSTYPERESOLVER_P_H
Tracks the types for the QmlCompiler.
QQmlJSScope::ConstPtr functionType() const
QQmlJSScope::ConstPtr m_int8Type
QQmlJSScope::ConstPtr dateTimeType() const
const QQmlJSScopesById & objectsById() const
QQmlJSScope::ConstPtr int64Type() const
QQmlJSScope::ConstPtr m_stringListType
QQmlJSScope::ConstPtr m_arrayPrototype
QQmlJSImporter::ImportedTypes m_imports
QQmlJSScope::ConstPtr stringType() const
QQmlJSScope::ConstPtr m_realType
QQmlJSScope::ConstPtr m_int64Type
QQmlJSScope::ConstPtr m_uint16Type
QQmlJSScope::ConstPtr listPropertyType() const
const QHash< QQmlJS::SourceLocation, QQmlJSMetaSignalHandler > & signalHandlers() const
QQmlJSScope::ConstPtr nullType() const
QQmlJSScope::ConstPtr timeType() const
QQmlJSScope::ConstPtr m_voidType
QQmlJSScope::ConstPtr uint64Type() const
QQmlJSScope::ConstPtr emptyType() const
QQmlJSScope::ConstPtr jsPrimitiveType() const
QQmlJSScope::ConstPtr m_jsValueType
QQmlJSScope::ConstPtr m_int16Type
QQmlJSScope::ConstPtr uint8Type() const
QQmlJSScope::ConstPtr byteArrayType() const
QQmlJSScope::ConstPtr arrayPrototype() const
QQmlJSScope::ConstPtr boolType() const
QQmlJSScope::ConstPtr qObjectListType() const
QQmlJSScope::ConstPtr m_jsPrimitiveType
QQmlJSScope::ConstPtr jsGlobalObject() const
QQmlJSScopesById m_objectsById
QQmlJSScope::ConstPtr m_qObjectListType
QQmlJSScope::ConstPtr m_varType
QQmlJSScope::ConstPtr m_byteArrayType
QQmlJSScope::ConstPtr m_forOfIteratorPtr
QString nameForType(const QQmlJSScope::ConstPtr &type) const
QQmlJSScope::ConstPtr m_forInIteratorPtr
QQmlJSScope::ConstPtr int16Type() const
const QHash< QString, QQmlJS::ImportedScope< QQmlJSScope::ConstPtr > > & importedTypes() const
QQmlJSScope::ConstPtr m_qQmlScriptStringType
bool isPrefix(const QString &name) const
QQmlJSScope::ConstPtr m_qObjectType
QQmlJSScope::ConstPtr jsValueType() const
QQmlJSScope::ConstPtr sizeType() const
QHash< QV4::CompiledData::Location, QQmlJSScope::ConstPtr > m_objectsByLocation
QQmlJSScope::ConstPtr stringListType() const
QQmlJSScope::ConstPtr uint32Type() const
QQmlJSScope::ConstPtr uint16Type() const
QQmlJSScope::ConstPtr int8Type() const
QQmlJSScope::ConstPtr m_urlType
QQmlJSScope::ConstPtr m_uint32Type
QQmlJSScope::ConstPtr int32Type() const
QQmlJSScope::ConstPtr m_numberPrototype
QQmlJSScope::ConstPtr m_functionType
void setParentMode(ParentMode mode)
QQmlJSScope::ConstPtr m_listPropertyType
QQmlJSScope::ConstPtr variantListType() const
QQmlJSScope::ConstPtr m_variantMapType
QQmlJSScope::ConstPtr m_stringType
QQmlJSScope::ConstPtr m_nullType
QQmlJSScope::ConstPtr voidType() const
QQmlJSScope::ConstPtr m_sizeType
QQmlJSScope::ConstPtr m_dateTimeType
ParentMode parentMode() const
QQmlJSScope::ConstPtr m_floatType
QHash< QQmlJS::SourceLocation, QQmlJSMetaSignalHandler > m_signalHandlers
QQmlJSScope::ConstPtr m_timeType
QQmlJSScope::ConstPtr m_boolType
QQmlJSScope::ConstPtr forOfIteratorPtr() const
QQmlJSScope::ConstPtr metaObjectType() const
QQmlJSScope::ConstPtr forInIteratorPtr() const
QQmlJSScope::ConstPtr m_metaObjectType
QQmlJSScope::ConstPtr realType() const
QQmlJSScope::ConstPtr m_jsGlobalObject
QQmlJSScope::ConstPtr urlType() const
QQmlJSScope::ConstPtr m_int32Type
QQmlJSScope::ConstPtr m_uint64Type
void setCloneMode(CloneMode mode)
QQmlJSScope::ConstPtr m_emptyType
QQmlJSScope::ConstPtr dateType() const
bool canAddressValueTypes() const
std::unique_ptr< QHash< QQmlJSScope::ConstPtr, TrackedType > > m_trackedTypes
QQmlJSScope::ConstPtr m_uint8Type
QQmlJSScope::ConstPtr m_variantListType
QQmlJSScope::ConstPtr typeForName(const QString &name) const
QQmlJSScope::ConstPtr qObjectType() const
QQmlJSScope::ConstPtr varType() const
QQmlJSScope::ConstPtr m_dateType
QQmlJSScope::ConstPtr variantMapType() const
QQmlJSScope::ConstPtr floatType() const
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
Combined button and popup list for selecting options.
quint64 ReturnedValue
GLint location
GLboolean GLboolean GLboolean b
GLenum mode
GLboolean GLboolean GLboolean GLboolean a
[7]
GLdouble GLdouble right
GLint left
GLenum type
GLuint program
GLuint name
GLuint64EXT * result
[6]
static constexpr To convert(const std::array< Mapping, N > &mapping, From Mapping::*from, To Mapping::*to, From value, To defaultValue)
static QT_BEGIN_NAMESPACE const uint Default
Definition qsplitter_p.h:27
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
static const uint base
Definition qurlidna.cpp:20
QList< int > list
[14]
timer inherits("QTimer")
QVariant variant
[1]
QExplicitlySharedDataPointer< Derived > derived(base)
QDBusArgument argument
std::shared_ptr< QQmlJSResourceFileMapper > mapper
std::shared_ptr< QQmlJSImporter > importer