diff options
| author | Sami Shalayel <sami.shalayel@qt.io> | 2024-12-05 16:52:13 +0100 |
|---|---|---|
| committer | Sami Shalayel <sami.shalayel@qt.io> | 2024-12-12 18:20:55 +0100 |
| commit | 37f69c43412a21c2419d1569ba834f273dced074 (patch) | |
| tree | 828a3411ed31c5f7f0fcbfd7ee8f9dff5ba0c471 | |
| parent | 94a481d433284b3c22df997c540513cb868c8dc6 (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>
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); |
