From 861aa753b95029b22e22629756880b9b60e1e4f4 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 26 Aug 2024 17:53:54 +0200 Subject: [PATCH] ClangCodeModel: Move compilation database creation to CppEditor We'd like to re-use it elsewhere. Task-number: QTCREATORBUG-29529 Change-Id: Idafd53308218932f596d57ed5c8786720c6c0314 Reviewed-by: David Schulz --- .../clangcodemodel/clangcodemodelplugin.cpp | 10 +- src/plugins/clangcodemodel/clangdclient.cpp | 1 + src/plugins/clangcodemodel/clangutils.cpp | 180 +-------------- src/plugins/clangcodemodel/clangutils.h | 16 +- src/plugins/cppeditor/CMakeLists.txt | 1 + src/plugins/cppeditor/compilationdb.cpp | 210 ++++++++++++++++++ src/plugins/cppeditor/compilationdb.h | 43 ++++ src/plugins/cppeditor/cppeditor.qbs | 2 + 8 files changed, 269 insertions(+), 194 deletions(-) create mode 100644 src/plugins/cppeditor/compilationdb.cpp create mode 100644 src/plugins/cppeditor/compilationdb.h diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index 62ef434a2e9..8484a7ba915 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -44,6 +44,7 @@ #include using namespace Core; +using namespace CppEditor; using namespace ProjectExplorer; using namespace Utils; @@ -77,7 +78,7 @@ void ClangCodeModelPlugin::initialize() TaskHub::addCategory({Constants::TASK_CATEGORY_DIAGNOSTICS, Tr::tr("Clang Code Model"), Tr::tr("C++ code issues that Clangd found in the current document.")}); - CppEditor::CppModelManager::activateClangCodeModel(std::make_unique()); + CppModelManager::activateClangCodeModel(std::make_unique()); createCompilationDBAction(); ActionBuilder updateStaleIndexEntries(this, "ClangCodeModel.UpdateStaleIndexEntries"); @@ -102,8 +103,6 @@ void ClangCodeModelPlugin::initialize() void ClangCodeModelPlugin::generateCompilationDB() { - using namespace CppEditor; - Target *target = ProjectManager::startupTarget(); if (!target) return; @@ -169,8 +168,7 @@ void ClangCodeModelPlugin::createCompilationDBAction() "No active project."); return; } - const CppEditor::ProjectInfo::ConstPtr projectInfo = - CppEditor::CppModelManager::projectInfo(project); + const ProjectInfo::ConstPtr projectInfo = CppModelManager::projectInfo(project); if (!projectInfo || projectInfo->projectParts().isEmpty()) { MessageManager::writeDisrupting("Cannot generate compilation database: " "Project has no C/C++ project parts."); @@ -179,7 +177,7 @@ void ClangCodeModelPlugin::createCompilationDBAction() m_generateCompilationDBAction->setEnabled(false); generateCompilationDB(); }); - connect(CppEditor::CppModelManager::instance(), &CppEditor::CppModelManager::projectPartsUpdated, + connect(CppModelManager::instance(), &CppModelManager::projectPartsUpdated, this, [this](Project *project) { if (project != ProjectManager::startupProject()) return; diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 16832965b88..7c307de4ac2 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index af363183916..85c9b65a90d 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -74,79 +75,6 @@ QString diagnosticCategoryPrefixRemoved(const QString &text) return text; } -static QStringList projectPartArguments(const ProjectPart &projectPart) -{ - QStringList args; - args << projectPart.compilerFilePath.toString(); - args << "-c"; - if (projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) { - args << "--target=" + projectPart.toolchainTargetTriple; - if (projectPart.toolchainAbi.architecture() == Abi::X86Architecture) - args << QLatin1String(projectPart.toolchainAbi.wordWidth() == 64 ? "-m64" : "-m32"); - } - args << projectPart.compilerFlags; - for (const ProjectExplorer::HeaderPath &headerPath : projectPart.headerPaths) { - if (headerPath.type == ProjectExplorer::HeaderPathType::User) { - args << "-I" + headerPath.path; - } else if (headerPath.type == ProjectExplorer::HeaderPathType::System) { - args << (projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID - ? "-I" - : "-isystem") - + headerPath.path; - } - } - for (const ProjectExplorer::Macro ¯o : projectPart.projectMacros) { - args.append(QString::fromUtf8( - macro.toKeyValue(macro.type == ProjectExplorer::MacroType::Define ? "-D" : "-U"))); - } - - return args; -} - -static QJsonObject createFileObject(const FilePath &buildDir, - const QStringList &arguments, - const ProjectPart &projectPart, - const ProjectFile &projFile, - CompilationDbPurpose purpose, - const QJsonArray &projectPartOptions, - UsePrecompiledHeaders usePch, - bool clStyle) -{ - QJsonObject fileObject; - fileObject["file"] = projFile.path.toString(); - QJsonArray args; - - if (purpose == CompilationDbPurpose::Project) { - args = QJsonArray::fromStringList(arguments); - - const ProjectFile::Kind kind = ProjectFile::classify(projFile.path.path()); - if (projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID - || projectPart.toolchainType == ProjectExplorer::Constants::CLANG_CL_TOOLCHAIN_TYPEID) { - if (!ProjectFile::isObjC(kind)) { - if (ProjectFile::isC(kind)) - args.append("/TC"); - else if (ProjectFile::isCxx(kind)) - args.append("/TP"); - } - } else { - QStringList langOption - = createLanguageOptionGcc(projectPart.language, kind, - projectPart.languageExtensions - & LanguageExtension::ObjectiveC); - for (const QString &langOptionPart : langOption) - args.append(langOptionPart); - } - } else { - args = clangOptionsForFile(projFile, projectPart, projectPartOptions, usePch, clStyle); - args.prepend("clang"); // TODO: clang-cl for MSVC targets? Does it matter at all what we put here? - } - - args.append(projFile.path.toUserOutput()); - fileObject["arguments"] = args; - fileObject["directory"] = buildDir.toString(); - return fileObject; -} - void generateCompilationDB( QPromise> &promise, const QList &projectInfoList, @@ -156,55 +84,10 @@ void generateCompilationDB( const QStringList &projectOptions, const FilePath &clangIncludeDir) { - QTC_ASSERT(!baseDir.isEmpty(), - promise.addResult(make_unexpected(Tr::tr("Could not retrieve build directory."))); return); - QTC_CHECK(baseDir.ensureWritableDir()); - QFile compileCommandsFile(baseDir.pathAppended("compile_commands.json").toFSPathString()); - const bool fileOpened = compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate); - if (!fileOpened) { - promise.addResult(make_unexpected(Tr::tr("Could not create \"%1\": %2") - .arg(compileCommandsFile.fileName(), compileCommandsFile.errorString()))); - return; - } - compileCommandsFile.write("["); - - const QJsonArray jsonProjectOptions = QJsonArray::fromStringList(projectOptions); - for (const ProjectInfo::ConstPtr &projectInfo : std::as_const(projectInfoList)) { - QTC_ASSERT(projectInfo, continue); - for (ProjectPart::ConstPtr projectPart : projectInfo->projectParts()) { - QTC_ASSERT(projectPart, continue); - QStringList args; - const CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder( - *projectPart, warningsConfig, clangIncludeDir, {}); - QJsonArray ppOptions; - if (purpose == CompilationDbPurpose::Project) { - args = projectPartArguments(*projectPart); - } else { - ppOptions = fullProjectPartOptions(projectPartOptions(optionsBuilder), - jsonProjectOptions); - } - for (const ProjectFile &projFile : projectPart->files) { - if (promise.isCanceled()) - return; - const QJsonObject json - = createFileObject(baseDir, - args, - *projectPart, - projFile, - purpose, - ppOptions, - projectInfo->settings().usePrecompiledHeaders(), - optionsBuilder.isClStyle()); - if (compileCommandsFile.size() > 1) - compileCommandsFile.write(","); - compileCommandsFile.write(QJsonDocument(json).toJson(QJsonDocument::Compact)); - } - } - } - - compileCommandsFile.write("]"); - compileCommandsFile.close(); - promise.addResult(FilePath::fromUserInput(compileCommandsFile.fileName())); + return CppEditor::generateCompilationDB( + promise, projectInfoList, baseDir, purpose, projectOptions, [&](const ProjectPart &pp) { + return clangOptionsBuilder(pp, warningsConfig, clangIncludeDir, {}); + }); } FilePath currentCppEditorDocumentFilePath() @@ -266,30 +149,6 @@ QString DiagnosticTextInfo::clazyCheckName(const QString &option) return option; } -QJsonArray clangOptionsForFile(const ProjectFile &file, const ProjectPart &projectPart, - const QJsonArray &generalOptions, UsePrecompiledHeaders usePch, - bool clStyle) -{ - CompilerOptionsBuilder optionsBuilder(projectPart); - optionsBuilder.setClStyle(clStyle); - ProjectFile::Kind fileKind = file.kind; - if (fileKind == ProjectFile::AmbiguousHeader) { - fileKind = projectPart.languageVersion <= LanguageVersion::LatestC - ? ProjectFile::CHeader : ProjectFile::CXXHeader; - } - if (usePch == UsePrecompiledHeaders::Yes - && projectPart.precompiledHeaders.contains(file.path.path())) { - usePch = UsePrecompiledHeaders::No; - } - optionsBuilder.updateFileLanguage(fileKind); - optionsBuilder.addPrecompiledHeaderOptions(usePch); - const QJsonArray specificOptions = QJsonArray::fromStringList(optionsBuilder.options()); - QJsonArray fullOptions = generalOptions; - for (const QJsonValue &opt : specificOptions) - fullOptions << opt; - return fullOptions; -} - ClangDiagnosticConfig warningsConfigForProject(Project *project) { return ClangdSettings(ClangdProjectSettings(project).settings()).diagnosticConfig(); @@ -329,34 +188,5 @@ CompilerOptionsBuilder clangOptionsBuilder(const ProjectPart &projectPart, return optionsBuilder; } -QJsonArray projectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder) -{ - const QStringList optionsList = optionsBuilder.options(); - QJsonArray optionsArray; - for (const QString &opt : optionsList) { - // These will be added later by the file-specific code, and they trigger warnings - // if they appear twice; see QTCREATORBUG-26664. - if (opt != "-TP" && opt != "-TC") - optionsArray << opt; - } - return optionsArray; -} - -QJsonArray fullProjectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder, - const QStringList &projectOptions) -{ - return fullProjectPartOptions(projectPartOptions(optionsBuilder), - QJsonArray::fromStringList(projectOptions)); -} - -QJsonArray fullProjectPartOptions(const QJsonArray &projectPartOptions, - const QJsonArray &projectOptions) -{ - QJsonArray fullProjectPartOptions = projectPartOptions; - for (const QJsonValue &opt : projectOptions) - fullProjectPartOptions.prepend(opt); - return fullProjectPartOptions; -} - } // namespace Internal } // namespace Clang diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h index ef413037506..93be75dfe23 100644 --- a/src/plugins/clangcodemodel/clangutils.h +++ b/src/plugins/clangcodemodel/clangutils.h @@ -3,6 +3,7 @@ #pragma once +#include "cppeditor/compilationdb.h" #include #include @@ -35,15 +36,6 @@ CppEditor::CompilerOptionsBuilder clangOptionsBuilder( const CppEditor::ClangDiagnosticConfig &warningsConfig, const Utils::FilePath &clangIncludeDir, const ProjectExplorer::Macros &extraMacros); -QJsonArray projectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder); -QJsonArray fullProjectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder, - const QStringList &projectOptions); -QJsonArray fullProjectPartOptions(const QJsonArray &projectPartOptions, - const QJsonArray &projectOptions); -QJsonArray clangOptionsForFile(const CppEditor::ProjectFile &file, - const CppEditor::ProjectPart &projectPart, - const QJsonArray &generalOptions, - CppEditor::UsePrecompiledHeaders usePch, bool clStyle); CppEditor::ProjectPart::ConstPtr projectPartForFile(const Utils::FilePath &filePath); @@ -51,13 +43,11 @@ Utils::FilePath currentCppEditorDocumentFilePath(); QString diagnosticCategoryPrefixRemoved(const QString &text); -using GenerateCompilationDbResult = Utils::expected_str; -enum class CompilationDbPurpose { Project, CodeModel }; void generateCompilationDB( - QPromise &promise, + QPromise &promise, const QList &projectInfoList, const Utils::FilePath &baseDir, - CompilationDbPurpose purpose, + CppEditor::CompilationDbPurpose purpose, const CppEditor::ClangDiagnosticConfig &warningsConfig, const QStringList &projectOptions, const Utils::FilePath &clangIncludeDir); diff --git a/src/plugins/cppeditor/CMakeLists.txt b/src/plugins/cppeditor/CMakeLists.txt index 69cfcc458d0..a541310f868 100644 --- a/src/plugins/cppeditor/CMakeLists.txt +++ b/src/plugins/cppeditor/CMakeLists.txt @@ -14,6 +14,7 @@ add_qtc_plugin(CppEditor clangdiagnosticconfigsmodel.cpp clangdiagnosticconfigsmodel.h clangdiagnosticconfigsselectionwidget.cpp clangdiagnosticconfigsselectionwidget.h clangdiagnosticconfigswidget.cpp clangdiagnosticconfigswidget.h + compilationdb.cpp compilationdb.h compileroptionsbuilder.cpp compileroptionsbuilder.h cppautocompleter.cpp cppautocompleter.h cppbuiltinmodelmanagersupport.cpp cppbuiltinmodelmanagersupport.h diff --git a/src/plugins/cppeditor/compilationdb.cpp b/src/plugins/cppeditor/compilationdb.cpp new file mode 100644 index 00000000000..bc3eacd83d7 --- /dev/null +++ b/src/plugins/cppeditor/compilationdb.cpp @@ -0,0 +1,210 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "compilationdb.h" + +#include "cppeditortr.h" + +#include +#include + +#include +#include +#include + +using namespace ProjectExplorer; +namespace PEConstants = ProjectExplorer::Constants; +using namespace Utils; + +namespace CppEditor { + +static QStringList projectPartArguments(const ProjectPart &projectPart) +{ + QStringList args; + args << projectPart.compilerFilePath.toString(); + args << "-c"; + if (projectPart.toolchainType != PEConstants::MSVC_TOOLCHAIN_TYPEID) { + args << "--target=" + projectPart.toolchainTargetTriple; + if (projectPart.toolchainAbi.architecture() == Abi::X86Architecture) + args << QLatin1String(projectPart.toolchainAbi.wordWidth() == 64 ? "-m64" : "-m32"); + } + args << projectPart.compilerFlags; + for (const ProjectExplorer::HeaderPath &headerPath : projectPart.headerPaths) { + if (headerPath.type == HeaderPathType::User) { + args << "-I" + headerPath.path; + } else if (headerPath.type == HeaderPathType::System) { + args << (projectPart.toolchainType == PEConstants::MSVC_TOOLCHAIN_TYPEID + ? "-I" + : "-isystem") + + headerPath.path; + } + } + for (const Macro ¯o : projectPart.projectMacros) { + args.append( + QString::fromUtf8(macro.toKeyValue(macro.type == MacroType::Define ? "-D" : "-U"))); + } + + return args; +} + +static QJsonArray projectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder) +{ + const QStringList optionsList = optionsBuilder.options(); + QJsonArray optionsArray; + for (const QString &opt : optionsList) { + // These will be added later by the file-specific code, and they trigger warnings + // if they appear twice; see QTCREATORBUG-26664. + if (opt != "-TP" && opt != "-TC") + optionsArray << opt; + } + return optionsArray; +} + +static QJsonArray fullProjectPartOptions(const QJsonArray &projectPartOptions, + const QJsonArray &projectOptions) +{ + QJsonArray fullProjectPartOptions = projectPartOptions; + for (const QJsonValue &opt : projectOptions) + fullProjectPartOptions.prepend(opt); + return fullProjectPartOptions; +} + +QJsonArray fullProjectPartOptions(const CppEditor::CompilerOptionsBuilder &optionsBuilder, + const QStringList &projectOptions) +{ + return fullProjectPartOptions(projectPartOptions(optionsBuilder), + QJsonArray::fromStringList(projectOptions)); +} + +QJsonArray clangOptionsForFile(const ProjectFile &file, const ProjectPart &projectPart, + const QJsonArray &generalOptions, UsePrecompiledHeaders usePch, + bool clStyle) +{ + CompilerOptionsBuilder optionsBuilder(projectPart); + optionsBuilder.setClStyle(clStyle); + ProjectFile::Kind fileKind = file.kind; + if (fileKind == ProjectFile::AmbiguousHeader) { + fileKind = projectPart.languageVersion <= LanguageVersion::LatestC + ? ProjectFile::CHeader : ProjectFile::CXXHeader; + } + if (usePch == UsePrecompiledHeaders::Yes + && projectPart.precompiledHeaders.contains(file.path.path())) { + usePch = UsePrecompiledHeaders::No; + } + optionsBuilder.updateFileLanguage(fileKind); + optionsBuilder.addPrecompiledHeaderOptions(usePch); + const QJsonArray specificOptions = QJsonArray::fromStringList(optionsBuilder.options()); + QJsonArray fullOptions = generalOptions; + for (const QJsonValue &opt : specificOptions) + fullOptions << opt; + return fullOptions; +} + +static QJsonObject createFileObject(const FilePath &buildDir, + const QStringList &arguments, + const ProjectPart &projectPart, + const ProjectFile &projFile, + CompilationDbPurpose purpose, + const QJsonArray &projectPartOptions, + UsePrecompiledHeaders usePch, + bool clStyle) +{ + QJsonObject fileObject; + fileObject["file"] = projFile.path.toString(); + QJsonArray args; + + if (purpose == CompilationDbPurpose::Project) { + args = QJsonArray::fromStringList(arguments); + + const ProjectFile::Kind kind = ProjectFile::classify(projFile.path.path()); + if (projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID + || projectPart.toolchainType == ProjectExplorer::Constants::CLANG_CL_TOOLCHAIN_TYPEID) { + if (!ProjectFile::isObjC(kind)) { + if (ProjectFile::isC(kind)) + args.append("/TC"); + else if (ProjectFile::isCxx(kind)) + args.append("/TP"); + } + } else { + QStringList langOption + = createLanguageOptionGcc(projectPart.language, kind, + projectPart.languageExtensions + & LanguageExtension::ObjectiveC); + for (const QString &langOptionPart : langOption) + args.append(langOptionPart); + } + } else { + args = clangOptionsForFile(projFile, projectPart, projectPartOptions, usePch, clStyle); + args.prepend("clang"); // TODO: clang-cl for MSVC targets? Does it matter at all what we put here? + } + + args.append(projFile.path.toUserOutput()); + fileObject["arguments"] = args; + fileObject["directory"] = buildDir.toString(); + return fileObject; +} + +void generateCompilationDB( + QPromise &promise, + const QList &projectInfoList, + const FilePath &baseDir, + CompilationDbPurpose purpose, + const QStringList &projectOptions, + const GetOptionsBuilder &getOptionsBuilder) +{ + const QString fileName = "compile_commands.json"; + QTC_ASSERT( + !baseDir.isEmpty(), + promise.addResult(make_unexpected(Tr::tr("Invalid location for %1.").arg(fileName))); + return); + QTC_CHECK(baseDir.ensureWritableDir()); + QFile compileCommandsFile(baseDir.pathAppended(fileName).toFSPathString()); + const bool fileOpened = compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate); + if (!fileOpened) { + promise.addResult(make_unexpected( + Tr::tr("Could not create \"%1\": %2") + .arg(compileCommandsFile.fileName(), compileCommandsFile.errorString()))); + return; + } + compileCommandsFile.write("["); + + const QJsonArray jsonProjectOptions = QJsonArray::fromStringList(projectOptions); + for (const ProjectInfo::ConstPtr &projectInfo : std::as_const(projectInfoList)) { + QTC_ASSERT(projectInfo, continue); + for (ProjectPart::ConstPtr projectPart : projectInfo->projectParts()) { + QTC_ASSERT(projectPart, continue); + QStringList args; + const CompilerOptionsBuilder optionsBuilder = getOptionsBuilder(*projectPart); + QJsonArray ppOptions; + if (purpose == CompilationDbPurpose::Project) { + args = projectPartArguments(*projectPart); + } else { + ppOptions = fullProjectPartOptions(projectPartOptions(optionsBuilder), + jsonProjectOptions); + } + for (const ProjectFile &projFile : projectPart->files) { + if (promise.isCanceled()) + return; + const QJsonObject json + = createFileObject(baseDir, + args, + *projectPart, + projFile, + purpose, + ppOptions, + projectInfo->settings().usePrecompiledHeaders(), + optionsBuilder.isClStyle()); + if (compileCommandsFile.size() > 1) + compileCommandsFile.write(","); + compileCommandsFile.write(QJsonDocument(json).toJson(QJsonDocument::Compact)); + } + } + } + + compileCommandsFile.write("]"); + compileCommandsFile.close(); + promise.addResult(FilePath::fromUserInput(compileCommandsFile.fileName())); + +} + +} // namespace CppEditor diff --git a/src/plugins/cppeditor/compilationdb.h b/src/plugins/cppeditor/compilationdb.h new file mode 100644 index 00000000000..25780fbcc05 --- /dev/null +++ b/src/plugins/cppeditor/compilationdb.h @@ -0,0 +1,43 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +#pragma once + +#include "compileroptionsbuilder.h" +#include "cppeditor_global.h" +#include "projectinfo.h" + +#include +#include + +#include +#include + +#include + +namespace CppEditor { +class ClangDiagnosticConfig; + +using GenerateCompilationDbResult = Utils::expected_str; +using GetOptionsBuilder = std::function; +enum class CompilationDbPurpose { Project, CodeModel }; + +QJsonArray CPPEDITOR_EXPORT fullProjectPartOptions( + const CppEditor::CompilerOptionsBuilder &optionsBuilder, + const QStringList &projectOptions); + +QJsonArray CPPEDITOR_EXPORT clangOptionsForFile( + const ProjectFile &file, + const ProjectPart &projectPart, + const QJsonArray &generalOptions, + UsePrecompiledHeaders usePch, + bool clStyle); + +void CPPEDITOR_EXPORT generateCompilationDB( + QPromise &promise, + const QList &projectInfoList, + const Utils::FilePath &baseDir, + CompilationDbPurpose purpose, + const QStringList &projectOptions, + const GetOptionsBuilder &getOptionsBuilder); + +} // namespace CppEditor diff --git a/src/plugins/cppeditor/cppeditor.qbs b/src/plugins/cppeditor/cppeditor.qbs index ea2611c3ba0..9331055b944 100644 --- a/src/plugins/cppeditor/cppeditor.qbs +++ b/src/plugins/cppeditor/cppeditor.qbs @@ -47,6 +47,8 @@ QtcPlugin { "clangdiagnosticconfigswidget.h", "clangdsettings.cpp", "clangdsettings.h", + "compilationdb.cpp", + "compilationdb.h", "compileroptionsbuilder.cpp", "compileroptionsbuilder.h", "cppautocompleter.cpp",