diff options
author | Christian Kamm <[email protected]> | 2011-10-12 08:36:02 +0200 |
---|---|---|
committer | Christian Kamm <[email protected]> | 2011-10-21 08:21:00 +0200 |
commit | 0b75a66407eda8de22f0ab141ccbc976daff44b4 (patch) | |
tree | 70cb46d5cbd4f4d032c956189cb676650b1358d4 /src/libs/qmljs/qmljslink.cpp | |
parent | 55420e2b7070b552fe7790935e56b846d10242f7 (diff) |
QmlJS: Support module apis defined by QML modules.
Change-Id: I18ec9daf8088f7db5ff2da11da14b539f501bab3
Reviewed-by: Fawzi Mohamed <[email protected]>
Diffstat (limited to 'src/libs/qmljs/qmljslink.cpp')
-rw-r--r-- | src/libs/qmljs/qmljslink.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 3e8cc72f147..0c78ab56c24 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)); } } |