forked from qt-creator/qt-creator
CppEditor: add more sections (protected, ...) for declaration (refactoring)
You can write definition of function, type Alt+Enter, as usual, and select not only public but also other possible sections like private, public slots and so on. Change-Id: I2faefc3833c6f05c9e2e5a2a41328bcdbe17ba14 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
committed by
Nikolai Kosjar
parent
f0f406bacb
commit
72e0ded3c4
@@ -126,6 +126,8 @@ private slots:
|
|||||||
void test_quickfix_InsertDefFromDecl_headerSource_namespace2();
|
void test_quickfix_InsertDefFromDecl_headerSource_namespace2();
|
||||||
void test_quickfix_InsertDefFromDecl_freeFunction();
|
void test_quickfix_InsertDefFromDecl_freeFunction();
|
||||||
|
|
||||||
|
void test_quickfix_InsertDeclFromDef();
|
||||||
|
|
||||||
void test_quickfix_AddIncludeForUndefinedIdentifier_normal();
|
void test_quickfix_AddIncludeForUndefinedIdentifier_normal();
|
||||||
void test_quickfix_AddIncludeForUndefinedIdentifier_noinclude();
|
void test_quickfix_AddIncludeForUndefinedIdentifier_noinclude();
|
||||||
void test_quickfix_AddIncludeForUndefinedIdentifier_noincludeComment01();
|
void test_quickfix_AddIncludeForUndefinedIdentifier_noincludeComment01();
|
||||||
|
@@ -129,10 +129,11 @@ struct TestCase
|
|||||||
TestCase(const QList<TestDocumentPtr> theTestFiles);
|
TestCase(const QList<TestDocumentPtr> theTestFiles);
|
||||||
~TestCase();
|
~TestCase();
|
||||||
|
|
||||||
QuickFixOperation::Ptr getFix(CppQuickFixFactory *factory, CPPEditorWidget *editorWidget);
|
QuickFixOperation::Ptr getFix(CppQuickFixFactory *factory, CPPEditorWidget *editorWidget,
|
||||||
|
int resultIndex = 0);
|
||||||
TestDocumentPtr testFileWithCursorMarker() const;
|
TestDocumentPtr testFileWithCursorMarker() const;
|
||||||
|
|
||||||
void run(CppQuickFixFactory *factory);
|
void run(CppQuickFixFactory *factory, int resultIndex = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TestCase(const TestCase &);
|
TestCase(const TestCase &);
|
||||||
@@ -141,13 +142,14 @@ private:
|
|||||||
void init();
|
void init();
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Apply the factory on the source and get back the first result or a null pointer.
|
/// Apply the factory on the source and get back the resultIndex'th result or a null pointer.
|
||||||
QuickFixOperation::Ptr TestCase::getFix(CppQuickFixFactory *factory, CPPEditorWidget *editorWidget)
|
QuickFixOperation::Ptr TestCase::getFix(CppQuickFixFactory *factory, CPPEditorWidget *editorWidget,
|
||||||
|
int resultIndex)
|
||||||
{
|
{
|
||||||
CppQuickFixInterface qfi(new CppQuickFixAssistInterface(editorWidget, ExplicitlyInvoked));
|
CppQuickFixInterface qfi(new CppQuickFixAssistInterface(editorWidget, ExplicitlyInvoked));
|
||||||
TextEditor::QuickFixOperations results;
|
TextEditor::QuickFixOperations results;
|
||||||
factory->match(qfi, results);
|
factory->match(qfi, results);
|
||||||
return results.isEmpty() ? QuickFixOperation::Ptr() : results.first();
|
return results.isEmpty() ? QuickFixOperation::Ptr() : results.at(resultIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The '@' in the originalSource is the position from where the quick-fix discovery is triggered.
|
/// The '@' in the originalSource is the position from where the quick-fix discovery is triggered.
|
||||||
@@ -271,7 +273,7 @@ QByteArray &removeTrailingWhitespace(QByteArray &input)
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestCase::run(CppQuickFixFactory *factory)
|
void TestCase::run(CppQuickFixFactory *factory, int resultIndex)
|
||||||
{
|
{
|
||||||
// Run the fix in the file having the cursor marker
|
// Run the fix in the file having the cursor marker
|
||||||
TestDocumentPtr testFile;
|
TestDocumentPtr testFile;
|
||||||
@@ -281,7 +283,7 @@ void TestCase::run(CppQuickFixFactory *factory)
|
|||||||
}
|
}
|
||||||
QVERIFY2(testFile, "No test file with cursor marker found");
|
QVERIFY2(testFile, "No test file with cursor marker found");
|
||||||
|
|
||||||
if (QuickFixOperation::Ptr fix = getFix(factory, testFile->editorWidget))
|
if (QuickFixOperation::Ptr fix = getFix(factory, testFile->editorWidget, resultIndex))
|
||||||
fix->perform();
|
fix->perform();
|
||||||
else
|
else
|
||||||
qDebug() << "Quickfix was not triggered";
|
qDebug() << "Quickfix was not triggered";
|
||||||
@@ -881,6 +883,55 @@ void CppPlugin::test_quickfix_InsertDefFromDecl_freeFunction()
|
|||||||
data.run(&factory);
|
data.run(&factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function for one of InsertDeclDef section cases
|
||||||
|
void insertToSectionDeclFromDef(const QByteArray §ion, int sectionIndex)
|
||||||
|
{
|
||||||
|
QList<TestDocumentPtr> testFiles;
|
||||||
|
|
||||||
|
QByteArray original;
|
||||||
|
QByteArray expected;
|
||||||
|
|
||||||
|
// Header File
|
||||||
|
original =
|
||||||
|
"class Foo\n"
|
||||||
|
"{\n"
|
||||||
|
"};\n";
|
||||||
|
expected =
|
||||||
|
"class Foo\n"
|
||||||
|
"{\n"
|
||||||
|
+ section + ":\n" +
|
||||||
|
" Foo();\n"
|
||||||
|
"@};\n\n";
|
||||||
|
testFiles << TestDocument::create(original, expected, QLatin1String("file.h"));
|
||||||
|
|
||||||
|
// Source File
|
||||||
|
original =
|
||||||
|
"#include \"file.h\"\n"
|
||||||
|
"\n"
|
||||||
|
"Foo::Foo@()\n"
|
||||||
|
"{\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
;
|
||||||
|
expected = original + "\n";
|
||||||
|
testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp"));
|
||||||
|
|
||||||
|
InsertDeclFromDef factory;
|
||||||
|
TestCase data(testFiles);
|
||||||
|
data.run(&factory, sectionIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check from source file: Insert in header file.
|
||||||
|
void CppPlugin::test_quickfix_InsertDeclFromDef()
|
||||||
|
{
|
||||||
|
insertToSectionDeclFromDef("public", 0);
|
||||||
|
insertToSectionDeclFromDef("public slots", 1);
|
||||||
|
insertToSectionDeclFromDef("protected", 2);
|
||||||
|
insertToSectionDeclFromDef("protected slots", 3);
|
||||||
|
insertToSectionDeclFromDef("private", 4);
|
||||||
|
insertToSectionDeclFromDef("private slots", 5);
|
||||||
|
}
|
||||||
|
|
||||||
/// Check normal add include if there is already a include
|
/// Check normal add include if there is already a include
|
||||||
void CppPlugin::test_quickfix_AddIncludeForUndefinedIdentifier_normal()
|
void CppPlugin::test_quickfix_AddIncludeForUndefinedIdentifier_normal()
|
||||||
{
|
{
|
||||||
|
@@ -2339,6 +2339,30 @@ private:
|
|||||||
QString m_decl;
|
QString m_decl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DeclOperationFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DeclOperationFactory(const CppQuickFixInterface &interface, const QString &fileName,
|
||||||
|
const Class *matchingClass, const QString &decl)
|
||||||
|
: m_interface(interface)
|
||||||
|
, m_fileName(fileName)
|
||||||
|
, m_matchingClass(matchingClass)
|
||||||
|
, m_decl(decl)
|
||||||
|
{}
|
||||||
|
TextEditor::QuickFixOperation::Ptr
|
||||||
|
operator()(InsertionPointLocator::AccessSpec xsSpec)
|
||||||
|
{
|
||||||
|
return TextEditor::QuickFixOperation::Ptr(
|
||||||
|
new InsertDeclOperation(m_interface, m_fileName, m_matchingClass, xsSpec, m_decl));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const CppQuickFixInterface &m_interface;
|
||||||
|
const QString &m_fileName;
|
||||||
|
const Class *m_matchingClass;
|
||||||
|
const QString &m_decl;
|
||||||
|
};
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
void InsertDeclFromDef::match(const CppQuickFixInterface &interface, QuickFixOperations &result)
|
void InsertDeclFromDef::match(const CppQuickFixInterface &interface, QuickFixOperations &result)
|
||||||
@@ -2387,8 +2411,16 @@ void InsertDeclFromDef::match(const CppQuickFixInterface &interface, QuickFixOpe
|
|||||||
QString fileName = QString::fromUtf8(matchingClass->fileName(),
|
QString fileName = QString::fromUtf8(matchingClass->fileName(),
|
||||||
matchingClass->fileNameLength());
|
matchingClass->fileNameLength());
|
||||||
const QString decl = InsertDeclOperation::generateDeclaration(fun);
|
const QString decl = InsertDeclOperation::generateDeclaration(fun);
|
||||||
result.append(QuickFixOperation::Ptr(new InsertDeclOperation(interface, fileName, matchingClass,
|
|
||||||
InsertionPointLocator::Public, decl)));
|
// Add several possible insertion locations for declaration
|
||||||
|
DeclOperationFactory operation(interface, fileName, matchingClass, decl);
|
||||||
|
|
||||||
|
result.append(operation(InsertionPointLocator::Public));
|
||||||
|
result.append(operation(InsertionPointLocator::PublicSlot));
|
||||||
|
result.append(operation(InsertionPointLocator::Protected));
|
||||||
|
result.append(operation(InsertionPointLocator::ProtectedSlot));
|
||||||
|
result.append(operation(InsertionPointLocator::Private));
|
||||||
|
result.append(operation(InsertionPointLocator::PrivateSlot));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6210,7 +6210,7 @@ int BaseTextEditorWidget::lineNumberDigits() const
|
|||||||
|
|
||||||
bool BaseTextEditorWidget::selectionVisible(int blockNumber) const
|
bool BaseTextEditorWidget::selectionVisible(int blockNumber) const
|
||||||
{
|
{
|
||||||
Q_UNUSED(blockNumber)
|
Q_UNUSED(blockNumber);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -118,11 +118,13 @@ struct ContentLessThan
|
|||||||
} // Anonymous
|
} // Anonymous
|
||||||
|
|
||||||
BasicProposalItemListModel::BasicProposalItemListModel()
|
BasicProposalItemListModel::BasicProposalItemListModel()
|
||||||
|
: m_isSortingAllowed(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
BasicProposalItemListModel::BasicProposalItemListModel(const QList<BasicProposalItem *> &items)
|
BasicProposalItemListModel::BasicProposalItemListModel(const QList<BasicProposalItem *> &items)
|
||||||
: m_currentItems(items)
|
: m_currentItems(items)
|
||||||
, m_originalItems(items)
|
, m_originalItems(items)
|
||||||
|
, m_isSortingAllowed(true)
|
||||||
{
|
{
|
||||||
mapPersistentIds();
|
mapPersistentIds();
|
||||||
}
|
}
|
||||||
@@ -139,6 +141,16 @@ void BasicProposalItemListModel::loadContent(const QList<BasicProposalItem *> &i
|
|||||||
mapPersistentIds();
|
mapPersistentIds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BasicProposalItemListModel::setSortingAllowed(bool isAllowed)
|
||||||
|
{
|
||||||
|
m_isSortingAllowed = isAllowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BasicProposalItemListModel::isSortingAllowed() const
|
||||||
|
{
|
||||||
|
return m_isSortingAllowed;
|
||||||
|
}
|
||||||
|
|
||||||
void BasicProposalItemListModel::mapPersistentIds()
|
void BasicProposalItemListModel::mapPersistentIds()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_originalItems.size(); ++i)
|
for (int i = 0; i < m_originalItems.size(); ++i)
|
||||||
@@ -258,6 +270,8 @@ bool BasicProposalItemListModel::isSortable(const QString &prefix) const
|
|||||||
{
|
{
|
||||||
Q_UNUSED(prefix);
|
Q_UNUSED(prefix);
|
||||||
|
|
||||||
|
if (!isSortingAllowed())
|
||||||
|
return false;
|
||||||
if (m_currentItems.size() < kMaxSort)
|
if (m_currentItems.size() < kMaxSort)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
|
@@ -65,6 +65,8 @@ public:
|
|||||||
virtual IAssistProposalItem *proposalItem(int index) const;
|
virtual IAssistProposalItem *proposalItem(int index) const;
|
||||||
|
|
||||||
void loadContent(const QList<BasicProposalItem *> &items);
|
void loadContent(const QList<BasicProposalItem *> &items);
|
||||||
|
void setSortingAllowed(bool isAllowed);
|
||||||
|
bool isSortingAllowed() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef QList<BasicProposalItem *>::iterator ItemIterator;
|
typedef QList<BasicProposalItem *>::iterator ItemIterator;
|
||||||
@@ -76,6 +78,7 @@ private:
|
|||||||
|
|
||||||
QHash<QString, int> m_idByText;
|
QHash<QString, int> m_idByText;
|
||||||
QList<BasicProposalItem *> m_originalItems;
|
QList<BasicProposalItem *> m_originalItems;
|
||||||
|
bool m_isSortingAllowed;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // TextEditor
|
} // TextEditor
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
#include <texteditor/basetexteditor.h>
|
#include <texteditor/basetexteditor.h>
|
||||||
#include <texteditor/texteditorsettings.h>
|
#include <texteditor/texteditorsettings.h>
|
||||||
#include <texteditor/completionsettings.h>
|
#include <texteditor/completionsettings.h>
|
||||||
|
#include <texteditor/codeassist/basicproposalitemlistmodel.h>
|
||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
@@ -265,6 +266,12 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
|
|||||||
}
|
}
|
||||||
|
|
||||||
IAssistProposal *newProposal = processor->perform(assistInterface);
|
IAssistProposal *newProposal = processor->perform(assistInterface);
|
||||||
|
if (kind == QuickFix) {
|
||||||
|
TextEditor::BasicProposalItemListModel *proposalModel =
|
||||||
|
static_cast<TextEditor::BasicProposalItemListModel *>(newProposal->model());
|
||||||
|
proposalModel->setSortingAllowed(false);
|
||||||
|
}
|
||||||
|
|
||||||
displayProposal(newProposal, reason);
|
displayProposal(newProposal, reason);
|
||||||
delete processor;
|
delete processor;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user