ClangCodeModel: Minimize QStringList -> QJsonArray conversions

... when setting up the compilation database.
As it turns out, these conversions were the most expensive part of
creating the JSON file. We now build the JSON arrays incrementally
instead of setting them up from scratch for every source file.

Change-Id: I1e664a6320d5b3c49b31366c58aa14f63818e008
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Christian Kandeler
2022-05-05 17:34:31 +02:00
parent 3ce7ca7242
commit 3d1ba205d0
3 changed files with 71 additions and 26 deletions

View File

@@ -1453,13 +1453,13 @@ private:
};
static void addToCompilationDb(QJsonObject &cdb,
const CppEditor::CompilerOptionsBuilder &optionsBuilder,
const CppEditor::ProjectPart &projectPart,
CppEditor::UsePrecompiledHeaders usePch,
const QStringList &projectOptions,
const QJsonArray &projectPartOptions,
const Utils::FilePath &workingDir,
const CppEditor::ProjectFile &sourceFile)
{
QStringList args = clangOptionsForFile(optionsBuilder, sourceFile, projectOptions, usePch);
QJsonArray args = clangOptionsForFile(sourceFile, projectPart, projectPartOptions, usePch);
// TODO: clangd seems to apply some heuristics depending on what we put here.
// Should we make use of them or keep using our own?
@@ -1469,7 +1469,7 @@ static void addToCompilationDb(QJsonObject &cdb,
args.append(fileString);
QJsonObject value;
value.insert("workingDirectory", workingDir.toString());
value.insert("compilationCommand", QJsonArray::fromStringList(args));
value.insert("compilationCommand", args);
cdb.insert(fileString, value);
}
@@ -1497,9 +1497,11 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
*CppEditor::CppModelManager::instance()->fallbackProjectPart(),
warningsConfig);
const CppEditor::UsePrecompiledHeaders usePch = CppEditor::getPchUsage();
const QStringList clangOptions = clangOptionsForFile(
optionsBuilder, {}, optionsForProject(nullptr, warningsConfig), usePch);
initOptions.insert("fallbackFlags", QJsonArray::fromStringList(clangOptions));
const QJsonArray projectPartOptions = fullProjectPartOptions(
optionsBuilder, optionsForProject(nullptr, warningsConfig));
const QJsonArray clangOptions = clangOptionsForFile({}, optionsBuilder.projectPart(),
projectPartOptions, usePch);
initOptions.insert("fallbackFlags", clangOptions);
setInitializationOptions(initOptions);
}
auto isRunningClangdClient = [](const LanguageClient::Client *c) {
@@ -1921,8 +1923,10 @@ void ClangdClient::updateParserConfig(const Utils::FilePath &filePath,
warningsConfig);
const CppEditor::ProjectFile file(filePath.toString(),
CppEditor::ProjectFile::classify(filePath.toString()));
addToCompilationDb(cdbChanges, optionsBuilder, CppEditor::getPchUsage(),
optionsForProject(project(), warningsConfig), filePath.parentDir(), file);
const QJsonArray projectPartOptions = fullProjectPartOptions(
optionsBuilder, optionsForProject(project(), warningsConfig));
addToCompilationDb(cdbChanges, *projectPart, CppEditor::getPchUsage(), projectPartOptions,
filePath.parentDir(), file);
QJsonObject settings;
addCompilationDb(settings, cdbChanges);
DidChangeConfigurationParams configChangeParams;