aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljstyperesolver_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/qqmljstyperesolver_p.h')
-rw-r--r--src/qmlcompiler/qqmljstyperesolver_p.h131
1 files changed, 110 insertions, 21 deletions
diff --git a/src/qmlcompiler/qqmljstyperesolver_p.h b/src/qmlcompiler/qqmljstyperesolver_p.h
index 6c3583ca73..9961c24842 100644
--- a/src/qmlcompiler/qqmljstyperesolver_p.h
+++ b/src/qmlcompiler/qqmljstyperesolver_p.h
@@ -14,20 +14,22 @@
//
// We mean it.
-#include <private/qtqmlcompilerexports_p.h>
+#include <memory>
+#include <qtqmlcompilerexports.h>
#include <private/qqmlirbuilder_p.h>
#include <private/qqmljsast_p.h>
#include "qqmljsimporter_p.h"
#include "qqmljslogger_p.h"
#include "qqmljsregistercontent_p.h"
+#include "qqmljsresourcefilemapper_p.h"
#include "qqmljsscope_p.h"
#include "qqmljsscopesbyid_p.h"
QT_BEGIN_NAMESPACE
class QQmlJSImportVisitor;
-class Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSTypeResolver
+class Q_QMLCOMPILER_EXPORT QQmlJSTypeResolver
{
public:
enum ParentMode { UseDocumentParent, UseParentProperty };
@@ -41,12 +43,18 @@ public:
QQmlJSScope::ConstPtr voidType() const { return m_voidType; }
QQmlJSScope::ConstPtr emptyType() const { return m_emptyType; }
- QQmlJSScope::ConstPtr emptyListType() const { return m_emptyListType; }
QQmlJSScope::ConstPtr nullType() const { return m_nullType; }
QQmlJSScope::ConstPtr realType() const { return m_realType; }
QQmlJSScope::ConstPtr floatType() const { return m_floatType; }
- QQmlJSScope::ConstPtr intType() const { return m_intType; }
- QQmlJSScope::ConstPtr uintType() const { return m_uintType; }
+ QQmlJSScope::ConstPtr int8Type() const { return m_int8Type; }
+ QQmlJSScope::ConstPtr uint8Type() const { return m_uint8Type; }
+ QQmlJSScope::ConstPtr int16Type() const { return m_int16Type; }
+ QQmlJSScope::ConstPtr uint16Type() const { return m_uint16Type; }
+ QQmlJSScope::ConstPtr int32Type() const { return m_int32Type; }
+ QQmlJSScope::ConstPtr uint32Type() const { return m_uint32Type; }
+ QQmlJSScope::ConstPtr int64Type() const { return m_int64Type; }
+ QQmlJSScope::ConstPtr uint64Type() const { return m_uint64Type; }
+ QQmlJSScope::ConstPtr sizeType() const { return m_sizeType; }
QQmlJSScope::ConstPtr boolType() const { return m_boolType; }
QQmlJSScope::ConstPtr stringType() const { return m_stringType; }
QQmlJSScope::ConstPtr stringListType() const { return m_stringListType; }
@@ -56,6 +64,7 @@ public:
QQmlJSScope::ConstPtr dateType() const { return m_dateType; }
QQmlJSScope::ConstPtr timeType() const { return m_timeType; }
QQmlJSScope::ConstPtr variantListType() const { return m_variantListType; }
+ QQmlJSScope::ConstPtr variantMapType() const { return m_variantMapType; }
QQmlJSScope::ConstPtr varType() const { return m_varType; }
QQmlJSScope::ConstPtr jsValueType() const { return m_jsValueType; }
QQmlJSScope::ConstPtr jsPrimitiveType() const { return m_jsPrimitiveType; }
@@ -63,21 +72,35 @@ public:
QQmlJSScope::ConstPtr metaObjectType() const { return m_metaObjectType; }
QQmlJSScope::ConstPtr functionType() const { return m_functionType; }
QQmlJSScope::ConstPtr jsGlobalObject() const { return m_jsGlobalObject; }
+ QQmlJSScope::ConstPtr qObjectType() const { return m_qObjectType; }
QQmlJSScope::ConstPtr qObjectListType() const { return m_qObjectListType; }
+ QQmlJSScope::ConstPtr arrayPrototype() const { return m_arrayPrototype; }
+ QQmlJSScope::ConstPtr forInIteratorPtr() const { return m_forInIteratorPtr; }
+ QQmlJSScope::ConstPtr forOfIteratorPtr() const { return m_forOfIteratorPtr; }
+
+ QQmlJSScope::ConstPtr mathObject() const;
+ QQmlJSScope::ConstPtr consoleObject() const;
QQmlJSScope::ConstPtr scopeForLocation(const QV4::CompiledData::Location &location) const;
- QQmlJSScope::ConstPtr scopeForId(
- const QString &id, const QQmlJSScope::ConstPtr &referrer) const;
bool isPrefix(const QString &name) const
{
return m_imports.hasType(name) && !m_imports.type(name).scope;
}
+ const QHash<QString, QQmlJS::ImportedScope<QQmlJSScope::ConstPtr>> &importedTypes() const
+ {
+ return m_imports.types();
+ }
QQmlJSScope::ConstPtr typeForName(const QString &name) const
{
return m_imports.type(name).scope;
}
+ QString nameForType(const QQmlJSScope::ConstPtr &type) const
+ {
+ return m_imports.name(originalType(type));
+ }
+
QQmlJSScope::ConstPtr typeFromAST(QQmlJS::AST::Type *type) const;
QQmlJSScope::ConstPtr typeForConst(QV4::ReturnedValue rv) const;
QQmlJSRegisterContent typeForBinaryOperation(QSOperator::Op oper,
@@ -89,6 +112,8 @@ public:
UnaryOperator op, const QQmlJSRegisterContent &operand) const;
bool isPrimitive(const QQmlJSRegisterContent &type) const;
+ bool isPrimitive(const QQmlJSScope::ConstPtr &type) const;
+
bool isNumeric(const QQmlJSRegisterContent &type) const;
bool isIntegral(const QQmlJSRegisterContent &type) const;
@@ -104,13 +129,21 @@ public:
QQmlJSRegisterContent builtinType(const QQmlJSScope::ConstPtr &type) const;
QQmlJSRegisterContent globalType(const QQmlJSScope::ConstPtr &type) const;
- QQmlJSRegisterContent scopedType(const QQmlJSScope::ConstPtr &scope, const QString &name) const;
- QQmlJSRegisterContent memberType(const QQmlJSRegisterContent &type, const QString &name) const;
+ QQmlJSRegisterContent scopedType(const QQmlJSScope::ConstPtr &scope, const QString &name,
+ int lookupIndex = QQmlJSRegisterContent::InvalidLookupIndex,
+ QQmlJSScopesByIdOptions options = Default) const;
+ QQmlJSRegisterContent memberType(
+ const QQmlJSRegisterContent &type, const QString &name,
+ int lookupIndex = QQmlJSRegisterContent::InvalidLookupIndex) const;
QQmlJSRegisterContent valueType(const QQmlJSRegisterContent &list) const;
QQmlJSRegisterContent returnType(
const QQmlJSScope::ConstPtr &type, QQmlJSRegisterContent::ContentVariant variant,
const QQmlJSScope::ConstPtr &scope) const;
+ QQmlJSRegisterContent iteratorPointer(
+ const QQmlJSRegisterContent &listType, QQmlJS::AST::ForEachType type,
+ int lookupIndex) const;
+
bool registerIsStoredIn(const QQmlJSRegisterContent &reg,
const QQmlJSScope::ConstPtr &type) const;
bool registerContains(const QQmlJSRegisterContent &reg,
@@ -125,10 +158,13 @@ public:
QQmlJSScope::ConstPtr trackedContainedType(const QQmlJSRegisterContent &container) const;
QQmlJSScope::ConstPtr originalContainedType(const QQmlJSRegisterContent &container) const;
- void adjustTrackedType(const QQmlJSScope::ConstPtr &tracked,
- const QQmlJSScope::ConstPtr &conversion) const;
- void adjustTrackedType(const QQmlJSScope::ConstPtr &tracked,
- const QList<QQmlJSScope::ConstPtr> &conversions) const;
+ [[nodiscard]] bool adjustTrackedType(
+ const QQmlJSScope::ConstPtr &tracked, const QQmlJSScope::ConstPtr &conversion) const;
+ [[nodiscard]] bool adjustTrackedType(
+ const QQmlJSScope::ConstPtr &tracked,
+ const QList<QQmlJSScope::ConstPtr> &conversions) const;
+ void adjustOriginalType(
+ const QQmlJSScope::ConstPtr &tracked, const QQmlJSScope::ConstPtr &conversion) const;
void generalizeType(const QQmlJSScope::ConstPtr &type) const;
void setParentMode(ParentMode mode) { m_parentMode = mode; }
@@ -144,7 +180,7 @@ public:
const QQmlJSScopesById &objectsById() const { return m_objectsById; }
bool canCallJSFunctions() const { return m_objectsById.signaturesAreEnforced(); }
- bool canUseValueTypes() const { return m_objectsById.valueTypesAreCopied(); }
+ bool canAddressValueTypes() const { return m_objectsById.valueTypesAreAddressable(); }
const QHash<QQmlJS::SourceLocation, QQmlJSMetaSignalHandler> &signalHandlers() const
{
@@ -155,19 +191,47 @@ public:
QQmlJSRegisterContent convert(
const QQmlJSRegisterContent &from, const QQmlJSRegisterContent &to) const;
+ QQmlJSRegisterContent cast(
+ const QQmlJSRegisterContent &from, const QQmlJSScope::ConstPtr &to) const;
QQmlJSScope::ConstPtr merge(const QQmlJSScope::ConstPtr &a,
const QQmlJSScope::ConstPtr &b) const;
bool canHoldUndefined(const QQmlJSRegisterContent &content) const;
+ bool isOptionalType(const QQmlJSRegisterContent &content) const;
+ QQmlJSScope::ConstPtr extractNonVoidFromOptionalType(
+ const QQmlJSRegisterContent &content) const;
+
bool isNumeric(const QQmlJSScope::ConstPtr &type) const;
+ bool isIntegral(const QQmlJSScope::ConstPtr &type) const;
+ bool isSignedInteger(const QQmlJSScope::ConstPtr &type) const;
+ bool isUnsignedInteger(const QQmlJSScope::ConstPtr &type) const;
+ bool isNativeArrayIndex(const QQmlJSScope::ConstPtr &type) const;
+
+ bool canHold(const QQmlJSScope::ConstPtr &container,
+ const QQmlJSScope::ConstPtr &contained) const;
+
+ bool canPopulate(
+ const QQmlJSScope::ConstPtr &type, const QQmlJSScope::ConstPtr &argument,
+ bool *isExtension) const;
+
+ QQmlJSMetaMethod selectConstructor(
+ const QQmlJSScope::ConstPtr &type, const QQmlJSScope::ConstPtr &argument,
+ bool *isExtension) const;
+
+ bool areEquivalentLists(const QQmlJSScope::ConstPtr &a, const QQmlJSScope::ConstPtr &b) const;
+
+ bool isTriviallyCopyable(const QQmlJSScope::ConstPtr &type) const;
+
+ bool inherits(const QQmlJSScope::ConstPtr &derived, const QQmlJSScope::ConstPtr &base) const;
protected:
- QQmlJSRegisterContent memberType(const QQmlJSScope::ConstPtr &type, const QString &name) const;
+ QQmlJSRegisterContent memberType(
+ const QQmlJSScope::ConstPtr &type, const QString &name,
+ int baseLookupIndex, int resultLookupIndex) const;
QQmlJSRegisterContent memberEnumType(const QQmlJSScope::ConstPtr &type,
const QString &name) const;
- bool isPrimitive(const QQmlJSScope::ConstPtr &type) const;
bool checkEnums(const QQmlJSScope::ConstPtr &scope, const QString &name,
QQmlJSRegisterContent *result, QQmlJSScope::ExtensionKind mode) const;
bool canPrimitivelyConvertFromTo(
@@ -177,21 +241,28 @@ protected:
const QQmlJSRegisterContent &origin,
QQmlJSScope::ConstPtr (QQmlJSTypeResolver::*op)(const QQmlJSScope::ConstPtr &) const) const;
- QQmlJSRegisterContent referenceTypeForName(
+ QQmlJSRegisterContent registerContentForName(
const QString &name,
const QQmlJSScope::ConstPtr &scopeType = QQmlJSScope::ConstPtr(),
bool hasObjectModuelPrefix = false) const;
+
QQmlJSScope::ConstPtr m_voidType;
- QQmlJSScope::ConstPtr m_emptyListType;
QQmlJSScope::ConstPtr m_emptyType;
QQmlJSScope::ConstPtr m_nullType;
QQmlJSScope::ConstPtr m_numberPrototype;
- QQmlJSScope::ConstPtr m_arrayType;
+ QQmlJSScope::ConstPtr m_arrayPrototype;
QQmlJSScope::ConstPtr m_realType;
QQmlJSScope::ConstPtr m_floatType;
- QQmlJSScope::ConstPtr m_intType;
- QQmlJSScope::ConstPtr m_uintType;
+ QQmlJSScope::ConstPtr m_int8Type;
+ QQmlJSScope::ConstPtr m_uint8Type;
+ QQmlJSScope::ConstPtr m_int16Type;
+ QQmlJSScope::ConstPtr m_uint16Type;
+ QQmlJSScope::ConstPtr m_int32Type;
+ QQmlJSScope::ConstPtr m_uint32Type;
+ QQmlJSScope::ConstPtr m_int64Type;
+ QQmlJSScope::ConstPtr m_uint64Type;
+ QQmlJSScope::ConstPtr m_sizeType;
QQmlJSScope::ConstPtr m_boolType;
QQmlJSScope::ConstPtr m_stringType;
QQmlJSScope::ConstPtr m_stringListType;
@@ -201,14 +272,19 @@ protected:
QQmlJSScope::ConstPtr m_dateType;
QQmlJSScope::ConstPtr m_timeType;
QQmlJSScope::ConstPtr m_variantListType;
+ QQmlJSScope::ConstPtr m_variantMapType;
QQmlJSScope::ConstPtr m_varType;
QQmlJSScope::ConstPtr m_jsValueType;
QQmlJSScope::ConstPtr m_jsPrimitiveType;
QQmlJSScope::ConstPtr m_listPropertyType;
+ QQmlJSScope::ConstPtr m_qObjectType;
QQmlJSScope::ConstPtr m_qObjectListType;
+ QQmlJSScope::ConstPtr m_qQmlScriptStringType;
QQmlJSScope::ConstPtr m_metaObjectType;
QQmlJSScope::ConstPtr m_functionType;
QQmlJSScope::ConstPtr m_jsGlobalObject;
+ QQmlJSScope::ConstPtr m_forInIteratorPtr;
+ QQmlJSScope::ConstPtr m_forOfIteratorPtr;
QQmlJSScopesById m_objectsById;
QHash<QV4::CompiledData::Location, QQmlJSScope::ConstPtr> m_objectsByLocation;
@@ -235,6 +311,19 @@ protected:
std::unique_ptr<QHash<QQmlJSScope::ConstPtr, TrackedType>> m_trackedTypes;
};
+/*!
+\internal
+
+QQmlJSTypeResolver expects to be outlived by its importer and mapper. It crashes when its importer
+or mapper gets destructed. Therefore, you can use this struct to extend the lifetime of its
+dependencies in case you need to store the resolver as a class member.
+*/
+struct QQmlJSTypeResolverDependencies
+{
+ std::shared_ptr<QQmlJSImporter> importer;
+ std::shared_ptr<QQmlJSResourceFileMapper> mapper;
+};
+
QT_END_NAMESPACE
#endif // QQMLJSTYPERESOLVER_P_H