From 0456643a86bbb1f7fbcc4235c2fb5e5d7e9976ae Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 6 Jul 2022 12:21:04 +0200 Subject: [PATCH] ClangCodeModel: Use the correct language type options for MSVC This was broken by our compiler command line optimizations, resulting in "-x" rather than "/T" appearing for MSVC/clang-cl toolchains and causing clangd to assume C instead of C++ for some files. Change-Id: Ib98db88ac90e4e45a7016a7edcb80a279df372aa Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 11 +++++++---- src/plugins/clangcodemodel/clangutils.cpp | 12 ++++++++---- src/plugins/clangcodemodel/clangutils.h | 2 +- src/plugins/cppeditor/compileroptionsbuilder.h | 1 + 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 08f9f10b1e1..6dd7226b951 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -845,9 +845,11 @@ static void addToCompilationDb(QJsonObject &cdb, CppEditor::UsePrecompiledHeaders usePch, const QJsonArray &projectPartOptions, const Utils::FilePath &workingDir, - const CppEditor::ProjectFile &sourceFile) + const CppEditor::ProjectFile &sourceFile, + bool clStyle) { - QJsonArray args = clangOptionsForFile(sourceFile, projectPart, projectPartOptions, usePch); + QJsonArray args = clangOptionsForFile(sourceFile, projectPart, projectPartOptions, usePch, + clStyle); // TODO: clangd seems to apply some heuristics depending on what we put here. // Should we make use of them or keep using our own? @@ -889,7 +891,8 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir) const QJsonArray projectPartOptions = fullProjectPartOptions( optionsBuilder, globalClangOptions()); const QJsonArray clangOptions = clangOptionsForFile({}, optionsBuilder.projectPart(), - projectPartOptions, usePch); + projectPartOptions, usePch, + optionsBuilder.isClStyle()); initOptions.insert("fallbackFlags", clangOptions); setInitializationOptions(initOptions); } @@ -1328,7 +1331,7 @@ void ClangdClient::updateParserConfig(const Utils::FilePath &filePath, const QJsonArray projectPartOptions = fullProjectPartOptions( optionsBuilder, globalClangOptions()); addToCompilationDb(cdbChanges, *projectPart, CppEditor::getPchUsage(), projectPartOptions, - filePath.parentDir(), file); + filePath.parentDir(), file, optionsBuilder.isClStyle()); QJsonObject settings; addCompilationDb(settings, cdbChanges); DidChangeConfigurationParams configChangeParams; diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index a1c4393eab0..c85ee98e1cf 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -130,7 +130,8 @@ static QJsonObject createFileObject(const FilePath &buildDir, const ProjectFile &projFile, CompilationDbPurpose purpose, const QJsonArray &projectPartOptions, - UsePrecompiledHeaders usePch) + UsePrecompiledHeaders usePch, + bool clStyle) { QJsonObject fileObject; fileObject["file"] = projFile.path; @@ -155,7 +156,7 @@ static QJsonObject createFileObject(const FilePath &buildDir, args.append(langOptionPart); } } else { - args = clangOptionsForFile(projFile, projectPart, projectPartOptions, usePch); + 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? } @@ -200,7 +201,8 @@ GenerateCompilationDbResult generateCompilationDB(const CppEditor::ProjectInfo:: } for (const ProjectFile &projFile : projectPart->files) { const QJsonObject json = createFileObject(baseDir, args, *projectPart, projFile, - purpose, ppOptions, usePch); + purpose, ppOptions, usePch, + optionsBuilder.isClStyle()); if (compileCommandsFile.size() > 1) compileCommandsFile.write(","); compileCommandsFile.write('\n' + QJsonDocument(json).toJson().trimmed()); @@ -274,9 +276,11 @@ QString DiagnosticTextInfo::clazyCheckName(const QString &option) QJsonArray clangOptionsForFile(const ProjectFile &file, const ProjectPart &projectPart, - const QJsonArray &generalOptions, UsePrecompiledHeaders usePch) + 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 diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h index 4eef4b90ddc..bb90b84bfc8 100644 --- a/src/plugins/clangcodemodel/clangutils.h +++ b/src/plugins/clangcodemodel/clangutils.h @@ -66,7 +66,7 @@ QJsonArray fullProjectPartOptions(const QJsonArray &projectPartOptions, QJsonArray clangOptionsForFile(const CppEditor::ProjectFile &file, const CppEditor::ProjectPart &projectPart, const QJsonArray &generalOptions, - CppEditor::UsePrecompiledHeaders usePch); + CppEditor::UsePrecompiledHeaders usePch, bool clStyle); CppEditor::ProjectPart::ConstPtr projectPartForFile(const QString &filePath); diff --git a/src/plugins/cppeditor/compileroptionsbuilder.h b/src/plugins/cppeditor/compileroptionsbuilder.h index ffdb7c20873..3a0b1e459a9 100644 --- a/src/plugins/cppeditor/compileroptionsbuilder.h +++ b/src/plugins/cppeditor/compileroptionsbuilder.h @@ -95,6 +95,7 @@ public: void evaluateCompilerFlags(); bool isClStyle() const; + void setClStyle(bool clStyle) { m_clStyle = clStyle; } const ProjectPart &projectPart() const { return m_projectPart; }