CplusPlus: Use plainer callbacks to interact to the CppEditor

Lets us remove a few explicit CppModelManager::instance() call
in user code later.

Change-Id: Id8d846d06a0715b3d609cc5d52cc031e1d025fb1
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-07-11 14:19:33 +02:00
parent 1d59a37acb
commit 90ba140545
5 changed files with 70 additions and 54 deletions

View File

@@ -3,48 +3,57 @@
#include "cppmodelmanagerbase.h" #include "cppmodelmanagerbase.h"
namespace CPlusPlus { #include <utils/qtcassert.h>
static CppModelManagerBase *g_instance = nullptr; namespace CPlusPlus::CppModelManagerBase {
CppModelManagerBase::CppModelManagerBase(QObject *parent) static bool (*setExtraDiagnosticsCallback)
: QObject(parent) (const QString &, const QString &, const QList<Document::DiagnosticMessage> &) = nullptr;
static CPlusPlus::Snapshot (*snapshotCallback)() = nullptr;
bool trySetExtraDiagnostics(const QString &fileName, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics)
{ {
Q_ASSERT(!g_instance); if (!setExtraDiagnosticsCallback)
g_instance = this; return false;
return setExtraDiagnosticsCallback(fileName, kind, diagnostics);
} }
CppModelManagerBase::~CppModelManagerBase() bool setExtraDiagnostics(const QString &fileName, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics)
{ {
Q_ASSERT(g_instance == this); QTC_ASSERT(setExtraDiagnosticsCallback, return false);
g_instance = nullptr; return setExtraDiagnosticsCallback(fileName, kind, diagnostics);
} }
CppModelManagerBase *CppModelManagerBase::instance() Snapshot snapshot()
{ {
return g_instance; QTC_ASSERT(snapshotCallback, return {});
return snapshotCallback();
} }
bool CppModelManagerBase::trySetExtraDiagnostics(const QString &fileName, const QString &kind, bool hasSnapshots()
const QList<CPlusPlus::Document::DiagnosticMessage> &diagnostics)
{ {
if (CppModelManagerBase *mm = instance()) return snapshotCallback;
return mm->setExtraDiagnostics(fileName, kind, diagnostics);
return false;
} }
bool CppModelManagerBase::setExtraDiagnostics(const QString &fileName, const QString &kind, // Installation
const QList<CPlusPlus::Document::DiagnosticMessage> &diagnostics)
void registerSetExtraDiagnosticsCallback(
bool (*callback)(const QString &, const QString &, const QList<Document::DiagnosticMessage> &))
{ {
Q_UNUSED(fileName) QTC_ASSERT(callback, return);
Q_UNUSED(kind) QTC_CHECK(!setExtraDiagnosticsCallback); // bark when used twice
Q_UNUSED(diagnostics) setExtraDiagnosticsCallback = callback;
return false;
} }
CPlusPlus::Snapshot CppModelManagerBase::snapshot() const void registerSnapshotCallback(Snapshot (*callback)())
{ {
return CPlusPlus::Snapshot(); QTC_ASSERT(callback, return);
QTC_CHECK(!snapshotCallback); // bark when used twice
snapshotCallback = callback;
} }
} // namespace CPlusPlus } // CPlusPlus::CppModelManagerBase

View File

@@ -5,29 +5,24 @@
#include <cplusplus/CppDocument.h> #include <cplusplus/CppDocument.h>
#include <QObject> namespace CPlusPlus::CppModelManagerBase {
#include <QList>
QT_BEGIN_NAMESPACE CPLUSPLUS_EXPORT bool trySetExtraDiagnostics
class QString; (const QString &, const QString &, const QList<Document::DiagnosticMessage> &);
QT_END_NAMESPACE
namespace CPlusPlus { CPLUSPLUS_EXPORT bool setSetExtraDiagnostics
(const QString &, const QString &, const QList<Document::DiagnosticMessage> &);
class CPLUSPLUS_EXPORT CppModelManagerBase : public QObject CPLUSPLUS_EXPORT bool hasSnapshots();
{
Q_OBJECT
public:
CppModelManagerBase(QObject *parent = nullptr);
~CppModelManagerBase();
static CppModelManagerBase *instance(); CPLUSPLUS_EXPORT CPlusPlus::Snapshot snapshot();
static bool trySetExtraDiagnostics(const QString &fileName, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics);
virtual bool setExtraDiagnostics(const QString &fileName, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics);
virtual CPlusPlus::Snapshot snapshot() const;
};
} // namespace CPlusPlus // These callback are provided by the CppEditor plugin.
CPLUSPLUS_EXPORT void registerSnapshotCallback(CPlusPlus::Snapshot (*)(void));
CPLUSPLUS_EXPORT void registerSetExtraDiagnosticsCallback(
bool(*)(const QString &, const QString &, const QList<Document::DiagnosticMessage> &));
} // CPlusPlus::CppModelManagerBase

