forked from qt-creator/qt-creator
CppEditor: Consider all "else" branches
... in "Add braces to control statement" quickfix. Change-Id: Ie9dde7692e72300d350029cac01b712795c6e200 Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -8243,6 +8243,298 @@ void MyObject::f()
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true)
|
||||
emit mySig();
|
||||
else
|
||||
emit otherSig();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true) {
|
||||
emit mySig();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if with one else, unbraced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true) {
|
||||
emit mySig();
|
||||
} else
|
||||
emit otherSig();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true) {
|
||||
emit mySig();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if with one else, if braced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true)
|
||||
emit mySig();
|
||||
else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true) {
|
||||
emit mySig();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if with one else, else braced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (true) {
|
||||
emit mySig();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
expected.clear();
|
||||
QTest::newRow("if with one else, both braced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1)
|
||||
emit sig1();
|
||||
else if (x == 2)
|
||||
emit sig2();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain without final else, unbraced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2)
|
||||
emit sig2();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain without final else, partially braced 1") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1)
|
||||
emit sig1();
|
||||
else if (x == 2) {
|
||||
emit sig2();
|
||||
}
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain without final else, partially braced 2") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
}
|
||||
})delim";
|
||||
expected.clear();
|
||||
QTest::newRow("if-else chain without final else, fully braced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1)
|
||||
emit sig1();
|
||||
else if (x == 2)
|
||||
emit sig2();
|
||||
else if (x == 3)
|
||||
emit sig3();
|
||||
else
|
||||
emit otherSig();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3) {
|
||||
emit sig3();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain, unbraced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2)
|
||||
emit sig2();
|
||||
else if (x == 3)
|
||||
emit sig3();
|
||||
else
|
||||
emit otherSig();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3) {
|
||||
emit sig3();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain, partially braced 1") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1)
|
||||
emit sig1();
|
||||
else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3)
|
||||
emit sig3();
|
||||
else
|
||||
emit otherSig();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3) {
|
||||
emit sig3();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain, partially braced 2") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1)
|
||||
emit sig1();
|
||||
else if (x == 2)
|
||||
emit sig2();
|
||||
else if (x == 3) {
|
||||
emit sig3();
|
||||
} else
|
||||
emit otherSig();
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3) {
|
||||
emit sig3();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain, partially braced 3") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1)
|
||||
emit sig1();
|
||||
else if (x == 2)
|
||||
emit sig2();
|
||||
else if (x == 3)
|
||||
emit sig3();
|
||||
else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
expected = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3) {
|
||||
emit sig3();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
QTest::newRow("if-else chain, partially braced 4") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@if (x == 1) {
|
||||
emit sig1();
|
||||
} else if (x == 2) {
|
||||
emit sig2();
|
||||
} else if (x == 3) {
|
||||
emit sig3();
|
||||
} else {
|
||||
emit otherSig();
|
||||
}
|
||||
})delim";
|
||||
expected.clear();
|
||||
QTest::newRow("if-else chain, fully braced") << original << expected;
|
||||
|
||||
original = R"delim(
|
||||
void MyObject::f()
|
||||
{
|
||||
@while (true)
|
||||
emit mySig();
|
||||
|
@@ -809,9 +809,11 @@ template<typename Statement> class AddBracesToControlStatementOp : public CppQui
|
||||
{
|
||||
public:
|
||||
AddBracesToControlStatementOp(const CppQuickFixInterface &interface,
|
||||
const QList<Statement *> &statements)
|
||||
const QList<Statement *> &statements,
|
||||
StatementAST *elseStatement,
|
||||
int elseToken)
|
||||
: CppQuickFixOperation(interface, 0)
|
||||
, m_statements(statements)
|
||||
, m_statements(statements), m_elseStatement(elseStatement), m_elseToken(elseToken)
|
||||
{
|
||||
setDescription(Tr::tr("Add Curly Braces"));
|
||||
}
|
||||
@@ -828,11 +830,23 @@ public:
|
||||
if constexpr (std::is_same_v<Statement, DoStatementAST>) {
|
||||
const int end = currentFile->startOf(statement->while_token);
|
||||
changes.insert(end, QLatin1String("} "));
|
||||
} else if constexpr (std::is_same_v<Statement, IfStatementAST>) {
|
||||
if (statement->else_statement) {
|
||||
changes.insert(currentFile->startOf(statement->else_token), "} ");
|
||||
} else {
|
||||
changes.insert(currentFile->endOf(statement->statement->lastToken() - 1),
|
||||
"\n}");
|
||||
}
|
||||
|
||||
} else {
|
||||
const int end = currentFile->endOf(statement->statement->lastToken() - 1);
|
||||
changes.insert(end, QLatin1String("\n}"));
|
||||
}
|
||||
}
|
||||
if (m_elseStatement) {
|
||||
changes.insert(currentFile->endOf(m_elseToken), " {");
|
||||
changes.insert(currentFile->endOf(m_elseStatement->lastToken() - 1), "\n}");
|
||||
}
|
||||
|
||||
currentFile->setChangeSet(changes);
|
||||
currentFile->apply();
|
||||
@@ -840,6 +854,8 @@ public:
|
||||
|
||||
private:
|
||||
const QList<Statement *> m_statements;
|
||||
StatementAST * const m_elseStatement;
|
||||
const int m_elseToken;
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
@@ -851,10 +867,30 @@ bool checkControlStatementsHelper(const CppQuickFixInterface &interface, QuickFi
|
||||
if (!statement)
|
||||
return false;
|
||||
|
||||
QList<Statement *> statements;
|
||||
if (interface.isCursorOn(triggerToken(statement)) && statement->statement
|
||||
&& !statement->statement->asCompoundStatement()) {
|
||||
result << new AddBracesToControlStatementOp(interface, QList{statement});
|
||||
statements << statement;
|
||||
}
|
||||
|
||||
StatementAST *elseStmt = nullptr;
|
||||
int elseToken = 0;
|
||||
if constexpr (std::is_same_v<Statement, IfStatementAST>) {
|
||||
IfStatementAST *currentIfStmt = statement;
|
||||
for (elseStmt = currentIfStmt->else_statement, elseToken = currentIfStmt->else_token;
|
||||
elseStmt && (currentIfStmt = elseStmt->asIfStatement());
|
||||
elseStmt = currentIfStmt->else_statement, elseToken = currentIfStmt->else_token) {
|
||||
if (currentIfStmt->statement && !currentIfStmt->statement->asCompoundStatement())
|
||||
statements << currentIfStmt;
|
||||
}
|
||||
if (elseStmt && (elseStmt->asIfStatement() || elseStmt->asCompoundStatement())) {
|
||||
elseStmt = nullptr;
|
||||
elseToken = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!statements.isEmpty() || elseStmt)
|
||||
result << new AddBracesToControlStatementOp(interface, statements, elseStmt, elseToken);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user