28void QQmlScriptBlob::dataReceived(
const SourceCodeData &data)
30 assertTypeLoaderThread();
32 if (data.isCacheable()) {
33 if (
auto unit = QQmlMetaType::obtainCompilationUnit(url())) {
34 initializeFromCompilationUnit(std::move(unit));
38 if (m_typeLoader->readCacheFile()) {
39 auto unit = QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>();
41 if (unit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) {
42 initializeFromCompilationUnit(std::move(unit));
45 qCDebug(DBG_DISK_CACHE()) <<
"Error loading" << urlString()
46 <<
"from disk cache:" << error;
52 if (m_cachedUnitStatus == QQmlMetaType::CachedUnitLookupError::VersionMismatch)
53 setError(QQmlTypeLoader::tr(
"File was compiled ahead of time with an incompatible version of Qt and the original file cannot be found. Please recompile"));
55 setError(QQmlTypeLoader::tr(
"No such file or directory"));
60 QString source = data.readAll(&error);
61 if (!error.isEmpty()) {
66 QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit;
69 QList<QQmlJS::DiagnosticMessage> diagnostics;
70 unit = QV4::Compiler::Codegen::compileModule(
71 m_typeLoader->isDebugging(), urlString(), source, data.sourceTimeStamp(),
73 QList<QQmlError> errors = QQmlEnginePrivate::qmlErrorFromDiagnostics(urlString(), diagnostics);
74 if (!errors.isEmpty()) {
79 QmlIR::Document irUnit(urlString(), finalUrlString(), m_typeLoader->isDebugging());
81 irUnit.jsModule.sourceTimeStamp = data.sourceTimeStamp();
83 QmlIR::ScriptDirectivesCollector collector(&irUnit);
84 irUnit.jsParserEngine.setDirectives(&collector);
86 QList<QQmlError> errors;
87 const QString fragment = finalUrl().fragment();
88 irUnit.javaScriptCompilationUnit = QV4::Script::precompile(
89 &irUnit.jsModule, &irUnit.jsParserEngine, &irUnit.jsGenerator, urlString(),
90 source, &errors, fragment == QLatin1String(
"global")
91 ? QV4::Compiler::ContextType::Global
92 : QV4::Compiler::ContextType::ScriptImportedByQML,
93 fragment == QLatin1String(
"include")
94 ? QV4::Script::InheritContext::Yes
95 : QV4::Script::InheritContext::No);
98 if (!errors.isEmpty()) {
103 QmlIR::QmlUnitGenerator qmlGenerator;
104 qmlGenerator.generate(irUnit);
105 unit = std::move(irUnit.javaScriptCompilationUnit);
108 if (m_typeLoader->writeCacheFile()) {
110 if (unit->saveToDisk(url(), &errorString)) {
112 if (!unit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) {
116 qCDebug(DBG_DISK_CACHE()) <<
"Error saving cached version of"
117 << unit->fileName() <<
"to disk:" << errorString;
121 initializeFromCompilationUnit(std::move(unit));
124void QQmlScriptBlob::initializeFromCachedUnit(
const QQmlPrivate::CachedQmlUnit *cachedUnit)
126 assertTypeLoaderThread();
127 initializeFromCompilationUnit(QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>(
128 cachedUnit->qmlData, cachedUnit->aotCompiledFunctions, urlString(), finalUrlString()));
131void QQmlScriptBlob::done()
133 assertTypeLoaderThread();
139 for (
int ii = 0; ii < m_scripts.size(); ++ii) {
140 const ScriptReference &script = m_scripts.at(ii);
145 if (script.script->isError()) {
146 QList<QQmlError> errors = script.script->errors();
149 error.setLine(qmlConvertSourceCoordinate<quint32,
int>(script.location.line()));
150 error.setColumn(qmlConvertSourceCoordinate<quint32,
int>(script.location.column()));
151 error.setDescription(QQmlTypeLoader::tr(
"Script %1 unavailable").arg(script.script->urlString()));
152 errors.prepend(error);
159 m_scriptData->typeNameCache.adopt(
new QQmlTypeNameCache(m_importCache));
163 for (
int scriptIndex = 0; scriptIndex < m_scripts.size(); ++scriptIndex) {
164 const ScriptReference &script = m_scripts.at(scriptIndex);
166 m_scriptData->scripts.append(script.script->scriptData());
168 if (!script.nameSpace.isNull()) {
169 if (!ns.contains(script.nameSpace)) {
170 ns.insert(script.nameSpace);
171 m_scriptData->typeNameCache->add(script.nameSpace);
174 m_scriptData->typeNameCache->add(script.qualifier, scriptIndex, script.nameSpace);
177 m_importCache->populateCache(m_scriptData->typeNameCache.data());
180 if (
auto cu = m_scriptData->compilationUnit()) {
181 cu->qmlType = QQmlMetaType::findCompositeType(url(), cu, QQmlMetaType::JavaScript);
182 for (
const auto &script : std::as_const(m_scripts))
183 cu->dependentScripts.append(script.script->scriptData());
184 QQmlMetaType::registerInternalCompositeType(cu);
195void QQmlScriptBlob::scriptImported(
const QQmlRefPointer<QQmlScriptBlob> &blob,
const QV4::CompiledData::Location &location,
const QString &qualifier,
const QString &nameSpace)
197 assertTypeLoaderThread();
201 ref.location = location;
202 ref.qualifier = qualifier;
203 ref.nameSpace = nameSpace;