aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cppeditor
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2024-03-07 11:10:31 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2024-03-14 12:44:13 +0000
commit71ada2b47872255112c4b0f000c39603e94b8fdd (patch)
tree792ee15244eb9113998f323ab718c90aaec44066 /src/plugins/cppeditor
parentc19f97bd231ec3834db27718430d570cbdefa94d (diff)
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>
Diffstat (limited to 'src/plugins/cppeditor')
-rw-r--r--src/plugins/cppeditor/cppquickfix_test.cpp292
-rw-r--r--src/plugins/cppeditor/cppquickfixes.cpp42
2 files changed, 331 insertions, 3 deletions
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp
index 98650baa21..0a5b71c814 100644
--- a/src/plugins/cppeditor/cppquickfix_test.cpp
+++ b/src/plugins/cppeditor/cppquickfix_test.cpp
@@ -8244,6 +8244,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();
})delim";
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index 383c5245ae..9ac67e1e29 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -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;
}