aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSami Shalayel <sami.shalayel@qt.io>2024-12-05 16:52:13 +0100
committerSami Shalayel <sami.shalayel@qt.io>2024-12-12 18:20:55 +0100
commit37f69c43412a21c2419d1569ba834f273dced074 (patch)
tree828a3411ed31c5f7f0fcbfd7ee8f9dff5ba0c471
parent94a481d433284b3c22df997c540513cb868c8dc6 (diff)
qmlls: fix go to definition going to build folder
Amends b1ff6073a7247c921e20cd98b2e3297e7368681b that does not find resource files of QML Modules that are not the main QML Module: use all available .qrc files in the build directory when doing operations like "go to definition". Also search for hidden folders, because .qrc files tend to be nested inside of .qt or .rcc folders. Add a test when going to the defition of a QML file defined in a different module. Pick-to: 6.8 6.9 Fixes: QTCREATORBUG-31881 Fixes: QTBUG-131920 Change-Id: I751e2cd2d1a9867459226e4f884eb1da5c1f9436 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qmlcompiler/qqmljsutils.cpp24
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/Main.qml6
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml3
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/qmake_testapp.qrc5
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/testapp_raw_qml_0.qrc5
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/Main.qml6
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/qmldir3
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/MyModule_raw_qml_0.qrc5
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/qmake_MyModule.qrc5
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/MyItem.qml3
-rw-r--r--tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/qmldir4
-rw-r--r--tests/auto/qmlls/utils/tst_qmlls_utils.cpp24
12 files changed, 67 insertions, 26 deletions
diff --git a/src/qmlcompiler/qqmljsutils.cpp b/src/qmlcompiler/qqmljsutils.cpp
index 2fc0564edc..ad8a14944f 100644
--- a/src/qmlcompiler/qqmljsutils.cpp
+++ b/src/qmlcompiler/qqmljsutils.cpp
@@ -248,30 +248,14 @@ bool canCompareWithQUrl(
return lhsType == typeResolver->urlType() && rhsType == typeResolver->urlType();
}
-static QVarLengthArray<QString, 2> resourceFoldersFromBuildFolder(const QString &buildFolder)
-{
- QVarLengthArray<QString, 2> result;
- const QDir dir(buildFolder);
- if (dir.exists(u".rcc"_s)) {
- result.append(dir.filePath(u".rcc"_s));
- }
- if (dir.exists(u".qt/rcc"_s)) {
- result.append(dir.filePath(u".qt/rcc"_s));
- }
- return result;
-}
-
-
QStringList QQmlJSUtils::resourceFilesFromBuildFolders(const QStringList &buildFolders)
{
QStringList result;
for (const QString &path : buildFolders) {
- for (const QString &resourceFolder : resourceFoldersFromBuildFolder(path)) {
- QDirIterator it(resourceFolder, QStringList{ u"*.qrc"_s }, QDir::Files,
- QDirIterator::Subdirectories);
- while (it.hasNext()) {
- result.append(it.next());
- }
+ QDirIterator it(path, QStringList{ u"*.qrc"_s }, QDir::Files | QDir::Hidden,
+ QDirIterator::Subdirectories);
+ while (it.hasNext()) {
+ result.append(it.next());
}
}
return result;
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/Main.qml b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/Main.qml
new file mode 100644
index 0000000000..dd96763569
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/Main.qml
@@ -0,0 +1,6 @@
+import QtQuick
+import MyModule
+
+Item {
+ MyItem {}
+}
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml
new file mode 100644
index 0000000000..3052615aef
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml
@@ -0,0 +1,3 @@
+import QtQuick
+
+Item {}
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/qmake_testapp.qrc b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/qmake_testapp.qrc
new file mode 100644
index 0000000000..def147c016
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/qmake_testapp.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/TestApp">
+ <file alias="qmldir">../../TestApp/qmldir</file>
+ </qresource>
+</RCC>
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/testapp_raw_qml_0.qrc b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/testapp_raw_qml_0.qrc
new file mode 100644
index 0000000000..a5fb4a1973
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/testapp_raw_qml_0.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/TestApp/">
+ <file alias="Main.qml">../../../TestApp/Main.qml</file>
+ </qresource>
+</RCC>
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/Main.qml b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/Main.qml
new file mode 100644
index 0000000000..dd96763569
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/Main.qml
@@ -0,0 +1,6 @@
+import QtQuick
+import MyModule
+
+Item {
+ MyItem {}
+}
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/qmldir b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/qmldir
new file mode 100644
index 0000000000..e256072077
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/qmldir
@@ -0,0 +1,3 @@
+module testapp
+prefer :/testapp/
+Main 1.0 Main.qml
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/MyModule_raw_qml_0.qrc b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/MyModule_raw_qml_0.qrc
new file mode 100644
index 0000000000..01307e1549
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/MyModule_raw_qml_0.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/MyModule/">
+ <file alias="MyItem.qml">../../../../../../TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml</file>
+ </qresource>
+</RCC>
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/qmake_MyModule.qrc b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/qmake_MyModule.qrc
new file mode 100644
index 0000000000..3454fb1120
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/qmake_MyModule.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/MyModule">
+ <file alias="qmldir">../../qmldir</file>
+ </qresource>
+</RCC>
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/MyItem.qml b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/MyItem.qml
new file mode 100644
index 0000000000..3052615aef
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/MyItem.qml
@@ -0,0 +1,3 @@
+import QtQuick
+
+Item {}
diff --git a/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/qmldir b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/qmldir
new file mode 100644
index 0000000000..00d7d2d118
--- /dev/null
+++ b/tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/qmldir
@@ -0,0 +1,4 @@
+module MyModule
+typeinfo MyModule.qmltypes
+prefer :/MyModule/
+MyItem 254.0 MyItem.qml
diff --git a/tests/auto/qmlls/utils/tst_qmlls_utils.cpp b/tests/auto/qmlls/utils/tst_qmlls_utils.cpp
index a51d7a23b6..df45256008 100644
--- a/tests/auto/qmlls/utils/tst_qmlls_utils.cpp
+++ b/tests/auto/qmlls/utils/tst_qmlls_utils.cpp
@@ -1819,11 +1819,11 @@ void tst_qmlls_utils::findDefinitionFromLocation_data()
QTest::addColumn<int>("expectedLine");
QTest::addColumn<int>("expectedCharacter");
QTest::addColumn<size_t>("expectedLength");
- QTest::addColumn<QString>("extraBuildDir");
+ QTest::addColumn<QStringList>("extraBuildDirs");
const QString JSDefinitionsQml = testFile(u"JSDefinitions.qml"_s);
const QString BaseTypeQml = testFile(u"BaseType.qml"_s);
- const QString noExtraBuildDir;
+ const QStringList noExtraBuildDir;
QTest::addRow("JSIdentifierX")
<< JSDefinitionsQml << 14 << 11 << JSDefinitionsQml << 13 << 13 << strlen("x") << noExtraBuildDir;
@@ -1959,10 +1959,22 @@ void tst_qmlls_utils::findDefinitionFromLocation_data()
const QString myComponentQml = testFile(u"findDefinition/mymodule-source/MyModule/X/Y/Z/MyComponent.qml"_s);
QTest::addRow("nestedFromOwnModule") << mainQml << 4 << 5 << myComponentQml << 3 << 1
- << strlen("Item") << testFile(u"findDefinition/mymodule-build"_s);
+ << strlen("Item") << QStringList { testFile(u"findDefinition/mymodule-build"_s) };
QTest::addRow("nestedFromOwnModuleWithoutQmldirPrefer") << mainQml << 4 << 5 << myComponentQml << 3 << 1
<< strlen("Item")
- << testFile(u"findDefinition/mymodule-build-without-qmldir-prefer"_s);
+ << QStringList { testFile(u"findDefinition/mymodule-build-without-qmldir-prefer"_s) };
+ }
+
+ {
+ const QString mainQml = testFile(u"findDefinition/TestAppWithBuildFolder/TestApp/Main.qml"_s);
+ const QString myComponentQml = testFile(u"findDefinition/TestAppWithBuildFolder/TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml"_s);
+ QTest::addRow("componentFromOtherModule")
+ << mainQml << 5 << 8 << myComponentQml << 3 << 1 << strlen("Item")
+ << QStringList{
+ testFile(u"findDefinition/TestAppWithBuildFolder/build"_s),
+ testFile(
+ u"findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder"_s)
+ };
}
}
@@ -1975,7 +1987,7 @@ void tst_qmlls_utils::findDefinitionFromLocation()
QFETCH(int, expectedLine);
QFETCH(int, expectedCharacter);
QFETCH(size_t, expectedLength);
- QFETCH(QString, extraBuildDir);
+ QFETCH(QStringList, extraBuildDirs);
if (expectedLine == -1)
expectedLine = line;
@@ -1988,7 +2000,7 @@ void tst_qmlls_utils::findDefinitionFromLocation()
Q_ASSERT(expectedLine > 0);
Q_ASSERT(expectedCharacter > 0);
- auto [env, file] = createEnvironmentAndLoadFile(filePath, QStringList { extraBuildDir });
+ auto [env, file] = createEnvironmentAndLoadFile(filePath, extraBuildDirs);
auto locations = QQmlLSUtils::itemsFromTextLocation(
file.field(QQmlJS::Dom::Fields::currentItem), line - 1, character - 1);