ClangCodeModel: Keep a ref count for "extra files"

These are files that we temporarily report to the server as "open"
without actually having a document for them. Since this mechanism is
used in several places, we'd like to keep a consistent state even when
such actions overlap.

Change-Id: I0cfe3427740ec479926bc114848ad08f8866bdbb
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2022-11-15 17:36:15 +01:00
parent e202138fb0
commit 86770f28d0

View File

@@ -295,6 +295,7 @@ public:
QHash<TextDocument *, HighlightingData> highlightingData;
QHash<Utils::FilePath, CppEditor::BaseEditorDocumentParser::Configuration> parserConfigs;
QHash<Utils::FilePath, Tasks> issuePaneEntries;
QHash<Utils::FilePath, int> openedExtraFiles;
VersionedDataCache<const TextDocument *, ClangdAstNode> astCache;
VersionedDataCache<Utils::FilePath, ClangdAstNode> externalAstCache;
@@ -421,10 +422,11 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
}
});
connect(this, &Client::initialized, this, [] {
connect(this, &Client::initialized, this, [this] {
auto currentDocumentFilter = static_cast<ClangdCurrentDocumentFilter *>(
CppEditor::CppModelManager::instance()->currentDocumentFilter());
currentDocumentFilter->updateCurrentClient();
d->openedExtraFiles.clear();
});
start();
@@ -444,6 +446,13 @@ bool ClangdClient::isFullyIndexed() const
void ClangdClient::openExtraFile(const Utils::FilePath &filePath, const QString &content)
{
const auto it = d->openedExtraFiles.find(filePath);
if (it != d->openedExtraFiles.end()) {
QTC_CHECK(it.value() > 0);
++it.value();
return;
}
QFile cxxFile(filePath.toString());
if (content.isEmpty() && !cxxFile.open(QIODevice::ReadOnly))
return;
@@ -454,10 +463,18 @@ void ClangdClient::openExtraFile(const Utils::FilePath &filePath, const QString
item.setVersion(0);
sendMessage(DidOpenTextDocumentNotification(DidOpenTextDocumentParams(item)),
SendDocUpdates::Ignore);
d->openedExtraFiles.insert(filePath, 1);
}
void ClangdClient::closeExtraFile(const Utils::FilePath &filePath)
{
const auto it = d->openedExtraFiles.find(filePath);
QTC_ASSERT(it != d->openedExtraFiles.end(), return);
QTC_CHECK(it.value() > 0);
if (--it.value() > 0)
return;
d->openedExtraFiles.erase(it);
sendMessage(DidCloseTextDocumentNotification(DidCloseTextDocumentParams(
TextDocumentIdentifier{DocumentUri::fromFilePath(filePath)})),
SendDocUpdates::Ignore);