From 37f69c43412a21c2419d1569ba834f273dced074 Mon Sep 17 00:00:00 2001 From: Sami Shalayel Date: Thu, 5 Dec 2024 16:52:13 +0100 Subject: [PATCH] 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 --- src/qmlcompiler/qqmljsutils.cpp | 24 ++++--------------- .../TestAppWithBuildFolder/TestApp/Main.qml | 6 +++++ .../anothersubfolder/MyModule/MyItem.qml | 3 +++ .../build/.qt/rcc/qmake_testapp.qrc | 5 ++++ .../build/.qt/rcc/testapp_raw_qml_0.qrc | 5 ++++ .../build/TestApp/Main.qml | 6 +++++ .../build/TestApp/qmldir | 3 +++ .../MyModule/.qt/rcc/MyModule_raw_qml_0.qrc | 5 ++++ .../MyModule/.qt/rcc/qmake_MyModule.qrc | 5 ++++ .../anothersubfolder/MyModule/MyItem.qml | 3 +++ .../anothersubfolder/MyModule/qmldir | 4 ++++ tests/auto/qmlls/utils/tst_qmlls_utils.cpp | 24 ++++++++++++++----- 12 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/Main.qml create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/qmake_testapp.qrc create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/.qt/rcc/testapp_raw_qml_0.qrc create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/Main.qml create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/TestApp/qmldir create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/MyModule_raw_qml_0.qrc create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/.qt/rcc/qmake_MyModule.qrc create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/MyItem.qml create mode 100644 tests/auto/qmlls/utils/data/findDefinition/TestAppWithBuildFolder/build/somesubfolder/anothersubfolder/MyModule/qmldir 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 resourceFoldersFromBuildFolder(const QString &buildFolder) -{ - QVarLengthArray 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 @@ + + + ../../TestApp/qmldir + + 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 @@ + + + ../../../TestApp/Main.qml + + 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 @@ + + + ../../../../../../TestApp/somesubfolder/anothersubfolder/MyModule/MyItem.qml + + 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 @@ + + + ../../qmldir + + 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("expectedLine"); QTest::addColumn("expectedCharacter"); QTest::addColumn("expectedLength"); - QTest::addColumn("extraBuildDir"); + QTest::addColumn("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);