QmlJS: Support module apis defined by QML modules.

Change-Id: I18ec9daf8088f7db5ff2da11da14b539f501bab3
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
This commit is contained in:
Christian Kamm
2011-10-12 08:36:02 +02:00
parent 55420e2b70
commit 0b75a66407
7 changed files with 147 additions and 29 deletions

View File

@@ -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));
}
}