diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7482b1fa07f..c0d61b81ccc 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1456,19 +1456,20 @@ static void addToCompilationDb(QJsonObject &cdb, const CppEditor::CompilerOptionsBuilder &optionsBuilder, const QStringList &projectOptions, const Utils::FilePath &workingDir, - const Utils::FilePath &sourceFile) + const CppEditor::ProjectFile &sourceFile) { - QStringList args = clangOptionsForFile(optionsBuilder, sourceFile.toString(), projectOptions); + QStringList args = clangOptionsForFile(optionsBuilder, sourceFile, projectOptions); // TODO: clangd seems to apply some heuristics depending on what we put here. // Should we make use of them or keep using our own? args.prepend("clang"); - args.append(sourceFile.toUserOutput()); + const QString fileString = Utils::FilePath::fromString(sourceFile.path).toUserOutput(); + args.append(fileString); QJsonObject value; value.insert("workingDirectory", workingDir.toString()); value.insert("compilationCommand", QJsonArray::fromStringList(args)); - cdb.insert(sourceFile.toUserOutput(), value); + cdb.insert(fileString, value); } static void addCompilationDb(QJsonObject &parentObject, const QJsonObject &cdb) @@ -1916,8 +1917,10 @@ void ClangdClient::updateParserConfig(const Utils::FilePath &filePath, const CppEditor::ClangDiagnosticConfig warningsConfig = warningsConfigForProject(project()); CppEditor::CompilerOptionsBuilder optionsBuilder = clangOptionsBuilder(*projectPart, warningsConfig); + const CppEditor::ProjectFile file(filePath.toString(), + CppEditor::ProjectFile::classify(filePath.toString())); addToCompilationDb(cdbChanges, optionsBuilder, optionsForProject(project(), warningsConfig), - filePath.parentDir(), filePath); + filePath.parentDir(), file); QJsonObject settings; addCompilationDb(settings, cdbChanges); DidChangeConfigurationParams configChangeParams; diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 05664bbc21b..e0ae5c31d73 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -212,7 +212,7 @@ static QJsonObject createFileObject(const FilePath &buildDir, args.append(langOptionPart); } } else { - args = QJsonArray::fromStringList(clangOptionsForFile(optionsBuilder, projFile.path, + args = QJsonArray::fromStringList(clangOptionsForFile(optionsBuilder, projFile, projectOptions)); args.prepend("clang"); // TODO: clang-cl for MSVC targets? Does it matter at all what we put here? } @@ -334,20 +334,19 @@ static ClangProjectSettings &getProjectSettings(ProjectExplorer::Project *projec } // namespace QStringList clangOptionsForFile(CompilerOptionsBuilder optionsBuilder, - const QString &filePath, const QStringList &projectOptions) + const ProjectFile &file, const QStringList &projectOptions) { - ProjectFile::Kind fileKind = filePath.isEmpty() - ? ProjectFile::Unclassified : ProjectFile::classify(filePath); + ProjectFile::Kind fileKind = file.kind; if (fileKind == ProjectFile::AmbiguousHeader) { fileKind = optionsBuilder.projectPart().languageVersion <= LanguageVersion::LatestC ? ProjectFile::CHeader : ProjectFile::CXXHeader; } auto pchUsage = getPchUsage(); if (pchUsage == UsePrecompiledHeaders::Yes - && optionsBuilder.projectPart().precompiledHeaders.contains(filePath)) { + && optionsBuilder.projectPart().precompiledHeaders.contains(file.path)) { pchUsage = UsePrecompiledHeaders::No; } - optionsBuilder.updateFileLanguage(fileKind); + optionsBuilder.updateFileLanguage(file.kind); optionsBuilder.addPrecompiledHeaderOptions(pchUsage); return projectOptions + optionsBuilder.options(); } diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h index 3122813456a..eb5baac596d 100644 --- a/src/plugins/clangcodemodel/clangutils.h +++ b/src/plugins/clangcodemodel/clangutils.h @@ -64,7 +64,8 @@ CppEditor::CompilerOptionsBuilder clangOptionsBuilder( const CppEditor::ProjectPart &projectPart, const CppEditor::ClangDiagnosticConfig &warningsConfig); QStringList clangOptionsForFile(CppEditor::CompilerOptionsBuilder optionsBuilder, - const QString &filePath, const QStringList &projectOptions); + const CppEditor::ProjectFile &file, + const QStringList &projectOptions); CppEditor::ProjectPart::ConstPtr projectPartForFile(const QString &filePath); CppEditor::ProjectPart::ConstPtr projectPartForFileBasedOnProcessor(const QString &filePath);