CppEditor: Make "Complete switch statement" quickfix more visible

Do not require the cursor to be on the "switch" keyword, but allow it to
be anywhere within the switch construct.

Fixes: QTCREATORBUG-5379
Change-Id: Ic25504237b3ef12958f339d7176dfeeac6bd3466
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2021-01-29 17:00:06 +01:00
parent 45fa8894bd
commit feefe3585f
2 changed files with 27 additions and 1 deletions

View File

@@ -409,6 +409,32 @@ void CppEditorPlugin::test_quickfix_data()
"}\n" "}\n"
); );
// Same as above with the cursor somewhere in the body.
QTest::newRow("CompleteSwitchCaseStatement_basic1_enum class, cursor in the body")
<< CppQuickFixFactoryPtr(new CompleteSwitchCaseStatement) << _(
"enum class EnumType { V1, V2 };\n"
"\n"
"void f()\n"
"{\n"
" EnumType t;\n"
" switch (t) {\n"
" @}\n"
"}\n"
) << _(
"enum class EnumType { V1, V2 };\n"
"\n"
"void f()\n"
"{\n"
" EnumType t;\n"
" switch (t) {\n"
" case EnumType::V1:\n"
" break;\n"
" case EnumType::V2:\n"
" break;\n"
" }\n"
"}\n"
);
// Checks: All enum values are added as case statements for a blank switch when // Checks: All enum values are added as case statements for a blank switch when
// the variable is declared alongside the enum definition. // the variable is declared alongside the enum definition.
QTest::newRow("CompleteSwitchCaseStatement_basic1_enum_with_declaration") QTest::newRow("CompleteSwitchCaseStatement_basic1_enum_with_declaration")

View File

@@ -2833,7 +2833,7 @@ void CompleteSwitchCaseStatement::match(const CppQuickFixInterface &interface,
AST *ast = path.at(depth); AST *ast = path.at(depth);
SwitchStatementAST *switchStatement = ast->asSwitchStatement(); SwitchStatementAST *switchStatement = ast->asSwitchStatement();
if (switchStatement) { if (switchStatement) {
if (!interface.isCursorOn(switchStatement->switch_token) || !switchStatement->statement) if (!switchStatement->statement)
return; return;
CompoundStatementAST *compoundStatement = switchStatement->statement->asCompoundStatement(); CompoundStatementAST *compoundStatement = switchStatement->statement->asCompoundStatement();
if (!compoundStatement) // we ignore pathologic case "switch (t) case A: ;" if (!compoundStatement) // we ignore pathologic case "switch (t) case A: ;"