From a4b5fc00a88dbb852b9fddc4ee125ba27c6bacf0 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 14 Feb 2018 14:32:51 +0100 Subject: [PATCH] CodeAssist: use shared pointer to pass around proposal models Task-number: QTCREATORBUG-17752 Change-Id: Ia41f169b86ead209830e6f15764062389ced2b67 Reviewed-by: hjk --- .../clangcodemodel/clangassistproposal.cpp | 4 +-- .../clangcodemodel/clangassistproposal.h | 2 +- .../clangcompletionassistprocessor.cpp | 7 +++-- .../test/clangautomationutils.cpp | 26 ++++++++++--------- .../test/clangautomationutils.h | 15 +++++------ .../test/clangcodecompletion_test.cpp | 24 ++++++++--------- src/plugins/cppeditor/cppeditorwidget.cpp | 3 +-- .../followsymbol_switchmethoddecldef_test.cpp | 13 +++++----- src/plugins/cpptools/cppcompletion_test.cpp | 10 +++---- src/plugins/cpptools/cppcompletionassist.cpp | 13 +++++----- src/plugins/cpptools/cppcompletionassist.h | 4 ++- src/plugins/cpptools/cpptoolstestcase.cpp | 10 ------- src/plugins/cpptools/cpptoolstestcase.h | 11 -------- .../cppvirtualfunctionassistprovider.cpp | 2 +- src/plugins/fakevim/fakevimplugin.cpp | 3 ++- .../glsleditor/glslcompletionassist.cpp | 2 +- .../qmljseditor/qmljscompletionassist.cpp | 11 ++++---- src/plugins/qmljseditor/qmljseditor.cpp | 3 +-- .../texteditor/codeassist/codeassistant.cpp | 3 +-- .../codeassist/functionhintproposal.cpp | 4 +-- .../codeassist/functionhintproposal.h | 8 +++--- .../codeassist/functionhintproposalwidget.cpp | 7 +++-- .../codeassist/functionhintproposalwidget.h | 2 +- .../texteditor/codeassist/genericproposal.cpp | 4 +-- .../texteditor/codeassist/genericproposal.h | 8 +++--- .../codeassist/genericproposalmodel.h | 3 +++ .../codeassist/genericproposalwidget.cpp | 16 +++++------- .../codeassist/genericproposalwidget.h | 7 ++--- .../texteditor/codeassist/iassistproposal.h | 4 +-- .../codeassist/iassistproposalmodel.h | 4 +++ .../codeassist/iassistproposalwidget.h | 4 +-- .../codeassist/ifunctionhintproposalmodel.h | 2 ++ .../codeassist/keywordscompletionassist.cpp | 2 +- src/plugins/texteditor/codeassist/runner.cpp | 5 +--- 34 files changed, 112 insertions(+), 134 deletions(-) diff --git a/src/plugins/clangcodemodel/clangassistproposal.cpp b/src/plugins/clangcodemodel/clangassistproposal.cpp index b70b56b7941..16b9937908b 100644 --- a/src/plugins/clangcodemodel/clangassistproposal.cpp +++ b/src/plugins/clangcodemodel/clangassistproposal.cpp @@ -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(model()); + auto clangAssistProposalModel = model().staticCast(); return clangAssistProposalModel->neededCorrection() == ClangBackEnd::CompletionCorrection::DotToArrowCorrection diff --git a/src/plugins/clangcodemodel/clangassistproposal.h b/src/plugins/clangcodemodel/clangassistproposal.h index 70b5f15ca27..4353b43fb29 100644 --- a/src/plugins/clangcodemodel/clangassistproposal.h +++ b/src/plugins/clangcodemodel/clangassistproposal.h @@ -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; diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 06bcbebd899..8c05232bc88 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -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 diff --git a/src/plugins/clangcodemodel/test/clangautomationutils.cpp b/src/plugins/clangcodemodel/test/clangautomationutils.cpp index e0bc59e2f3c..ada161fb4a5 100644 --- a/src/plugins/clangcodemodel/test/clangautomationutils.cpp +++ b/src/plugins/clangcodemodel/test/clangautomationutils.cpp @@ -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(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(assistInterface); clangAssistInterface->setHeaderPaths(toHeaderPaths(includePaths)); @@ -121,19 +121,21 @@ ProposalModel completionResults(TextEditor::BaseTextEditor *textEditor, CompletionAssistProvider *assistProvider = textEditor->textDocument()->completionAssistProvider(); QTC_ASSERT(qobject_cast(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(waitForCompletions.proposalModel); + QTC_ASSERT(result == WaitForAsyncCompletions::GotResults, + return TextEditor::ProposalModelPtr()); + return waitForCompletions.proposalModel; } } // namespace Internal diff --git a/src/plugins/clangcodemodel/test/clangautomationutils.h b/src/plugins/clangcodemodel/test/clangautomationutils.h index 9942a597fd7..4e16db9f2db 100644 --- a/src/plugins/clangcodemodel/test/clangautomationutils.h +++ b/src/plugins/clangcodemodel/test/clangautomationutils.h @@ -25,22 +25,19 @@ #pragma once +#include + #include #include -namespace TextEditor { -class BaseTextEditor; -class IAssistProposalModel; -} +namespace TextEditor { class BaseTextEditor; } namespace ClangCodeModel { namespace Internal { -using ProposalModel = QSharedPointer; - -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 diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp index 9165ccca29c..53b1ecb9dc6 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp @@ -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 diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index feeb0571862..778936570e7 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -815,12 +815,11 @@ static void addRefactoringActions(QMenu *menu, AssistInterface *iface) using Processor = QScopedPointer; using Proposal = QScopedPointer; - using Model = QScopedPointer; 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(proposal->model())); + auto model = proposal->model().staticCast(); for (int index = 0; index < model->size(); ++index) { const auto item = static_cast(model->proposalItem(index)); const QuickFixOperation::Ptr op = item->data().value(); diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index ef025a61795..3ac121d918e 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -137,23 +137,22 @@ public: AssistInterface *assistInterface = m_editorWidget->createAssistInterface(FollowSymbol, ExplicitlyInvoked); - using CppTools::Tests::IAssistProposalScopedPointer; - const IAssistProposalScopedPointer immediateProposal( + const QScopedPointer immediateProposal( processor->immediateProposal(assistInterface)); - const IAssistProposalScopedPointer finalProposal(processor->perform(assistInterface)); + const QScopedPointer 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(imodel); + GenericProposalModelPtr model = imodel.staticCast(); if (!model) return result; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 147ae4e4554..4abc2ccbd38 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -115,17 +115,17 @@ public: ai->recreateTextDocument(); InternalCppCompletionAssistProcessor processor; - const Tests::IAssistProposalScopedPointer proposal(processor.perform(ai)); - if (!proposal.d) + const QScopedPointer 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(model); + CppAssistProposalModelPtr listmodel = model.staticCast(); 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()) diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 9b7cdc45127..078d695f852 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -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(model)->m_replaceDotForArrow) + , m_replaceDotForArrow(model.staticCast()->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 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, diff --git a/src/plugins/cpptools/cppcompletionassist.h b/src/plugins/cpptools/cppcompletionassist.h index 809a5a1005c..f2712c6e915 100644 --- a/src/plugins/cpptools/cppcompletionassist.h +++ b/src/plugins/cpptools/cppcompletionassist.h @@ -77,6 +77,8 @@ public: QSharedPointer m_typeOfExpression; }; +using CppAssistProposalModelPtr = QSharedPointer; + class InternalCompletionAssistProvider : public CppCompletionAssistProvider { Q_OBJECT @@ -158,7 +160,7 @@ private: }; QScopedPointer m_interface; - QScopedPointer m_model; + CppAssistProposalModelPtr m_model; }; class CppCompletionAssistInterface : public TextEditor::AssistInterface diff --git a/src/plugins/cpptools/cpptoolstestcase.cpp b/src/plugins/cpptools/cpptoolstestcase.cpp index 43ed514efee..9b05e4f5428 100644 --- a/src/plugins/cpptools/cpptoolstestcase.cpp +++ b/src/plugins/cpptools/cpptoolstestcase.cpp @@ -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()); diff --git a/src/plugins/cpptools/cpptoolstestcase.h b/src/plugins/cpptools/cpptoolstestcase.h index 6a00aceb229..2b1818e8272 100644 --- a/src/plugins/cpptools/cpptoolstestcase.h +++ b/src/plugins/cpptools/cpptoolstestcase.h @@ -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 d; -}; - } // namespace Tests } // namespace CppTools diff --git a/src/plugins/cpptools/cppvirtualfunctionassistprovider.cpp b/src/plugins/cpptools/cppvirtualfunctionassistprovider.cpp index f0b8f029a6e..c07d88639ef 100644 --- a/src/plugins/cpptools/cppvirtualfunctionassistprovider.cpp +++ b/src/plugins/cpptools/cppvirtualfunctionassistprovider.cpp @@ -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(); diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 0f07a30f6f5..8d0ede09048 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -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: diff --git a/src/plugins/glsleditor/glslcompletionassist.cpp b/src/plugins/glsleditor/glslcompletionassist.cpp index a9ced66128e..2ada88f6465 100644 --- a/src/plugins/glsleditor/glslcompletionassist.cpp +++ b/src/plugins/glsleditor/glslcompletionassist.cpp @@ -479,7 +479,7 @@ IAssistProposal *GlslCompletionAssistProcessor::perform(const AssistInterface *i IAssistProposal *GlslCompletionAssistProcessor::createHintProposal( const QVector &symbols) { - IFunctionHintProposalModel *model = new GlslFunctionHintProposalModel(symbols); + FunctionHintProposalModelPtr model(new GlslFunctionHintProposalModel(symbols)); IAssistProposal *proposal = new FunctionHintProposal(m_startPosition, model); return proposal; } diff --git a/src/plugins/qmljseditor/qmljscompletionassist.cpp b/src/plugins/qmljseditor/qmljscompletionassist.cpp index fa7615dc73e..c397f3ae9fe 100644 --- a/src/plugins/qmljseditor/qmljscompletionassist.cpp +++ b/src/plugins/qmljseditor/qmljscompletionassist.cpp @@ -347,7 +347,7 @@ QStringList qmlJSAutoComplete(QTextDocument *textDocument, info))); if (proposal) { - GenericProposalModel *model = static_cast(proposal->model()); + GenericProposalModelPtr model = proposal->model().staticCast(); 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) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index c0514808f18..b2628c0783b 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -832,14 +832,13 @@ void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e) QmlJSEditorPlugin::quickFixAssistProvider()->createProcessor()); QScopedPointer proposal(processor->perform(interface)); if (!proposal.isNull()) { - GenericProposalModel *model = static_cast(proposal->model()); + GenericProposalModelPtr model = proposal->model().staticCast(); for (int index = 0; index < model->size(); ++index) { AssistProposalItem *item = static_cast(model->proposalItem(index)); QuickFixOperation::Ptr op = item->data().value(); QAction *action = refactoringMenu->addAction(op->description()); connect(action, &QAction::triggered, this, [op]() { op->perform(); }); } - delete model; } } } diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index d275a78bce0..e84fbe1aa07 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -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 proposalCandidateModel(newProposal->model()); QScopedPointer 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); diff --git a/src/plugins/texteditor/codeassist/functionhintproposal.cpp b/src/plugins/texteditor/codeassist/functionhintproposal.cpp index 048ce8da569..6cfbc51c4af 100644 --- a/src/plugins/texteditor/codeassist/functionhintproposal.cpp +++ b/src/plugins/texteditor/codeassist/functionhintproposal.cpp @@ -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; } diff --git a/src/plugins/texteditor/codeassist/functionhintproposal.h b/src/plugins/texteditor/codeassist/functionhintproposal.h index 53746534541..a4fd7ebe6a7 100644 --- a/src/plugins/texteditor/codeassist/functionhintproposal.h +++ b/src/plugins/texteditor/codeassist/functionhintproposal.h @@ -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 diff --git a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp index 5118ec2810f..32a3c770985 100644 --- a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp @@ -102,7 +102,7 @@ struct FunctionHintProposalWidgetPrivate const QWidget *m_underlyingWidget = nullptr; CodeAssistant *m_assistant = nullptr; - IFunctionHintProposalModel *m_model = nullptr; + FunctionHintProposalModelPtr m_model; QPointer 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(model); + d->m_model = model.staticCast(); } void FunctionHintProposalWidget::setDisplayRect(const QRect &rect) diff --git a/src/plugins/texteditor/codeassist/functionhintproposalwidget.h b/src/plugins/texteditor/codeassist/functionhintproposalwidget.h index 0081904bc44..99def1676a1 100644 --- a/src/plugins/texteditor/codeassist/functionhintproposalwidget.h +++ b/src/plugins/texteditor/codeassist/functionhintproposalwidget.h @@ -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; diff --git a/src/plugins/texteditor/codeassist/genericproposal.cpp b/src/plugins/texteditor/codeassist/genericproposal.cpp index c2b06e4f954..6feff83251a 100644 --- a/src/plugins/texteditor/codeassist/genericproposal.cpp +++ b/src/plugins/texteditor/codeassist/genericproposal.cpp @@ -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; } diff --git a/src/plugins/texteditor/codeassist/genericproposal.h b/src/plugins/texteditor/codeassist/genericproposal.h index 3acfe46bc45..eafa6ce6f93 100644 --- a/src/plugins/texteditor/codeassist/genericproposal.h +++ b/src/plugins/texteditor/codeassist/genericproposal.h @@ -26,18 +26,18 @@ #pragma once #include "iassistproposal.h" +#include "genericproposalmodel.h" #include 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 &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 diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.h b/src/plugins/texteditor/codeassist/genericproposalmodel.h index 0e2213436c9..25de296f7bc 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.h +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.h @@ -83,4 +83,7 @@ private: QString m_prefilterPrefix; bool m_duplicatesRemoved = false; }; + +using GenericProposalModelPtr = QSharedPointer; + } // TextEditor diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index 625b75e0d03..cecaad9666b 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -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(model); + d->m_model = model.staticCast(); 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; } diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.h b/src/plugins/texteditor/codeassist/genericproposalwidget.h index 016a3b952bd..86ce6be8738 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.h +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.h @@ -27,13 +27,14 @@ #include "iassistproposalwidget.h" +#include "genericproposalmodel.h" + #include 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; diff --git a/src/plugins/texteditor/codeassist/iassistproposal.h b/src/plugins/texteditor/codeassist/iassistproposal.h index 4e93993dc26..0dbf24462fc 100644 --- a/src/plugins/texteditor/codeassist/iassistproposal.h +++ b/src/plugins/texteditor/codeassist/iassistproposal.h @@ -26,12 +26,12 @@ #pragma once #include "assistenums.h" +#include "iassistproposalmodel.h" #include 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); diff --git a/src/plugins/texteditor/codeassist/iassistproposalmodel.h b/src/plugins/texteditor/codeassist/iassistproposalmodel.h index fdb6289ce1e..92a66589807 100644 --- a/src/plugins/texteditor/codeassist/iassistproposalmodel.h +++ b/src/plugins/texteditor/codeassist/iassistproposalmodel.h @@ -27,6 +27,8 @@ #include +#include + QT_FORWARD_DECLARE_CLASS(QString) namespace TextEditor { @@ -43,4 +45,6 @@ public: virtual QString text(int index) const = 0; }; +using ProposalModelPtr = QSharedPointer; + } // TextEditor diff --git a/src/plugins/texteditor/codeassist/iassistproposalwidget.h b/src/plugins/texteditor/codeassist/iassistproposalwidget.h index fd86bb5722b..98411ddeb68 100644 --- a/src/plugins/texteditor/codeassist/iassistproposalwidget.h +++ b/src/plugins/texteditor/codeassist/iassistproposalwidget.h @@ -26,6 +26,7 @@ #pragma once #include "assistenums.h" +#include "iassistproposalmodel.h" #include @@ -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; diff --git a/src/plugins/texteditor/codeassist/ifunctionhintproposalmodel.h b/src/plugins/texteditor/codeassist/ifunctionhintproposalmodel.h index fe329e7c822..7649a6398ee 100644 --- a/src/plugins/texteditor/codeassist/ifunctionhintproposalmodel.h +++ b/src/plugins/texteditor/codeassist/ifunctionhintproposalmodel.h @@ -43,4 +43,6 @@ public: virtual QString id(int index) const; }; +using FunctionHintProposalModelPtr = QSharedPointer; + } // TextEditor diff --git a/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp b/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp index 0b26d4809e0..15e0dda482b 100644 --- a/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp +++ b/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp @@ -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 items = m_snippetCollector.collect(); diff --git a/src/plugins/texteditor/codeassist/runner.cpp b/src/plugins/texteditor/codeassist/runner.cpp index 2306ecd328d..abc2078d4e5 100644 --- a/src/plugins/texteditor/codeassist/runner.cpp +++ b/src/plugins/texteditor/codeassist/runner.cpp @@ -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)