View File

@@ -1366,13 +1366,12 @@ void ModelManagerInterface::startCppQmlTypeUpdate()
return; return;
} }
CPlusPlus::CppModelManagerBase *cppModelManager = if (!CPlusPlus::CppModelManagerBase::hasSnapshots())
CPlusPlus::CppModelManagerBase::instance();
if (!cppModelManager)
return; return;
m_cppQmlTypesUpdater = Utils::asyncRun(&ModelManagerInterface::updateCppQmlTypes, this, m_cppQmlTypesUpdater = Utils::asyncRun(&ModelManagerInterface::updateCppQmlTypes, this,
cppModelManager->snapshot(), m_queuedCppDocuments); CPlusPlus::CppModelManagerBase::snapshot(),
m_queuedCppDocuments);
m_queuedCppDocuments.clear(); m_queuedCppDocuments.clear();
} }

View File

@@ -912,12 +912,25 @@ void CppModelManager::initCppTools()
}); });
} }
static bool setExtraDiagnosticsCallback(const QString &fileName, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics)
{
return m_instance->setExtraDiagnostics(fileName, kind, diagnostics);
}
static Snapshot snapshotCallback()
{
return m_instance->snapshot();
}
CppModelManager::CppModelManager() CppModelManager::CppModelManager()
: CppModelManagerBase(nullptr) : d(new CppModelManagerPrivate)
, d(new CppModelManagerPrivate)
{ {
m_instance = this; m_instance = this;
CppModelManagerBase::registerSetExtraDiagnosticsCallback(&setExtraDiagnosticsCallback);
CppModelManagerBase::registerSnapshotCallback(&snapshotCallback);
// Used for weak dependency in VcsBaseSubmitEditor // Used for weak dependency in VcsBaseSubmitEditor
setObjectName("CppModelManager"); setObjectName("CppModelManager");
ExtensionSystem::PluginManager::addObject(this); ExtensionSystem::PluginManager::addObject(this);

View File

@@ -66,7 +66,7 @@ enum class SignalSlotType {
None None
}; };
class CPPEDITOR_EXPORT CppModelManager final : public CPlusPlus::CppModelManagerBase class CPPEDITOR_EXPORT CppModelManager final : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -97,7 +97,7 @@ public:
bool setExtraDiagnostics(const QString &fileName, bool setExtraDiagnostics(const QString &fileName,
const QString &kind, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics) override; const QList<Document::DiagnosticMessage> &diagnostics);
const QList<Document::DiagnosticMessage> diagnosticMessages(); const QList<Document::DiagnosticMessage> diagnosticMessages();
@@ -119,7 +119,7 @@ public:
/// all loaded projects. /// all loaded projects.
ProjectPart::ConstPtr fallbackProjectPart(); ProjectPart::ConstPtr fallbackProjectPart();
CPlusPlus::Snapshot snapshot() const override; CPlusPlus::Snapshot snapshot() const;
Document::Ptr document(const Utils::FilePath &filePath) const; Document::Ptr document(const Utils::FilePath &filePath) const;
bool replaceDocument(Document::Ptr newDoc); bool replaceDocument(Document::Ptr newDoc);