CppEditor: New quick fix "Optimize For Loop"

Rewrites post increment/decrement operators (++ and --) as pre
increment/decrement operators and moves non string/numeric literals and
non id expressions from loops condition to loops initializer.

Change-Id: Id95334b6df6fcaa9af436cc1d2d0982d38bf8fe2
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Lorenz Haas
2013-05-23 20:59:02 +02:00
committed by Nikolai Kosjar
parent 7811cad178
commit 02825b5894
5 changed files with 310 additions and 0 deletions

View File

@@ -3768,3 +3768,93 @@ void CppEditorPlugin::test_quickfix_InsertVirtualMethods_BaseClassInNamespace()
TestCase data(testFiles);
data.run(&factory);
}
/// Check: optimize postcrement
void CppEditorPlugin::test_quickfix_OptimizeForLoop_postcrement()
{
const QByteArray original = "void foo() {f@or (int i = 0; i < 3; i++) {}}\n";
const QByteArray expected = "void foo() {for (int i = 0; i < 3; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: optimize condition
void CppEditorPlugin::test_quickfix_OptimizeForLoop_condition()
{
const QByteArray original = "void foo() {f@or (int i = 0; i < 3 + 5; ++i) {}}\n";
const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; i < total; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: optimize fliped condition
void CppEditorPlugin::test_quickfix_OptimizeForLoop_flipedCondition()
{
const QByteArray original = "void foo() {f@or (int i = 0; 3 + 5 > i; ++i) {}}\n";
const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; total > i; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: if "total" used, create other name.
void CppEditorPlugin::test_quickfix_OptimizeForLoop_alterVariableName()
{
const QByteArray original = "void foo() {f@or (int i = 0, total = 0; i < 3 + 5; ++i) {}}\n";
const QByteArray expected = "void foo() {for (int i = 0, total = 0, totalX = 3 + 5; i < totalX; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: optimize postcrement and condition
void CppEditorPlugin::test_quickfix_OptimizeForLoop_optimizeBoth()
{
const QByteArray original = "void foo() {f@or (int i = 0; i < 3 + 5; i++) {}}\n";
const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; i < total; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: empty initializier
void CppEditorPlugin::test_quickfix_OptimizeForLoop_emptyInitializer()
{
const QByteArray original = "int i; void foo() {f@or (; i < 3 + 5; ++i) {}}\n";
const QByteArray expected = "int i; void foo() {for (int total = 3 + 5; i < total; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: wrong initializier type -> no trigger
void CppEditorPlugin::test_quickfix_OptimizeForLoop_wrongInitializer()
{
const QByteArray original = "int i; void foo() {f@or (double a = 0; i < 3 + 5; ++i) {}}\n";
const QByteArray expected = "int i; void foo() {f@or (double a = 0; i < 3 + 5; ++i) {}}\n\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: No trigger when numeric
void CppEditorPlugin::test_quickfix_OptimizeForLoop_noTriggerNumeric1()
{
const QByteArray original = "void foo() {fo@r (int i = 0; i < 3; ++i) {}}\n";
const QByteArray expected = original + "\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}
/// Check: No trigger when numeric
void CppEditorPlugin::test_quickfix_OptimizeForLoop_noTriggerNumeric2()
{
const QByteArray original = "void foo() {fo@r (int i = 0; i < -3; ++i) {}}\n";
const QByteArray expected = original + "\n";
OptimizeForLoop factory;
TestCase data(original, expected);
data.run(&factory);
}