summaryrefslogtreecommitdiff
path: root/src/libs/qmljs/qmljslink.cpp
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2011-10-12 08:36:02 +0200
committerChristian Kamm <christian.d.kamm@nokia.com>2011-10-21 08:21:00 +0200
commit0b75a66407eda8de22f0ab141ccbc976daff44b4 (patch)
tree70cb46d5cbd4f4d032c956189cb676650b1358d4 /src/libs/qmljs/qmljslink.cpp
parent55420e2b7070b552fe7790935e56b846d10242f7 (diff)
downloadqt-creator-0b75a66407eda8de22f0ab141ccbc976daff44b4.tar.gz
QmlJS: Support module apis defined by QML modules.
Change-Id: I18ec9daf8088f7db5ff2da11da14b539f501bab3 Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
Diffstat (limited to 'src/libs/qmljs/qmljslink.cpp')
-rw-r--r--src/libs/qmljs/qmljslink.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp
index 3e8cc72f14..0c78ab56c2 100644
--- a/src/libs/qmljs/qmljslink.cpp
+++ b/src/libs/qmljs/qmljslink.cpp
@@ -89,6 +89,8 @@ public:
QHash<ImportCacheKey, Import> importCache;
+ QHash<QString, QList<ModuleApiInfo> > importableModuleApis;
+
Document::Ptr document;
QList<DiagnosticMessage> *diagnosticMessages;
@@ -231,6 +233,8 @@ Context::ImportsPerDocument LinkPrivate::linkImports()
void LinkPrivate::populateImportedTypes(Imports *imports, Document::Ptr doc)
{
+ importableModuleApis.clear();
+
// implicit imports: the <default> package is always available
loadImplicitDefaultImports(imports);
@@ -315,6 +319,18 @@ Import LinkPrivate::importFileOrDirectory(Document::Ptr doc, const ImportInfo &i
return import;
}
+static ModuleApiInfo findBestModuleApi(const QList<ModuleApiInfo> &apis, const ComponentVersion &version)
+{
+ ModuleApiInfo best;
+ foreach (const ModuleApiInfo &moduleApi, apis) {
+ if (moduleApi.version <= version
+ && (!best.version.isValid() || best.version < moduleApi.version)) {
+ best = moduleApi;
+ }
+ }
+ return best;
+}
+
/*
import Qt 4.6
import Qt 4.6 as Xxx
@@ -372,6 +388,13 @@ Import LinkPrivate::importNonFile(Document::Ptr doc, const ImportInfo &importInf
}
}
+ // check module apis that previous imports may have enabled
+ ModuleApiInfo moduleApi = findBestModuleApi(importableModuleApis.value(packageName), version);
+ if (moduleApi.version.isValid()) {
+ importFound = true;
+ import.object->setPrototype(valueOwner->cppQmlTypes().objectByCppName(moduleApi.name));
+ }
+
if (!importFound && importInfo.ast()) {
import.valid = false;
error(doc, locationFromRange(importInfo.ast()->firstSourceLocation(),
@@ -442,6 +465,21 @@ bool LinkPrivate::importLibrary(Document::Ptr doc,
foreach (const CppComponentValue *object, valueOwner->cppQmlTypes().createObjectsForImport(packageName, version)) {
import->object->setMember(object->className(), object);
}
+
+ // all but no-uri module apis become available for import
+ QList<ModuleApiInfo> noUriModuleApis;
+ foreach (const ModuleApiInfo &moduleApi, libraryInfo.moduleApis()) {
+ if (moduleApi.uri.isEmpty()) {
+ noUriModuleApis += moduleApi;
+ } else {
+ importableModuleApis[moduleApi.uri] += moduleApi;
+ }
+ }
+
+ // if a module api has no uri, it shares the same name
+ ModuleApiInfo sameUriModuleApi = findBestModuleApi(noUriModuleApis, version);
+ if (sameUriModuleApi.version.isValid())
+ import->object->setPrototype(valueOwner->cppQmlTypes().objectByCppName(sameUriModuleApi.name));
}
}