QmlJS: Support .import directives in js files.

* Allow .import...
* Fix parsing of JS files when using Lexer::scanDirectives()
* Clean up ImportInfo construction.
* Rename ImportInfo::id to ImportInfo::as.

Change-Id: I888da248f06dc6184db99aa74c3b50d7f2f5e491
Reviewed-on: http://codereview.qt-project.org/5625
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
This commit is contained in:
Christian Kamm
2011-09-27 15:12:22 +02:00
parent faa792f3cd
commit 82cbd0a974
10 changed files with 186 additions and 95 deletions

View File

@@ -233,15 +233,13 @@ Context::ImportsPerDocument LinkPrivate::linkImports()
void LinkPrivate::populateImportedTypes(Imports *imports, Document::Ptr doc)
{
if (! doc->qmlProgram())
return;
// implicit imports: the <default> package is always available
loadImplicitDefaultImports(imports);
// implicit imports:
// qml files in the same directory are available without explicit imports
loadImplicitDirectoryImports(imports, doc);
if (doc->isQmlDocument())
loadImplicitDirectoryImports(imports, doc);
// explicit imports, whether directories, files or libraries
foreach (const ImportInfo &info, doc->bind()->imports()) {
@@ -261,8 +259,10 @@ void LinkPrivate::populateImportedTypes(Imports *imports, Document::Ptr doc)
import = importNonFile(doc, info);
break;
case ImportInfo::UnknownFileImport:
error(doc, info.ast()->fileNameToken,
Link::tr("file or directory not found"));
if (info.ast()) {
error(doc, info.ast()->fileNameToken,
Link::tr("file or directory not found"));
}
break;
default:
break;
@@ -400,9 +400,8 @@ bool LinkPrivate::importLibrary(Document::Ptr doc,
import->libraryPath = libraryPath;
const ComponentVersion version = importInfo.version();
const UiImport *ast = importInfo.ast();
SourceLocation errorLoc;
if (ast)
if (const UiImport *ast = importInfo.ast())
errorLoc = locationFromRange(ast->firstSourceLocation(), ast->lastSourceLocation());
if (!libraryInfo.plugins().isEmpty()) {
@@ -505,8 +504,7 @@ void LinkPrivate::loadQmldirComponents(ObjectValue *import, ComponentVersion ver
void LinkPrivate::loadImplicitDirectoryImports(Imports *imports, Document::Ptr doc)
{
ImportInfo implcitDirectoryImportInfo(
ImportInfo::ImplicitDirectoryImport, doc->path());
ImportInfo implcitDirectoryImportInfo = ImportInfo::implicitDirectoryImport(doc->path());
Import directoryImport = importCache.value(ImportCacheKey(implcitDirectoryImportInfo));
if (!directoryImport.object) {
@@ -523,15 +521,15 @@ void LinkPrivate::loadImplicitDefaultImports(Imports *imports)
{
const QString defaultPackage = CppQmlTypes::defaultPackage;
if (valueOwner->cppQmlTypes().hasModule(defaultPackage)) {
ImportInfo info(ImportInfo::LibraryImport, defaultPackage);
const ComponentVersion maxVersion(ComponentVersion::MaxVersion, ComponentVersion::MaxVersion);
const ImportInfo info = ImportInfo::moduleImport(defaultPackage, maxVersion, QString());
Import import = importCache.value(ImportCacheKey(info));
if (!import.object) {
import.info = info;
import.object = new ObjectValue(valueOwner);
foreach (const QmlObjectValue *object,
valueOwner->cppQmlTypes().createObjectsForImport(
defaultPackage,
ComponentVersion(ComponentVersion::MaxVersion, ComponentVersion::MaxVersion))) {
defaultPackage, maxVersion)) {
import.object->setMember(object->className(), object);
}
importCache.insert(ImportCacheKey(info), import);