diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-02-06 10:11:09 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-02-11 12:50:46 +0000 |
commit | 40215ac87a15c41c6531714da2d43728df75235b (patch) | |
tree | 11ad39dd85d0eaf5a942c6fdd267d32d886f1a9f /src/lib/corelib/language | |
parent | 061c88a6081f487886e4b9e42ff4ec014cfd6040 (diff) |
Module providers: Fix some change tracking problems
- We must not remember our temporary files.
- We need to use a different reference time stamp for the created
modules.
- Collecting the results of File.exists() & friends can lead to false
positives, so we disable it for now.
Change-Id: Id64685b510606f1991e83eb825c36a1b3ec4a4e1
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r-- | src/lib/corelib/language/language.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/language.h | 7 | ||||
-rw-r--r-- | src/lib/corelib/language/loader.cpp | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 15 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.cpp | 24 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.h | 6 |
7 files changed, 39 insertions, 19 deletions
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp index 2a9eb5b0e..86056f2a6 100644 --- a/src/lib/corelib/language/language.cpp +++ b/src/lib/corelib/language/language.cpp @@ -588,7 +588,7 @@ void ResolvedProject::store(PersistentPool &pool) TopLevelProject::TopLevelProject() - : bgLocker(nullptr), locked(false), lastResolveTime(FileTime::oldestTime()) + : bgLocker(nullptr), locked(false), lastStartResolveTime(FileTime::oldestTime()) { } diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h index 994ad6c55..82d9f94a2 100644 --- a/src/lib/corelib/language/language.h +++ b/src/lib/corelib/language/language.h @@ -703,7 +703,8 @@ public: bool locked; // This is the API-level lock for the project instance. Set<QString> buildSystemFiles; - FileTime lastResolveTime; + FileTime lastStartResolveTime; + FileTime lastEndResolveTime; QList<ErrorInfo> warningsEncountered; void setBuildConfiguration(const QVariantMap &config); @@ -724,8 +725,8 @@ private: pool.serializationOp<opType>(m_id, canonicalFilePathResults, fileExistsResults, directoryEntriesResults, fileLastModifiedResults, environment, probes, profileConfigs, overriddenValues, buildSystemFiles, - lastResolveTime, warningsEncountered, buildData, - moduleProviderInfo); + lastStartResolveTime, lastEndResolveTime, warningsEncountered, + buildData, moduleProviderInfo); } void load(PersistentPool &pool) override; void store(PersistentPool &pool) override; diff --git a/src/lib/corelib/language/loader.cpp b/src/lib/corelib/language/loader.cpp index 4d2eef983..e27ccca74 100644 --- a/src/lib/corelib/language/loader.cpp +++ b/src/lib/corelib/language/loader.cpp @@ -170,7 +170,8 @@ TopLevelProjectPtr Loader::loadProject(const SetupProjectParameters &_parameters ProjectResolver resolver(&evaluator, loadResult, parameters, m_logger); resolver.setProgressObserver(m_progressObserver); const TopLevelProjectPtr project = resolver.resolve(); - project->lastResolveTime = resolveTime; + project->lastStartResolveTime = resolveTime; + project->lastEndResolveTime = FileTime::currentTime(); // E.g. if the top-level project is disabled. if (m_progressObserver) diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 58dab062a..fe71df43f 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -361,7 +361,7 @@ ModuleLoaderResult ModuleLoader::load(const SetupProjectParameters ¶meters) handleTopLevelProject(&result, root, buildDirectory, Set<QString>() << QDir::cleanPath(parameters.projectFilePath())); result.root = root; - result.qbsFiles = m_reader->filesRead(); + result.qbsFiles = m_reader->filesRead() - m_tempQbsFiles; for (auto it = m_localProfiles.cbegin(); it != m_localProfiles.cend(); ++it) result.profileConfigs.remove(it.key()); printProfilingInfo(); @@ -2156,7 +2156,10 @@ void ModuleLoader::setSearchPathsForProduct(ModuleLoader::ProductContext *produc if (!m_moduleProviderInfo.empty()) { const QVariantMap configForProduct = moduleProviderConfig(*product); for (const ModuleProviderInfo &c : m_moduleProviderInfo) { - if (configForProduct.value(c.name.toString()) == c.config) { + if (configForProduct.value(c.name.toString()).toMap() == c.config) { + qCDebug(lcModuleLoader) << "re-using search paths" << c.searchPaths + << "from module provider" << c.name + << "for product" << product->name; product->knownModuleProviders.insert(c.name); product->searchPaths << c.searchPaths; } @@ -2622,10 +2625,6 @@ void ModuleLoader::resolveDependsItem(DependsContext *dependsContext, Item *pare } ErrorInfo e(Tr::tr("Dependency '%1' not found for product '%2'.") .arg(moduleName.toString(), productName), dependsItem->location()); - if (moduleName.size() == 2 && moduleName.front() == QStringLiteral("Qt")) { - e.append(Tr::tr("Please create a Qt profile using the qbs-setup-qt tool " - "if you haven't already done so.")); - } throw e; } if (result.isProduct && !m_dependsChain.empty() && !m_dependsChain.back().isProduct) { @@ -3761,6 +3760,7 @@ ModuleLoader::ModuleProviderResult ModuleLoader::findModuleProvider(const Qualif "for dependency '%1': %2").arg(name.toString(), dummyItemFile.errorString())); } + m_tempQbsFiles << dummyItemFile.fileName(); qCDebug(lcModuleLoader) << "Instantiating module provider at" << providerFile; const QString projectBuildDir = product.project->item->variantProperty( StringConstants::buildDirectoryProperty())->value().toString(); @@ -3789,6 +3789,7 @@ ModuleLoader::ModuleProviderResult ModuleLoader::findModuleProvider(const Qualif .arg(providerFile, providerItem->typeName(), BuiltinDeclarations::instance().nameForType(ItemType::ModuleProvider))); } + providerItem->setParent(product.item); const QVariantMap configMap = moduleConfig.toMap(); for (auto it = configMap.begin(); it != configMap.end(); ++it) { const PropertyDeclaration decl = providerItem->propertyDeclaration(it.key()); @@ -3798,7 +3799,7 @@ ModuleLoader::ModuleProviderResult ModuleLoader::findModuleProvider(const Qualif } providerItem->setProperty(it.key(), VariantValue::create(it.value())); } - EvalContextSwitcher contextSwitcher(m_evaluator->engine(), EvalContext::ProbeExecution); + EvalContextSwitcher contextSwitcher(m_evaluator->engine(), EvalContext::ModuleProvider); const QStringList searchPaths = m_evaluator->stringListValue(providerItem, QStringLiteral("searchPaths")); if (searchPaths.empty()) { diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h index 9e45908c3..a0a555748 100644 --- a/src/lib/corelib/language/moduleloader.h +++ b/src/lib/corelib/language/moduleloader.h @@ -450,6 +450,7 @@ private: Set<Item *> m_exportsWithDeferredDependsItems; ModuleProviderInfoList m_moduleProviderInfo; + Set<QString> m_tempQbsFiles; SetupProjectParameters m_parameters; std::unique_ptr<Settings> m_settings; diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp index fb4706b3b..7b2c69aa1 100644 --- a/src/lib/corelib/language/scriptengine.cpp +++ b/src/lib/corelib/language/scriptengine.cpp @@ -234,6 +234,7 @@ void ScriptEngine::checkContext(const QString &operation, + Tr::tr("Should this call be in a JavaScriptCommand instead?"); } break; + case EvalContext::ModuleProvider: case EvalContext::ProbeExecution: case EvalContext::JsCommand: QBS_ASSERT(false, continue); @@ -574,25 +575,30 @@ void ScriptEngine::releaseResourcesOfScriptObjects() void ScriptEngine::addCanonicalFilePathResult(const QString &filePath, const QString &resultFilePath) { - m_canonicalFilePathResult.insert(filePath, resultFilePath); + if (gatherFileResults()) + m_canonicalFilePathResult.insert(filePath, resultFilePath); } void ScriptEngine::addFileExistsResult(const QString &filePath, bool exists) { - m_fileExistsResult.insert(filePath, exists); + if (gatherFileResults()) + m_fileExistsResult.insert(filePath, exists); } void ScriptEngine::addDirectoryEntriesResult(const QString &path, QDir::Filters filters, const QStringList &entries) { - m_directoryEntriesResult.insert( - std::pair<QString, quint32>(path, static_cast<quint32>(filters)), - entries); + if (gatherFileResults()) { + m_directoryEntriesResult.insert( + std::pair<QString, quint32>(path, static_cast<quint32>(filters)), + entries); + } } void ScriptEngine::addFileLastModifiedResult(const QString &filePath, const FileTime &fileTime) { - m_fileLastModifiedResult.insert(filePath, fileTime); + if (gatherFileResults()) + m_fileLastModifiedResult.insert(filePath, fileTime); } Set<QString> ScriptEngine::imports() const @@ -655,6 +661,12 @@ void ScriptEngine::abort() abortEvaluation(m_cancelationError); } +bool ScriptEngine::gatherFileResults() const +{ + return evalContext() == EvalContext::PropertyEvaluation + || evalContext() == EvalContext::ProbeExecution; +} + class JSTypeExtender { public: diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h index 226cf16a9..89863189a 100644 --- a/src/lib/corelib/language/scriptengine.h +++ b/src/lib/corelib/language/scriptengine.h @@ -72,7 +72,9 @@ class PrepareScriptObserver; class ScriptImporter; class ScriptPropertyObserver; -enum class EvalContext { PropertyEvaluation, ProbeExecution, RuleExecution, JsCommand }; +enum class EvalContext { + PropertyEvaluation, ProbeExecution, ModuleProvider, RuleExecution, JsCommand +}; class DubiousContext { public: @@ -279,6 +281,8 @@ private: void abort(); + bool gatherFileResults() const; + void installQbsBuiltins(); void extendJavaScriptBuiltins(); void installFunction(const QString &name, int length, QScriptValue *functionValue, |