From 2361f267322ba30694b4ab6c25f5062a5a3ace03 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Fri, 26 Feb 2021 14:33:34 +0100 Subject: [PATCH] Support merged QML import paths with header paths QUL does not have separate QML import paths, but (re-)uses the include paths for this purpose. Support this behavior by adding all include paths to the QML import paths before handing the project information off to the QML code model. Change-Id: Ic2e39ab69ac27776f5070b7b8b7c66d53a83210b Reviewed-by: Reviewed-by: Fawzi Mohamed --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 31 ++++++++++++++----- .../cmakeprojectmanager/cmakebuildsystem.h | 2 +- src/plugins/mcusupport/mcusupportoptions.cpp | 14 ++++++++- src/plugins/qtsupport/qtkitinformation.cpp | 5 +++ src/plugins/qtsupport/qtkitinformation.h | 6 ++++ src/plugins/qtsupport/qtsupportconstants.h | 2 ++ 6 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 044d1ab3728..e8c3bd3700f 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -658,13 +658,13 @@ void CMakeBuildSystem::updateProjectData() QtSupport::CppKitInfo kitInfo(kit()); QTC_ASSERT(kitInfo.isValid(), return ); - { - QString errorMessage; - RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage); - if (!errorMessage.isEmpty()) - cmakeBuildConfiguration()->setError(errorMessage); - qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage; + QString errorMessage; + RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage); + if (!errorMessage.isEmpty()) + cmakeBuildConfiguration()->setError(errorMessage); + qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage; + { for (RawProjectPart &rpp : rpps) { rpp.setQtVersion( kitInfo.projectPartQtVersion); // TODO: Check if project actually uses Qt. @@ -682,7 +682,18 @@ void CMakeBuildSystem::updateProjectData() m_cppCodeModelUpdater->update({p, kitInfo, cmakeBuildConfiguration()->environment(), rpps}); } { - updateQmlJSCodeModel(); + const bool mergedHeaderPathsAndQmlImportPaths = kit()->value( + QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), false).toBool(); + QStringList extraHeaderPaths; + for (const RawProjectPart &rpp : qAsConst(rpps)) { + if (mergedHeaderPathsAndQmlImportPaths) { + for (const auto &headerPath : rpp.headerPaths) { + if (headerPath.type == HeaderPathType::User) + extraHeaderPaths.append(headerPath.path); + } + } + } + updateQmlJSCodeModel(extraHeaderPaths); } emit cmakeBuildConfiguration()->buildTypeChanged(); @@ -1176,7 +1187,7 @@ QList CMakeBuildSystem::findExtraCompilers() return extraCompilers; } -void CMakeBuildSystem::updateQmlJSCodeModel() +void CMakeBuildSystem::updateQmlJSCodeModel(const QStringList &extraHeaderPaths) { QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); @@ -1199,6 +1210,10 @@ void CMakeBuildSystem::updateQmlJSCodeModel() addImports(cmakeImports); addImports(kit()->value(QtSupport::KitQmlImportPath::id()).toString()); + for (const QString &extraHeaderPath : extraHeaderPaths) + projectInfo.importPaths.maybeInsert(FilePath::fromString(extraHeaderPath), + QmlJS::Dialect::Qml); + project()->setProjectLanguage(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID, !projectInfo.sourceFiles.isEmpty()); modelManager->updateProjectInfo(projectInfo, p); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index 00740feaa0a..069321e5cfa 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -140,7 +140,7 @@ private: void updateProjectData(); void updateFallbackProjectData(); QList findExtraCompilers(); - void updateQmlJSCodeModel(); + void updateQmlJSCodeModel(const QStringList &extraHeaderPaths); void handleParsingSucceeded(); void handleParsingFailed(const QString &msg); diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index cfb3dcc3643..698182f2ed2 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -680,10 +680,12 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc k->setDeviceTypeForIcon(DEVICE_TYPE); k->setValue(QtSupport::SuppliesQtQuickImportPath::id(), true); k->setValue(QtSupport::KitQmlImportPath::id(), QVariant(sdkPath + "/include/qul")); + k->setValue(QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), true); QSet irrelevant = { SysRootKitAspect::id(), QtSupport::SuppliesQtQuickImportPath::id(), - QtSupport::KitQmlImportPath::id() + QtSupport::KitQmlImportPath::id(), + QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), }; if (!kitNeedsQtVersion()) irrelevant.insert(QtSupport::QtKitAspect::id()); @@ -1027,6 +1029,16 @@ void McuSupportOptions::fixExistingKits() } } } + + // Check if the MCU kit has the flag for merged header/qml-import paths set. + const auto mergedPaths = QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(); + if (!irrelevantAspects.contains(mergedPaths)) { + irrelevantAspects.insert(mergedPaths); + kit->setIrrelevantAspects(irrelevantAspects); + } + if (!kit->value(mergedPaths, false).toBool()) { + kit->setValue(mergedPaths, true); + } } // Fix kit dependencies for known targets diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 255aa2d949e..4c4fb479f85 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -474,4 +474,9 @@ Id KitQmlImportPath::id() return QtSupport::Constants::KIT_QML_IMPORT_PATH; } +Id KitHasMergedHeaderPathsWithQmlImportPaths::id() +{ + return QtSupport::Constants::KIT_HAS_MERGED_HEADER_PATHS_WITH_QML_IMPORT_PATHS; +} + } // namespace QtSupport diff --git a/src/plugins/qtsupport/qtkitinformation.h b/src/plugins/qtsupport/qtkitinformation.h index bf6f9a58c2f..0080abb947e 100644 --- a/src/plugins/qtsupport/qtkitinformation.h +++ b/src/plugins/qtsupport/qtkitinformation.h @@ -95,4 +95,10 @@ public: static Utils::Id id(); }; +class QTSUPPORT_EXPORT KitHasMergedHeaderPathsWithQmlImportPaths +{ +public: + static Utils::Id id(); +}; + } // namespace QtSupport diff --git a/src/plugins/qtsupport/qtsupportconstants.h b/src/plugins/qtsupport/qtsupportconstants.h index 5837d1ade42..da0f01ba1ef 100644 --- a/src/plugins/qtsupport/qtsupportconstants.h +++ b/src/plugins/qtsupport/qtsupportconstants.h @@ -58,6 +58,8 @@ const char FEATURE_DESKTOP[] = "QtSupport.Wizards.FeatureDesktop"; // Kit flags const char FLAGS_SUPPLIES_QTQUICK_IMPORT_PATH[] = "QtSupport.SuppliesQtQuickImportPath"; const char KIT_QML_IMPORT_PATH[] = "QtSupport.KitQmlImportPath"; +const char KIT_HAS_MERGED_HEADER_PATHS_WITH_QML_IMPORT_PATHS[] = + "QtSupport.KitHasMergedHeaderPathsWithQmlImportPaths"; } // namepsace Constants } // namepsace QtSupport