forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -83,4 +83,7 @@ private:
|
||||
QString m_prefilterPrefix;
|
||||
bool m_duplicatesRemoved = false;
|
||||
};
|
||||
|
||||
using GenericProposalModelPtr = QSharedPointer<GenericProposalModel>;
|
||||
|
||||
} // TextEditor
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -43,4 +43,6 @@ public:
|
||||
virtual QString id(int index) const;
|
||||
};
|
||||
|
||||
using FunctionHintProposalModelPtr = QSharedPointer<IFunctionHintProposalModel>;
|
||||
|
||||
} // TextEditor
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user