ClangCodeModel: Use clangd's include path

... rather than the one from the LLVM that Qt Creator was compiled
against.

Task-number: QTCREATORBUG-27120
Change-Id: I4f211345ed547cd13f0b0774b99bc0f199a9cd44
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2022-05-09 16:16:51 +02:00
parent 56576ad319
commit b5b9b7e32c
5 changed files with 23 additions and 14 deletions

View File

@@ -86,7 +86,8 @@ void ClangCodeModelPlugin::generateCompilationDB()
= QtConcurrent::run(&Internal::generateCompilationDB, projectInfo, = QtConcurrent::run(&Internal::generateCompilationDB, projectInfo,
projectInfo->buildRoot(), CompilationDbPurpose::Project, projectInfo->buildRoot(), CompilationDbPurpose::Project,
warningsConfig, warningsConfig,
optionsForProject(target->project(), warningsConfig)); optionsForProject(target->project(), warningsConfig),
FilePath());
Core::ProgressManager::addTask(task, tr("Generating Compilation DB"), "generate compilation db"); Core::ProgressManager::addTask(task, tr("Generating Compilation DB"), "generate compilation db");
m_generatorWatcher.setFuture(task); m_generatorWatcher.setFuture(task);
} }

View File

@@ -1492,10 +1492,12 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
setQuickFixAssistProvider(new ClangdQuickFixProvider(this)); setQuickFixAssistProvider(new ClangdQuickFixProvider(this));
if (!project) { if (!project) {
QJsonObject initOptions; QJsonObject initOptions;
const Utils::FilePath includeDir
= CppEditor::ClangdSettings(d->settings).clangdIncludePath();
const CppEditor::ClangDiagnosticConfig warningsConfig = warningsConfigForProject(nullptr); const CppEditor::ClangDiagnosticConfig warningsConfig = warningsConfigForProject(nullptr);
CppEditor::CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder( CppEditor::CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder(
*CppEditor::CppModelManager::instance()->fallbackProjectPart(), *CppEditor::CppModelManager::instance()->fallbackProjectPart(),
warningsConfig); warningsConfig, includeDir);
const CppEditor::UsePrecompiledHeaders usePch = CppEditor::getPchUsage(); const CppEditor::UsePrecompiledHeaders usePch = CppEditor::getPchUsage();
const QJsonArray projectPartOptions = fullProjectPartOptions( const QJsonArray projectPartOptions = fullProjectPartOptions(
optionsBuilder, optionsForProject(nullptr, warningsConfig)); optionsBuilder, optionsForProject(nullptr, warningsConfig));
@@ -1918,9 +1920,10 @@ void ClangdClient::updateParserConfig(const Utils::FilePath &filePath,
if (!projectPart) if (!projectPart)
return; return;
QJsonObject cdbChanges; QJsonObject cdbChanges;
const Utils::FilePath includeDir = CppEditor::ClangdSettings(d->settings).clangdIncludePath();
const CppEditor::ClangDiagnosticConfig warningsConfig = warningsConfigForProject(project()); const CppEditor::ClangDiagnosticConfig warningsConfig = warningsConfigForProject(project());
CppEditor::CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder(*projectPart, CppEditor::CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder(
warningsConfig); *projectPart, warningsConfig, includeDir);
const CppEditor::ProjectFile file(filePath.toString(), const CppEditor::ProjectFile file(filePath.toString(),
CppEditor::ProjectFile::classify(filePath.toString())); CppEditor::ProjectFile::classify(filePath.toString()));
const QJsonArray projectPartOptions = fullProjectPartOptions( const QJsonArray projectPartOptions = fullProjectPartOptions(

View File

@@ -310,7 +310,8 @@ void ClangModelManagerSupport::connectToWidgetsMarkContextMenuRequested(QWidget
void ClangModelManagerSupport::updateLanguageClient( void ClangModelManagerSupport::updateLanguageClient(
ProjectExplorer::Project *project, const CppEditor::ProjectInfo::ConstPtr &projectInfo) ProjectExplorer::Project *project, const CppEditor::ProjectInfo::ConstPtr &projectInfo)
{ {
if (!CppEditor::ClangdProjectSettings(project).settings().useClangd) const ClangdSettings::Data clangdSettingsData = ClangdProjectSettings(project).settings();
if (!clangdSettingsData.useClangd)
return; return;
const auto getJsonDbDir = [project] { const auto getJsonDbDir = [project] {
if (const ProjectExplorer::Target * const target = project->activeTarget()) { if (const ProjectExplorer::Target * const target = project->activeTarget()) {
@@ -419,10 +420,12 @@ void ClangModelManagerSupport::updateLanguageClient(
}); });
}); });
const Utils::FilePath includeDir = ClangdSettings(clangdSettingsData).clangdIncludePath();
const ClangDiagnosticConfig warningsConfig = warningsConfigForProject(project); const ClangDiagnosticConfig warningsConfig = warningsConfigForProject(project);
auto future = Utils::runAsync(&Internal::generateCompilationDB, projectInfo, jsonDbDir, auto future = Utils::runAsync(&Internal::generateCompilationDB, projectInfo, jsonDbDir,
CompilationDbPurpose::CodeModel, CompilationDbPurpose::CodeModel,
warningsConfig, optionsForProject(project, warningsConfig)); warningsConfig, optionsForProject(project, warningsConfig),
includeDir);
generatorWatcher->setFuture(future); generatorWatcher->setFuture(future);
m_generatorSynchronizer.addFuture(future); m_generatorSynchronizer.addFuture(future);
} }

View File

@@ -172,7 +172,8 @@ GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo::
const Utils::FilePath &baseDir, const Utils::FilePath &baseDir,
CompilationDbPurpose purpose, CompilationDbPurpose purpose,
const ClangDiagnosticConfig &warningsConfig, const ClangDiagnosticConfig &warningsConfig,
const QStringList &projectOptions) const QStringList &projectOptions,
const FilePath &clangIncludeDir)
{ {
QTC_ASSERT(!baseDir.isEmpty(), return GenerateCompilationDbResult(QString(), QTC_ASSERT(!baseDir.isEmpty(), return GenerateCompilationDbResult(QString(),
QCoreApplication::translate("ClangUtils", "Could not retrieve build directory."))); QCoreApplication::translate("ClangUtils", "Could not retrieve build directory.")));
@@ -192,8 +193,8 @@ GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo::
const QJsonArray jsonProjectOptions = QJsonArray::fromStringList(projectOptions); const QJsonArray jsonProjectOptions = QJsonArray::fromStringList(projectOptions);
for (ProjectPart::ConstPtr projectPart : projectInfo->projectParts()) { for (ProjectPart::ConstPtr projectPart : projectInfo->projectParts()) {
QStringList args; QStringList args;
const CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder(*projectPart, const CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder(
warningsConfig); *projectPart, warningsConfig, clangIncludeDir);
QJsonArray ppOptions; QJsonArray ppOptions;
if (purpose == CompilationDbPurpose::Project) { if (purpose == CompilationDbPurpose::Project) {
args = projectPartArguments(*projectPart); args = projectPartArguments(*projectPart);
@@ -370,13 +371,12 @@ QString textUntilPreviousStatement(TextEditor::TextDocumentManipulatorInterface
} }
CompilerOptionsBuilder clangOptionsBuilder(const ProjectPart &projectPart, CompilerOptionsBuilder clangOptionsBuilder(const ProjectPart &projectPart,
const ClangDiagnosticConfig &warningsConfig) const ClangDiagnosticConfig &warningsConfig,
const Utils::FilePath &clangIncludeDir)
{ {
const auto useBuildSystemWarnings = warningsConfig.useBuildSystemWarnings() const auto useBuildSystemWarnings = warningsConfig.useBuildSystemWarnings()
? UseBuildSystemWarnings::Yes ? UseBuildSystemWarnings::Yes
: UseBuildSystemWarnings::No; : UseBuildSystemWarnings::No;
const FilePath clangIncludeDir = Core::ICore::clangIncludeDirectory(
QString(CLANG_VERSION), FilePath(CLANG_INCLUDE_DIR));
CompilerOptionsBuilder optionsBuilder(projectPart, UseSystemHeader::No, CompilerOptionsBuilder optionsBuilder(projectPart, UseSystemHeader::No,
UseTweakedHeaderPaths::Yes, UseLanguageDefines::No, UseTweakedHeaderPaths::Yes, UseLanguageDefines::No,
useBuildSystemWarnings, clangIncludeDir); useBuildSystemWarnings, clangIncludeDir);

View File

@@ -57,7 +57,8 @@ const QStringList optionsForProject(ProjectExplorer::Project *project,
CppEditor::CompilerOptionsBuilder clangOptionsBuilder( CppEditor::CompilerOptionsBuilder clangOptionsBuilder(
const CppEditor::ProjectPart &projectPart, const CppEditor::ProjectPart &projectPart,
const CppEditor::ClangDiagnosticConfig &warningsConfig); const CppEditor::ClangDiagnosticConfig &warningsConfig,
const Utils::FilePath &clangIncludeDir);
QJsonArray projectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder); QJsonArray projectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder);
QJsonArray fullProjectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder, QJsonArray fullProjectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder,
const QStringList &projectOptions); const QStringList &projectOptions);
@@ -89,7 +90,8 @@ public:
enum class CompilationDbPurpose { Project, CodeModel }; enum class CompilationDbPurpose { Project, CodeModel };
GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo::ConstPtr projectInfo, GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo::ConstPtr projectInfo,
const Utils::FilePath &baseDir, CompilationDbPurpose purpose, const Utils::FilePath &baseDir, CompilationDbPurpose purpose,
const CppEditor::ClangDiagnosticConfig &warningsConfig, const QStringList &projectOptions); const CppEditor::ClangDiagnosticConfig &warningsConfig, const QStringList &projectOptions,
const Utils::FilePath &clangIncludeDir);
class DiagnosticTextInfo class DiagnosticTextInfo
{ {