From 9d90efee8ba2bd61756cadb27ddb1f464e6aa872 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Fri, 26 Feb 2021 14:22:42 +0100 Subject: [PATCH] Add QML import path supplied by the kit Although QUL has merged the QML import paths and the include paths, the convention for C/C++ is to have the headers for a project under a subdirectory of the include path, and do imports relative to the include path. For example: #include The QML code model doesn't know about this convention, so for the kit has to supply an extra QML import path for this case. Change-Id: I82d4375dd8a1f510180f81b011a715dee8c10d60 Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 10 ++++-- src/plugins/mcusupport/mcusupportoptions.cpp | 31 +++++++++++++++++-- src/plugins/qtsupport/qtkitinformation.cpp | 5 +++ src/plugins/qtsupport/qtkitinformation.h | 6 ++++ src/plugins/qtsupport/qtsupportconstants.h | 1 + 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 73c21babb9e..ed53c8191e0 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1188,11 +1188,15 @@ void CMakeBuildSystem::updateQmlJSCodeModel() projectInfo.importPaths.clear(); + auto addImports = [&projectInfo](const QString &imports) { + foreach (const QString &import, CMakeConfigItem::cmakeSplitValue(imports)) + projectInfo.importPaths.maybeInsert(FilePath::fromString(import), QmlJS::Dialect::Qml); + }; + const CMakeConfig &cm = cmakeBuildConfiguration()->configurationFromCMake(); const QString cmakeImports = QString::fromUtf8(CMakeConfigItem::valueOf("QML_IMPORT_PATH", cm)); - - foreach (const QString &cmakeImport, CMakeConfigItem::cmakeSplitValue(cmakeImports)) - projectInfo.importPaths.maybeInsert(FilePath::fromString(cmakeImport), QmlJS::Dialect::Qml); + addImports(cmakeImports); + addImports(kit()->value(QtSupport::KitQmlImportPath::id()).toString()); project()->setProjectLanguage(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID, !projectInfo.sourceFiles.isEmpty()); diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index a6c046dacce..a1b5ec219f1 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -660,7 +661,8 @@ FilePath McuSupportOptions::qulDirFromSettings() QSettings::UserScope)); } -static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mcuTarget) +static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mcuTarget, + const QString &sdkPath) { using namespace Constants; @@ -677,7 +679,12 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc if (mcuTarget->toolChainPackage()->isDesktopToolchain()) k->setDeviceTypeForIcon(DEVICE_TYPE); k->setValue(QtSupport::SuppliesQtQuickImportPath::id(), true); - QSet irrelevant = { SysRootKitAspect::id(), QtSupport::SuppliesQtQuickImportPath::id() }; + k->setValue(QtSupport::KitQmlImportPath::id(), QVariant(sdkPath + "/include/qul")); + QSet irrelevant = { + SysRootKitAspect::id(), + QtSupport::SuppliesQtQuickImportPath::id(), + QtSupport::KitQmlImportPath::id() + }; if (!kitNeedsQtVersion()) irrelevant.insert(QtSupport::QtKitAspect::id()); k->setIrrelevantAspects(irrelevant); @@ -874,7 +881,7 @@ Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget, const McuPackage *qtF const auto init = [mcuTarget, qtForMCUsSdk](Kit *k) { KitGuard kitGuard(k); - setKitProperties(kitName(mcuTarget), k, mcuTarget); + setKitProperties(kitName(mcuTarget), k, mcuTarget, qtForMCUsSdk->path()); setKitDevice(k, mcuTarget); setKitToolchains(k, mcuTarget->toolChainPackage()); setKitDebugger(k, mcuTarget->toolChainPackage()); @@ -980,6 +987,24 @@ void McuSupportOptions::fixExistingKits() if (!kit->hasValue(bringsQtQuickImportPath)) { kit->setValue(bringsQtQuickImportPath, true); } + + // Check if the MCU kit supplies its import path. + const auto kitQmlImportPath = QtSupport::KitQmlImportPath::id(); + if (!irrelevantAspects.contains(kitQmlImportPath)) { + irrelevantAspects.insert(kitQmlImportPath); + kit->setIrrelevantAspects(irrelevantAspects); + } + if (!kit->hasValue(kitQmlImportPath)) { + auto config = CMakeProjectManager::CMakeConfigurationKitAspect::configuration(kit); + for (const auto &cfgItem : qAsConst(config)) { + if (cfgItem.key == "QUL_GENERATORS") { + auto idx = cfgItem.value.indexOf("/lib/cmake/Qul"); + auto qulDir = cfgItem.value.left(idx); + kit->setValue(kitQmlImportPath, QVariant(qulDir + "/include/qul")); + break; + } + } + } } } diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index a1411598f27..255aa2d949e 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -469,4 +469,9 @@ Id SuppliesQtQuickImportPath::id() return QtSupport::Constants::FLAGS_SUPPLIES_QTQUICK_IMPORT_PATH; } +Id KitQmlImportPath::id() +{ + return QtSupport::Constants::KIT_QML_IMPORT_PATH; +} + } // namespace QtSupport diff --git a/src/plugins/qtsupport/qtkitinformation.h b/src/plugins/qtsupport/qtkitinformation.h index 23427df87b4..bf6f9a58c2f 100644 --- a/src/plugins/qtsupport/qtkitinformation.h +++ b/src/plugins/qtsupport/qtkitinformation.h @@ -89,4 +89,10 @@ public: static Utils::Id id(); }; +class QTSUPPORT_EXPORT KitQmlImportPath +{ +public: + static Utils::Id id(); +}; + } // namespace QtSupport diff --git a/src/plugins/qtsupport/qtsupportconstants.h b/src/plugins/qtsupport/qtsupportconstants.h index ea921295d62..5837d1ade42 100644 --- a/src/plugins/qtsupport/qtsupportconstants.h +++ b/src/plugins/qtsupport/qtsupportconstants.h @@ -57,6 +57,7 @@ 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"; } // namepsace Constants } // namepsace QtSupport