CodeAssist: use shared pointer to pass around proposal models

Task-number: QTCREATORBUG-17752
Change-Id: Ia41f169b86ead209830e6f15764062389ced2b67
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
David Schulz
2018-02-14 14:32:51 +01:00
parent 4598a78980
commit a4b5fc00a8
34 changed files with 112 additions and 134 deletions

View File

@@ -30,14 +30,14 @@
namespace ClangCodeModel {
namespace Internal {
ClangAssistProposal::ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModel *model)
ClangAssistProposal::ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModelPtr model)
: GenericProposal(cursorPos, model)
{
}
bool ClangAssistProposal::isCorrective(TextEditor::TextEditorWidget *editorWidget) const
{
auto clangAssistProposalModel = static_cast<ClangAssistProposalModel*>(model());
auto clangAssistProposalModel = model().staticCast<ClangAssistProposalModel>();
return clangAssistProposalModel->neededCorrection()
== ClangBackEnd::CompletionCorrection::DotToArrowCorrection

View File

@@ -35,7 +35,7 @@ namespace Internal {
class ClangAssistProposal : public TextEditor::GenericProposal
{
public:
ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModel *model);
ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModelPtr model);
bool isCorrective(TextEditor::TextEditorWidget *editorWidget) const override;
void makeCorrection(TextEditor::TextEditorWidget *editorWidget) override;

View File

@@ -593,7 +593,7 @@ bool ClangCompletionAssistProcessor::sendCompletionRequest(int position,
TextEditor::IAssistProposal *ClangCompletionAssistProcessor::createProposal(
CompletionCorrection neededCorrection) const
{
ClangAssistProposalModel *model = new ClangAssistProposalModel(neededCorrection);
TextEditor::GenericProposalModelPtr model(new ClangAssistProposalModel(neededCorrection));
model->loadContent(m_completions);
return new ClangAssistProposal(m_positionForProposal, model);
}
@@ -601,9 +601,8 @@ TextEditor::IAssistProposal *ClangCompletionAssistProcessor::createProposal(
IAssistProposal *ClangCompletionAssistProcessor::createFunctionHintProposal(
const ClangBackEnd::CodeCompletions &completions) const
{
auto *model = new ClangFunctionHintModel(completions);
auto *proposal = new FunctionHintProposal(m_positionForProposal, model);
return proposal;
TextEditor::FunctionHintProposalModelPtr model(new ClangFunctionHintModel(completions));
return new FunctionHintProposal(m_positionForProposal, model);
}
} // namespace Internal

View File

@@ -89,7 +89,7 @@ public:
}
public:
TextEditor::IAssistProposalModel *proposalModel;
TextEditor::ProposalModelPtr proposalModel;
};
static const CppTools::ProjectPartHeaderPaths toHeaderPaths(const QStringList &paths)
@@ -102,17 +102,17 @@ static const CppTools::ProjectPartHeaderPaths toHeaderPaths(const QStringList &p
return result;
}
ProposalModel completionResults(TextEditor::BaseTextEditor *textEditor,
const QStringList &includePaths,
int timeOutInMs)
TextEditor::ProposalModelPtr completionResults(TextEditor::BaseTextEditor *textEditor,
const QStringList &includePaths,
int timeOutInMs)
{
using namespace TextEditor;
TextEditorWidget *textEditorWidget = qobject_cast<TextEditorWidget *>(textEditor->widget());
QTC_ASSERT(textEditorWidget, return ProposalModel());
QTC_ASSERT(textEditorWidget, return TextEditor::ProposalModelPtr());
AssistInterface *assistInterface = textEditorWidget->createAssistInterface(
TextEditor::Completion, TextEditor::ExplicitlyInvoked);
QTC_ASSERT(assistInterface, return ProposalModel());
QTC_ASSERT(assistInterface, return TextEditor::ProposalModelPtr());
if (!includePaths.isEmpty()) {
auto clangAssistInterface = static_cast<ClangCompletionAssistInterface *>(assistInterface);
clangAssistInterface->setHeaderPaths(toHeaderPaths(includePaths));
@@ -121,19 +121,21 @@ ProposalModel completionResults(TextEditor::BaseTextEditor *textEditor,
CompletionAssistProvider *assistProvider
= textEditor->textDocument()->completionAssistProvider();
QTC_ASSERT(qobject_cast<ClangCompletionAssistProvider *>(assistProvider),
return ProposalModel());
QTC_ASSERT(assistProvider, return ProposalModel());
QTC_ASSERT(assistProvider->runType() == IAssistProvider::Asynchronous, return ProposalModel());
return TextEditor::ProposalModelPtr());
QTC_ASSERT(assistProvider, return TextEditor::ProposalModelPtr());
QTC_ASSERT(assistProvider->runType() == IAssistProvider::Asynchronous,
return TextEditor::ProposalModelPtr());
IAssistProcessor *processor = assistProvider->createProcessor();
QTC_ASSERT(processor, return ProposalModel());
QTC_ASSERT(processor, return TextEditor::ProposalModelPtr());
WaitForAsyncCompletions waitForCompletions;
const WaitForAsyncCompletions::WaitResult result = waitForCompletions.wait(processor,
assistInterface,
timeOutInMs);
QTC_ASSERT(result == WaitForAsyncCompletions::GotResults, return ProposalModel());
return QSharedPointer<TextEditor::IAssistProposalModel>(waitForCompletions.proposalModel);
QTC_ASSERT(result == WaitForAsyncCompletions::GotResults,
return TextEditor::ProposalModelPtr());
return waitForCompletions.proposalModel;
}
} // namespace Internal

