aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/qmljs
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@qt.io>2021-01-11 14:09:51 +0100
committerChristian Stenger <christian.stenger@qt.io>2021-01-21 13:47:45 +0000
commit6ea088c02f9b0c61a8e9df1472b0ddfe544eb601 (patch)
treeabd63dd75155c225e52d5dea1209ca37bf887c57 /src/libs/qmljs
parent7dc72c533e4bba81ea3126d8cb98840ca746f786 (diff)
QmlJS: Fix handling multiple import paths into same module
It is possible to import components of different paths to fill a module. Take further paths into account when looking up types. Fixes: QTCREATORBUG-24405 Change-Id: I8d6bf0a324ea9c0d1fe9d91b40857f91f00dd662 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Fawzi Mohamed <fawzi.mohamed@qt.io>
Diffstat (limited to 'src/libs/qmljs')
-rw-r--r--src/libs/qmljs/qmljslink.cpp14
-rw-r--r--src/libs/qmljs/qmljsmodelmanagerinterface.cpp4
-rw-r--r--src/libs/qmljs/qmljsplugindumper.cpp13
-rw-r--r--src/libs/qmljs/qmljsutils.cpp13
-rw-r--r--src/libs/qmljs/qmljsutils.h4
5 files changed, 30 insertions, 18 deletions
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp
index 32e916eb89..121fee3301 100644
--- a/src/libs/qmljs/qmljslink.cpp
+++ b/src/libs/qmljs/qmljslink.cpp
@@ -410,8 +410,13 @@ Import LinkPrivate::importNonFile(const Document::Ptr &doc, const ImportInfo &im
const QString packageName = importInfo.name();
const ComponentVersion version = importInfo.version();
- QString libraryPath = modulePath(packageName, version.toString(), m_importPaths);
- bool importFound = !libraryPath.isEmpty() && importLibrary(doc, libraryPath, &import, import.object);
+ QStringList libraryPaths = modulePaths(packageName, version.toString(), m_importPaths);
+ bool importFound = false;
+ for (const QString &libPath : libraryPaths) {
+ importFound = !libPath.isEmpty() && importLibrary(doc, libPath, &import, import.object);
+ if (importFound)
+ break;
+ }
if (!importFound) {
for (const QString &dir : qAsConst(m_applicationDirectories)) {
@@ -501,7 +506,10 @@ bool LinkPrivate::importLibrary(const Document::Ptr &doc,
Import subImport;
subImport.valid = true;
subImport.info = ImportInfo::moduleImport(importName, vNow, importInfo.as(), importInfo.ast());
- subImport.libraryPath = modulePath(importName, vNow.toString(), m_importPaths);
+
+ const QStringList libraryPaths = modulePaths(importName, vNow.toString(), m_importPaths);
+ subImport.libraryPath = libraryPaths.value(0); // first is the best match
+
bool subImportFound = importLibrary(doc, subImport.libraryPath, &subImport, targetObject, importPath, true);
if (!subImportFound && errorLoc.isValid()) {
diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
index 210adf6096..2c5178cd0d 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
@@ -869,7 +869,9 @@ static QString modulePath(const ImportInfo &import, const QStringList &paths)
{
if (!import.version().isValid())
return QString();
- return modulePath(import.name(), import.version().toString(), paths);
+
+ const QStringList modPaths = modulePaths(import.name(), import.version().toString(), paths);
+ return modPaths.value(0); // first is best match
}
static void findNewLibraryImports(const Document::Ptr &doc, const Snapshot &snapshot,
diff --git a/src/libs/qmljs/qmljsplugindumper.cpp b/src/libs/qmljs/qmljsplugindumper.cpp
index 9508c13d31..730743f890 100644
--- a/src/libs/qmljs/qmljsplugindumper.cpp
+++ b/src/libs/qmljs/qmljsplugindumper.cpp
@@ -421,16 +421,17 @@ QString PluginDumper::buildQmltypesPath(const QString &name) const
version = m.captured("major") + QLatin1Char('.') + m.captured("minor");
}
- const QString path = modulePath(qualifiedName, version, m_modelManager->importPathsNames());
+ const QStringList paths = modulePaths(qualifiedName, version, m_modelManager->importPathsNames());
- if (path.isEmpty())
+ if (paths.isEmpty())
return QString();
- QDirIterator it(path, QStringList { "*.qmltypes" }, QDir::Files);
-
- if (it.hasNext())
- return it.next();
+ for (const QString &path : paths) {
+ QDirIterator it(path, QStringList { "*.qmltypes" }, QDir::Files);
+ if (it.hasNext())
+ return it.next();
+ }
return QString();
}
diff --git a/src/libs/qmljs/qmljsutils.cpp b/src/libs/qmljs/qmljsutils.cpp
index 4549bcbdfe..03136e4064 100644
--- a/src/libs/qmljs/qmljsutils.cpp
+++ b/src/libs/qmljs/qmljsutils.cpp
@@ -233,12 +233,12 @@ bool QmlJS::maybeModuleVersion(const QString &version) {
* \return The module paths if found, an empty string otherwise
* \see qmlimportscanner in qtdeclarative/tools
*/
-QString QmlJS::modulePath(const QString &name, const QString &version,
- const QStringList &importPaths)
+QStringList QmlJS::modulePaths(const QString &name, const QString &version,
+ const QStringList &importPaths)
{
Q_ASSERT(maybeModuleVersion(version));
if (importPaths.isEmpty())
- return QString();
+ return {};
const QString sanitizedVersion = version == undefinedVersion ? QString() : version;
const QStringList parts = name.split('.', Qt::SkipEmptyParts);
@@ -249,6 +249,7 @@ QString QmlJS::modulePath(const QString &name, const QString &version,
// sanitized version.
const QRegularExpression re("\\.?\\d+$");
+ QStringList result;
QString candidate;
for (QString ver = sanitizedVersion; !ver.isEmpty(); ver.remove(re)) {
@@ -260,7 +261,7 @@ QString QmlJS::modulePath(const QString &name, const QString &version,
ver,
mkpath(parts.mid(i + 1))));
if (QDir(candidate).exists())
- return candidate;
+ result << candidate;
}
}
}
@@ -269,10 +270,10 @@ QString QmlJS::modulePath(const QString &name, const QString &version,
for (const QString &path: importPaths) {
candidate = QDir::cleanPath(QString::fromLatin1("%1/%2").arg(path, mkpath(parts)));
if (QDir(candidate).exists())
- return candidate;
+ result << candidate;
}
- return QString();
+ return result;
}
bool QmlJS::isValidBuiltinPropertyType(const QString &name)
diff --git a/src/libs/qmljs/qmljsutils.h b/src/libs/qmljs/qmljsutils.h
index ce85a94986..23656ac2cb 100644
--- a/src/libs/qmljs/qmljsutils.h
+++ b/src/libs/qmljs/qmljsutils.h
@@ -57,8 +57,8 @@ QMLJS_EXPORT DiagnosticMessage errorMessage(const SourceLocation &loc,
QMLJS_EXPORT bool maybeModuleVersion(const QString &version);
-QMLJS_EXPORT QString modulePath(const QString &moduleImportName, const QString &version,
- const QStringList &importPaths);
+QMLJS_EXPORT QStringList modulePaths(const QString &moduleImportName, const QString &version,
+ const QStringList &importPaths);
template <class T>
SourceLocation locationFromRange(const T *node)