818
void QQmlDataLoaderThread::callCompletedMain(QQmlDataBlob *b)
826
void QQmlDataLoaderThread::loadWithCachedUnitThread(QQmlDataBlob *b, const QQmlPrivate::CachedQmlUnit *unit)
828
m_loader->loadWithCachedUnitThread(b, unit);
832
void QQmlDataLoaderThread::callCompletedMain(QQmlDataBlob *b)
820
834
QML_MEMORY_SCOPE_URL(b->url());
821
835
#ifdef DATABLOB_DEBUG
822
qWarning("QQmlDataLoaderThread: %s completed() callback", qPrintable(b->url().toString()));
836
qWarning("QQmlDataLoaderThread: %s completed() callback", qPrintable(b->url().toString()));
828
void QQmlDataLoaderThread::callDownloadProgressChangedMain(QQmlDataBlob *b, qreal p)
842
void QQmlDataLoaderThread::callDownloadProgressChangedMain(QQmlDataBlob *b, qreal p)
830
844
#ifdef DATABLOB_DEBUG
831
qWarning("QQmlDataLoaderThread: %s downloadProgressChanged(%f) callback",
832
qPrintable(b->url().toString()), p);
845
qWarning("QQmlDataLoaderThread: %s downloadProgressChanged(%f) callback",
846
qPrintable(b->url().toString()), p);
834
b->downloadProgressChanged(p);
848
b->downloadProgressChanged(p);
838
void QQmlDataLoaderThread::initializeEngineMain(QQmlExtensionInterface *iface,
852
void QQmlDataLoaderThread::initializeEngineMain(QQmlExtensionInterface *iface,
841
855
Q_ASSERT(m_loader->engine()->thread() == QThread::currentThread());
1230
1292
QQmlScriptBlob *blob = typeLoader()->getScript(scriptUrl);
1231
1293
addDependency(blob);
1233
scriptImported(blob, import->location.start, script.nameSpace, import->qualifier);
1295
scriptImported(blob, import->location, script.nameSpace, importQualifier);
1240
bool QQmlTypeLoader::Blob::addImport(const QQmlScript::Import &import, QList<QQmlError> *errors)
1302
bool QQmlTypeLoader::Blob::addImport(const QV4::CompiledData::Import *import, QList<QQmlError> *errors)
1242
1304
Q_ASSERT(errors);
1244
1306
QQmlImportDatabase *importDatabase = typeLoader()->importDatabase();
1246
if (import.type == QQmlScript::Import::Script) {
1247
QUrl scriptUrl = finalUrl().resolved(QUrl(import.uri));
1308
const QString &importUri = stringAt(import->uriIndex);
1309
const QString &importQualifier = stringAt(import->qualifierIndex);
1310
if (import->type == QV4::CompiledData::Import::ImportScript) {
1311
QUrl scriptUrl = finalUrl().resolved(QUrl(importUri));
1248
1312
QQmlScriptBlob *blob = typeLoader()->getScript(scriptUrl);
1249
1313
addDependency(blob);
1251
scriptImported(blob, import.location.start, import.qualifier, QString());
1252
} else if (import.type == QQmlScript::Import::Library) {
1315
scriptImported(blob, import->location, importQualifier, QString());
1316
} else if (import->type == QV4::CompiledData::Import::ImportLibrary) {
1253
1317
QString qmldirFilePath;
1254
1318
QString qmldirUrl;
1256
if (QQmlMetaType::isLockedModule(import.uri, import.majorVersion)) {
1320
if (QQmlMetaType::isLockedModule(importUri, import->majorVersion)) {
1257
1321
//Locked modules are checked first, to save on filesystem checks
1258
if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion,
1259
import.minorVersion, QString(), QString(), false, errors))
1322
if (!m_importCache.addLibraryImport(importDatabase, importUri, importQualifier, import->majorVersion,
1323
import->minorVersion, QString(), QString(), false, errors))
1262
} else if (m_imports.locateQmldir(importDatabase, import.uri, import.majorVersion, import.minorVersion,
1326
} else if (m_importCache.locateQmldir(importDatabase, importUri, import->majorVersion, import->minorVersion,
1263
1327
&qmldirFilePath, &qmldirUrl)) {
1264
1328
// This is a local library import
1265
if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion,
1266
import.minorVersion, qmldirFilePath, qmldirUrl, false, errors))
1329
if (!m_importCache.addLibraryImport(importDatabase, importUri, importQualifier, import->majorVersion,
1330
import->minorVersion, qmldirFilePath, qmldirUrl, false, errors))
1269
if (!import.qualifier.isEmpty()) {
1333
if (!importQualifier.isEmpty()) {
1270
1334
// Does this library contain any qualified scripts?
1271
1335
QUrl libraryUrl(qmldirUrl);
1272
1336
const QmldirContent *qmldir = typeLoader()->qmldirContent(qmldirFilePath, qmldirUrl);
1275
1339
QQmlScriptBlob *blob = typeLoader()->getScript(scriptUrl);
1276
1340
addDependency(blob);
1278
scriptImported(blob, import.location.start, script.nameSpace, import.qualifier);
1342
scriptImported(blob, import->location, script.nameSpace, importQualifier);
1282
1346
// Is this a module?
1283
if (QQmlMetaType::isAnyModule(import.uri)) {
1284
if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion,
1285
import.minorVersion, QString(), QString(), false, errors))
1347
if (QQmlMetaType::isAnyModule(importUri)) {
1348
if (!m_importCache.addLibraryImport(importDatabase, importUri, importQualifier, import->majorVersion,
1349
import->minorVersion, QString(), QString(), false, errors))
1288
1352
// We haven't yet resolved this import
1289
m_unresolvedImports.insert(&import, 0);
1353
m_unresolvedImports.insert(import, 0);
1291
1355
// Query any network import paths for this library
1292
1356
QStringList remotePathList = importDatabase->importPathList(QQmlImportDatabase::Remote);
1293
1357
if (!remotePathList.isEmpty()) {
1294
1358
// Add this library and request the possible locations for it
1295
if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion,
1296
import.minorVersion, QString(), QString(), true, errors))
1359
if (!m_importCache.addLibraryImport(importDatabase, importUri, importQualifier, import->majorVersion,
1360
import->minorVersion, QString(), QString(), true, errors))
1299
1363
// Probe for all possible locations
1300
1364
int priority = 0;
1301
1365
for (int version = QQmlImports::FullyVersioned; version <= QQmlImports::Unversioned; ++version) {
1302
1366
foreach (const QString &path, remotePathList) {
1303
QString qmldirUrl = QQmlImports::completeQmldirPath(import.uri, path, import.majorVersion, import.minorVersion,
1367
QString qmldirUrl = QQmlImports::completeQmldirPath(importUri, path, import->majorVersion, import->minorVersion,
1304
1368
static_cast<QQmlImports::ImportVersion>(version));
1305
if (!fetchQmldir(QUrl(qmldirUrl), &import, ++priority, errors))
1369
if (!fetchQmldir(QUrl(qmldirUrl), import, ++priority, errors))
2154
2205
if (data.isFile()) preparseData = data.asFile()->metaData(QLatin1String("qml:preparse"));
2156
if (m_useNewCompiler) {
2157
parsedQML.reset(new QtQml::ParsedQML(QV8Engine::getV4(typeLoader()->engine())->debugger != 0));
2158
QQmlCodeGenerator compiler;
2159
if (!compiler.generateFromQml(code, finalUrl(), finalUrlString(), parsedQML.data())) {
2160
setError(compiler.errors);
2164
if (!scriptParser.parse(code, preparseData, finalUrl(), finalUrlString())) {
2165
setError(scriptParser.errors());
2207
QQmlEngine *qmlEngine = typeLoader()->engine();
2208
m_document.reset(new QmlIR::Document(QV8Engine::getV4(qmlEngine)->debugger != 0));
2209
QmlIR::IRBuilder compiler(QV8Engine::get(qmlEngine)->illegalNames());
2210
if (!compiler.generateFromQml(code, finalUrlString(), finalUrlString(), m_document.data())) {
2211
QList<QQmlError> errors;
2212
foreach (const QQmlJS::DiagnosticMessage &msg, compiler.errors) {
2214
e.setUrl(finalUrl());
2215
e.setLine(msg.loc.startLine);
2216
e.setColumn(msg.loc.startColumn);
2217
e.setDescription(msg.message);
2170
m_imports.setBaseUrl(finalUrl(), finalUrlString());
2224
continueLoadFromIR();
2227
void QQmlTypeData::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit)
2229
QQmlEngine *qmlEngine = typeLoader()->engine();
2230
m_document.reset(new QmlIR::Document(QV8Engine::getV4(qmlEngine)->debugger != 0));
2231
unit->loadIR(m_document.data(), unit);
2232
continueLoadFromIR();
2235
void QQmlTypeData::continueLoadFromIR()
2237
m_document->collectTypeReferences();
2238
m_importCache.setBaseUrl(finalUrl(), finalUrlString());
2172
2240
// For remote URLs, we don't delay the loading of the implicit import
2173
2241
// because the loading probably requires an asynchronous fetch of the
2195
2264
QList<QQmlError> errors;
2197
// ### convert to use new data structure once old compiler is gone.
2198
if (m_useNewCompiler && m_newImports.isEmpty()) {
2199
m_newImports.reserve(parsedQML->imports.size());
2200
foreach (QV4::CompiledData::Import *i, parsedQML->imports) {
2201
QQmlScript::Import import;
2202
import.uri = parsedQML->stringAt(i->uriIndex);
2203
import.qualifier = parsedQML->stringAt(i->qualifierIndex);
2204
import.majorVersion = i->majorVersion;
2205
import.minorVersion = i->minorVersion;
2206
import.location.start.line = i->location.line;
2207
import.location.start.column = i->location.column;
2210
case QV4::CompiledData::Import::ImportFile: import.type = QQmlScript::Import::File; break;
2211
case QV4::CompiledData::Import::ImportLibrary: import.type = QQmlScript::Import::Library; break;
2212
case QV4::CompiledData::Import::ImportScript: import.type = QQmlScript::Import::Script; break;
2217
m_newImports << import;
2221
foreach (const QQmlScript::Import &import, m_useNewCompiler ? m_newImports : scriptParser.imports()) {
2266
foreach (const QV4::CompiledData::Import *import, m_document->imports) {
2222
2267
if (!addImport(import, &errors)) {
2223
2268
Q_ASSERT(errors.size());
2224
2269
QQmlError error(errors.takeFirst());
2225
error.setUrl(m_imports.baseUrl());
2226
error.setLine(import.location.start.line);
2227
error.setColumn(import.location.start.column);
2270
error.setUrl(m_importCache.baseUrl());
2271
error.setLine(import->location.line);
2272
error.setColumn(import->location.column);
2228
2273
errors.prepend(error); // put it back on the list after filling out information.
2229
2274
setError(errors);
2234
// ### convert to use new data structure once old compiler is gone.
2235
if (m_useNewCompiler && m_newPragmas.isEmpty()) {
2236
m_newPragmas.reserve(parsedQML->pragmas.size());
2237
foreach (QtQml::Pragma *p, parsedQML->pragmas) {
2238
QQmlScript::Pragma pragma;
2239
pragma.location.start.line = p->location.line;
2240
pragma.location.start.column = p->location.column;
2243
case QtQml::Pragma::PragmaSingleton: pragma.type = QQmlScript::Pragma::Singleton; break;
2247
m_newPragmas << pragma;
2251
foreach (const QQmlScript::Pragma &pragma, m_useNewCompiler ? m_newPragmas : scriptParser.pragmas()) {
2252
if (!addPragma(pragma, &errors)) {
2279
foreach (QmlIR::Pragma *pragma, m_document->pragmas) {
2280
if (!addPragma(*pragma, &errors)) {
2253
2281
Q_ASSERT(errors.size());
2254
2282
setError(errors);
2302
2335
m_compiledData->url = finalUrl();
2303
2336
m_compiledData->name = finalUrlString();
2305
QQmlCompilingProfiler prof(m_compiledData->name);
2307
if (m_useNewCompiler) {
2308
m_compiledData->importCache = new QQmlTypeNameCache;
2310
foreach (const QString &ns, m_namespaces)
2311
m_compiledData->importCache->add(ns);
2313
// Add any Composite Singletons that were used to the import cache
2314
for (int i = 0; i < compositeSingletons().count(); ++i) {
2315
m_compiledData->importCache->add(compositeSingletons().at(i).type->qmlTypeName(),
2316
compositeSingletons().at(i).type->sourceUrl(), compositeSingletons().at(i).prefix);
2319
m_imports.populateCache(m_compiledData->importCache);
2320
m_compiledData->importCache->addref();
2322
QQmlEngine *engine = typeLoader()->engine();
2323
QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(engine);
2325
for (QHash<int, TypeReference>::ConstIterator resolvedType = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd();
2326
resolvedType != end; ++resolvedType) {
2327
QQmlCompiledData::TypeReference ref;
2328
if (resolvedType->typeData) {
2329
ref.component = resolvedType->typeData->compiledData();
2330
ref.component->addref();
2332
ref.type = resolvedType->type;
2335
ref.majorVersion = resolvedType->majorVersion;
2336
ref.minorVersion = resolvedType->minorVersion;
2337
m_compiledData->resolvedTypes.insert(resolvedType.key(), ref);
2341
SignalHandlerConverter converter(QQmlEnginePrivate::get(engine),
2344
if (!converter.convertSignalHandlerExpressionsToFunctionDeclarations()) {
2345
setError(converter.errors);
2346
m_compiledData->release();
2352
// Collect imported scripts
2353
m_compiledData->scripts.reserve(m_scripts.count());
2354
for (int scriptIndex = 0; scriptIndex < m_scripts.count(); ++scriptIndex) {
2355
const ScriptReference &script = m_scripts.at(scriptIndex);
2357
QString qualifier = script.qualifier;
2358
QString enclosingNamespace;
2360
const int lastDotIndex = qualifier.lastIndexOf(QLatin1Char('.'));
2361
if (lastDotIndex != -1) {
2362
enclosingNamespace = qualifier.left(lastDotIndex);
2363
qualifier = qualifier.mid(lastDotIndex+1);
2366
m_compiledData->importCache->add(qualifier, scriptIndex, enclosingNamespace);
2367
QQmlScriptData *scriptData = script.script->scriptData();
2368
scriptData->addref();
2369
m_compiledData->scripts << scriptData;
2372
// Compile JS binding expressions and signal handlers
2374
JSCodeGen jsCodeGen(finalUrlString(), parsedQML->code, &parsedQML->jsModule, &parsedQML->jsParserEngine, parsedQML->program, m_compiledData->importCache);
2375
const QVector<int> runtimeFunctionIndices = jsCodeGen.generateJSCodeForFunctionsAndBindings(parsedQML->functions);
2377
QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_typeLoader->engine());
2379
QScopedPointer<QQmlJS::EvalInstructionSelection> isel(v4->iselFactory->create(enginePrivate, v4->executableAllocator, &parsedQML->jsModule, &parsedQML->jsGenerator));
2380
isel->setUseFastLookups(false);
2381
QV4::CompiledData::CompilationUnit *jsUnit = isel->compile(/*generated unit data*/false);
2383
// Generate QML compiled type data structures
2385
QmlUnitGenerator qmlGenerator;
2386
QV4::CompiledData::QmlUnit *qmlUnit = qmlGenerator.generate(*parsedQML.data(), runtimeFunctionIndices);
2389
Q_ASSERT(!jsUnit->data);
2390
jsUnit->ownsData = false;
2391
jsUnit->data = &qmlUnit->header;
2394
m_compiledData->compilationUnit = jsUnit;
2395
if (m_compiledData->compilationUnit)
2396
m_compiledData->compilationUnit->ref();
2397
m_compiledData->qmlUnit = qmlUnit; // ownership transferred to m_compiledData
2399
QList<QQmlError> errors;
2401
// Build property caches and VME meta object data
2403
m_compiledData->datas.reserve(qmlUnit->nObjects);
2404
m_compiledData->propertyCaches.reserve(qmlUnit->nObjects);
2406
QQmlPropertyCacheCreator propertyCacheBuilder(enginePrivate,
2407
qmlUnit, m_compiledData->url,
2408
&m_imports, &m_compiledData->resolvedTypes);
2410
for (quint32 i = 0; i < qmlUnit->nObjects; ++i) {
2411
const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i);
2413
QByteArray vmeMetaObjectData;
2414
QQmlPropertyCache *propertyCache = 0;
2416
// If the object has no type, then it's probably a nested object definition as part
2417
// of a group property.
2418
const bool objectHasType = !parsedQML->jsGenerator.strings.at(obj->inheritedTypeNameIndex).isEmpty();
2419
if (objectHasType) {
2420
if (!propertyCacheBuilder.create(obj, &propertyCache, &vmeMetaObjectData)) {
2421
errors << propertyCacheBuilder.errors;
2426
m_compiledData->datas << vmeMetaObjectData;
2428
propertyCache->addref();
2429
m_compiledData->propertyCaches << propertyCache;
2431
if (i == qmlUnit->indexOfRootObject) {
2432
Q_ASSERT(propertyCache);
2433
m_compiledData->rootPropertyCache = propertyCache;
2434
propertyCache->addref();
2438
// Resolve component boundaries and aliases
2440
if (errors.isEmpty()) {
2441
// Scan for components, determine their scopes and resolve aliases within the scope.
2442
QQmlComponentAndAliasResolver resolver(m_compiledData->url, m_compiledData->qmlUnit, m_compiledData->resolvedTypes, m_compiledData->propertyCaches,
2443
&m_compiledData->datas, &m_compiledData->objectIndexToIdForRoot, &m_compiledData->objectIndexToIdPerComponent);
2444
if (!resolver.resolve())
2445
errors << resolver.errors;
2448
if (errors.isEmpty()) {
2449
// Add to type registry of composites
2450
if (m_compiledData->isCompositeType())
2451
QQmlEnginePrivate::get(engine)->registerInternalCompositeType(m_compiledData);
2453
const QV4::CompiledData::Object *obj = qmlUnit->objectAt(qmlUnit->indexOfRootObject);
2454
QQmlCompiledData::TypeReference typeRef = m_compiledData->resolvedTypes.value(obj->inheritedTypeNameIndex);
2455
if (typeRef.component) {
2456
m_compiledData->metaTypeId = typeRef.component->metaTypeId;
2457
m_compiledData->listMetaTypeId = typeRef.component->listMetaTypeId;
2459
m_compiledData->metaTypeId = typeRef.type->typeId();
2460
m_compiledData->listMetaTypeId = typeRef.type->qListTypeId();
2465
// Sanity check property bindings
2466
if (errors.isEmpty()) {
2467
QQmlPropertyValidator validator(m_compiledData->url, m_compiledData->qmlUnit, m_compiledData->resolvedTypes,
2468
m_compiledData->propertyCaches, m_compiledData->objectIndexToIdPerComponent);
2469
if (!validator.validate())
2470
errors << validator.errors;
2473
if (!errors.isEmpty()) {
2475
m_compiledData->release();
2479
QQmlCompiler compiler(&scriptParser._pool);
2480
if (!compiler.compile(typeLoader()->engine(), this, m_compiledData)) {
2481
setError(compiler.errors());
2482
m_compiledData->release();
2338
QQmlCompilingProfiler prof(QQmlEnginePrivate::get(typeLoader()->engine())->profiler, m_compiledData->name);
2340
QQmlTypeCompiler compiler(QQmlEnginePrivate::get(typeLoader()->engine()), m_compiledData, this, m_document.data());
2341
if (!compiler.compile()) {
2342
setError(compiler.compilationErrors());
2343
m_compiledData->release();
2488
2348
void QQmlTypeData::resolveTypes()
2490
2350
// Add any imported scripts to our resolved set
2491
foreach (const QQmlImports::ScriptReference &script, m_imports.resolvedScripts())
2351
foreach (const QQmlImports::ScriptReference &script, m_importCache.resolvedScripts())
2493
2353
QQmlScriptBlob *blob = typeLoader()->getScript(script.location);
2494
2354
addDependency(blob);
2541
// --- old compiler:
2542
foreach (QQmlScript::TypeReference *parserRef, scriptParser.referencedTypes()) {
2545
int majorVersion = -1;
2546
int minorVersion = -1;
2548
if (!resolveType(parserRef, majorVersion, minorVersion, ref))
2551
if (ref.type->isComposite()) {
2552
ref.typeData = typeLoader()->getType(ref.type->sourceUrl());
2553
addDependency(ref.typeData);
2556
ref.majorVersion = majorVersion;
2557
ref.minorVersion = minorVersion;
2559
Q_ASSERT(parserRef->firstUse);
2560
ref.location = parserRef->firstUse->location.start;
2565
// --- new compiler:
2566
QV4::CompiledData::TypeReferenceMap typeReferences;
2569
typeReferences = parsedQML->typeReferences;
2570
names = parsedQML->jsGenerator.strings;
2572
// ### collect from available QV4::CompiledData::QmlUnit
2574
for (QV4::CompiledData::TypeReferenceMap::ConstIterator unresolvedRef = typeReferences.constBegin(), end = typeReferences.constEnd();
2397
for (QV4::CompiledData::TypeReferenceMap::ConstIterator unresolvedRef = m_document->typeReferences.constBegin(), end = m_document->typeReferences.constEnd();
2575
2398
unresolvedRef != end; ++unresolvedRef) {
2577
2400
TypeReference ref; // resolved reference
2402
const bool reportErrors = unresolvedRef->errorWhenNotFound;
2579
2404
int majorVersion = -1;
2580
2405
int minorVersion = -1;
2581
2406
QQmlImportNamespace *typeNamespace = 0;
2582
2407
QList<QQmlError> errors;
2584
const QString name = names.at(unresolvedRef.key());
2585
bool typeFound = m_imports.resolveType(name, &ref.type,
2409
const QString name = stringAt(unresolvedRef.key());
2410
bool typeFound = m_importCache.resolveType(name, &ref.type,
2586
2411
&majorVersion, &minorVersion, &typeNamespace, &errors);
2587
2412
if (!typeNamespace && !typeFound && !m_implicitImportLoaded) {
2588
2413
// Lazy loading of implicit import
2589
2414
if (loadImplicitImport()) {
2590
2415
// Try again to find the type
2591
2416
errors.clear();
2592
typeFound = m_imports.resolveType(name, &ref.type,
2417
typeFound = m_importCache.resolveType(name, &ref.type,
2593
2418
&majorVersion, &minorVersion, &typeNamespace, &errors);
2595
2420
return; //loadImplicitImport() hit an error, and called setError already
2599
if (!typeFound || typeNamespace) {
2424
if ((!typeFound || typeNamespace) && reportErrors) {
2600
2425
// Known to not be a type:
2601
2426
// - known to be a namespace (Namespace {})
2602
2427
// - type with unknown namespace (UnknownNamespace.SomeType {})
2611
2436
// Description should come from error provided by addImport() function.
2612
2437
error.setDescription(QQmlTypeLoader::tr("Unreported error adding script import to import database"));
2614
error.setUrl(m_imports.baseUrl());
2439
error.setUrl(m_importCache.baseUrl());
2615
2440
error.setDescription(QQmlTypeLoader::tr("%1 %2").arg(name).arg(error.description()));
2618
error.setLine(unresolvedRef->line);
2619
error.setColumn(unresolvedRef->column);
2443
error.setLine(unresolvedRef->location.line);
2444
error.setColumn(unresolvedRef->location.column);
2621
2446
errors.prepend(error);
2622
2447
setError(errors);
2626
if (ref.type->isComposite()) {
2451
if (ref.type && ref.type->isComposite()) {
2627
2452
ref.typeData = typeLoader()->getType(ref.type->sourceUrl());
2628
2453
addDependency(ref.typeData);
2630
2455
ref.majorVersion = majorVersion;
2631
2456
ref.minorVersion = minorVersion;
2633
ref.location.line = unresolvedRef->line;
2634
ref.location.column = unresolvedRef->column;
2458
ref.location.line = unresolvedRef->location.line;
2459
ref.location.column = unresolvedRef->location.column;
2461
ref.needsCreation = unresolvedRef->needsCreation;
2636
2463
m_resolvedTypes.insert(unresolvedRef.key(), ref);
2640
bool QQmlTypeData::resolveType(const QQmlScript::TypeReference *parserRef, int &majorVersion, int &minorVersion, TypeReference &ref)
2467
bool QQmlTypeData::resolveType(const QString &typeName, int &majorVersion, int &minorVersion, TypeReference &ref)
2642
2469
QQmlImportNamespace *typeNamespace = 0;
2643
2470
QList<QQmlError> errors;
2645
bool typeFound = m_imports.resolveType(parserRef->name, &ref.type,
2472
bool typeFound = m_importCache.resolveType(typeName, &ref.type,
2646
2473
&majorVersion, &minorVersion, &typeNamespace, &errors);
2647
2474
if (!typeNamespace && !typeFound && !m_implicitImportLoaded) {
2648
2475
// Lazy loading of implicit import
2649
2476
if (loadImplicitImport()) {
2650
2477
// Try again to find the type
2651
2478
errors.clear();
2652
typeFound = m_imports.resolveType(parserRef->name, &ref.type,
2479
typeFound = m_importCache.resolveType(typeName, &ref.type,
2653
2480
&majorVersion, &minorVersion, &typeNamespace, &errors);
2655
2482
return false; //loadImplicitImport() hit an error, and called setError already
2864
2679
void QQmlScriptBlob::dataReceived(const Data &data)
2866
m_source = QString::fromUtf8(data.data(), data.size());
2868
m_scriptData = new QQmlScriptData();
2869
m_scriptData->url = finalUrl();
2870
m_scriptData->urlString = finalUrlString();
2872
QQmlError metaDataError;
2873
m_metadata = QQmlScript::Parser::extractMetaData(m_source, &metaDataError);
2874
if (metaDataError.isValid()) {
2875
metaDataError.setUrl(finalUrl());
2876
setError(metaDataError);
2681
QString source = QString::fromUtf8(data.data(), data.size());
2683
QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_typeLoader->engine());
2684
QmlIR::Document irUnit(v4->debugger != 0);
2685
QQmlJS::DiagnosticMessage metaDataError;
2686
irUnit.extractScriptMetaData(source, &metaDataError);
2687
if (!metaDataError.message.isEmpty()) {
2689
e.setUrl(finalUrl());
2690
e.setLine(metaDataError.loc.startLine);
2691
e.setColumn(metaDataError.loc.startColumn);
2692
e.setDescription(metaDataError.message);
2880
m_imports.setBaseUrl(finalUrl(), finalUrlString());
2882
2697
QList<QQmlError> errors;
2884
foreach (const QQmlScript::Import &import, m_metadata.imports) {
2885
if (!addImport(import, &errors)) {
2886
Q_ASSERT(errors.size());
2887
QQmlError error(errors.takeFirst());
2888
error.setUrl(m_imports.baseUrl());
2889
error.setLine(import.location.start.line);
2890
error.setColumn(import.location.start.column);
2891
errors.prepend(error); // put it back on the list after filling out information.
2698
QV4::CompiledData::CompilationUnit *unit = QV4::Script::precompile(&irUnit.jsModule, &irUnit.jsGenerator, v4, finalUrl(), source, &errors);
2702
if (!errors.isEmpty()) {
2708
irUnit.javaScriptCompilationUnit = unit;
2710
QmlIR::QmlUnitGenerator qmlGenerator;
2711
QV4::CompiledData::QmlUnit *qmlUnit = qmlGenerator.generate(irUnit);
2712
Q_ASSERT(!unit->data);
2713
Q_ASSERT((void*)qmlUnit == (void*)&qmlUnit->header);
2714
// The js unit owns the data and will free the qml unit.
2715
unit->data = &qmlUnit->header;
2717
initializeFromCompilationUnit(unit);
2721
void QQmlScriptBlob::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit)
2723
initializeFromCompilationUnit(unit->createCompilationUnit());
2898
2726
void QQmlScriptBlob::done()
2934
2762
m_scriptData->importCache->add(script.qualifier, scriptIndex, script.nameSpace);
2937
m_imports.populateCache(m_scriptData->importCache);
2939
m_scriptData->pragmas = m_metadata.pragmas;
2941
QList<QQmlError> errors;
2942
QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_typeLoader->engine());
2943
m_scriptData->m_precompiledScript = QV4::Script::precompile(v4, m_scriptData->url, m_source, &errors);
2765
m_importCache.populateCache(m_scriptData->importCache);
2768
QString QQmlScriptBlob::stringAt(int index) const
2770
return m_scriptData->m_precompiledScript->data->stringAt(index);
2773
void QQmlScriptBlob::scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace)
2775
ScriptReference ref;
2777
ref.location = location;
2778
ref.qualifier = qualifier;
2779
ref.nameSpace = nameSpace;
2784
void QQmlScriptBlob::initializeFromCompilationUnit(QV4::CompiledData::CompilationUnit *unit)
2786
Q_ASSERT(!m_scriptData);
2787
m_scriptData = new QQmlScriptData();
2788
m_scriptData->url = finalUrl();
2789
m_scriptData->urlString = finalUrlString();
2790
m_scriptData->m_precompiledScript = unit;
2944
2791
if (m_scriptData->m_precompiledScript)
2945
2792
m_scriptData->m_precompiledScript->ref();
2947
if (!errors.isEmpty()) {
2794
m_importCache.setBaseUrl(finalUrl(), finalUrlString());
2796
Q_ASSERT(m_scriptData->m_precompiledScript->data->flags & QV4::CompiledData::Unit::IsQml);
2797
const QV4::CompiledData::QmlUnit *qmlUnit = reinterpret_cast<const QV4::CompiledData::QmlUnit*>(m_scriptData->m_precompiledScript->data);
2799
QList<QQmlError> errors;
2800
for (quint32 i = 0; i < qmlUnit->nImports; ++i) {
2801
const QV4::CompiledData::Import *import = qmlUnit->importAt(i);
2802
if (!addImport(import, &errors)) {
2803
Q_ASSERT(errors.size());
2804
QQmlError error(errors.takeFirst());
2805
error.setUrl(m_importCache.baseUrl());
2806
error.setLine(import->location.line);
2807
error.setColumn(import->location.column);
2808
errors.prepend(error); // put it back on the list after filling out information.
2953
void QQmlScriptBlob::scriptImported(QQmlScriptBlob *blob, const QQmlScript::Location &location, const QString &qualifier, const QString &nameSpace)
2955
ScriptReference ref;
2957
ref.location = location;
2958
ref.qualifier = qualifier;
2959
ref.nameSpace = nameSpace;
2964
2815
QQmlQmldirData::QQmlQmldirData(const QUrl &url, QQmlTypeLoader *loader)
2965
2816
: QQmlTypeLoader::Blob(url, QmldirFile, loader), m_import(0), m_priority(0)