View File

@@ -25,22 +25,19 @@
#pragma once
#include <texteditor/codeassist/iassistproposalmodel.h>
#include <QString>
#include <QSharedPointer>
namespace TextEditor {
class BaseTextEditor;
class IAssistProposalModel;
}
namespace TextEditor { class BaseTextEditor; }
namespace ClangCodeModel {
namespace Internal {
using ProposalModel = QSharedPointer<TextEditor::IAssistProposalModel>;
ProposalModel completionResults(TextEditor::BaseTextEditor *textEditor,
const QStringList &includePaths = QStringList(),
int timeOutInMs = 10000);
TextEditor::ProposalModelPtr completionResults(TextEditor::BaseTextEditor *textEditor,
const QStringList &includePaths = QStringList(),
int timeOutInMs = 10000);
} // namespace Internal
} // namespace ClangCodeModel

View File

@@ -337,10 +337,10 @@ public:
proposal = completionResults(openEditor.editor(), includePaths, 15000);
}
ProposalModel proposal;
TextEditor::ProposalModelPtr proposal;
};
int indexOfItemWithText(ProposalModel model, const QByteArray &text)
int indexOfItemWithText(TextEditor::ProposalModelPtr model, const QByteArray &text)
{
if (!model)
return -1;
@@ -354,12 +354,12 @@ int indexOfItemWithText(ProposalModel model, const QByteArray &text)
return -1;
}
bool hasItem(ProposalModel model, const QByteArray &text)
bool hasItem(TextEditor::ProposalModelPtr model, const QByteArray &text)
{
return indexOfItemWithText(model, text) != -1;
}
bool hasItem(ProposalModel model, const QByteArray &text, const QByteArray &detail)
bool hasItem(TextEditor::ProposalModelPtr model, const QByteArray &text, const QByteArray &detail)
{
const int index = indexOfItemWithText(model, text);
if (index != -1 && index < model->size()) {
@@ -372,7 +372,7 @@ bool hasItem(ProposalModel model, const QByteArray &text, const QByteArray &deta
return false;
}
bool hasSnippet(ProposalModel model, const QByteArray &text)
bool hasSnippet(TextEditor::ProposalModelPtr model, const QByteArray &text)
{
if (!model)
return false;
@@ -602,7 +602,7 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCode()
OpenEditorAtCursorPosition openEditor(testDocument);
QVERIFY(openEditor.succeeded());
ProposalModel proposal = completionResults(openEditor.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openEditor.editor());
QVERIFY(hasItem(proposal, "projectConfiguration1"));
}
@@ -615,7 +615,7 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeAfterChangingProje
QVERIFY(openEditor.succeeded());
// Check completion without project
ProposalModel proposal = completionResults(openEditor.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openEditor.editor());
QVERIFY(hasItem(proposal, "noProjectConfigurationDetected"));
{
@@ -667,7 +667,7 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile(
QVERIFY(openSource.succeeded());
// ...and check comletions
ProposalModel proposal = completionResults(openSource.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "menuBar"));
QVERIFY(hasItem(proposal, "statusBar"));
QVERIFY(hasItem(proposal, "centralWidget"));
@@ -687,7 +687,7 @@ void ClangCodeCompletionTest::testCompleteAfterModifyingIncludedHeaderInOtherEdi
// Test that declarations from header file are visible in source file
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
ProposalModel proposal = completionResults(openSource.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Open header and insert a new declaration
@@ -720,7 +720,7 @@ void ClangCodeCompletionTest::testCompleteAfterModifyingIncludedHeaderByRefactor
// Open source and test that declaration from header file is visible in source file
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
ProposalModel proposal = completionResults(openSource.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Modify header document without switching to its editor.
@@ -755,7 +755,7 @@ void ClangCodeCompletionTest::testCompleteAfterChangingIncludedAndOpenHeaderExte
// Open source and test completions
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
ProposalModel proposal = completionResults(openSource.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Simulate external modification and wait for reload
@@ -783,7 +783,7 @@ void ClangCodeCompletionTest::testCompleteAfterChangingIncludedAndNotOpenHeaderE
// Open source and test completions
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
ProposalModel proposal = completionResults(openSource.editor());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Simulate external modification, e.g version control checkout

View File

@@ -815,12 +815,11 @@ static void addRefactoringActions(QMenu *menu, AssistInterface *iface)
using Processor = QScopedPointer<IAssistProcessor>;
using Proposal = QScopedPointer<IAssistProposal>;
using Model = QScopedPointer<GenericProposalModel>;
const Processor processor(CppEditorPlugin::instance()->quickFixProvider()->createProcessor());
const Proposal proposal(processor->perform(iface)); // OK, perform() takes ownership of iface.
if (proposal) {
Model model(static_cast<GenericProposalModel *>(proposal->model()));
auto model = proposal->model().staticCast<GenericProposalModel>();
for (int index = 0; index < model->size(); ++index) {
const auto item = static_cast<AssistProposalItem *>(model->proposalItem(index));
const QuickFixOperation::Ptr op = item->data().value<QuickFixOperation::Ptr>();

View File

@@ -137,23 +137,22 @@ public:
AssistInterface *assistInterface
= m_editorWidget->createAssistInterface(FollowSymbol, ExplicitlyInvoked);
using CppTools::Tests::IAssistProposalScopedPointer;
const IAssistProposalScopedPointer immediateProposal(
const QScopedPointer<IAssistProposal> immediateProposal(
processor->immediateProposal(assistInterface));
const IAssistProposalScopedPointer finalProposal(processor->perform(assistInterface));
const QScopedPointer<IAssistProposal> finalProposal(processor->perform(assistInterface));
VirtualFunctionAssistProvider::clearParams();
m_immediateItems = itemList(immediateProposal.d->model());
m_finalItems = itemList(finalProposal.d->model());
m_immediateItems = itemList(immediateProposal->model());
m_finalItems = itemList(finalProposal->model());
return false;
}
static OverrideItemList itemList(IAssistProposalModel *imodel)
static OverrideItemList itemList(ProposalModelPtr imodel)
{
OverrideItemList result;
GenericProposalModel *model = dynamic_cast<GenericProposalModel *>(imodel);
GenericProposalModelPtr model = imodel.staticCast<GenericProposalModel>();
if (!model)
return result;

View File

@@ -115,17 +115,17 @@ public:
ai->recreateTextDocument();
InternalCppCompletionAssistProcessor processor;
const Tests::IAssistProposalScopedPointer proposal(processor.perform(ai));
if (!proposal.d)
const QScopedPointer<IAssistProposal> proposal(processor.perform(ai));
if (!proposal)
return completions;
IAssistProposalModel *model = proposal.d->model();
ProposalModelPtr model = proposal->model();
if (!model)
return completions;
CppAssistProposalModel *listmodel = dynamic_cast<CppAssistProposalModel *>(model);
CppAssistProposalModelPtr listmodel = model.staticCast<CppAssistProposalModel>();
if (!listmodel)
return completions;
const int pos = proposal.d->basePosition();
const int pos = proposal->basePosition();
const int length = m_position - pos;
const QString prefix = Utils::Text::textAt(QTextCursor(m_textDocument), pos, length);
if (!prefix.isEmpty())

View File

@@ -443,9 +443,9 @@ AssistInterface *InternalCompletionAssistProvider::createAssistInterface(const Q
class CppAssistProposal : public GenericProposal
{
public:
CppAssistProposal(int cursorPos, GenericProposalModel *model)
CppAssistProposal(int cursorPos, GenericProposalModelPtr model)
: GenericProposal(cursorPos, model)
, m_replaceDotForArrow(static_cast<CppAssistProposalModel *>(model)->m_replaceDotForArrow)
, m_replaceDotForArrow(model.staticCast<CppAssistProposalModel>()->m_replaceDotForArrow)
{}
bool isCorrective(TextEditorWidget *) const override { return m_replaceDotForArrow; }
@@ -922,16 +922,15 @@ IAssistProposal *InternalCppCompletionAssistProcessor::createContentProposal()
}
m_model->loadContent(m_completions);
return new CppAssistProposal(m_positionForProposal, m_model.take());
return new CppAssistProposal(m_positionForProposal, m_model);
}
IAssistProposal *InternalCppCompletionAssistProcessor::createHintProposal(
QList<Function *> functionSymbols) const
{
IFunctionHintProposalModel *model =
new CppFunctionHintModel(functionSymbols, m_model->m_typeOfExpression);
IAssistProposal *proposal = new FunctionHintProposal(m_positionForProposal, model);
return proposal;
FunctionHintProposalModelPtr model(new CppFunctionHintModel(functionSymbols,
m_model->m_typeOfExpression));
return new FunctionHintProposal(m_positionForProposal, model);
}
int InternalCppCompletionAssistProcessor::startOfOperator(int positionInDocument,

View File

@@ -77,6 +77,8 @@ public:
QSharedPointer<CPlusPlus::TypeOfExpression> m_typeOfExpression;
};
using CppAssistProposalModelPtr = QSharedPointer<CppAssistProposalModel>;
class InternalCompletionAssistProvider : public CppCompletionAssistProvider
{
Q_OBJECT
@@ -158,7 +160,7 @@ private:
};
QScopedPointer<const CppCompletionAssistInterface> m_interface;
QScopedPointer<CppAssistProposalModel> m_model;
CppAssistProposalModelPtr m_model;
};
class CppCompletionAssistInterface : public TextEditor::AssistInterface

View File

@@ -395,16 +395,6 @@ FileWriterAndRemover::~FileWriterAndRemover()
}
}
IAssistProposalScopedPointer::IAssistProposalScopedPointer(TextEditor::IAssistProposal *proposal)
: d(proposal)
{}
IAssistProposalScopedPointer::~IAssistProposalScopedPointer()
{
if (d && d->model())
delete d->model();
}
VerifyCleanCppModelManager::VerifyCleanCppModelManager()
{
QVERIFY(isClean());

View File

@@ -172,16 +172,5 @@ private:
bool m_writtenSuccessfully;
};
// Normally the proposal is deleted by the ProcessorRunner or the
// GenericProposalWidget, but in tests we usually don't make use of them.
class CPPTOOLS_EXPORT IAssistProposalScopedPointer
{
public:
IAssistProposalScopedPointer(TextEditor::IAssistProposal *proposal);
~IAssistProposalScopedPointer();
QScopedPointer<TextEditor::IAssistProposal> d;
};
} // namespace Tests
} // namespace CppTools

View File

@@ -83,7 +83,7 @@ protected:
void showProposal(const QString &prefix) override
{
GenericProposalModel *proposalModel = model();
GenericProposalModelPtr proposalModel = model();
if (proposalModel && proposalModel->size() == 1) {
emit proposalItemActivated(proposalModel->proposalItem(0));
deleteLater();

View File

@@ -1111,7 +1111,8 @@ public:
//qDebug() << "COMPLETIONS" << completions->size();
delete interface;
return new GenericProposal(basePosition, new FakeVimAssistProposalModel(items));
return new GenericProposal(basePosition,
GenericProposalModelPtr(new FakeVimAssistProposalModel(items)));
}
private:

View File

@@ -479,7 +479,7 @@ IAssistProposal *GlslCompletionAssistProcessor::perform(const AssistInterface *i
IAssistProposal *GlslCompletionAssistProcessor::createHintProposal(
const QVector<GLSL::Function *> &symbols)
{
IFunctionHintProposalModel *model = new GlslFunctionHintProposalModel(symbols);
FunctionHintProposalModelPtr model(new GlslFunctionHintProposalModel(symbols));
IAssistProposal *proposal = new FunctionHintProposal(m_startPosition, model);
return proposal;
}

View File

@@ -347,7 +347,7 @@ QStringList qmlJSAutoComplete(QTextDocument *textDocument,
info)));
if (proposal) {
GenericProposalModel *model = static_cast<GenericProposalModel*>(proposal->model());
GenericProposalModelPtr model = proposal->model().staticCast<GenericProposalModel>();
int basePosition = proposal->basePosition();
const QString prefix = textDocument->toPlainText().mid(basePosition,
@@ -538,7 +538,7 @@ QmlJSCompletionAssistProcessor::~QmlJSCompletionAssistProcessor()
IAssistProposal *QmlJSCompletionAssistProcessor::createContentProposal() const
{
GenericProposalModel *model = new QmlJSAssistProposalModel(m_completions);
GenericProposalModelPtr model(new QmlJSAssistProposalModel(m_completions));
return new GenericProposal(m_startPosition, model);
}
@@ -546,10 +546,9 @@ IAssistProposal *QmlJSCompletionAssistProcessor::createHintProposal(
const QString &functionName, const QStringList &namedArguments,
int optionalNamedArguments, bool isVariadic) const
{
IFunctionHintProposalModel *model = new FunctionHintProposalModel(
functionName, namedArguments, optionalNamedArguments, isVariadic);
IAssistProposal *proposal = new FunctionHintProposal(m_startPosition, model);
return proposal;
FunctionHintProposalModelPtr model(new FunctionHintProposalModel(
functionName, namedArguments, optionalNamedArguments, isVariadic));
return new FunctionHintProposal(m_startPosition, model);
}
IAssistProposal *QmlJSCompletionAssistProcessor::perform(const AssistInterface *assistInterface)

View File

@@ -832,14 +832,13 @@ void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e)
QmlJSEditorPlugin::quickFixAssistProvider()->createProcessor());
QScopedPointer<IAssistProposal> proposal(processor->perform(interface));
if (!proposal.isNull()) {
GenericProposalModel *model = static_cast<GenericProposalModel *>(proposal->model());
GenericProposalModelPtr model = proposal->model().staticCast<GenericProposalModel>();
for (int index = 0; index < model->size(); ++index) {
AssistProposalItem *item = static_cast<AssistProposalItem *>(model->proposalItem(index));
QuickFixOperation::Ptr op = item->data().value<QuickFixOperation::Ptr>();
QAction *action = refactoringMenu->addAction(op->description());
connect(action, &QAction::triggered, this, [op]() { op->perform(); });
}
delete model;
}
}
}

View File

@@ -280,7 +280,6 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR
return;
// TODO: The proposal should own the model until someone takes it explicitly away.
QScopedPointer<IAssistProposalModel> proposalCandidateModel(newProposal->model());
QScopedPointer<IAssistProposal> proposalCandidate(newProposal);
bool destroyCurrentContext = false;
@@ -336,7 +335,7 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR
m_proposalWidget->setKind(m_assistKind);
m_proposalWidget->setBasePosition(basePosition);
m_proposalWidget->setUnderlyingWidget(m_editorWidget);
m_proposalWidget->setModel(proposalCandidateModel.take());
m_proposalWidget->setModel(m_proposal->model());
m_proposalWidget->setDisplayRect(m_editorWidget->cursorRect(basePosition));
m_proposalWidget->setIsSynchronized(!m_receivedContentWhileWaiting);
m_proposalWidget->showProposal(prefix);

View File

@@ -29,7 +29,7 @@
using namespace TextEditor;
FunctionHintProposal::FunctionHintProposal(int cursorPos, IFunctionHintProposalModel *model)
FunctionHintProposal::FunctionHintProposal(int cursorPos, FunctionHintProposalModelPtr model)
: IAssistProposal(cursorPos)
, m_model(model)
{
@@ -39,7 +39,7 @@ FunctionHintProposal::FunctionHintProposal(int cursorPos, IFunctionHintProposalM
FunctionHintProposal::~FunctionHintProposal()
{}
IAssistProposalModel *FunctionHintProposal::model() const
ProposalModelPtr FunctionHintProposal::model() const
{
return m_model;
}

View File

@@ -26,7 +26,7 @@
#pragma once
#include "iassistproposal.h"
#include "ifunctionhintproposalmodel.h"
namespace TextEditor {
@@ -35,14 +35,14 @@ class IFunctionHintProposalModel;
class TEXTEDITOR_EXPORT FunctionHintProposal : public IAssistProposal
{
public:
FunctionHintProposal(int cursorPos, IFunctionHintProposalModel *model);
FunctionHintProposal(int cursorPos, FunctionHintProposalModelPtr model);
~FunctionHintProposal();
IAssistProposalModel *model() const override;
ProposalModelPtr model() const override;
IAssistProposalWidget *createWidget() const override;
private:
IFunctionHintProposalModel *m_model;
FunctionHintProposalModelPtr m_model;
};
} // TextEditor

View File

@@ -102,7 +102,7 @@ struct FunctionHintProposalWidgetPrivate
const QWidget *m_underlyingWidget = nullptr;
CodeAssistant *m_assistant = nullptr;
IFunctionHintProposalModel *m_model = nullptr;
FunctionHintProposalModelPtr m_model;
QPointer<Utils::FakeToolTip> m_popupFrame;
QLabel *m_numberLabel = nullptr;
QLabel *m_hintLabel = nullptr;
@@ -161,7 +161,6 @@ FunctionHintProposalWidget::FunctionHintProposalWidget()
FunctionHintProposalWidget::~FunctionHintProposalWidget()
{
delete d->m_model;
delete d;
}
@@ -181,9 +180,9 @@ void FunctionHintProposalWidget::setUnderlyingWidget(const QWidget *underlyingWi
d->m_underlyingWidget = underlyingWidget;
}
void FunctionHintProposalWidget::setModel(IAssistProposalModel *model)
void FunctionHintProposalWidget::setModel(ProposalModelPtr model)
{
d->m_model = static_cast<IFunctionHintProposalModel *>(model);
d->m_model = model.staticCast<IFunctionHintProposalModel>();
}
void FunctionHintProposalWidget::setDisplayRect(const QRect &rect)

View File

@@ -44,7 +44,7 @@ public:
void setReason(AssistReason reason) override;
void setKind(AssistKind kind) override;
void setUnderlyingWidget(const QWidget *underlyingWidget) override;
void setModel(IAssistProposalModel *model) override;
void setModel(ProposalModelPtr model) override;
void setDisplayRect(const QRect &rect) override;
void setIsSynchronized(bool isSync) override;

View File

@@ -31,7 +31,7 @@
namespace TextEditor {
GenericProposal::GenericProposal(int cursorPos, GenericProposalModel *model)
GenericProposal::GenericProposal(int cursorPos, GenericProposalModelPtr model)
: IAssistProposal(cursorPos)
, m_model(model)
{}
@@ -77,7 +77,7 @@ bool GenericProposal::hasItemsToPropose(const QString &prefix, AssistReason reas
return m_model->hasItemsToPropose(prefix, reason);
}
IAssistProposalModel *GenericProposal::model() const
ProposalModelPtr GenericProposal::model() const
{
return m_model;
}

View File

@@ -26,18 +26,18 @@
#pragma once
#include "iassistproposal.h"
#include "genericproposalmodel.h"
#include <texteditor/quickfix.h>
namespace TextEditor {
class GenericProposalModel;
class AssistProposalItemInterface;
class TEXTEDITOR_EXPORT GenericProposal : public IAssistProposal
{
public:
GenericProposal(int cursorPos, GenericProposalModel *model);
GenericProposal(int cursorPos, GenericProposalModelPtr model);
GenericProposal(int cursorPos, const QList<AssistProposalItemInterface *> &items);
~GenericProposal();
@@ -46,14 +46,14 @@ public:
const QuickFixOperations &quickFixes);
bool hasItemsToPropose(const QString &prefix, AssistReason reason) const override;
IAssistProposalModel *model() const override;
ProposalModelPtr model() const override;
IAssistProposalWidget *createWidget() const override;
protected:
void moveBasePosition(int length);
private:
GenericProposalModel *m_model;
GenericProposalModelPtr m_model;
};
} // TextEditor

View File

@@ -83,4 +83,7 @@ private:
QString m_prefilterPrefix;
bool m_duplicatesRemoved = false;
};
using GenericProposalModelPtr = QSharedPointer<GenericProposalModel>;
} // TextEditor

View File

@@ -62,16 +62,16 @@ class ModelAdapter : public QAbstractListModel
Q_OBJECT
public:
ModelAdapter(GenericProposalModel *completionModel, QWidget *parent);
ModelAdapter(GenericProposalModelPtr completionModel, QWidget *parent);
virtual int rowCount(const QModelIndex &) const;
virtual QVariant data(const QModelIndex &index, int role) const;
private:
GenericProposalModel *m_completionModel;
GenericProposalModelPtr m_completionModel;
};
ModelAdapter::ModelAdapter(GenericProposalModel *completionModel, QWidget *parent)
ModelAdapter::ModelAdapter(GenericProposalModelPtr completionModel, QWidget *parent)
: QAbstractListModel(parent)
, m_completionModel(completionModel)
{}
@@ -208,7 +208,7 @@ public:
const QWidget *m_underlyingWidget = nullptr;
GenericProposalListView *m_completionListView;
GenericProposalModel *m_model = nullptr;
GenericProposalModelPtr m_model;
QRect m_displayRect;
bool m_isSynchronized = true;
bool m_explicitlySelected = false;
@@ -309,7 +309,6 @@ GenericProposalWidget::GenericProposalWidget()
GenericProposalWidget::~GenericProposalWidget()
{
delete d->m_model;
delete d;
}
@@ -336,10 +335,9 @@ void GenericProposalWidget::setUnderlyingWidget(const QWidget *underlyingWidget)
d->m_underlyingWidget = underlyingWidget;
}
void GenericProposalWidget::setModel(IAssistProposalModel *model)
void GenericProposalWidget::setModel(ProposalModelPtr model)
{
delete d->m_model;
d->m_model = static_cast<GenericProposalModel *>(model);
d->m_model = model.staticCast<GenericProposalModel>();
d->m_completionListView->setModel(new ModelAdapter(d->m_model, d->m_completionListView));
connect(d->m_completionListView->selectionModel(), &QItemSelectionModel::currentChanged,
@@ -611,7 +609,7 @@ bool GenericProposalWidget::activateCurrentProposalItem()
return false;
}
GenericProposalModel *GenericProposalWidget::model()
GenericProposalModelPtr GenericProposalWidget::model()
{
return d->m_model;
}

View File

@@ -27,13 +27,14 @@
#include "iassistproposalwidget.h"
#include "genericproposalmodel.h"
#include <texteditor/texteditor_global.h>
namespace TextEditor {
class GenericProposalWidgetPrivate;
class GenericProposalModel;
class TEXTEDITOR_EXPORT GenericProposalWidget : public IAssistProposalWidget
{
@@ -48,7 +49,7 @@ public:
void setReason(AssistReason reason) override;
void setKind(AssistKind kind) override;
void setUnderlyingWidget(const QWidget *underlyingWidget) override;
void setModel(IAssistProposalModel *model) override;
void setModel(ProposalModelPtr model) override;
void setDisplayRect(const QRect &rect) override;
void setIsSynchronized(bool isSync) override;
@@ -67,7 +68,7 @@ private:
protected:
bool eventFilter(QObject *o, QEvent *e) override;
bool activateCurrentProposalItem();
GenericProposalModel *model();
TextEditor::GenericProposalModelPtr model();
private:
GenericProposalWidgetPrivate *d;

View File

@@ -26,12 +26,12 @@
#pragma once
#include "assistenums.h"
#include "iassistproposalmodel.h"
#include <texteditor/texteditor_global.h>
namespace TextEditor {
class IAssistProposalModel;
class IAssistProposalWidget;
class TextEditorWidget;
@@ -46,7 +46,7 @@ public:
virtual bool hasItemsToPropose(const QString &, AssistReason) const { return true; }
virtual bool isCorrective(TextEditorWidget *editorWidget) const;
virtual void makeCorrection(TextEditorWidget *editorWidget);
virtual IAssistProposalModel *model() const = 0;
virtual TextEditor::ProposalModelPtr model() const = 0;
virtual IAssistProposalWidget *createWidget() const = 0;
void setFragile(bool fragile);

View File

@@ -27,6 +27,8 @@
#include <texteditor/texteditor_global.h>
#include <QSharedPointer>
QT_FORWARD_DECLARE_CLASS(QString)
namespace TextEditor {
@@ -43,4 +45,6 @@ public:
virtual QString text(int index) const = 0;
};
using ProposalModelPtr = QSharedPointer<IAssistProposalModel>;
} // TextEditor

View File

@@ -26,6 +26,7 @@
#pragma once
#include "assistenums.h"
#include "iassistproposalmodel.h"
#include <texteditor/texteditor_global.h>
@@ -34,7 +35,6 @@
namespace TextEditor {
class CodeAssistant;
class IAssistProposalModel;
class AssistProposalItemInterface;
class TEXTEDITOR_EXPORT IAssistProposalWidget : public QFrame
@@ -49,7 +49,7 @@ public:
virtual void setReason(AssistReason reason) = 0;
virtual void setKind(AssistKind kind) = 0;
virtual void setUnderlyingWidget(const QWidget *underlyingWidget) = 0;
virtual void setModel(IAssistProposalModel *model) = 0;
virtual void setModel(ProposalModelPtr model) = 0;
virtual void setDisplayRect(const QRect &rect) = 0;
virtual void setIsSynchronized(bool isSync) = 0;

View File

@@ -43,4 +43,6 @@ public:
virtual QString id(int index) const;
};
using FunctionHintProposalModelPtr = QSharedPointer<IFunctionHintProposalModel>;
} // TextEditor

View File

@@ -207,7 +207,7 @@ IAssistProposal *KeywordsCompletionAssistProcessor::perform(const AssistInterfac
QStringList functionSymbols = m_keywords.argsForFunction(word);
if (functionSymbols.size() == 0)
return nullptr;
IFunctionHintProposalModel *model = new KeywordsFunctionHintModel(functionSymbols);
FunctionHintProposalModelPtr model(new KeywordsFunctionHintModel(functionSymbols));
return new FunctionHintProposal(startPosition, model);
} else {
QList<AssistProposalItemInterface *> items = m_snippetCollector.collect();

View File

@@ -38,11 +38,8 @@ ProcessorRunner::ProcessorRunner()
ProcessorRunner::~ProcessorRunner()
{
delete m_processor;
if (m_discardProposal && m_proposal) {
// Proposal doesn't own the model, so we need to delete both.
delete m_proposal->model();
if (m_discardProposal && m_proposal)
delete m_proposal;
}
}
void ProcessorRunner::setProcessor(IAssistProcessor *computer)