From 0d5d6344bd1ada7d1d2d392100e0b6ddb40dfd36 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 20 May 2010 15:19:42 +0200 Subject: [PATCH] QmlJS: Collect import version numbers in Bind. --- src/libs/qmljs/qmljsbind.cpp | 28 +++++++++++++++---- src/libs/qmljs/qmljsbind.h | 18 ++++++++---- src/libs/qmljs/qmljslink.cpp | 4 +-- src/plugins/qmljseditor/qmljsmodelmanager.cpp | 20 ++++++------- 4 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp index b9dabcb3e85..906b87f68e8 100644 --- a/src/libs/qmljs/qmljsbind.cpp +++ b/src/libs/qmljs/qmljsbind.cpp @@ -53,17 +53,17 @@ Bind::~Bind() { } -QStringList Bind::fileImports() const +QList Bind::fileImports() const { return _fileImports; } -QStringList Bind::directoryImports() const +QList Bind::directoryImports() const { return _directoryImports; } -QStringList Bind::libraryImports() const +QList Bind::libraryImports() const { return _libraryImports; } @@ -185,14 +185,30 @@ bool Bind::visit(AST::Program *) bool Bind::visit(UiImport *ast) { + ImportInfo info; + + info.majorVersion = QmlObjectValue::NoVersion; + info.minorVersion = QmlObjectValue::NoVersion; + + if (ast->versionToken.isValid()) { + const QString versionString = _doc->source().mid(ast->versionToken.offset, ast->versionToken.length); + const int dotIdx = versionString.indexOf(QLatin1Char('.')); + if (dotIdx != -1) { + info.majorVersion = versionString.left(dotIdx).toInt(); + info.minorVersion = versionString.mid(dotIdx + 1).toInt(); + } + } + if (ast->importUri) { - _libraryImports += toString(ast->importUri, QLatin1Char('/')); + info.name = toString(ast->importUri, QLatin1Char('/')); + _libraryImports += info; } else if (ast->fileName) { const QFileInfo importFileInfo(_doc->path() + QLatin1Char('/') + ast->fileName->asString()); + info.name = importFileInfo.absoluteFilePath(); if (importFileInfo.isFile()) - _fileImports += importFileInfo.absoluteFilePath(); + _fileImports += info; else if (importFileInfo.isDir()) - _directoryImports += importFileInfo.absoluteFilePath(); + _directoryImports += info; //else // error: file or directory does not exist } diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h index ed9264e2429..f5a7ee56f6f 100644 --- a/src/libs/qmljs/qmljsbind.h +++ b/src/libs/qmljs/qmljsbind.h @@ -50,9 +50,15 @@ public: Bind(Document *doc); virtual ~Bind(); - QStringList fileImports() const; - QStringList directoryImports() const; - QStringList libraryImports() const; + struct ImportInfo { + QString name; + int majorVersion; + int minorVersion; + }; + + QList fileImports() const; + QList directoryImports() const; + QList libraryImports() const; Interpreter::ObjectValue *currentObjectValue() const; Interpreter::ObjectValue *idEnvironment() const; @@ -105,9 +111,9 @@ private: QHash _functionScopes; QStringList _includedScripts; - QStringList _fileImports; - QStringList _directoryImports; - QStringList _libraryImports; + QList _fileImports; + QList _directoryImports; + QList _libraryImports; }; } // end of namespace Qml diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index e562cc498d4..ab714c54a26 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -65,8 +65,8 @@ void Link::initializeScopeChain() } else { // add scope chains for all components that import this file foreach (Document::Ptr otherDoc, _snapshot) { - foreach (const QString &fileImport, otherDoc->bind()->fileImports()) { - if (_doc->fileName() == fileImport) { + foreach (const Bind::ImportInfo &fileImport, otherDoc->bind()->fileImports()) { + if (_doc->fileName() == fileImport.name) { ScopeChain::QmlComponentChain *component = new ScopeChain::QmlComponentChain; componentScopes.insert(otherDoc.data(), component); scopeChain.qmlComponentScope.instantiatingComponents += component; diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.cpp b/src/plugins/qmljseditor/qmljsmodelmanager.cpp index 405f94d1c37..5151bb534ac 100644 --- a/src/plugins/qmljseditor/qmljsmodelmanager.cpp +++ b/src/plugins/qmljseditor/qmljsmodelmanager.cpp @@ -236,15 +236,15 @@ static void findNewFileImports(const Document::Ptr &doc, const Snapshot &snapsho QStringList *importedFiles, QSet *scannedPaths) { // scan files and directories that are explicitly imported - foreach (const QString &fileImport, doc->bind()->fileImports()) { - if (! snapshot.document(fileImport)) - *importedFiles += fileImport; + foreach (const Bind::ImportInfo &fileImport, doc->bind()->fileImports()) { + if (! snapshot.document(fileImport.name)) + *importedFiles += fileImport.name; } - foreach (const QString &directoryImport, doc->bind()->directoryImports()) { - if (snapshot.documentsInDirectory(directoryImport).isEmpty()) { - if (! scannedPaths->contains(directoryImport)) { - *importedFiles += qmlFilesInDirectory(directoryImport); - scannedPaths->insert(directoryImport); + foreach (const Bind::ImportInfo &directoryImport, doc->bind()->directoryImports()) { + if (snapshot.documentsInDirectory(directoryImport.name).isEmpty()) { + if (! scannedPaths->contains(directoryImport.name)) { + *importedFiles += qmlFilesInDirectory(directoryImport.name); + scannedPaths->insert(directoryImport.name); } } } @@ -256,10 +256,10 @@ static void findNewLibraryImports(const Document::Ptr &doc, const Snapshot &snap { // scan library imports const QStringList importPaths = modelManager->importPaths(); - foreach (const QString &libraryImport, doc->bind()->libraryImports()) { + foreach (const Bind::ImportInfo &libraryImport, doc->bind()->libraryImports()) { foreach (const QString &importPath, importPaths) { QDir dir(importPath); - dir.cd(libraryImport); + dir.cd(libraryImport.name); const QString targetPath = dir.absolutePath(); // if we know there is a library, done