diff --git a/languages/qmljs/duchain/cache.cpp b/languages/qmljs/duchain/cache.cpp --- a/languages/qmljs/duchain/cache.cpp +++ b/languages/qmljs/duchain/cache.cpp @@ -81,7 +81,14 @@ bool isVersion1 = version.startsWith(QLatin1String("1.")); bool isQtQuick = (uri == QLatin1String("QtQuick")); - if (!version.isEmpty() && !isVersion1) { + QStringList modulesWithoutVersionSuffix = + QStringList() + << "QtQml" + << "QtMultimedia" + << "QtQuick.LocalStorage" + << "QtQuick.XmlListModel"; + + if (!version.isEmpty() && !isVersion1 && !modulesWithoutVersionSuffix.contains(uri)) { // Modules having a version greater or equal to 2 are stored in a directory // name like QtQuick.2 fragment += QLatin1Char('.') + version.section(QLatin1Char('.'), 0, 0); @@ -98,6 +105,10 @@ break; } } else if (QFile::exists(pathString)) { + QStringList nameFilter("*.qmltypes"); + if (QDir(pathString).entryList(nameFilter).isEmpty()) { + continue; + } path = pathString; break; } diff --git a/languages/qmljs/duchain/tests/test_qmljsdeclarations.h b/languages/qmljs/duchain/tests/test_qmljsdeclarations.h --- a/languages/qmljs/duchain/tests/test_qmljsdeclarations.h +++ b/languages/qmljs/duchain/tests/test_qmljsdeclarations.h @@ -36,6 +36,8 @@ void testQMLId(); void testProperty(); + + void testQMLtypesImportPaths(); }; #endif // TESTCONTEXTS_H diff --git a/languages/qmljs/duchain/tests/test_qmljsdeclarations.cpp b/languages/qmljs/duchain/tests/test_qmljsdeclarations.cpp --- a/languages/qmljs/duchain/tests/test_qmljsdeclarations.cpp +++ b/languages/qmljs/duchain/tests/test_qmljsdeclarations.cpp @@ -24,6 +24,7 @@ #include "../helper.h" #include "../parsesession.h" #include "../declarationbuilder.h" +#include "../cache.h" #include #include @@ -239,3 +240,58 @@ QCOMPARE(foo->abstractType()->toString(), QString("int")); QCOMPARE(QString::fromUtf8(foo->comment()), QString("some comment")); } + +/** + * Test that all qmltypes files for built-in QtQuick modules are found on the system. + * These files are also available on CI machines, since an installed Qt5 is assumed + */ +void TestDeclarations::testQMLtypesImportPaths() +{ + KDevelop::IndexedString stubPath; + QString path; + + // QtQuick QML modules + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick", "2.0"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtTest", "1.1"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.Layouts", "1.1"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.Controls", "1.1"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.Dialogs", "1.1"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.Extras", "1.1"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.LocalStorage", "2.0"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.Particles", "2.0"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.Window", "2.2"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQuick.XmlListModel", "2.0"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + // QtQml QML modules + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQml", "2.2"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQml.Models", "2.3"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + path = QmlJS::Cache::instance().modulePath(stubPath, "QtQml.StateMachine", "1.0"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); + + // QtMultimedia QML modules + path = QmlJS::Cache::instance().modulePath(stubPath, "QtMultimedia", "5.6"); + QVERIFY(QFileInfo::exists(path + "/plugins.qmltypes")); +}