C++: add test-case for member access replacement in completion.

Change-Id: Id5fe00b94a6622178db9bd26f54d29efe88970f7
Reviewed-by: Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Erik Verbruggen
2013-01-30 09:58:09 +01:00
parent 8f4817152c
commit cede294788
4 changed files with 55 additions and 27 deletions

View File

@@ -72,7 +72,7 @@ struct TestCase
QTextDocument *doc; QTextDocument *doc;
}; };
static QStringList getCompletions(TestCase &data) static QStringList getCompletions(TestCase &data, bool *replaceAccessOperator = 0)
{ {
QStringList completions; QStringList completions;
@@ -86,13 +86,16 @@ static QStringList getCompletions(TestCase &data)
IAssistProposalModel *model = proposal->model(); IAssistProposalModel *model = proposal->model();
if (!model) if (!model)
return completions; return completions;
BasicProposalItemListModel *listmodel = dynamic_cast<BasicProposalItemListModel *>(model); CppAssistProposalModel *listmodel = dynamic_cast<CppAssistProposalModel *>(model);
if (!listmodel) if (!listmodel)
return completions; return completions;
for (int i = 0; i < listmodel->size(); ++i) for (int i = 0; i < listmodel->size(); ++i)
completions << listmodel->text(i); completions << listmodel->text(i);
if (replaceAccessOperator)
*replaceAccessOperator = listmodel->m_replaceDotForArrow;
return completions; return completions;
} }
@@ -1288,3 +1291,30 @@ void CppToolsPlugin::test_completion_instantiate_nested_of_nested_class_when_enc
QVERIFY(completions.contains(QLatin1String("Foo"))); QVERIFY(completions.contains(QLatin1String("Foo")));
QVERIFY(completions.contains(QLatin1String("foo_i"))); QVERIFY(completions.contains(QLatin1String("foo_i")));
} }
void CppToolsPlugin::test_completion_member_access_operator_1()
{
TestCase data;
data.srcText = "\n"
"struct S { void t(); };\n"
"void f() { S *s;\n"
"@\n"
"}\n"
;
setup(&data);
Utils::ChangeSet change;
QString txt = QLatin1String("s.");
change.insert(data.pos, txt);
QTextCursor cursor(data.doc);
change.apply(&cursor);
data.pos += txt.length();
bool replaceAccessOperator = false;
QStringList completions = getCompletions(data, &replaceAccessOperator);
QCOMPARE(completions.size(), 2);
QVERIFY(completions.contains(QLatin1String("S")));
QVERIFY(completions.contains(QLatin1String("t")));
QVERIFY(replaceAccessOperator);
}

View File

@@ -58,7 +58,6 @@
#include <coreplugin/mimedatabase.h> #include <coreplugin/mimedatabase.h>
#include <cppeditor/cppeditorconstants.h> #include <cppeditor/cppeditorconstants.h>
#include <texteditor/codeassist/basicproposalitem.h> #include <texteditor/codeassist/basicproposalitem.h>
#include <texteditor/codeassist/basicproposalitemlistmodel.h>
#include <texteditor/codeassist/genericproposal.h> #include <texteditor/codeassist/genericproposal.h>
#include <texteditor/codeassist/ifunctionhintproposalmodel.h> #include <texteditor/codeassist/ifunctionhintproposalmodel.h>
#include <texteditor/codeassist/functionhintproposal.h> #include <texteditor/codeassist/functionhintproposal.h>
@@ -91,29 +90,6 @@ struct CompleteFunctionDeclaration
Function *function; Function *function;
}; };
// ----------------------
// CppAssistProposalModel
// ----------------------
class CppAssistProposalModel : public TextEditor::BasicProposalItemListModel
{
public:
CppAssistProposalModel()
: TextEditor::BasicProposalItemListModel()
, m_completionOperator(T_EOF_SYMBOL)
, m_replaceDotForArrow(false)
, m_typeOfExpression(new TypeOfExpression)
{
m_typeOfExpression->setExpandTemplates(true);
}
virtual bool isSortable(const QString &prefix) const;
virtual IAssistProposalItem *proposalItem(int index) const;
unsigned m_completionOperator;
bool m_replaceDotForArrow;
QSharedPointer<TypeOfExpression> m_typeOfExpression;
};
// --------------------- // ---------------------
// CppAssistProposalItem // CppAssistProposalItem
// --------------------- // ---------------------

View File

@@ -41,10 +41,12 @@
# include <cplusplus/Symbol.h> # include <cplusplus/Symbol.h>
#endif #endif
#include <texteditor/codeassist/basicproposalitemlistmodel.h>
#include <texteditor/codeassist/completionassistprovider.h> #include <texteditor/codeassist/completionassistprovider.h>
#include <texteditor/codeassist/iassistprocessor.h> #include <texteditor/codeassist/iassistprocessor.h>
#include <texteditor/snippets/snippetassistcollector.h> #include <texteditor/snippets/snippetassistcollector.h>
#include <texteditor/codeassist/defaultassistinterface.h> #include <texteditor/codeassist/defaultassistinterface.h>
#include <texteditor/codeassist/basicproposalitem.h>
#include <QStringList> #include <QStringList>
#include <QVariant> #include <QVariant>
@@ -64,7 +66,26 @@ namespace CppTools {
namespace Internal { namespace Internal {
class CppCompletionAssistInterface; class CppCompletionAssistInterface;
class CppAssistProposalModel;
class CppAssistProposalModel : public TextEditor::BasicProposalItemListModel
{
public:
CppAssistProposalModel()
: TextEditor::BasicProposalItemListModel()
, m_completionOperator(CPlusPlus::T_EOF_SYMBOL)
, m_replaceDotForArrow(false)
, m_typeOfExpression(new CPlusPlus::TypeOfExpression)
{
m_typeOfExpression->setExpandTemplates(true);
}
virtual bool isSortable(const QString &prefix) const;
virtual TextEditor::IAssistProposalItem *proposalItem(int index) const;
unsigned m_completionOperator;
bool m_replaceDotForArrow;
QSharedPointer<CPlusPlus::TypeOfExpression> m_typeOfExpression;
};
class InternalCompletionAssistProvider : public CppCompletionAssistProvider class InternalCompletionAssistProvider : public CppCompletionAssistProvider
{ {

View File

@@ -112,6 +112,7 @@ private slots:
void test_completion_enclosing_template_class_data(); void test_completion_enclosing_template_class_data();
void test_completion_instantiate_nested_class_when_enclosing_is_template(); void test_completion_instantiate_nested_class_when_enclosing_is_template();
void test_completion_instantiate_nested_of_nested_class_when_enclosing_is_template(); void test_completion_instantiate_nested_of_nested_class_when_enclosing_is_template();
void test_completion_member_access_operator_1();
void test_format_pointerdeclaration_in_simpledeclarations(); void test_format_pointerdeclaration_in_simpledeclarations();
void test_format_pointerdeclaration_in_simpledeclarations_data(); void test_format_pointerdeclaration_in_simpledeclarations_data();