diff options
author | David Schulz <david.schulz@qt.io> | 2019-12-04 09:53:26 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2020-01-08 09:21:25 +0000 |
commit | 1ab9dc946410e96e0e211347e9d9127740ab18dd (patch) | |
tree | 779341b2d2817194c978ab78d544e2635e054494 /src/plugins/cppeditor/cppquickfixes.cpp | |
parent | 15734ac5eb5b7b55916aca7b83a85ed8b6c793c1 (diff) |
CppEditor: generate valid code via "Convert to Pointer/Stack Variable"
Adding a "= new <TypeName>" after converting a stack variable without
assignment or initializer to pointer.
Also remove the assignment when converting from pointer to stack
variable as this works better with explicit constructors.
Fixes: QTCREATORBUG-23181
Change-Id: I377ec32a1b66cf4b96db14cfcb4b71fb96c80c98
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/cppeditor/cppquickfixes.cpp')
-rw-r--r-- | src/plugins/cppeditor/cppquickfixes.cpp | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index d384322bdd..c3c93f7a5e 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -4153,20 +4153,21 @@ private: void removeNewExpression(ChangeSet &changes, NewExpressionAST *newExprAST) const { - ExpressionListParenAST *exprlist = newExprAST->new_initializer - ? newExprAST->new_initializer->asExpressionListParen() - : nullptr; + ExpressionListAST *exprlist = nullptr; + if (newExprAST->new_initializer) { + if (ExpressionListParenAST *ast = newExprAST->new_initializer->asExpressionListParen()) + exprlist = ast->expression_list; + else if (BracedInitializerAST *ast = newExprAST->new_initializer->asBracedInitializer()) + exprlist = ast->expression_list; + } - if (exprlist && exprlist->expression_list) { + if (exprlist) { // remove 'new' keyword and type before initializer changes.remove(m_file->startOf(newExprAST->new_token), m_file->startOf(newExprAST->new_initializer)); - // remove parenthesis around initializer - int pos = m_file->startOf(exprlist->lparen_token); - changes.remove(pos, pos + 1); - pos = m_file->startOf(exprlist->rparen_token); - changes.remove(pos, pos + 1); + changes.remove(m_file->endOf(m_declaratorAST->equal_token - 1), + m_file->startOf(m_declaratorAST->equal_token + 1)); } else { // remove the whole new expression changes.remove(m_file->endOf(m_identifierAST->firstToken()), @@ -4272,24 +4273,30 @@ private: return overview.prettyName(namedType->name->name); } - void insertNewExpression(ChangeSet &changes, CallAST *callAST) const + void insertNewExpression(ChangeSet &changes, ExpressionAST *ast) const { const QString typeName = typeNameOfDeclaration(); - if (typeName.isEmpty()) { - changes.insert(m_file->startOf(callAST), QLatin1String("new ")); + if (CallAST *callAST = ast->asCall()) { + if (typeName.isEmpty()) { + changes.insert(m_file->startOf(callAST), QLatin1String("new ")); + } else { + changes.insert(m_file->startOf(callAST), + QLatin1String("new ") + typeName + QLatin1Char('(')); + changes.insert(m_file->startOf(callAST->lastToken()), QLatin1String(")")); + } } else { - changes.insert(m_file->startOf(callAST), - QLatin1String("new ") + typeName + QLatin1Char('(')); - changes.insert(m_file->startOf(callAST->lastToken()), QLatin1String(")")); + if (typeName.isEmpty()) + return; + changes.insert(m_file->startOf(ast), QLatin1String(" = new ") + typeName); } } - void insertNewExpression(ChangeSet &changes, ExpressionListParenAST *exprListAST) const + void insertNewExpression(ChangeSet &changes) const { const QString typeName = typeNameOfDeclaration(); if (typeName.isEmpty()) return; - changes.insert(m_file->startOf(exprListAST), + changes.insert(m_file->endOf(m_identifierAST->firstToken()), QLatin1String(" = new ") + typeName); } @@ -4301,10 +4308,15 @@ private: changes.insert(m_file->startOf(idExprAST), QLatin1String("&")); } else if (CallAST *callAST = m_declaratorAST->initializer->asCall()) { insertNewExpression(changes, callAST); - } else if (ExpressionListParenAST *exprListAST - = m_declaratorAST->initializer->asExpressionListParen()) { + } else if (ExpressionListParenAST *exprListAST = m_declaratorAST->initializer + ->asExpressionListParen()) { insertNewExpression(changes, exprListAST); + } else if (BracedInitializerAST *bracedInitializerAST = m_declaratorAST->initializer + ->asBracedInitializer()) { + insertNewExpression(changes, bracedInitializerAST); } + } else { + insertNewExpression(changes); } // Fix all occurrences of the identifier in this function. |