diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 679e41004bf..b92f12279f3 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -517,12 +517,14 @@ void ClangModelManagerSupport::updateLanguageClient(ProjectExplorer::Project *pr && currentClient->project() == docProject) { continue; } - if (!docProject || docProject == project) { - if (currentClient) - currentClient->closeDocument(doc); - LanguageClientManager::openDocumentWithClient(doc, client); - hasDocuments = true; + if (docProject != project + && (docProject || !ProjectFile::isHeader(doc->filePath()))) { + continue; } + if (currentClient) + currentClient->closeDocument(doc); + LanguageClientManager::openDocumentWithClient(doc, client); + hasDocuments = true; } for (auto it = m_queuedShadowDocuments.begin(); it != m_queuedShadowDocuments.end();) { @@ -625,11 +627,13 @@ void ClangModelManagerSupport::claimNonProjectSources(ClangdClient *client) } if (!ClangdSettings::instance().sizeIsOkay(doc->filePath())) continue; - if (!ProjectExplorer::SessionManager::projectForFile(doc->filePath())) { - if (currentClient) - currentClient->closeDocument(doc); - LanguageClientManager::openDocumentWithClient(doc, client); - } + if (ProjectExplorer::SessionManager::projectForFile(doc->filePath())) + continue; + if (client->project() && !ProjectFile::isHeader(doc->filePath())) + continue; + if (currentClient) + currentClient->closeDocument(doc); + LanguageClientManager::openDocumentWithClient(doc, client); } } @@ -717,7 +721,7 @@ void ClangModelManagerSupport::onEditorOpened(Core::IEditor *editor) return; if (sessionModeEnabled()) project = nullptr; - else if (!project) + else if (!project && ProjectFile::isHeader(document->filePath())) project = fallbackProject(); if (ClangdClient * const client = clientForProject(project)) LanguageClientManager::openDocumentWithClient(textDocument, client); diff --git a/src/plugins/cppeditor/cppprojectfile.cpp b/src/plugins/cppeditor/cppprojectfile.cpp index c28f41a2291..c5a5d57d5b8 100644 --- a/src/plugins/cppeditor/cppprojectfile.cpp +++ b/src/plugins/cppeditor/cppprojectfile.cpp @@ -6,6 +6,7 @@ #include "cppeditorconstants.h" #include +#include #include #include @@ -125,6 +126,11 @@ bool ProjectFile::isHeader(ProjectFile::Kind kind) } } +bool ProjectFile::isHeader(const Utils::FilePath &fp) +{ + return isHeader(classify(fp.toString())); +} + bool ProjectFile::isSource(ProjectFile::Kind kind) { switch (kind) { diff --git a/src/plugins/cppeditor/cppprojectfile.h b/src/plugins/cppeditor/cppprojectfile.h index 71310fec8a2..16894555cf5 100644 --- a/src/plugins/cppeditor/cppprojectfile.h +++ b/src/plugins/cppeditor/cppprojectfile.h @@ -7,6 +7,8 @@ #include +namespace Utils { class FilePath; } + namespace CppEditor { class CPPEDITOR_EXPORT ProjectFile @@ -39,6 +41,7 @@ public: static bool isSource(Kind kind); static bool isHeader(Kind kind); + static bool isHeader(const Utils::FilePath &fp); static bool isC(Kind kind); static bool isCxx(Kind kind); static bool isAmbiguousHeader(const QString &filePath);