aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@theqtcompany.com>2016-02-01 14:51:01 +0100
committerMarco Bubke <marco.bubke@theqtcompany.com>2016-02-01 14:01:35 +0000
commitc903f4974f3ed403b1cc4af4f143922d8ebc7961 (patch)
tree8212fe73b701edd3826b8972c76913beec197e4c
parente42bf6ebc637e9ef4ec95787374c9743eb80d8d4 (diff)
TextEditor: Introduce AssistProposalItemInterface
For unit test we need to break every dependency to the TextEditor Widget etc.. With an abstract interface we can implement it in clang without relying on unwanted dependencies. It makes it also easier to compute the values deferred. Change-Id: I1b313a1625f4e80bd324ab4bf1a7c4f6b690abe9 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
-rw-r--r--src/plugins/clangcodemodel/clangassistproposalitem.h2
-rw-r--r--src/plugins/clangcodemodel/clangassistproposalmodel.cpp7
-rw-r--r--src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp6
-rw-r--r--src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp4
-rw-r--r--src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp15
-rw-r--r--src/plugins/cppeditor/cppvirtualfunctionproposalitem.h2
-rw-r--r--src/plugins/cpptools/cppcompletionassist.cpp33
-rw-r--r--src/plugins/cpptools/cppcompletionassist.h2
-rw-r--r--src/plugins/cpptools/cppcompletionassistprocessor.h2
-rw-r--r--src/plugins/fakevim/fakevimplugin.cpp6
-rw-r--r--src/plugins/glsleditor/glslcompletionassist.cpp2
-rw-r--r--src/plugins/qmljseditor/qmljscompletionassist.cpp20
-rw-r--r--src/plugins/qmljseditor/qmljscompletionassist.h4
-rw-r--r--src/plugins/texteditor/circularclipboardassist.cpp2
-rw-r--r--src/plugins/texteditor/codeassist/assistproposalitem.cpp24
-rw-r--r--src/plugins/texteditor/codeassist/assistproposalitem.h24
-rw-r--r--src/plugins/texteditor/codeassist/assistproposaliteminterface.h68
-rw-r--r--src/plugins/texteditor/codeassist/codeassistant.cpp4
-rw-r--r--src/plugins/texteditor/codeassist/genericproposal.cpp2
-rw-r--r--src/plugins/texteditor/codeassist/genericproposal.h4
-rw-r--r--src/plugins/texteditor/codeassist/genericproposalmodel.cpp20
-rw-r--r--src/plugins/texteditor/codeassist/genericproposalmodel.h10
-rw-r--r--src/plugins/texteditor/codeassist/genericproposalwidget.cpp4
-rw-r--r--src/plugins/texteditor/codeassist/iassistproposalwidget.h4
-rw-r--r--src/plugins/texteditor/codeassist/keywordscompletionassist.cpp4
-rw-r--r--src/plugins/texteditor/codeassist/keywordscompletionassist.h2
-rw-r--r--src/plugins/texteditor/codeassist/quickfixassistprocessor.cpp3
-rw-r--r--src/plugins/texteditor/snippets/snippetassistcollector.cpp6
-rw-r--r--src/plugins/texteditor/snippets/snippetassistcollector.h4
-rw-r--r--src/plugins/texteditor/texteditor.pro1
-rw-r--r--src/plugins/texteditor/texteditor.qbs1
31 files changed, 187 insertions, 105 deletions
diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.h b/src/plugins/clangcodemodel/clangassistproposalitem.h
index 6f856fd608..bc0b2c7782 100644
--- a/src/plugins/clangcodemodel/clangassistproposalitem.h
+++ b/src/plugins/clangcodemodel/clangassistproposalitem.h
@@ -33,7 +33,7 @@
namespace ClangCodeModel {
namespace Internal {
-class ClangAssistProposalItem : public TextEditor::AssistProposalItem
+class ClangAssistProposalItem final : public TextEditor::AssistProposalItem
{
friend bool operator<(const ClangAssistProposalItem &first, const ClangAssistProposalItem &second);
public:
diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp
index 26ca6f6185..06dc7b3198 100644
--- a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp
+++ b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp
@@ -27,7 +27,7 @@
#include "clangassistproposalmodel.h"
-#include <texteditor/codeassist/assistproposalitem.h>
+#include <texteditor/codeassist/assistproposaliteminterface.h>
#include <algorithm>
@@ -47,9 +47,10 @@ bool ClangAssistProposalModel::isSortable(const QString &/*prefix*/) const
void ClangAssistProposalModel::sort(const QString &/*prefix*/)
{
- using TextEditor::AssistProposalItem;
+ using TextEditor::AssistProposalItemInterface;
- auto currentItemsCompare = [](AssistProposalItem *first, AssistProposalItem *second) {
+ auto currentItemsCompare = [](AssistProposalItemInterface *first,
+ AssistProposalItemInterface *second) {
return (first->order() > 0
&& (first->order() < second->order()
|| (first->order() == second->order() && first->text() < second->text())));
diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
index 08d0aba102..ca80217326 100644
--- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
@@ -58,14 +58,14 @@ namespace ClangCodeModel {
namespace Internal {
using ClangBackEnd::CodeCompletion;
-using TextEditor::AssistProposalItem;
+using TextEditor::AssistProposalItemInterface;
namespace {
const char SNIPPET_ICON_PATH[] = ":/texteditor/images/snippet.png";
-QList<AssistProposalItem *> toAssistProposalItems(const CodeCompletions &completions)
+QList<AssistProposalItemInterface *> toAssistProposalItems(const CodeCompletions &completions)
{
static CPlusPlus::Icons m_icons; // de-deduplicate
@@ -178,7 +178,7 @@ QList<AssistProposalItem *> toAssistProposalItems(const CodeCompletions &complet
}
}
- QList<AssistProposalItem *> results;
+ QList<AssistProposalItemInterface *> results;
results.reserve(items.size());
std::copy(items.cbegin(), items.cend(), std::back_inserter(results));
diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
index 9aae254c1a..54f35b9dca 100644
--- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
+++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
@@ -746,10 +746,10 @@ bool hasSnippet(ProposalModel model, const QByteArray &text)
auto *genericModel = static_cast<TextEditor::GenericProposalModel *>(model.data());
for (int i = 0, size = genericModel->size(); i < size; ++i) {
- TextEditor::AssistProposalItem *item = genericModel->proposalItem(i);
+ TextEditor::AssistProposalItemInterface *item = genericModel->proposalItem(i);
QTC_ASSERT(item, continue);
if (item->text() == snippetText)
- return item->data().toString().contains(QLatin1Char('$'));
+ return item->isSnippet();
}
return false;
diff --git a/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp b/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp
index bd89edf8f7..1e14ad1294 100644
--- a/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp
+++ b/src/plugins/cppeditor/cppvirtualfunctionassistprovider.cpp
@@ -101,7 +101,9 @@ private:
class VirtualFunctionProposal : public GenericProposal
{
public:
- VirtualFunctionProposal(int cursorPos, const QList<AssistProposalItem *> &items, bool openInSplit)
+ VirtualFunctionProposal(int cursorPos,
+ const QList<AssistProposalItemInterface *> &items,
+ bool openInSplit)
: GenericProposal(cursorPos, items)
, m_openInSplit(openInSplit)
{}
@@ -126,13 +128,12 @@ public:
{
QTC_ASSERT(m_params.function, return 0);
- AssistProposalItem *hintItem
- = new VirtualFunctionProposalItem(TextEditorWidget::Link());
+ auto *hintItem = new VirtualFunctionProposalItem(TextEditorWidget::Link());
hintItem->setText(QCoreApplication::translate("VirtualFunctionsAssistProcessor",
"...searching overrides"));
hintItem->setOrder(-1000);
- QList<AssistProposalItem *> items;
+ QList<AssistProposalItemInterface *> items;
items << itemFromFunction(m_params.function);
items << hintItem;
return new VirtualFunctionProposal(m_params.cursorPosition, items, m_params.openInNextSplit);
@@ -156,7 +157,7 @@ public:
if (overrides.isEmpty())
return 0;
- QList<AssistProposalItem *> items;
+ QList<AssistProposalItemInterface *> items;
foreach (Function *func, overrides)
items << itemFromFunction(func);
items.first()->setOrder(1000); // Ensure top position for function of static type
@@ -172,14 +173,14 @@ private:
return func;
}
- AssistProposalItem *itemFromFunction(Function *func) const
+ VirtualFunctionProposalItem *itemFromFunction(Function *func) const
{
const TextEditorWidget::Link link = CppTools::linkToSymbol(maybeDefinitionFor(func));
QString text = m_overview.prettyName(LookupContext::fullyQualifiedName(func));
if (func->isPureVirtual())
text += QLatin1String(" = 0");
- AssistProposalItem *item = new VirtualFunctionProposalItem(link, m_params.openInNextSplit);
+ auto *item = new VirtualFunctionProposalItem(link, m_params.openInNextSplit);
item->setText(text);
item->setIcon(m_icons.iconForSymbol(func));
diff --git a/src/plugins/cppeditor/cppvirtualfunctionproposalitem.h b/src/plugins/cppeditor/cppvirtualfunctionproposalitem.h
index 39bf6717fe..58daca1229 100644
--- a/src/plugins/cppeditor/cppvirtualfunctionproposalitem.h
+++ b/src/plugins/cppeditor/cppvirtualfunctionproposalitem.h
@@ -32,7 +32,7 @@
namespace CppEditor {
namespace Internal {
-class VirtualFunctionProposalItem: public TextEditor::AssistProposalItem
+class VirtualFunctionProposalItem final : public TextEditor::AssistProposalItem
{
public:
VirtualFunctionProposalItem(const TextEditor::TextEditorWidget::Link &link,
diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp
index 0ac330c3af..7ce4c6c828 100644
--- a/src/plugins/cpptools/cppcompletionassist.cpp
+++ b/src/plugins/cpptools/cppcompletionassist.cpp
@@ -80,7 +80,7 @@ struct CompleteFunctionDeclaration
// ---------------------
// CppAssistProposalItem
// ---------------------
-class CppAssistProposalItem : public AssistProposalItem
+class CppAssistProposalItem final : public AssistProposalItem
{
public:
CppAssistProposalItem() :
@@ -95,11 +95,14 @@ public:
void keepTypeOfExpression(const QSharedPointer<TypeOfExpression> &typeOfExp)
{ m_typeOfExpression = typeOfExp; }
+
+ quint64 hash() const override;
+
private:
- bool m_isOverloaded;
- mutable QChar m_typedChar;
- unsigned m_completionOperator;
QSharedPointer<TypeOfExpression> m_typeOfExpression;
+ unsigned m_completionOperator;
+ mutable QChar m_typedChar;
+ bool m_isOverloaded;
};
} // Internal
@@ -115,10 +118,10 @@ bool CppAssistProposalModel::isSortable(const QString &prefix) const
return !prefix.isEmpty();
}
-AssistProposalItem *CppAssistProposalModel::proposalItem(int index) const
+AssistProposalItemInterface *CppAssistProposalModel::proposalItem(int index) const
{
- auto item = static_cast<AssistProposalItem *>(GenericProposalModel::proposalItem(index));
- if (!item->data().canConvert<QString>()) {
+ AssistProposalItemInterface *item = GenericProposalModel::proposalItem(index);
+ if (!item->isSnippet()) {
CppAssistProposalItem *cppItem = static_cast<CppAssistProposalItem *>(item);
cppItem->keepCompletionOperator(m_completionOperator);
cppItem->keepTypeOfExpression(m_typeOfExpression);
@@ -178,6 +181,16 @@ static bool isDereferenced(TextEditorWidget *editorWidget, int basePosition)
return false;
}
+quint64 CppAssistProposalItem::hash() const
+{
+ if (data().canConvert<Symbol *>())
+ return quint64(data().value<Symbol *>()->index());
+ else if (data().canConvert<CompleteFunctionDeclaration>())
+ return quint64(data().value<CompleteFunctionDeclaration>().function->index());
+
+ return 0;
+}
+
void CppAssistProposalItem::applyContextualContent(TextEditorWidget *editorWidget, int basePosition) const
{
Symbol *symbol = 0;
@@ -892,12 +905,12 @@ IAssistProposal *InternalCppCompletionAssistProcessor::createContentProposal()
{
// Duplicates are kept only if they are snippets.
QSet<QString> processed;
- QList<AssistProposalItem *>::iterator it = m_completions.begin();
+ auto it = m_completions.begin();
while (it != m_completions.end()) {
CppAssistProposalItem *item = static_cast<CppAssistProposalItem *>(*it);
- if (!processed.contains(item->text()) || item->data().canConvert<QString>()) {
+ if (!processed.contains(item->text()) || item->isSnippet()) {
++it;
- if (!item->data().canConvert<QString>()) {
+ if (!item->isSnippet()) {
processed.insert(item->text());
if (!item->isOverloaded()) {
if (Symbol *symbol = qvariant_cast<Symbol *>(item->data())) {
diff --git a/src/plugins/cpptools/cppcompletionassist.h b/src/plugins/cpptools/cppcompletionassist.h
index 57811e7c63..738840cd15 100644
--- a/src/plugins/cpptools/cppcompletionassist.h
+++ b/src/plugins/cpptools/cppcompletionassist.h
@@ -71,7 +71,7 @@ public:
}
bool isSortable(const QString &prefix) const override;
- TextEditor::AssistProposalItem *proposalItem(int index) const override;
+ TextEditor::AssistProposalItemInterface *proposalItem(int index) const override;
unsigned m_completionOperator;
bool m_replaceDotForArrow;
diff --git a/src/plugins/cpptools/cppcompletionassistprocessor.h b/src/plugins/cpptools/cppcompletionassistprocessor.h
index 59fea84aca..862d77f53f 100644
--- a/src/plugins/cpptools/cppcompletionassistprocessor.h
+++ b/src/plugins/cpptools/cppcompletionassistprocessor.h
@@ -44,7 +44,7 @@ protected:
void addSnippets();
int m_positionForProposal;
- QList<TextEditor::AssistProposalItem *> m_completions;
+ QList<TextEditor::AssistProposalItemInterface *> m_completions;
QStringList m_preprocessorCompletions;
TextEditor::IAssistProposal *m_hintProposal;
CPlusPlus::Icons m_icons;
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index b7f903e89c..259efa97ba 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -915,7 +915,7 @@ private:
QString m_needle;
};
-class FakeVimAssistProposalItem : public AssistProposalItem
+class FakeVimAssistProposalItem final : public AssistProposalItem
{
public:
FakeVimAssistProposalItem(const FakeVimCompletionAssistProvider *provider)
@@ -948,7 +948,7 @@ private:
class FakeVimAssistProposalModel : public GenericProposalModel
{
public:
- FakeVimAssistProposalModel(const QList<AssistProposalItem *> &items)
+ FakeVimAssistProposalModel(const QList<AssistProposalItemInterface *> &items)
{
loadContent(items);
}
@@ -976,7 +976,7 @@ public:
tc.setPosition(interface->position());
tc.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
- QList<AssistProposalItem *> items;
+ QList<AssistProposalItemInterface *> items;
QSet<QString> seen;
QTextDocument::FindFlags flags = QTextDocument::FindCaseSensitively;
while (1) {
diff --git a/src/plugins/glsleditor/glslcompletionassist.cpp b/src/plugins/glsleditor/glslcompletionassist.cpp
index 437f6fb72a..e75bfb97a2 100644
--- a/src/plugins/glsleditor/glslcompletionassist.cpp
+++ b/src/plugins/glsleditor/glslcompletionassist.cpp
@@ -264,7 +264,7 @@ IAssistProposal *GlslCompletionAssistProcessor::perform(const AssistInterface *i
QList<GLSL::Symbol *> members;
QStringList specialMembers;
- QList<AssistProposalItem *> m_completions;
+ QList<AssistProposalItemInterface *> m_completions;
bool functionCall = (ch == QLatin1Char('(') && pos == m_interface->position() - 1);
diff --git a/src/plugins/qmljseditor/qmljscompletionassist.cpp b/src/plugins/qmljseditor/qmljscompletionassist.cpp
index 16656fe448..42c1c89131 100644
--- a/src/plugins/qmljseditor/qmljscompletionassist.cpp
+++ b/src/plugins/qmljseditor/qmljscompletionassist.cpp
@@ -78,7 +78,7 @@ enum CompletionOrder {
TypeOrder = -30
};
-static void addCompletion(QList<AssistProposalItem *> *completions,
+static void addCompletion(QList<AssistProposalItemInterface *> *completions,
const QString &text,
const QIcon &icon,
int order,
@@ -95,7 +95,7 @@ static void addCompletion(QList<AssistProposalItem *> *completions,
completions->append(item);
}
-static void addCompletions(QList<AssistProposalItem *> *completions,
+static void addCompletions(QList<AssistProposalItemInterface *> *completions,
const QStringList &newCompletions,
const QIcon &icon,
int order)
@@ -120,10 +120,10 @@ public:
class CompletionAdder : public PropertyProcessor
{
protected:
- QList<AssistProposalItem *> *completions;
+ QList<AssistProposalItemInterface *> *completions;
public:
- CompletionAdder(QList<AssistProposalItem *> *completions,
+ CompletionAdder(QList<AssistProposalItemInterface *> *completions,
const QIcon &icon, int order)
: completions(completions)
, icon(icon)
@@ -150,7 +150,7 @@ public:
class LhsCompletionAdder : public CompletionAdder
{
public:
- LhsCompletionAdder(QList<AssistProposalItem *> *completions,
+ LhsCompletionAdder(QList<AssistProposalItemInterface *> *completions,
const QIcon &icon,
int order,
bool afterOn)
@@ -982,7 +982,7 @@ class QmlJSLessThan
public:
QmlJSLessThan(const QString &searchString) : m_searchString(searchString)
{ }
- bool operator() (const AssistProposalItem *a, const AssistProposalItem *b)
+ bool operator() (const AssistProposalItemInterface *a, const AssistProposalItemInterface *b)
{
if (a->order() != b->order())
return a->order() > b->order();
@@ -990,8 +990,8 @@ public:
return true;
else if (b->text().isEmpty())
return false;
- else if (a->data().isValid() != b->data().isValid())
- return a->data().isValid();
+ else if (a->isValid() != b->isValid())
+ return a->isValid();
else if (a->text().at(0).isUpper() && b->text().at(0).isLower())
return false;
else if (a->text().at(0).isLower() && b->text().at(0).isUpper())
@@ -1016,9 +1016,9 @@ void QmlJSAssistProposalModel::filter(const QString &prefix)
GenericProposalModel::filter(prefix);
if (prefix.startsWith(QLatin1String("__")))
return;
- QList<AssistProposalItem *> newCurrentItems;
+ QList<AssistProposalItemInterface *> newCurrentItems;
newCurrentItems.reserve(m_currentItems.size());
- foreach (AssistProposalItem *item, m_currentItems)
+ foreach (AssistProposalItemInterface *item, m_currentItems)
if (!item->text().startsWith(QLatin1String("__")))
newCurrentItems << item;
m_currentItems = newCurrentItems;
diff --git a/src/plugins/qmljseditor/qmljscompletionassist.h b/src/plugins/qmljseditor/qmljscompletionassist.h
index c1acff4919..d4be4f43a6 100644
--- a/src/plugins/qmljseditor/qmljscompletionassist.h
+++ b/src/plugins/qmljseditor/qmljscompletionassist.h
@@ -61,7 +61,7 @@ public:
class QmlJSAssistProposalModel : public TextEditor::GenericProposalModel
{
public:
- QmlJSAssistProposalModel(const QList<TextEditor::AssistProposalItem *> &items)
+ QmlJSAssistProposalModel(const QList<TextEditor::AssistProposalItemInterface *> &items)
{
loadContent(items);
}
@@ -109,7 +109,7 @@ private:
int m_startPosition;
QScopedPointer<const QmlJSCompletionAssistInterface> m_interface;
- QList<TextEditor::AssistProposalItem *> m_completions;
+ QList<TextEditor::AssistProposalItemInterface *> m_completions;
TextEditor::SnippetAssistCollector m_snippetCollector;
};
diff --git a/src/plugins/texteditor/circularclipboardassist.cpp b/src/plugins/texteditor/circularclipboardassist.cpp
index c8e4fb0f7e..316dd723b5 100644
--- a/src/plugins/texteditor/circularclipboardassist.cpp
+++ b/src/plugins/texteditor/circularclipboardassist.cpp
@@ -90,7 +90,7 @@ public:
QIcon icon = QIcon::fromTheme(QLatin1String("edit-paste"), Core::Icons::PASTE.icon()).pixmap(16);
CircularClipboard * clipboard = CircularClipboard::instance();
- QList<AssistProposalItem *> items;
+ QList<AssistProposalItemInterface *> items;
for (int i = 0; i < clipboard->size(); ++i) {
QSharedPointer<const QMimeData> data = clipboard->next();
diff --git a/src/plugins/texteditor/codeassist/assistproposalitem.cpp b/src/plugins/texteditor/codeassist/assistproposalitem.cpp
index 7504d4cf8a..2b14ae1970 100644
--- a/src/plugins/texteditor/codeassist/assistproposalitem.cpp
+++ b/src/plugins/texteditor/codeassist/assistproposalitem.cpp
@@ -60,19 +60,12 @@ namespace TextEditor {
This is the place to implement the actual application of the item.
*/
-AssistProposalItem::AssistProposalItem()
- : m_order(0)
-{}
-
-AssistProposalItem::~AssistProposalItem()
-{}
-
void AssistProposalItem::setIcon(const QIcon &icon)
{
m_icon = icon;
}
-const QIcon &AssistProposalItem::icon() const
+QIcon AssistProposalItem::icon() const
{
return m_icon;
}
@@ -92,7 +85,7 @@ void AssistProposalItem::setDetail(const QString &detail)
m_detail = detail;
}
-const QString &AssistProposalItem::detail() const
+QString AssistProposalItem::detail() const
{
return m_detail;
}
@@ -107,14 +100,19 @@ const QVariant &AssistProposalItem::data() const
return m_data;
}
-int AssistProposalItem::order() const
+bool AssistProposalItem::isSnippet() const
+{
+ return data().canConvert<QString>();
+}
+
+bool AssistProposalItem::isValid() const
{
- return m_order;
+ return m_data.isValid();
}
-void AssistProposalItem::setOrder(int order)
+quint64 AssistProposalItem::hash() const
{
- m_order = order;
+ return 0;
}
bool AssistProposalItem::implicitlyApplies() const
diff --git a/src/plugins/texteditor/codeassist/assistproposalitem.h b/src/plugins/texteditor/codeassist/assistproposalitem.h
index c48592d27d..8cbdc09c16 100644
--- a/src/plugins/texteditor/codeassist/assistproposalitem.h
+++ b/src/plugins/texteditor/codeassist/assistproposalitem.h
@@ -28,6 +28,7 @@
#include <texteditor/texteditor_global.h>
+#include "assistproposaliteminterface.h"
#include <QIcon>
#include <QString>
@@ -37,30 +38,28 @@ namespace TextEditor {
class TextEditorWidget;
-class TEXTEDITOR_EXPORT AssistProposalItem
+class TEXTEDITOR_EXPORT AssistProposalItem : public AssistProposalItemInterface
{
public:
- AssistProposalItem();
- virtual ~AssistProposalItem();
-
- virtual QString text() const;
- virtual bool implicitlyApplies() const;
- virtual bool prematurelyApplies(const QChar &c) const;
- virtual void apply(TextEditorWidget *editorWidget, int basePosition) const;
+ QString text() const override;
+ bool implicitlyApplies() const override;
+ bool prematurelyApplies(const QChar &c) const override;
+ void apply(TextEditorWidget *editorWidget, int basePosition) const override;
void setIcon(const QIcon &icon);
- const QIcon &icon() const;
+ QIcon icon() const final;
void setText(const QString &text);
void setDetail(const QString &detail);
- const QString &detail() const;
+ QString detail() const final;
void setData(const QVariant &var);
const QVariant &data() const;
- int order() const;
- void setOrder(int order);
+ bool isSnippet() const final;
+ bool isValid() const final;
+ quint64 hash() const;
virtual void applyContextualContent(TextEditorWidget *editorWidget, int basePosition) const;
virtual void applySnippet(TextEditorWidget *editorWidget, int basePosition) const;
@@ -71,7 +70,6 @@ private:
QString m_text;
QString m_detail;
QVariant m_data;
- int m_order;
};
} // namespace TextEditor
diff --git a/src/plugins/texteditor/codeassist/assistproposaliteminterface.h b/src/plugins/texteditor/codeassist/assistproposaliteminterface.h
new file mode 100644
index 0000000000..797bf78c7c
--- /dev/null
+++ b/src/plugins/texteditor/codeassist/assistproposaliteminterface.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#ifndef TEXTEDITOR_ASSISTPROPOSALITEMINTERFACE_H
+#define TEXTEDITOR_ASSISTPROPOSALITEMINTERFACE_H
+
+#include <texteditor/texteditor_global.h>
+
+QT_BEGIN_NAMESPACE
+class QChar;
+class QIcon;
+class QString;
+class QVariant;
+QT_END_NAMESPACE
+
+#include <QString>
+
+namespace TextEditor {
+
+class TextEditorWidget;
+
+class TEXTEDITOR_EXPORT AssistProposalItemInterface
+{
+public:
+ virtual ~AssistProposalItemInterface() noexcept = default;
+
+ virtual QString text() const = 0;
+ virtual bool implicitlyApplies() const = 0;
+ virtual bool prematurelyApplies(const QChar &character) const = 0;
+ virtual void apply(TextEditorWidget *editorWidget, int basePosition) const = 0;
+ virtual QIcon icon() const = 0;
+ virtual QString detail() const = 0;
+ virtual bool isSnippet() const = 0;
+ virtual bool isValid() const = 0;
+ virtual quint64 hash() const = 0; // it is only for removing duplicates
+
+ int order() const { return m_order; }
+ void setOrder(int order) { m_order = order; }
+
+private:
+ int m_order = 0;
+};
+
+} // namespace TextEditor
+
+#endif // TEXTEDITOR_ASSISTPROPOSALITEMINTERFACE_H
diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp
index 3c5ed2a6b1..aa84f7a43c 100644
--- a/src/plugins/texteditor/codeassist/codeassistant.cpp
+++ b/src/plugins/texteditor/codeassist/codeassistant.cpp
@@ -85,7 +85,7 @@ public:
private:
void proposalComputed();
- void processProposalItem(AssistProposalItem *proposalItem);
+ void processProposalItem(AssistProposalItemInterface *proposalItem);
void handlePrefixExpansion(const QString &newPrefix);
void finalizeProposal();
void explicitlyAborted();
@@ -354,7 +354,7 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR
m_editorWidget->position() - basePosition));
}
-void CodeAssistantPrivate::processProposalItem(AssistProposalItem *proposalItem)
+void CodeAssistantPrivate::processProposalItem(AssistProposalItemInterface *proposalItem)
{
QTC_ASSERT(m_proposal, return);
proposalItem->apply(m_editorWidget, m_proposal->basePosition());
diff --git a/src/plugins/texteditor/codeassist/genericproposal.cpp b/src/plugins/texteditor/codeassist/genericproposal.cpp
index 74da05f936..2e8bd1ad45 100644
--- a/src/plugins/texteditor/codeassist/genericproposal.cpp
+++ b/src/plugins/texteditor/codeassist/genericproposal.cpp
@@ -34,7 +34,7 @@ GenericProposal::GenericProposal(int cursorPos, GenericProposalModel *model)
, m_model(model)
{}
-GenericProposal::GenericProposal(int cursorPos, const QList<AssistProposalItem *> &items)
+GenericProposal::GenericProposal(int cursorPos, const QList<AssistProposalItemInterface *> &items)
: m_basePosition(cursorPos)
, m_model(new GenericProposalModel)
{
diff --git a/src/plugins/texteditor/codeassist/genericproposal.h b/src/plugins/texteditor/codeassist/genericproposal.h
index 5b3aaefc79..87da2ec56b 100644
--- a/src/plugins/texteditor/codeassist/genericproposal.h
+++ b/src/plugins/texteditor/codeassist/genericproposal.h
@@ -32,13 +32,13 @@
namespace TextEditor {
class GenericProposalModel;
-class AssistProposalItem;
+class AssistProposalItemInterface;
class TEXTEDITOR_EXPORT GenericProposal : public IAssistProposal
{
public:
GenericProposal(int cursorPos, GenericProposalModel *model);
- GenericProposal(int cursorPos, const QList<AssistProposalItem *> &items);
+ GenericProposal(int cursorPos, const QList<AssistProposalItemInterface *> &items);
~GenericProposal();
bool isFragile() const override;
diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp
index 3b6ca22c07..31f22f05ba 100644
--- a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp
+++ b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp
@@ -54,7 +54,7 @@ struct ContentLessThan
: m_prefix(prefix)
{}
- bool operator()(const AssistProposalItem *a, const AssistProposalItem *b)
+ bool operator()(const AssistProposalItemInterface *a, const AssistProposalItemInterface *b)
{
// The order is case-insensitive in principle, but case-sensitive when this
// would otherwise mean equality
@@ -137,7 +137,7 @@ GenericProposalModel::~GenericProposalModel()
qDeleteAll(m_originalItems);
}
-void GenericProposalModel::loadContent(const QList<AssistProposalItem *> &items)
+void GenericProposalModel::loadContent(const QList<AssistProposalItemInterface *> &items)
{
m_originalItems = items;
m_currentItems = items;
@@ -170,17 +170,18 @@ QString GenericProposalModel::detail(int index) const
return m_currentItems.at(index)->detail();
}
+// make it optional because it is not needed in many cases
void GenericProposalModel::removeDuplicates()
{
- QHash<QString, QVariant> unique;
- QList<AssistProposalItem *>::iterator it = m_originalItems.begin();
+ QHash<QString, quint64> unique;
+ auto it = m_originalItems.begin();
while (it != m_originalItems.end()) {
- const AssistProposalItem *item = *it;
+ const AssistProposalItemInterface *item = *it;
if (unique.contains(item->text())
- && unique.value(item->text(), QVariant()) == item->data()) {
+ && unique.value(item->text()) == item->hash()) {
it = m_originalItems.erase(it);
} else {
- unique.insert(item->text(), item->data());
+ unique.insert(item->text(), item->hash());
++it;
}
}
@@ -245,8 +246,7 @@ void GenericProposalModel::filter(const QString &prefix)
QRegExp regExp(keyRegExp);
m_currentItems.clear();
- for (auto it = m_originalItems.begin(); it != m_originalItems.end(); ++it) {
- AssistProposalItem *item = *it;
+ foreach (const auto &item, m_originalItems) {
if (regExp.indexIn(item->text()) == 0)
m_currentItems.append(item);
}
@@ -306,7 +306,7 @@ QString GenericProposalModel::proposalPrefix() const
return commonPrefix;
}
-AssistProposalItem *GenericProposalModel::proposalItem(int index) const
+AssistProposalItemInterface *GenericProposalModel::proposalItem(int index) const
{
return m_currentItems.at(index);
}
diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.h b/src/plugins/texteditor/codeassist/genericproposalmodel.h
index b83847ff1c..0f27ca4659 100644
--- a/src/plugins/texteditor/codeassist/genericproposalmodel.h
+++ b/src/plugins/texteditor/codeassist/genericproposalmodel.h
@@ -39,7 +39,7 @@ QT_FORWARD_DECLARE_CLASS(QIcon)
namespace TextEditor {
-class AssistProposalItem;
+class AssistProposalItemInterface;
class TEXTEDITOR_EXPORT GenericProposalModel : public IAssistProposalModel
{
@@ -61,18 +61,18 @@ public:
virtual bool supportsPrefixExpansion() const;
virtual QString proposalPrefix() const;
virtual bool keepPerfectMatch(AssistReason reason) const;
- virtual AssistProposalItem *proposalItem(int index) const;
+ virtual AssistProposalItemInterface *proposalItem(int index) const;
- void loadContent(const QList<AssistProposalItem *> &items);
+ void loadContent(const QList<AssistProposalItemInterface *> &items);
void setSortingAllowed(bool isAllowed);
bool isSortingAllowed() const;
protected:
- QList<AssistProposalItem *> m_currentItems;
+ QList<AssistProposalItemInterface *> m_currentItems;
private:
QHash<QString, int> m_idByText;
- QList<AssistProposalItem *> m_originalItems;
+ QList<AssistProposalItemInterface *> m_originalItems;
};
} // TextEditor
diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
index 8581670232..b1f72f7924 100644
--- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
+++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
@@ -483,7 +483,7 @@ bool GenericProposalWidget::updateAndCheck(const QString &prefix)
&& d->m_justInvoked
&& d->m_isSynchronized) {
if (d->m_model->size() == 1) {
- AssistProposalItem *item = d->m_model->proposalItem(0);
+ AssistProposalItemInterface *item = d->m_model->proposalItem(0);
if (item->implicitlyApplies()) {
d->m_completionListView->reset();
abort();
@@ -628,7 +628,7 @@ bool GenericProposalWidget::eventFilter(QObject *o, QEvent *e)
&& d->m_completionListView->currentIndex().isValid()
&& qApp->focusWidget() == o) {
const QChar &typedChar = ke->text().at(0);
- AssistProposalItem *item =
+ AssistProposalItemInterface *item =
d->m_model->proposalItem(d->m_completionListView->currentIndex().row());
if (item->prematurelyApplies(typedChar)
&& (d->m_reason == ExplicitlyInvoked || item->text().endsWith(typedChar))) {
diff --git a/src/plugins/texteditor/codeassist/iassistproposalwidget.h b/src/plugins/texteditor/codeassist/iassistproposalwidget.h
index 50e44c9ebf..c64147d78d 100644
--- a/src/plugins/texteditor/codeassist/iassistproposalwidget.h
+++ b/src/plugins/texteditor/codeassist/iassistproposalwidget.h
@@ -36,7 +36,7 @@ namespace TextEditor {
class CodeAssistant;
class IAssistProposalModel;
-class AssistProposalItem;
+class AssistProposalItemInterface;
class TEXTEDITOR_EXPORT IAssistProposalWidget : public QFrame
{
@@ -60,7 +60,7 @@ public:
signals:
void prefixExpanded(const QString &newPrefix);
- void proposalItemActivated(AssistProposalItem *proposalItem);
+ void proposalItemActivated(AssistProposalItemInterface *proposalItem);
void explicitlyAborted();
};
diff --git a/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp b/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp
index eeeba95bba..974207588f 100644
--- a/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp
+++ b/src/plugins/texteditor/codeassist/keywordscompletionassist.cpp
@@ -192,7 +192,7 @@ IAssistProposal *KeywordsCompletionAssistProcessor::perform(const AssistInterfac
IAssistProposal *proposal = new FunctionHintProposal(m_startPosition, model);
return proposal;
} else {
- QList<AssistProposalItem *> items;
+ QList<AssistProposalItemInterface *> items;
addWordsToProposalList(&items, m_keywords.variables(), m_variableIcon);
addWordsToProposalList(&items, m_keywords.functions(), m_functionIcon);
return new GenericProposal(m_startPosition, items);
@@ -256,7 +256,7 @@ bool KeywordsCompletionAssistProcessor::isInComment() const
return false;
}
-void KeywordsCompletionAssistProcessor::addWordsToProposalList(QList<AssistProposalItem *> *items, const QStringList &words, const QIcon &icon)
+void KeywordsCompletionAssistProcessor::addWordsToProposalList(QList<AssistProposalItemInterface *> *items, const QStringList &words, const QIcon &icon)
{
if (!items)
return;
diff --git a/src/plugins/texteditor/codeassist/keywordscompletionassist.h b/src/plugins/texteditor/codeassist/keywordscompletionassist.h
index 7c06f24946..c3ecc8f98e 100644
--- a/src/plugins/texteditor/codeassist/keywordscompletionassist.h
+++ b/src/plugins/texteditor/codeassist/keywordscompletionassist.h
@@ -94,7 +94,7 @@ private:
bool acceptsIdleEditor();
int findStartOfName(int pos = -1);
bool isInComment() const;
- void addWordsToProposalList(QList<AssistProposalItem *> *items, const QStringList &words, const QIcon &icon);
+ void addWordsToProposalList(QList<AssistProposalItemInterface *> *items, const QStringList &words, const QIcon &icon);
int m_startPosition;
QString m_word;
diff --git a/src/plugins/texteditor/codeassist/quickfixassistprocessor.cpp b/src/plugins/texteditor/codeassist/quickfixassistprocessor.cpp
index 17884ded36..52d192f4cb 100644
--- a/src/plugins/texteditor/codeassist/quickfixassistprocessor.cpp
+++ b/src/plugins/texteditor/codeassist/quickfixassistprocessor.cpp
@@ -55,7 +55,7 @@ IAssistProposal *QuickFixAssistProcessor::perform(const AssistInterface *interfa
factory->matchingOperations(assistInterface, quickFixes);
if (!quickFixes.isEmpty()) {
- QList<AssistProposalItem *> items;
+ QList<AssistProposalItemInterface *> items;
foreach (const QuickFixOperation::Ptr &op, quickFixes) {
QVariant v;
v.setValue(op);
@@ -65,6 +65,7 @@ IAssistProposal *QuickFixAssistProcessor::perform(const AssistInterface *interfa
item->setOrder(op->priority());
items.append(item);
}
+
return new GenericProposal(interface->position(), items);
}
diff --git a/src/plugins/texteditor/snippets/snippetassistcollector.cpp b/src/plugins/texteditor/snippets/snippetassistcollector.cpp
index 7b4d02f152..5a17e71dd5 100644
--- a/src/plugins/texteditor/snippets/snippetassistcollector.cpp
+++ b/src/plugins/texteditor/snippets/snippetassistcollector.cpp
@@ -32,7 +32,7 @@
using namespace TextEditor;
using namespace Internal;
-static void appendSnippets(QList<AssistProposalItem *> *items,
+static void appendSnippets(QList<AssistProposalItemInterface *> *items,
const QString &groupId,
const QIcon &icon,
int order)
@@ -61,9 +61,9 @@ SnippetAssistCollector::SnippetAssistCollector(const QString &groupId, const QIc
SnippetAssistCollector::~SnippetAssistCollector()
{}
-QList<AssistProposalItem *> SnippetAssistCollector::collect() const
+QList<AssistProposalItemInterface *> SnippetAssistCollector::collect() const
{
- QList<AssistProposalItem *> snippets;
+ QList<AssistProposalItemInterface *> snippets;
appendSnippets(&snippets, m_groupId, m_icon, m_order);
appendSnippets(&snippets, QLatin1String(Constants::TEXT_SNIPPET_GROUP_ID), m_icon, m_order);
return snippets;
diff --git a/src/plugins/texteditor/snippets/snippetassistcollector.h b/src/plugins/texteditor/snippets/snippetassistcollector.h
index ef727342c7..59f4df8e91 100644
--- a/src/plugins/texteditor/snippets/snippetassistcollector.h
+++ b/src/plugins/texteditor/snippets/snippetassistcollector.h
@@ -34,7 +34,7 @@
namespace TextEditor {
-class AssistProposalItem;
+class AssistProposalItemInterface;
class TEXTEDITOR_EXPORT SnippetAssistCollector
{
@@ -42,7 +42,7 @@ public:
SnippetAssistCollector(const QString &groupId, const QIcon &icon, int order = 0);
~SnippetAssistCollector();
- QList<AssistProposalItem *> collect() const;
+ QList<AssistProposalItemInterface *> collect() const;
private:
QString m_groupId;
diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro
index f763a8863c..ca7ab43eba 100644
--- a/src/plugins/texteditor/texteditor.pro
+++ b/src/plugins/texteditor/texteditor.pro
@@ -189,6 +189,7 @@ HEADERS += texteditorplugin.h \
convenience.h \
codeassist/assistenums.h \
codeassist/runner.h \
+ codeassist/assistproposaliteminterface.h \
codeassist/completionassistprovider.h \
codeassist/genericproposalmodel.h \
codeassist/quickfixassistprovider.h \
diff --git a/src/plugins/texteditor/texteditor.qbs b/src/plugins/texteditor/texteditor.qbs
index e9edede675..9549676b53 100644
--- a/src/plugins/texteditor/texteditor.qbs
+++ b/src/plugins/texteditor/texteditor.qbs
@@ -148,6 +148,7 @@ QtcPlugin {
"assistinterface.h",
"assistproposalitem.cpp",
"assistproposalitem.h",
+ "assistproposaliteminterface.h",
"codeassistant.cpp",
"codeassistant.h",
"completionassistprovider.cpp",