39 QQmlJSTypeResolver(QQmlJSImporter *importer);
42 void init(QQmlJSImportVisitor *visitor, QQmlJS::AST::Node *program);
44 QQmlJSRegisterContentPool *registerContentPool()
const {
return m_pool.get(); }
45 QQmlJSLogger *logger()
const {
return m_logger; }
46 QQmlJSImporter *importer()
const {
return m_importer; }
51 enum ParentMode { UseDocumentParent, UseParentProperty };
52 void setParentMode(ParentMode mode) { m_parentMode = mode; }
53 ParentMode parentMode()
const {
return m_parentMode; }
55 enum CloneMode { CloneTypes, DoNotCloneTypes };
56 void setCloneMode(CloneMode mode) { m_cloneMode = mode; }
57 CloneMode cloneMode()
const {
return m_cloneMode; }
62 QQmlJSScope::ConstPtr voidType()
const {
return m_voidType; }
63 QQmlJSScope::ConstPtr emptyType()
const {
return m_emptyType; }
64 QQmlJSScope::ConstPtr nullType()
const {
return m_nullType; }
65 QQmlJSScope::ConstPtr realType()
const {
return m_realType; }
66 QQmlJSScope::ConstPtr floatType()
const {
return m_floatType; }
67 QQmlJSScope::ConstPtr int8Type()
const {
return m_int8Type; }
68 QQmlJSScope::ConstPtr uint8Type()
const {
return m_uint8Type; }
69 QQmlJSScope::ConstPtr int16Type()
const {
return m_int16Type; }
70 QQmlJSScope::ConstPtr uint16Type()
const {
return m_uint16Type; }
71 QQmlJSScope::ConstPtr int32Type()
const {
return m_int32Type; }
72 QQmlJSScope::ConstPtr uint32Type()
const {
return m_uint32Type; }
73 QQmlJSScope::ConstPtr int64Type()
const {
return m_int64Type; }
74 QQmlJSScope::ConstPtr uint64Type()
const {
return m_uint64Type; }
75 QQmlJSScope::ConstPtr sizeType()
const {
return m_sizeType; }
76 QQmlJSScope::ConstPtr boolType()
const {
return m_boolType; }
77 QQmlJSScope::ConstPtr stringType()
const {
return m_stringType; }
78 QQmlJSScope::ConstPtr stringListType()
const {
return m_stringListType; }
79 QQmlJSScope::ConstPtr byteArrayType()
const {
return m_byteArrayType; }
80 QQmlJSScope::ConstPtr urlType()
const {
return m_urlType; }
81 QQmlJSScope::ConstPtr dateTimeType()
const {
return m_dateTimeType; }
82 QQmlJSScope::ConstPtr dateType()
const {
return m_dateType; }
83 QQmlJSScope::ConstPtr timeType()
const {
return m_timeType; }
84 QQmlJSScope::ConstPtr regexpType()
const {
return m_regexpType; }
85 QQmlJSScope::ConstPtr variantListType()
const {
return m_variantListType; }
86 QQmlJSScope::ConstPtr variantMapType()
const {
return m_variantMapType; }
87 QQmlJSScope::ConstPtr varType()
const {
return m_varType; }
88 QQmlJSScope::ConstPtr qmlPropertyMapType()
const {
return m_qmlPropertyMapType; }
89 QQmlJSScope::ConstPtr jsValueType()
const {
return m_jsValueType; }
90 QQmlJSScope::ConstPtr jsPrimitiveType()
const {
return m_jsPrimitiveType; }
91 QQmlJSScope::ConstPtr listPropertyType()
const {
return m_listPropertyType; }
92 QQmlJSScope::ConstPtr metaObjectType()
const {
return m_metaObjectType; }
93 QQmlJSScope::ConstPtr functionType()
const {
return m_functionType; }
94 QQmlJSScope::ConstPtr jsGlobalObject()
const {
return m_jsGlobalObject; }
95 QQmlJSScope::ConstPtr qObjectType()
const {
return m_qObjectType; }
96 QQmlJSScope::ConstPtr qObjectListType()
const {
return m_qObjectListType; }
97 QQmlJSScope::ConstPtr arrayPrototype()
const {
return m_arrayPrototype; }
98 QQmlJSScope::ConstPtr forInIteratorPtr()
const {
return m_forInIteratorPtr; }
99 QQmlJSScope::ConstPtr forOfIteratorPtr()
const {
return m_forOfIteratorPtr; }
100 QQmlJSScope::ConstPtr qQmlScriptStringType()
const {
return m_qQmlScriptStringType; }
102 QQmlJSRegisterContent jsGlobalObjectContent()
const {
return m_jsGlobalObjectContent; }
103 QQmlJSScope::ConstPtr mathObject()
const;
104 QQmlJSScope::ConstPtr consoleObject()
const;
106 QQmlJSScope::ConstPtr typeForConst(QV4::ReturnedValue rv)
const;
111 bool isPrefix(
const QString &name)
const
113 return m_imports.hasType(name) && !m_imports.type(name).scope;
116 const QHash<QString, QQmlJS::ContextualType> &importedTypes()
const
118 return m_imports.types();
121 const auto &importedNames()
const
123 return m_imports.contextualTypes().names();
126 QQmlJSScope::ConstPtr typeForName(
const QString &name)
const
128 return m_imports.type(name).scope;
131 QString nameForType(
const QQmlJSScope::ConstPtr &type)
const
133 return m_imports.name(type);
136 QStringList seenModuleQualifiers()
const {
return m_seenModuleQualifiers; }
141 QQmlJSScope::ConstPtr scopeForLocation(
const QV4::CompiledData::Location &location)
const;
142 QQmlJSScope::ConstPtr typeFromAST(QQmlJS::AST::Type *type)
const;
143 QQmlJSScope::ConstPtr typeForId(
144 const QQmlJSScope::ConstPtr &scope,
const QString &name,
145 QQmlJSScopesByIdOptions options = QQmlJSScopesByIdOption::Default)
const
147 return m_objectsById.scope(name, scope, options);
150 const QQmlJSScopesById &objectsById()
const {
return m_objectsById; }
151 bool canCallJSFunctions()
const {
return m_objectsById.signaturesAreEnforced(); }
152 bool canAddressValueTypes()
const {
return m_objectsById.valueTypesAreAddressable(); }
154 QQmlJSScope::ConstPtr scopedType(
155 const QQmlJSScope::ConstPtr &scope,
const QString &name,
156 QQmlJSScopesByIdOptions options = QQmlJSScopesByIdOption::Default)
const;
158 const QHash<QQmlJS::SourceLocation, QQmlJSMetaSignalHandler> &signalHandlers()
const
160 return m_signalHandlers;
166 bool isPrimitive(QQmlJSRegisterContent type)
const;
167 bool isPrimitive(
const QQmlJSScope::ConstPtr &type)
const;
169 bool isNumeric(QQmlJSRegisterContent type)
const;
170 bool isNumeric(
const QQmlJSScope::ConstPtr &type)
const;
172 bool isIntegral(QQmlJSRegisterContent type)
const;
173 bool isIntegral(
const QQmlJSScope::ConstPtr &type)
const;
175 bool isSignedInteger(
const QQmlJSScope::ConstPtr &type)
const;
176 bool isUnsignedInteger(
const QQmlJSScope::ConstPtr &type)
const;
177 bool isNativeArrayIndex(
const QQmlJSScope::ConstPtr &type)
const;
179 bool canHold(
const QQmlJSScope::ConstPtr &container,
180 const QQmlJSScope::ConstPtr &contained)
const;
181 bool canHoldUndefined(QQmlJSRegisterContent content)
const;
182 bool isOptionalType(QQmlJSRegisterContent content)
const;
185 const QQmlJSScope::ConstPtr &type,
const QQmlJSScope::ConstPtr &argument,
186 bool *isExtension)
const;
188 bool canConvertFromTo(
const QQmlJSScope::ConstPtr &from,
const QQmlJSScope::ConstPtr &to)
const;
189 bool canConvertFromTo(QQmlJSRegisterContent from, QQmlJSRegisterContent to)
const;
191 bool areEquivalentLists(
const QQmlJSScope::ConstPtr &a,
const QQmlJSScope::ConstPtr &b)
const;
193 bool isTriviallyCopyable(
const QQmlJSScope::ConstPtr &type)
const;
195 bool inherits(
const QQmlJSScope::ConstPtr &derived,
const QQmlJSScope::ConstPtr &base)
const;
200 enum class ComponentIsGeneric { No, Yes };
201 QQmlJSScope::ConstPtr genericType(
202 const QQmlJSScope::ConstPtr &type,
203 ComponentIsGeneric allowComponent = ComponentIsGeneric::No)
const;
205 QQmlJSScope::ConstPtr storedType(
const QQmlJSScope::ConstPtr &type)
const;
207 QQmlJSRegisterContent original(QQmlJSRegisterContent type)
const;
208 QQmlJSScope::ConstPtr originalContainedType(QQmlJSRegisterContent container)
const;
210 QQmlJSRegisterContent shadowed(QQmlJSRegisterContent type)
const;
212 QQmlJSScope::ConstPtr merge(
213 const QQmlJSScope::ConstPtr &a,
const QQmlJSScope::ConstPtr &b)
const;
215 QQmlJSRegisterContent extractNonVoidFromOptionalType(
216 QQmlJSRegisterContent content)
const;
218 QQmlJSMetaMethod selectConstructor(
219 const QQmlJSScope::ConstPtr &type,
const QQmlJSScope::ConstPtr &argument,
220 bool *isExtension)
const;
225 QQmlJSRegisterContent typeForBinaryOperation(
226 QSOperator::Op oper, QQmlJSRegisterContent left,
227 QQmlJSRegisterContent right)
const;
229 enum class UnaryOperator { Not, Plus, Minus, Increment, Decrement, Complement };
230 QQmlJSRegisterContent typeForArithmeticUnaryOperation(
231 UnaryOperator op, QQmlJSRegisterContent operand)
const;
233 QQmlJSRegisterContent merge(
234 QQmlJSRegisterContent a, QQmlJSRegisterContent b)
const;
236 void clearMergeCache()
const { m_mergeCache.clear(); }
238 QQmlJSRegisterContent literalType(
const QQmlJSScope::ConstPtr &type)
const;
239 QQmlJSRegisterContent operationType(
const QQmlJSScope::ConstPtr &type)
const;
240 QQmlJSRegisterContent namedType(
const QQmlJSScope::ConstPtr &type)
const;
241 QQmlJSRegisterContent syntheticType(
const QQmlJSScope::ConstPtr &type)
const;
243 QQmlJSRegisterContent scopedType(
244 QQmlJSRegisterContent scope,
const QString &name,
245 int lookupIndex = QQmlJSRegisterContent::InvalidLookupIndex,
246 QQmlJSScopesByIdOptions options = QQmlJSScopesByIdOption::Default)
const;
248 QQmlJSRegisterContent memberType(
249 QQmlJSRegisterContent type,
const QString &name,
250 int lookupIndex = QQmlJSRegisterContent::InvalidLookupIndex)
const;
252 QQmlJSRegisterContent elementType(QQmlJSRegisterContent list)
const;
254 QQmlJSRegisterContent returnType(
255 const QQmlJSMetaMethod &method,
const QQmlJSScope::ConstPtr &returnType,
256 QQmlJSRegisterContent scope)
const;
258 QQmlJSRegisterContent extensionType(
259 const QQmlJSScope::ConstPtr &extension, QQmlJSRegisterContent base)
const;
261 QQmlJSRegisterContent baseType(
262 const QQmlJSScope::ConstPtr &base, QQmlJSRegisterContent derived)
const;
264 QQmlJSRegisterContent parentScope(
265 const QQmlJSScope::ConstPtr &parent, QQmlJSRegisterContent child)
const;
267 QQmlJSRegisterContent iteratorPointer(
268 QQmlJSRegisterContent listType, QQmlJS::AST::ForEachType type,
269 int lookupIndex)
const;
271 QQmlJSRegisterContent convert(
272 QQmlJSRegisterContent from, QQmlJSRegisterContent to)
const;
273 QQmlJSRegisterContent convert(
274 QQmlJSRegisterContent from,
const QQmlJSScope::ConstPtr &to)
const;
279 [[nodiscard]]
bool adjustTrackedType(
280 QQmlJSRegisterContent tracked,
const QQmlJSScope::ConstPtr &conversion)
const;
281 [[nodiscard]]
bool adjustTrackedType(
282 QQmlJSRegisterContent tracked, QQmlJSRegisterContent conversion)
const;
283 [[nodiscard]]
bool adjustTrackedType(
284 QQmlJSRegisterContent tracked,
285 const QList<QQmlJSRegisterContent> &conversions)
const;
286 void adjustOriginalType(
287 QQmlJSRegisterContent tracked,
const QQmlJSScope::ConstPtr &conversion)
const;
288 void generalizeType(QQmlJSRegisterContent type)
const;
293 QQmlJSRegisterContent memberType(QQmlJSRegisterContent type,
const QString &name,
294 int baseLookupIndex,
int resultLookupIndex)
const;
295 QQmlJSRegisterContent memberEnumType(QQmlJSRegisterContent type,
296 const QString &name)
const;
297 bool checkEnums(QQmlJSRegisterContent scope,
const QString &name,
298 QQmlJSRegisterContent *result)
const;
299 bool canPrimitivelyConvertFromTo(
300 const QQmlJSScope::ConstPtr &from,
const QQmlJSScope::ConstPtr &to)
const;
301 QQmlJSRegisterContent lengthProperty(
bool isWritable, QQmlJSRegisterContent scope)
const;
303 QQmlJSScope::ConstPtr containedTypeForName(
const QString &name)
const;
304 QQmlJSRegisterContent registerContentForName(
305 const QString &name, QQmlJSRegisterContent scopeType = {})
const;
307 QQmlJSScope::ConstPtr resolveParentProperty(
308 const QString &name,
const QQmlJSScope::ConstPtr &base,
309 const QQmlJSScope::ConstPtr &propType)
const;
311 std::unique_ptr<QQmlJSRegisterContentPool> m_pool;
316 using RegisterPair = std::pair<QQmlJSRegisterContent, QQmlJSRegisterContent>;
317 using RegisterMergeCache = QHash<RegisterPair, QQmlJSRegisterContent>;
318 mutable RegisterMergeCache m_mergeCache;
320 QQmlJSScope::ConstPtr m_voidType;
321 QQmlJSScope::ConstPtr m_emptyType;
322 QQmlJSScope::ConstPtr m_nullType;
323 QQmlJSScope::ConstPtr m_numberPrototype;
324 QQmlJSScope::ConstPtr m_arrayPrototype;
325 QQmlJSScope::ConstPtr m_realType;
326 QQmlJSScope::ConstPtr m_floatType;
327 QQmlJSScope::ConstPtr m_int8Type;
328 QQmlJSScope::ConstPtr m_uint8Type;
329 QQmlJSScope::ConstPtr m_int16Type;
330 QQmlJSScope::ConstPtr m_uint16Type;
331 QQmlJSScope::ConstPtr m_int32Type;
332 QQmlJSScope::ConstPtr m_uint32Type;
333 QQmlJSScope::ConstPtr m_int64Type;
334 QQmlJSScope::ConstPtr m_uint64Type;
335 QQmlJSScope::ConstPtr m_sizeType;
336 QQmlJSScope::ConstPtr m_boolType;
337 QQmlJSScope::ConstPtr m_stringType;
338 QQmlJSScope::ConstPtr m_stringListType;
339 QQmlJSScope::ConstPtr m_byteArrayType;
340 QQmlJSScope::ConstPtr m_urlType;
341 QQmlJSScope::ConstPtr m_dateTimeType;
342 QQmlJSScope::ConstPtr m_dateType;
343 QQmlJSScope::ConstPtr m_timeType;
344 QQmlJSScope::ConstPtr m_regexpType;
345 QQmlJSScope::ConstPtr m_variantListType;
346 QQmlJSScope::ConstPtr m_variantMapType;
347 QQmlJSScope::ConstPtr m_varType;
348 QQmlJSScope::ConstPtr m_qmlPropertyMapType;
349 QQmlJSScope::ConstPtr m_jsValueType;
350 QQmlJSScope::ConstPtr m_jsPrimitiveType;
351 QQmlJSScope::ConstPtr m_listPropertyType;
352 QQmlJSScope::ConstPtr m_qObjectType;
353 QQmlJSScope::ConstPtr m_qObjectListType;
354 QQmlJSScope::ConstPtr m_qQmlScriptStringType;
355 QQmlJSScope::ConstPtr m_metaObjectType;
356 QQmlJSScope::ConstPtr m_functionType;
357 QQmlJSScope::ConstPtr m_jsGlobalObject;
358 QQmlJSScope::ConstPtr m_forInIteratorPtr;
359 QQmlJSScope::ConstPtr m_forOfIteratorPtr;
361 QQmlJSRegisterContent m_jsGlobalObjectContent;
363 QQmlJSScopesById m_objectsById;
364 QHash<QV4::CompiledData::Location, QQmlJSScope::ConstPtr> m_objectsByLocation;
365 QQmlJSImporter::ImportedTypes m_imports;
366 QHash<QQmlJS::SourceLocation, QQmlJSMetaSignalHandler> m_signalHandlers;
367 QStringList m_seenModuleQualifiers;
369 ParentMode m_parentMode = UseParentProperty;
370 CloneMode m_cloneMode = CloneTypes;
371 QQmlJSLogger *m_logger =
nullptr;
372 QQmlJSImporter *m_importer =
nullptr;