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

View File

@@ -5,29 +5,24 @@
#include <cplusplus/CppDocument.h>
#include <QObject>
#include <QList>
namespace CPlusPlus::CppModelManagerBase {
QT_BEGIN_NAMESPACE
class QString;
QT_END_NAMESPACE
CPLUSPLUS_EXPORT bool trySetExtraDiagnostics
(const QString &, const QString &, const QList<Document::DiagnosticMessage> &);
namespace CPlusPlus {
CPLUSPLUS_EXPORT bool setSetExtraDiagnostics
(const QString &, const QString &, const QList<Document::DiagnosticMessage> &);
class CPLUSPLUS_EXPORT CppModelManagerBase : public QObject
{
Q_OBJECT
public:
CppModelManagerBase(QObject *parent = nullptr);
~CppModelManagerBase();
CPLUSPLUS_EXPORT bool hasSnapshots();
static CppModelManagerBase *instance();
static bool trySetExtraDiagnostics(const QString &fileName, const QString &kind,
const QList<Document::DiagnosticMessage> &diagnostics);
CPLUSPLUS_EXPORT CPlusPlus::Snapshot snapshot();
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;
}
CPlusPlus::CppModelManagerBase *cppModelManager =
CPlusPlus::CppModelManagerBase::instance();
if (!cppModelManager)
if (!CPlusPlus::CppModelManagerBase::hasSnapshots())
return;
m_cppQmlTypesUpdater = Utils::asyncRun(&ModelManagerInterface::updateCppQmlTypes, this,
cppModelManager->snapshot(), m_queuedCppDocuments);
CPlusPlus::CppModelManagerBase::snapshot(),
m_queuedCppDocuments);
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()
: CppModelManagerBase(nullptr)
, d(new CppModelManagerPrivate)
: d(new CppModelManagerPrivate)
{
m_instance = this;
CppModelManagerBase::registerSetExtraDiagnosticsCallback(&setExtraDiagnosticsCallback);
CppModelManagerBase::registerSnapshotCallback(&snapshotCallback);
// Used for weak dependency in VcsBaseSubmitEditor
setObjectName("CppModelManager");
ExtensionSystem::PluginManager::addObject(this);

View File

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