4#include <private/qqmlcomponentandaliasresolver_p.h>
5#include <private/qqmlengine_p.h>
6#include <private/qqmlirbuilder_p.h>
7#include <private/qqmlirloader_p.h>
8#include <private/qqmlpropertycachecreator_p.h>
9#include <private/qqmlpropertyvalidator_p.h>
10#include <private/qqmlscriptblob_p.h>
11#include <private/qqmlscriptdata_p.h>
12#include <private/qqmltypecompiler_p.h>
13#include <private/qqmltypedata_p.h>
14#include <private/qqmltypeloaderqmldircontent_p.h>
16#include <QtCore/qloggingcategory.h>
17#include <QtCore/qcryptographichash.h>
33 if (!prefix.isEmpty()) {
42 m_typesResolved(
false), m_implicitImportLoaded(
false)
50 m_compositeSingletons.clear();
51 m_resolvedTypes.clear();
56 return m_compiledData.
data();
61 Q_ASSERT(!m_callbacks.contains(callback));
62 m_callbacks.append(callback);
67 Q_ASSERT(m_callbacks.contains(callback));
68 m_callbacks.removeOne(callback);
69 Q_ASSERT(!m_callbacks.contains(callback));
74 if (inlineComponentName.
isEmpty())
76 return m_inlineComponentData[inlineComponentName].qmlType;
79bool QQmlTypeData::tryLoadFromDiskCache()
84 auto unit = QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>();
98 m_compiledData = std::move(unit);
100 QVector<QV4::CompiledData::InlineComponent> ics;
102 auto object = m_compiledData->
objectAt(
i);
104 const auto inlineComponentTable =
object->inlineComponentTable();
105 for (
auto i = 0;
i !=
object->nInlineComponents; ++
i) {
106 ics.push_back(inlineComponentTable[
i]);
118 if (!loadImplicitImport())
125 &&
import->qualifierIndex == 0
126 && !
import->version.hasMajorVersion()
127 && !
import->version.hasMinorVersion()) {
129 auto pendingImport = std::make_shared<PendingImport>(
149 error.setLine(qmlConvertSourceCoordinate<quint32, int>(import->location.line()));
150 error.setColumn(qmlConvertSourceCoordinate<quint32, int>(import->location.column()));
157 for (
auto&& ic: ics) {
160 importUrl.setFragment(nameString);
161 auto import = new QQmlImportInstance();
191 const CompiledObject &
component, CompiledBinding *binding)
195 const int candidateIndex =
component.namedObjectsInComponentTable()[
i];
196 if (m_compiler->objectAt(candidateIndex)->idNameIndex == binding->propertyNameIndex) {
197 m_propertyCaches->set(binding->value.objectIndex, m_propertyCaches->at(candidateIndex));
204typename QQmlComponentAndAliasResolver<QV4::CompiledData::CompilationUnit>::AliasResolutionResult
208 const CompiledObject *
obj = m_compiler->objectAt(objectIndex);
209 for (
auto alias =
obj->aliasesBegin(),
end =
obj->aliasesEnd(); alias !=
end; ++alias) {
212 return NoAliasResolved;
215 if (alias->isAliasToLocalAlias() || alias->encodedMetaPropertyIndex == -1)
218 const int targetObjectIndex
226 if (!targetCache->property(coreIndex))
227 return SomeAliasesResolved;
230 return AllAliasesResolved;
242QQmlError QQmlTypeData::createTypeAndPropertyCaches(
243 const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache,
256 QQmlPropertyCacheCreator<QV4::CompiledData::CompilationUnit> propertyCacheCreator(
266 result = propertyCacheCreator.buildMetaObjectsIncrementally();
267 if (
result.error.isValid()) {
278 pendingGroupPropertyBindings.
clear();
281 }
while (
result.canResume);
289 const QList<QQmlTypeData::TypeReference> &typeRefs,
292 for (
const auto &typeRef: typeRefs) {
293 if (typeRef.typeData) {
294 const auto unit = typeRef.typeData->compilationUnit()->unitData();
295 hash->addData({unit->md5Checksum,
sizeof(unit->md5Checksum)});
296 }
else if (
const QMetaObject *
mo = typeRef.type.metaObject()) {
299 hash->addData(propertyCache->checksum(checksums, &
ok));
311template<
typename ObjectContainer>
313 const ObjectContainer &container, QHash<QString, InlineComponentData> *icData,
315 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &
compilationUnit) {
317 for (
int i = 0;
i != container->objectCount(); ++
i) {
318 auto root = container->objectAt(
i);
319 for (
auto it = root->inlineComponentsBegin();
it != root->inlineComponentsEnd(); ++
it) {
322 InlineComponentData icDatum(
325 int(
it->objectIndex),
int(
it->nameIndex), 0, 0, 0);
327 icData->insert(container->stringAt(
it->nameIndex), icDatum);
333template<
typename Container>
334void QQmlTypeData::setCompileUnit(
const Container &container)
336 for (
int i = 0;
i != container->objectCount(); ++
i) {
337 auto const root = container->objectAt(
i);
338 for (
auto it = root->inlineComponentsBegin();
it != root->inlineComponentsEnd(); ++
it) {
347 typeRef->setCompilationUnit(m_compiledData);
357 m_typeReferences.
clear();
359 const auto encounteredErrors =
errors();
360 for (
const QQmlError &e : encounteredErrors)
361 qCDebug(DBG_DISK_CACHE) << e.toString();
362 m_compiledData.
reset();
370 for (
int ii = 0; ii < m_scripts.size(); ++ii) {
388 QList<QQmlError>
errors =
type.typeData ?
type.typeData->errors() : QList<QQmlError>{};
391 error.setLine(qmlConvertSourceCoordinate<quint32, int>(
type.location.line()));
392 error.setColumn(qmlConvertSourceCoordinate<quint32, int>(
type.location.column()));
397 for (
auto it = std::as_const(m_resolvedTypes).
begin(),
end = std::as_const(m_resolvedTypes).
end();
it !=
end;
400 Q_ASSERT(!
type.typeData ||
type.typeData->isCompleteOrError() ||
type.type.isInlineComponentType());
402 if (
type.type.isInlineComponentType()) {
407 int lastDot =
typeName.lastIndexOf(u
'.');
410 QQmlTypeLoader::tr(
"Type %1 has no inline component type called %2")
415 if (
type.typeData &&
type.typeData->isError()) {
417 createError(
type, QQmlTypeLoader::tr(
"Type %1 unavailable").
arg(
typeName));
423 for (
int ii = 0; ii < m_compositeSingletons.size(); ++ii) {
426 if (
type.typeData &&
type.typeData->isError()) {
429 createError(
type, QQmlTypeLoader::tr(
"Type %1 unavailable").
arg(
typeName));
435 const bool isSingleton = m_document
439 finalUrl(), m_compiledData, isSingleton
446 setupICs(m_document, &m_inlineComponentData,
finalUrl(), m_compiledData);
448 setupICs(m_compiledData, &m_inlineComponentData,
finalUrl(), m_compiledData);
451 QQmlRefPointer<QQmlTypeNameCache> typeNameCache;
453 QQmlError error = buildTypeResolutionCaches(&typeNameCache, &resolvedTypeCache);
454 if (
error.isValid()) {
461 const auto dependencyHasher = [&resolvedTypeCache,
this]() {
463 return (resolvedTypeCache.addToHash(&
hash,
typeLoader()->checksumCache())
471 if (m_document.
isNull()) {
472 const QQmlError error = createTypeAndPropertyCaches(typeNameCache, resolvedTypeCache);
474 setCompileUnit(m_compiledData);
477 if (
error.isValid()) {
479 <<
"Failed to create property caches for"
481 <<
"because" <<
error.description();
484 <<
"Checksum mismatch for cached version of"
488 if (!loadFromSource())
500 if (!
ref->type().isInlineComponentType())
506 ref->setCompilationUnit(QQmlRefPointer<QV4::CompiledData::CompilationUnit>());
509 m_compiledData.
reset();
513 if (!m_document.
isNull()) {
515 compile(typeNameCache, &resolvedTypeCache, dependencyHasher);
519 setCompileUnit(m_document);
541 if (!
type.isValid()) {
543 error.setDescription(QQmlTypeLoader::tr(
"No matching type found, pragma Singleton files cannot be used by QQmlComponent."));
546 }
else if (!
type.isCompositeSingleton()) {
548 error.setDescription(QQmlTypeLoader::tr(
"pragma Singleton used with a non composite singleton type %1").
arg(
type.qmlTypeName()));
555 if (
type.isValid() &&
type.isCompositeSingleton()) {
557 setError(QQmlTypeLoader::tr(
"qmldir defines type as singleton, but no pragma Singleton found in type %1.").
arg(
typeName));
566 for (
int scriptIndex = 0; scriptIndex < m_scripts.size(); ++scriptIndex) {
573 if (lastDotIndex != -1) {
574 enclosingNamespace = qualifier.
left(lastDotIndex).toString();
575 qualifier = qualifier.
mid(lastDotIndex+1);
579 qualifier.toString(), scriptIndex, enclosingNamespace);
589 while (!m_callbacks.isEmpty()) {
595bool QQmlTypeData::loadImplicitImport()
597 m_implicitImportLoaded =
true;
604 QList<QQmlError> implicitImportErrors;
612 if (!localQmldir.isEmpty()) {
614 const QList<QQmlDirParser::Import> moduleImports
619 &implicitImportErrors);
622 if (!implicitImportErrors.isEmpty()) {
632 m_backupSourceCode =
data;
634 if (tryLoadFromDiskCache())
640 if (!m_backupSourceCode.
exists() || m_backupSourceCode.
isEmpty()) {
642 setError(QQmlTypeLoader::tr(
"File was compiled ahead of time with an incompatible version of Qt and the original file cannot be found. Please recompile"));
643 else if (!m_backupSourceCode.
exists())
644 setError(QQmlTypeLoader::tr(
"No such file or directory"));
646 setError(QQmlTypeLoader::tr(
"File is empty"));
650 if (!loadFromSource())
653 continueLoadFromIR();
664 = QQmlRefPointer<QV4::CompiledData::CompilationUnit>(
667 continueLoadFromIR();
670bool QQmlTypeData::loadFromSource()
690 e.
setLine(qmlConvertSourceCoordinate<quint32, int>(msg.loc.startLine));
691 e.
setColumn(qmlConvertSourceCoordinate<quint32, int>(msg.loc.startColumn));
701void QQmlTypeData::restoreIR(
const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &unit)
709 continueLoadFromIR();
712void QQmlTypeData::continueLoadFromIR()
714 for (
auto const&
object: m_document->objects) {
715 for (
auto it =
object->inlineComponentsBegin();
it !=
object->inlineComponentsEnd(); ++
it) {
718 importUrl.setFragment(nameString);
719 auto import = new QQmlImportInstance();
730 if (!
finalUrl().scheme().isEmpty()) {
733 if (!loadImplicitImport())
736 auto implicitImport = std::make_shared<PendingImport>();
759 error.setLine(qmlConvertSourceCoordinate<quint32, int>(import->location.line()));
760 error.setColumn(qmlConvertSourceCoordinate<quint32, int>(import->location.column()));
771 if (!m_typesResolved) {
776 if ((*it)->priority == 0) {
780 keyIt != keyEnd; ++keyIt) {
783 error.setDescription(QQmlTypeLoader::tr(
"module \"%1\" is not installed").arg(import->uri));
785 error.setLine(qmlConvertSourceCoordinate<quint32, int>(
786 import->location.line()));
787 error.setColumn(qmlConvertSourceCoordinate<quint32, int>(
788 import->location.column()));
799 m_typesResolved =
true;
805 for (
int ii = 0; ii < m_callbacks.size(); ++ii) {
818void QQmlTypeData::compile(
const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache,
824 const bool typeRecompilation = m_document
832 enginePrivate,
this, m_document.
data(), resolvedTypeCache, dependencyHasher);
836 resolvedTypeCache->clear();
837 setError(compiler.compilationErrors());
841 const bool trySaveToDisk =
writeCacheFile() && !typeRecompilation;
850 qCDebug(DBG_DISK_CACHE) <<
"Error saving cached version of"
858 m_compiledData->
propertyCaches = std::move(*compiler.propertyCaches());
860 ==
static_cast<int>(m_compiledData->
objectCount()));
863void QQmlTypeData::resolveTypes()
866 if (!m_implicitImportLoaded && !loadImplicitImport())
877 if (!script.qualifier.isEmpty())
879 ref.qualifier = script.qualifier +
QLatin1Char(
'.') + script.nameSpace;
881 m_namespaces.
insert(script.qualifier);
883 ref.qualifier = script.nameSpace;
895 if (!csRef.prefix.isEmpty()) {
898 m_namespaces.
insert(csRef.prefix);
907 if (
ref.type.isCompositeSingleton()) {
910 qCDebug(lcCycle) <<
"Possible cyclic dependency detected between"
915 ref.prefix = csRef.prefix;
917 m_compositeSingletons <<
ref;
922 unresolvedRef !=
end; ++unresolvedRef) {
926 const bool reportErrors = unresolvedRef->errorWhenNotFound;
932 bool *selfReferenceDetection = unresolvedRef->needsCreation ?
nullptr : &
ref.selfReference;
934 if (!resolveType(
name, version,
ref, unresolvedRef->location.line(),
935 unresolvedRef->location.column(), reportErrors,
939 if (
ref.type.isComposite() && !
ref.selfReference) {
943 if (
ref.type.isInlineComponentType()) {
944 QUrl containingTypeUrl =
ref.type.sourceUrl();
946 if (!containingTypeUrl.isEmpty()) {
948 if (typeData.data() !=
this) {
949 ref.typeData = typeData;
955 ref.version = version;
956 ref.location = unresolvedRef->location;
957 ref.needsCreation = unresolvedRef->needsCreation;
958 m_resolvedTypes.insert(unresolvedRef.key(),
ref);
962 if (!m_implicitImportLoaded)
963 loadImplicitImport();
966QQmlError QQmlTypeData::buildTypeResolutionCaches(
967 QQmlRefPointer<QQmlTypeNameCache> *typeNameCache,
973 (*typeNameCache)->
add(
ns);
981 for (
auto resolvedType = m_resolvedTypes.constBegin(),
end = m_resolvedTypes.constEnd(); resolvedType !=
end; ++resolvedType) {
982 auto ref = std::make_unique<QV4::ResolvedTypeReference>();
984 if (resolvedType->typeData) {
988 ref->setCompilationUnit(resolvedType->typeData->compilationUnit());
989 if (resolvedType->type.isInlineComponentType()) {
994 const auto compilationUnit = resolvedType->typeData->compilationUnit();
1000 }
else if (resolvedType->type.isInlineComponentType()) {
1012 ref->setCompilationUnit(std::move(unit));
1023 reason =
tr(
"Element is not creatable.");
1030 ref->setTypePropertyCache(
1034 ref->setVersion(resolvedType->version);
1035 ref->doDynamicTypeCheck();
1036 resolvedTypeCache->insert(resolvedType.key(),
ref.release());
1043 TypeReference &
ref,
int lineNumber,
int columnNumber,
1045 bool *typeRecursionDetected)
1052 typeRecursionDetected);
1053 if (!typeNamespace && !typeFound && !m_implicitImportLoaded) {
1055 if (loadImplicitImport()) {
1060 registrationType, typeRecursionDetected);
1066 if ((!typeFound || typeNamespace) && reportErrors) {
1071 if (typeNamespace) {
1072 error.setDescription(QQmlTypeLoader::tr(
"Namespace %1 cannot be used as a type").
arg(
typeName));
1079 error.setDescription(QQmlTypeLoader::tr(
"Unreported error adding script import to import database"));
1085 if (lineNumber != -1)
1086 error.setLine(lineNumber);
1087 if (columnNumber != -1)
1088 error.setColumn(columnNumber);
const_iterator constEnd() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the ...
const_iterator constBegin() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item in the hash.
const_iterator ConstIterator
Qt-style synonym for QHash::const_iterator.
void clear() noexcept(std::is_nothrow_destructible< Node >::value)
Removes all items from the hash and frees up all memory used by it.
QV4::ExecutionEngine * handle() const
qsizetype size() const noexcept
bool isEmpty() const noexcept
void prepend(rvalue_ref t)
void reserve(qsizetype size)
QDateTime sourceTimeStamp() const
QString readAll(QString *error) const
bool isError() const
Returns true if the status is Error.
bool isCompleteOrError() const
Returns true if the status is Complete or Error.
void addDependency(QQmlDataBlob *)
Wait for blob to become complete or to error.
QList< QQmlError > errors() const
Return the errors on this blob.
QUrl url() const
Returns the physical url of the data.
QQmlTypeLoader * typeLoader() const
QUrl finalUrl() const
Returns the logical URL to be used for resolving further URLs referred to in the code.
QList< QQmlDataBlob * > m_waitingOnMe
virtual void allDependenciesDone()
Called when all blobs waited for have completed.
QString finalUrlString() const
Returns the finalUrl() as a string.
Type type() const
Returns the type provided to the constructor.
void setError(const QQmlError &)
Mark this blob as having errors.
QString urlString() const
static QQmlEnginePrivate * get(QQmlEngine *e)
The QQmlEngine class provides an environment for instantiating QML components.
The QQmlError class encapsulates a QML error.
void setColumn(int)
Sets the error column number.
void setLine(int)
Sets the error line number.
void setDescription(const QString &)
Sets the error description.
void setUrl(const QUrl &)
Sets the url for the file that caused this error.
void populateCache(QQmlTypeNameCache *cache) const
QList< CompositeSingletonReference > resolvedCompositeSingletons() const
QList< ScriptReference > resolvedScripts() const
bool addInlineComponentImport(QQmlImportInstance *const importInstance, const QString &name, const QUrl importUrl)
void setBaseUrl(const QUrl &url, const QString &urlString=QString())
Sets the base URL to be used for all relative file imports added.
QTypeRevision addImplicitImport(QQmlTypeLoader *typeLoader, QString *localQmldir, QList< QQmlError > *errors)
bool resolveType(QQmlTypeLoader *typeLoader, const QHashedStringRef &type, QQmlType *type_return, QTypeRevision *version_return, QQmlImportNamespace **ns_return, QList< QQmlError > *errors=nullptr, QQmlType::RegistrationType registrationType=QQmlType::AnyRegistrationType, bool *typeRecursionDetected=nullptr) const
static bool isLocal(const QString &url)
QQmlPropertyCache::ConstPtr at(int index) const
static QQmlPropertyIndex fromEncoded(qint32 encodedIndex)
QVector< QQmlError > validate()
QQmlRefPointer< QQmlScriptData > scriptData() const
QV4::CompiledData::CompilationUnit * compilationUnit() const
void done() override
Invoked once data has either been received or a network error occurred, and all dependencies are comp...
void registerCallback(TypeDataCallback *)
void completed() override
Invoked on the main thread sometime after done() was called on the load thread.
void downloadProgressChanged(qreal) override
Called when the download progress of this blob changes.
void unregisterCallback(TypeDataCallback *)
void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit) override
QQmlType qmlType(const QString &inlineComponentName=QString()) const
void dataReceived(const SourceCodeData &) override
Invoked when data for the blob is received.
void scriptImported(const QQmlRefPointer< QQmlScriptBlob > &blob, const QV4::CompiledData::Location &location, const QString &nameSpace, const QString &qualifier) override
QString stringAt(int index) const override
QByteArray typeClassName() const
void allDependenciesDone() override
Called when all blobs waited for have completed.
QString typeNamespace() const
QQmlDirImports imports() const
std::shared_ptr< PendingImport > PendingImportPtr
Blob(const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader)
bool readCacheFile() const
bool addImport(const QV4::CompiledData::Import *import, QQmlImports::ImportFlags, QList< QQmlError > *errors)
bool fetchQmldir(const QUrl &url, PendingImportPtr import, int priority, QList< QQmlError > *errors)
const QQmlImports * imports() const
bool writeCacheFile() const
QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus
QVector< PendingImportPtr > m_unresolvedImports
bool loadDependentImports(const QList< QQmlDirParser::Import > &imports, const QString &qualifier, QTypeRevision version, quint16 precedence, QQmlImports::ImportFlags flags, QList< QQmlError > *errors)
QQmlRefPointer< QQmlImports > m_importCache
The QQmlTypeLoader class abstracts loading files and their dependencies over the network.
QQmlEngine * engine() const
Return the QQmlEngine associated with this loader.
QQmlRefPointer< QQmlTypeData > getType(const QUrl &unNormalizedUrl, Mode mode=PreferSynchronous)
Returns a QQmlTypeData for the specified url.
QQmlRefPointer< QQmlScriptBlob > getScript(const QUrl &unNormalizedUrl)
Return a QQmlScriptBlob for url.
const QQmlTypeLoaderQmldirContent qmldirContent(const QString &filePath)
Return a QQmlTypeLoaderQmldirContent for absoluteFilePath.
void add(const QHashedString &name, int sciptIndex=-1, const QHashedString &nameSpace=QHashedString())
bool isCompositeSingleton() const
QTypeRevision version() const
QString noCreationReason() const
QString qmlTypeName() const
const QMetaObject * metaObject() const
QString elementName() const
bool containsRevisionedAttributes() const
T * data() const noexcept
Returns the value of the pointer referenced by this object.
bool isNull() const noexcept
Returns true if this object refers to \nullptr.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
iterator insert(const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString left(qsizetype n) const &
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
QString mid(qsizetype position, qsizetype n=-1) const &
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
QUrl resolved(const QUrl &relative) const
Returns the result of the merge of this URL with relative.
void setFragment(const QString &fragment, ParsingMode mode=TolerantMode)
Sets the fragment of the URL to fragment.
QString scheme() const
Returns the scheme of the URL.
void setReferencesCompilationUnit(bool doReference)
QHash< int, QWidget * > hash
[35multi]
qDeleteAll(list.begin(), list.end())
QSet< QString >::iterator it
Combined button and popup list for selecting options.
std::function< QByteArray()> DependentTypesHasher
DBusConnection const char DBusError * error
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLsizei const GLchar * message
GLsizei GLsizei GLchar * source
static void add(QPainterPath &path, const QWingedEdge &list, int edge, QPathEdge::Traversal traversal)
static qreal component(const QPointF &point, unsigned int i)
QQmlEngine * qmlEngine(const QObject *obj)
QT_BEGIN_NAMESPACE QQmlError qQmlCompileError(const QV4::CompiledData::Location &location, const QString &description)
int objectForId(const ObjectContainer *objectContainer, const CompiledObject &component, int id)
static bool addTypeReferenceChecksumsToHash(const QList< QQmlTypeData::TypeReference > &typeRefs, QHash< quintptr, QByteArray > *checksums, QCryptographicHash *hash)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
QLatin1StringView QLatin1String
QNetworkAccessManager manager
\inmodule QtCore \reentrant
bool contains(const AT &t) const noexcept
void resolveMissingPropertyCaches(QQmlPropertyCacheVector *propertyCaches) const
const AOTCompiledFunction * aotCompiledFunctions
const QV4::CompiledData::Unit * qmlData
static bool canCreateClassNameTypeByUrl(const QUrl &url)
QQmlRefPointer< QQmlScriptBlob > script
QV4::CompiledData::Location location
virtual void typeDataProgress(QQmlTypeData *, qreal)
virtual void typeDataReady(QQmlTypeData *)
virtual ~TypeDataCallback()
QString qualifiedName() const
QString stringAt(uint index) const
QHash< QString, InlineComponentData > inlineComponentData
int inlineComponentId(const QString &inlineComponentName) const
Q_QML_EXPORT bool saveToDisk(const QUrl &unitUrl, QString *errorString)
ResolvedTypeReference * resolvedType(int id) const
QVector< QQmlRefPointer< QQmlScriptData > > dependentScripts
ResolvedTypeReferenceMap resolvedTypes
bool verifyChecksum(const CompiledData::DependentTypesHasher &dependencyHasher) const
QQmlRefPointer< QQmlTypeNameCache > typeNameCache
void finalizeCompositeType(const QQmlType &type)
const Unit * unitData() const
const CompiledObject * objectAt(int index) const
QQmlPropertyCacheVector propertyCaches
Q_QML_EXPORT bool loadFromDisk(const QUrl &url, const QDateTime &sourceTimeStamp, QString *errorString)
void collectFromObject(const CompiledObject *obj)
void collectFromObjects(Iterator it, Iterator end)
StringTableGenerator stringTable
QDateTime sourceTimeStamp
QString stringForIndex(int index) const
const QSet< QString > & illegalNames() const
QQmlRefPointer< QV4::CompiledData::CompilationUnit > javaScriptCompilationUnit
QVector< Object * > objects
QString stringAt(int index) const
QV4::Compiler::Module jsModule
QV4::Compiler::JSUnitGenerator jsGenerator