diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2011-07-01 13:41:40 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2011-07-05 11:52:09 +0200 |
commit | 9ea0380a4dd5a681f1675cb5203e7a8c71764704 (patch) | |
tree | 0dab5e84e07349f16e3ae3def6337581f4abab55 /src/libs/qmljs/qmljslink.cpp | |
parent | f691d3824af0d2f3e03b85c31eae8996995a021e (diff) | |
download | qt-creator-9ea0380a4dd5a681f1675cb5203e7a8c71764704.tar.gz |
QmlJS: Enforce Context always being linked.
The default way of creating a Context is through Link.
Change-Id: Ia81f7ce90ba2b33d02eed432a61be836d404bedd
Reviewed-on: http://codereview.qt.nokia.com/1041
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
Diffstat (limited to 'src/libs/qmljs/qmljslink.cpp')
-rw-r--r-- | src/libs/qmljs/qmljslink.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index f1b3a62291..76de63cc46 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -84,7 +84,8 @@ class QmlJS::LinkPrivate { public: Snapshot snapshot; - Interpreter::Context *context; + Interpreter::ValueOwner *valueOwner; + Interpreter::Context::ImportsPerDocument imports; QStringList importPaths; QHash<ImportCacheKey, Import> importCache; @@ -108,11 +109,11 @@ public: \l{Context} with \l{Link}. */ -Link::Link(Context *context, const Snapshot &snapshot, const QStringList &importPaths) +Link::Link(const Snapshot &snapshot, const QStringList &importPaths) : d_ptr(new LinkPrivate) { Q_D(Link); - d->context = context; + d->valueOwner = new ValueOwner; d->snapshot = snapshot; d->importPaths = importPaths; @@ -123,54 +124,50 @@ Link::Link(Context *context, const Snapshot &snapshot, const QStringList &import ModelManagerInterface *modelManager = ModelManagerInterface::instance(); if (modelManager) { foreach (const QList<FakeMetaObject::ConstPtr> &cppTypes, modelManager->cppQmlTypes()) { - valueOwner()->cppQmlTypes().load(valueOwner(), cppTypes); + d->valueOwner->cppQmlTypes().load(d->valueOwner, cppTypes); } } } -void Link::operator()(QHash<QString, QList<DiagnosticMessage> > *messages) +Context Link::operator()(QHash<QString, QList<DiagnosticMessage> > *messages) { Q_D(Link); d->allDiagnosticMessages = messages; linkImports(); + return Context(d->snapshot, d->valueOwner, d->imports); } -void Link::operator()(const Document::Ptr &doc, QList<DiagnosticMessage> *messages) +Context Link::operator()(const Document::Ptr &doc, QList<DiagnosticMessage> *messages) { Q_D(Link); d->doc = doc; d->diagnosticMessages = messages; linkImports(); + return Context(d->snapshot, d->valueOwner, d->imports); } Link::~Link() { } -Interpreter::ValueOwner *Link::valueOwner() -{ - Q_D(Link); - return d->context->valueOwner(); -} - void Link::linkImports() { Q_D(Link); if (d->doc) { // do it on d->doc first, to make sure import errors are shown - Imports *imports = new Imports(valueOwner()); + Imports *imports = new Imports(d->valueOwner); populateImportedTypes(imports, d->doc); - d->context->setImports(d->doc.data(), imports); + d->imports.insert(d->doc.data(), QSharedPointer<Imports>(imports)); } foreach (Document::Ptr doc, d->snapshot) { if (doc == d->doc) continue; - Imports *imports = new Imports(valueOwner()); + Imports *imports = new Imports(d->valueOwner); populateImportedTypes(imports, doc); - d->context->setImports(doc.data(), imports); + d->imports.insert(doc.data(), QSharedPointer<Imports>(imports)); } } @@ -238,7 +235,7 @@ Import Link::importFileOrDirectory(Document::Ptr doc, const ImportInfo &importIn if (importInfo.type() == ImportInfo::DirectoryImport || importInfo.type() == ImportInfo::ImplicitDirectoryImport) { - import.object = new ObjectValue(valueOwner()); + import.object = new ObjectValue(d->valueOwner); importLibrary(doc, path, &import); @@ -269,7 +266,7 @@ Import Link::importNonFile(Document::Ptr doc, const ImportInfo &importInfo) Import import; import.info = importInfo; - import.object = new ObjectValue(valueOwner()); + import.object = new ObjectValue(d->valueOwner); const QString packageName = Bind::toString(importInfo.ast()->importUri, '.'); const ComponentVersion version = importInfo.version(); @@ -308,10 +305,10 @@ Import Link::importNonFile(Document::Ptr doc, const ImportInfo &importInfo) } // if there are cpp-based types for this package, use them too - if (valueOwner()->cppQmlTypes().hasPackage(packageName)) { + if (d->valueOwner->cppQmlTypes().hasPackage(packageName)) { importFound = true; foreach (QmlObjectValue *object, - valueOwner()->cppQmlTypes().typesForImport(packageName, version)) { + d->valueOwner->cppQmlTypes().typesForImport(packageName, version)) { import.object->setMember(object->className(), object); } } @@ -382,7 +379,7 @@ bool Link::importLibrary(Document::Ptr doc, } } else { QList<QmlObjectValue *> loadedObjects = - valueOwner()->cppQmlTypes().load(valueOwner(), libraryInfo.metaObjects()); + d->valueOwner->cppQmlTypes().load(d->valueOwner, libraryInfo.metaObjects()); foreach (QmlObjectValue *object, loadedObjects) { if (object->packageName().isEmpty()) { import->object->setMember(object->className(), object); @@ -479,14 +476,14 @@ void Link::loadImplicitDefaultImports(Imports *imports) Q_D(Link); const QString defaultPackage = CppQmlTypes::defaultPackage; - if (valueOwner()->cppQmlTypes().hasPackage(defaultPackage)) { + if (d->valueOwner->cppQmlTypes().hasPackage(defaultPackage)) { ImportInfo info(ImportInfo::LibraryImport, defaultPackage); Import import = d->importCache.value(ImportCacheKey(info)); if (!import.object) { import.info = info; - import.object = new ObjectValue(valueOwner()); + import.object = new ObjectValue(d->valueOwner); foreach (QmlObjectValue *object, - valueOwner()->cppQmlTypes().typesForImport(defaultPackage, ComponentVersion())) { + d->valueOwner->cppQmlTypes().typesForImport(defaultPackage, ComponentVersion())) { import.object->setMember(object->className(), object); } d->importCache.insert(ImportCacheKey(info), import); |