ClangCodeModel: Make open C++ files known to newly started clangd client

This is relevant when opening a session, for instance.

Change-Id: Iff3140296edb7b6d2b758f1f8b0b83a52fdd6f56
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-04-29 16:09:07 +02:00
parent c49a0af504
commit 78274956d0
2 changed files with 24 additions and 4 deletions

View File

@@ -37,6 +37,7 @@
#include "clanggloballocatorfilters.h"
#include "clangoverviewmodel.h"
#include <coreplugin/editormanager/documentmodel.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
@@ -290,8 +291,27 @@ void ClangModelManagerSupport::updateLanguageClient(ProjectExplorer::Project *pr
if (cppModelManager()->projectInfo(project) != projectInfo)
return;
// TODO: We'd like to add all open editor documents for the project to the client here,
// but there doesn't seem to be such an interface.
// Acquaint the client with all open C++ documents for this project.
bool hasDocuments = false;
for (const Core::DocumentModel::Entry * const entry : Core::DocumentModel::entries()) {
const auto textDocument = qobject_cast<TextEditor::TextDocument *>(entry->document);
if (!textDocument)
continue;
const bool isCppDocument = Utils::contains(
Core::DocumentModel::editorsForDocument(textDocument),
[](Core::IEditor *editor) {
return CppTools::CppModelManager::isCppEditor(editor);
});
if (!isCppDocument)
continue;
if (!project->isKnownFile(entry->fileName()))
continue;
client->openDocument(textDocument);
hasDocuments = true;
}
if (hasDocuments)
return;
// clangd oddity: Background indexing only starts after opening a random file.
// TODO: changes to the compilation db do not seem to trigger re-indexing.

View File

@@ -97,8 +97,8 @@ void RefactoringEngine::findUsages(const CppTools::CursorInEditor &cursor,
->findUsages(cursor, std::move(callback));
return;
}
if (!client->documentOpen(cursor.textDocument()))
client->openDocument(cursor.textDocument()); // TODO: Just a workaround
QTC_ASSERT(client->documentOpen(cursor.textDocument()),
client->openDocument(cursor.textDocument()));
client->findUsages(cursor.textDocument(), cursor.cursor());
}