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: <christiaan.janssen@qt.io>
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@qt.io>
This commit is contained in:
Erik Verbruggen
2021-02-26 14:33:34 +01:00
committed by Erik Verbruggen
parent 6a838d7c3c
commit 2361f26732
6 changed files with 50 additions and 10 deletions

View File

@@ -658,13 +658,13 @@ void CMakeBuildSystem::updateProjectData()
QtSupport::CppKitInfo kitInfo(kit()); QtSupport::CppKitInfo kitInfo(kit());
QTC_ASSERT(kitInfo.isValid(), return ); QTC_ASSERT(kitInfo.isValid(), return );
{
QString errorMessage; QString errorMessage;
RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage); RawProjectParts rpps = m_reader.createRawProjectParts(errorMessage);
if (!errorMessage.isEmpty()) if (!errorMessage.isEmpty())
cmakeBuildConfiguration()->setError(errorMessage); cmakeBuildConfiguration()->setError(errorMessage);
qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage; qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage;
{
for (RawProjectPart &rpp : rpps) { for (RawProjectPart &rpp : rpps) {
rpp.setQtVersion( rpp.setQtVersion(
kitInfo.projectPartQtVersion); // TODO: Check if project actually uses Qt. kitInfo.projectPartQtVersion); // TODO: Check if project actually uses Qt.
@@ -682,7 +682,18 @@ void CMakeBuildSystem::updateProjectData()
m_cppCodeModelUpdater->update({p, kitInfo, cmakeBuildConfiguration()->environment(), rpps}); 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(); emit cmakeBuildConfiguration()->buildTypeChanged();
@@ -1176,7 +1187,7 @@ QList<ProjectExplorer::ExtraCompiler *> CMakeBuildSystem::findExtraCompilers()
return extraCompilers; return extraCompilers;
} }
void CMakeBuildSystem::updateQmlJSCodeModel() void CMakeBuildSystem::updateQmlJSCodeModel(const QStringList &extraHeaderPaths)
{ {
QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance();
@@ -1199,6 +1210,10 @@ void CMakeBuildSystem::updateQmlJSCodeModel()
addImports(cmakeImports); addImports(cmakeImports);
addImports(kit()->value(QtSupport::KitQmlImportPath::id()).toString()); 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, project()->setProjectLanguage(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID,
!projectInfo.sourceFiles.isEmpty()); !projectInfo.sourceFiles.isEmpty());
modelManager->updateProjectInfo(projectInfo, p); modelManager->updateProjectInfo(projectInfo, p);

View File

@@ -140,7 +140,7 @@ private:
void updateProjectData(); void updateProjectData();
void updateFallbackProjectData(); void updateFallbackProjectData();
QList<ProjectExplorer::ExtraCompiler *> findExtraCompilers(); QList<ProjectExplorer::ExtraCompiler *> findExtraCompilers();
void updateQmlJSCodeModel(); void updateQmlJSCodeModel(const QStringList &extraHeaderPaths);
void handleParsingSucceeded(); void handleParsingSucceeded();
void handleParsingFailed(const QString &msg); void handleParsingFailed(const QString &msg);

View File

@@ -680,10 +680,12 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc
k->setDeviceTypeForIcon(DEVICE_TYPE); k->setDeviceTypeForIcon(DEVICE_TYPE);
k->setValue(QtSupport::SuppliesQtQuickImportPath::id(), true); k->setValue(QtSupport::SuppliesQtQuickImportPath::id(), true);
k->setValue(QtSupport::KitQmlImportPath::id(), QVariant(sdkPath + "/include/qul")); k->setValue(QtSupport::KitQmlImportPath::id(), QVariant(sdkPath + "/include/qul"));
k->setValue(QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), true);
QSet<Id> irrelevant = { QSet<Id> irrelevant = {
SysRootKitAspect::id(), SysRootKitAspect::id(),
QtSupport::SuppliesQtQuickImportPath::id(), QtSupport::SuppliesQtQuickImportPath::id(),
QtSupport::KitQmlImportPath::id() QtSupport::KitQmlImportPath::id(),
QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(),
}; };
if (!kitNeedsQtVersion()) if (!kitNeedsQtVersion())
irrelevant.insert(QtSupport::QtKitAspect::id()); 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 // Fix kit dependencies for known targets

View File

@@ -474,4 +474,9 @@ Id KitQmlImportPath::id()
return QtSupport::Constants::KIT_QML_IMPORT_PATH; return QtSupport::Constants::KIT_QML_IMPORT_PATH;
} }
Id KitHasMergedHeaderPathsWithQmlImportPaths::id()
{
return QtSupport::Constants::KIT_HAS_MERGED_HEADER_PATHS_WITH_QML_IMPORT_PATHS;
}
} // namespace QtSupport } // namespace QtSupport

View File

@@ -95,4 +95,10 @@ public:
static Utils::Id id(); static Utils::Id id();
}; };
class QTSUPPORT_EXPORT KitHasMergedHeaderPathsWithQmlImportPaths
{
public:
static Utils::Id id();
};
} // namespace QtSupport } // namespace QtSupport

View File

@@ -58,6 +58,8 @@ const char FEATURE_DESKTOP[] = "QtSupport.Wizards.FeatureDesktop";
// Kit flags // Kit flags
const char FLAGS_SUPPLIES_QTQUICK_IMPORT_PATH[] = "QtSupport.SuppliesQtQuickImportPath"; const char FLAGS_SUPPLIES_QTQUICK_IMPORT_PATH[] = "QtSupport.SuppliesQtQuickImportPath";
const char KIT_QML_IMPORT_PATH[] = "QtSupport.KitQmlImportPath"; const char KIT_QML_IMPORT_PATH[] = "QtSupport.KitQmlImportPath";
const char KIT_HAS_MERGED_HEADER_PATHS_WITH_QML_IMPORT_PATHS[] =
"QtSupport.KitHasMergedHeaderPathsWithQmlImportPaths";
} // namepsace Constants } // namepsace Constants
} // namepsace QtSupport } // namepsace QtSupport