diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp index 776e6eb97a8..10363150dc1 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp @@ -464,6 +464,33 @@ void addType(Storage::Synchronization::Types &types, tracer.end(keyValue("type", type)); } +using namespace Qt::StringLiterals; + +constexpr auto skipLists = std::make_tuple( + std::pair{"QtQuick.Templates-cppnative"sv, std::array{"QQuickItem"_L1}}); + +std::span getSkipList(std::string_view moduleName) +{ + static constexpr std::span emptySkipList; + auto currentSkipList = emptySkipList; + + std::apply( + [&](const auto &entry) { + if (entry.first == moduleName) + currentSkipList = entry.second; + }, + skipLists); + + return currentSkipList; +} + +bool skipType(const QQmlJSExportedScope &object, std::span skipList) +{ + return std::any_of(skipList.begin(), skipList.end(), [&](const QLatin1StringView skip) { + return object.scope->internalName() == skip; + }); +} + void addTypes(Storage::Synchronization::Types &types, const Storage::Synchronization::ProjectData &projectData, const QList &objects, @@ -473,13 +500,19 @@ void addTypes(Storage::Synchronization::Types &types, NanotraceHR::Tracer tracer{"add types"_t, category()}; types.reserve(Utils::usize(objects) + types.size()); - for (const auto &object : objects) + const auto skipList = getSkipList(storage.moduleName(projectData.moduleId)); + + for (const auto &object : objects) { + if (skipType(object, skipList)) + continue; + addType(types, projectData.sourceId, projectData.moduleId, object, storage, componentNameWithoutNamespaces); + } } } // namespace diff --git a/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp index a6b85404364..a42a560d07d 100644 --- a/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp @@ -851,4 +851,26 @@ TEST_F(QmlTypesParser, default_property) ElementsAre(Field(&Synchronization::Type::defaultPropertyName, Eq("children")))); } +TEST_F(QmlTypesParser, skip_template_item) +{ + ModuleId moduleId = storage.moduleId("QtQuick.Templates-cppnative"); + Synchronization::ProjectData projectData{qmltypesFileSourceId, + qmltypesFileSourceId, + moduleId, + Synchronization::FileType::QmlTypes}; + QString source{R"(import QtQuick.tooling 1.2 + Module{ + Component { name: "QQuickItem"} + Component { name: "QQmlComponent"}})"}; + + parser.parse(source, imports, types, projectData); + + ASSERT_THAT(types, + UnorderedElementsAre(IsType("QQmlComponent", + Synchronization::ImportedType{}, + Synchronization::ImportedType{}, + Storage::TypeTraitsKind::Reference, + qmltypesFileSourceId))); +} + } // namespace