CppEditor: Make "Add curly braces" quickfix more robust

Anchor the opening brace at the closing parenthesis, rather than at the
statement. This way, we won't get troubled by macro weirdness in the
statement part.

Fixes: QTCREATORBUG-13921
Change-Id: I05af24d1642e6b62c78bb2f47a1ef0b1fea326d0
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2020-07-07 15:43:42 +02:00
parent 044faadc2d
commit 5b3aece387
3 changed files with 34 additions and 6 deletions

View File

@@ -197,6 +197,8 @@ private slots:
void test_quickfix_ExtractLiteralAsParameter_memberFunction_separateFiles(); void test_quickfix_ExtractLiteralAsParameter_memberFunction_separateFiles();
void test_quickfix_ExtractLiteralAsParameter_notTriggeringForInvalidCode(); void test_quickfix_ExtractLiteralAsParameter_notTriggeringForInvalidCode();
void test_quickfix_addCurlyBraces();
void test_quickfix_InsertVirtualMethods_data(); void test_quickfix_InsertVirtualMethods_data();
void test_quickfix_InsertVirtualMethods(); void test_quickfix_InsertVirtualMethods();
void test_quickfix_InsertVirtualMethods_implementationFile(); void test_quickfix_InsertVirtualMethods_implementationFile();

View File

@@ -5417,6 +5417,31 @@ void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_notTriggeringForIn
QuickFixOperationTest(testDocuments, &factory); QuickFixOperationTest(testDocuments, &factory);
} }
void CppEditorPlugin::test_quickfix_addCurlyBraces()
{
QList<QuickFixTestDocument::Ptr> testDocuments;
const QByteArray original = R"delim(
void MyObject::f()
{
@if (true)
emit mySig();
}
)delim";
const QByteArray expected = R"delim(
void MyObject::f()
{
if (true) {
emit mySig();
}
}
)delim";
testDocuments << QuickFixTestDocument::create("file.cpp", original, expected);
AddBracesToIf factory;
QuickFixOperationTest(testDocuments, &factory);
}
void CppEditorPlugin::test_quickfix_ConvertQt4Connect_connectOutOfClass() void CppEditorPlugin::test_quickfix_ConvertQt4Connect_connectOutOfClass()
{ {
QByteArray prefix = QByteArray prefix =

View File

@@ -691,7 +691,8 @@ namespace {
class AddBracesToIfOp: public CppQuickFixOperation class AddBracesToIfOp: public CppQuickFixOperation
{ {
public: public:
AddBracesToIfOp(const CppQuickFixInterface &interface, int priority, StatementAST *statement) AddBracesToIfOp(const CppQuickFixInterface &interface, int priority,
const IfStatementAST *statement)
: CppQuickFixOperation(interface, priority) : CppQuickFixOperation(interface, priority)
, _statement(statement) , _statement(statement)
{ {
@@ -705,10 +706,10 @@ public:
ChangeSet changes; ChangeSet changes;
const int start = currentFile->endOf(_statement->firstToken() - 1); const int start = currentFile->endOf(_statement->rparen_token);
changes.insert(start, QLatin1String(" {")); changes.insert(start, QLatin1String(" {"));
const int end = currentFile->endOf(_statement->lastToken() - 1); const int end = currentFile->endOf(_statement->statement->lastToken() - 1);
changes.insert(end, QLatin1String("\n}")); changes.insert(end, QLatin1String("\n}"));
currentFile->setChangeSet(changes); currentFile->setChangeSet(changes);
@@ -717,7 +718,7 @@ public:
} }
private: private:
StatementAST *_statement; const IfStatementAST * const _statement;
}; };
} // anonymous namespace } // anonymous namespace
@@ -731,7 +732,7 @@ void AddBracesToIf::match(const CppQuickFixInterface &interface, QuickFixOperati
IfStatementAST *ifStatement = path.at(index)->asIfStatement(); IfStatementAST *ifStatement = path.at(index)->asIfStatement();
if (ifStatement && interface.isCursorOn(ifStatement->if_token) && ifStatement->statement if (ifStatement && interface.isCursorOn(ifStatement->if_token) && ifStatement->statement
&& !ifStatement->statement->asCompoundStatement()) { && !ifStatement->statement->asCompoundStatement()) {
result << new AddBracesToIfOp(interface, index, ifStatement->statement); result << new AddBracesToIfOp(interface, index, ifStatement);
return; return;
} }
@@ -742,7 +743,7 @@ void AddBracesToIf::match(const CppQuickFixInterface &interface, QuickFixOperati
if (ifStatement && ifStatement->statement if (ifStatement && ifStatement->statement
&& interface.isCursorOn(ifStatement->statement) && interface.isCursorOn(ifStatement->statement)
&& !ifStatement->statement->asCompoundStatement()) { && !ifStatement->statement->asCompoundStatement()) {
result << new AddBracesToIfOp(interface, index, ifStatement->statement); result << new AddBracesToIfOp(interface, index, ifStatement);
return; return;
} }
} }