From b8144e0c51259994ea88bd1302776fced19a4755 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 5 Apr 2022 12:57:17 +0200 Subject: CppEditor: Use trailing return type when moving function definition ... if the original definition also used a trailing return type. Task-number: QTCREATORBUG-27132 Change-Id: Iaeeeac08601f1d931aabe12be9f89ca0240d97a2 Reviewed-by: Christian Stenger Reviewed-by: Qt CI Bot Reviewed-by: --- src/libs/cplusplus/Overview.cpp | 1 + src/libs/cplusplus/Overview.h | 1 + src/libs/cplusplus/TypePrettyPrinter.cpp | 22 +++++++++++++++++----- src/plugins/cppeditor/cppquickfix_test.cpp | 2 +- src/plugins/cppeditor/cppquickfixes.cpp | 7 +++++++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/libs/cplusplus/Overview.cpp b/src/libs/cplusplus/Overview.cpp index 7303791b06..02288d94cd 100644 --- a/src/libs/cplusplus/Overview.cpp +++ b/src/libs/cplusplus/Overview.cpp @@ -86,6 +86,7 @@ Overview::Overview() showTemplateParameters(false), showEnclosingTemplate(false), includeWhiteSpaceInOperatorName(true), + trailingReturnType(false), markedArgument(0), markedArgumentBegin(0), markedArgumentEnd(0) diff --git a/src/libs/cplusplus/Overview.h b/src/libs/cplusplus/Overview.h index 243390cd8a..d12daa581f 100644 --- a/src/libs/cplusplus/Overview.h +++ b/src/libs/cplusplus/Overview.h @@ -69,6 +69,7 @@ public: bool showTemplateParameters: 1; bool showEnclosingTemplate: 1; bool includeWhiteSpaceInOperatorName: 1; /// "operator =()" vs "operator=()" + bool trailingReturnType: 1; int markedArgument; int markedArgumentBegin; diff --git a/src/libs/cplusplus/TypePrettyPrinter.cpp b/src/libs/cplusplus/TypePrettyPrinter.cpp index d766a3f03b..b184e2a1e1 100644 --- a/src/libs/cplusplus/TypePrettyPrinter.cpp +++ b/src/libs/cplusplus/TypePrettyPrinter.cpp @@ -435,11 +435,17 @@ void TypePrettyPrinter::visit(Function *type) retAndArgOverview.showTemplateParameters = true; if (_overview->showReturnTypes) { - const QString returnType = retAndArgOverview.prettyType(type->returnType()); - if (!returnType.isEmpty()) { - if (!endsWithPtrOrRef(returnType) || !(_overview->starBindFlags & Overview::BindToIdentifier)) - _text.prepend(QLatin1Char(' ')); - _text.prepend(returnType); + if (_overview->trailingReturnType) { + _text.prepend("auto "); + } else { + const QString returnType = retAndArgOverview.prettyType(type->returnType()); + if (!returnType.isEmpty()) { + if (!endsWithPtrOrRef(returnType) + || !(_overview->starBindFlags & Overview::BindToIdentifier)) { + _text.prepend(QLatin1Char(' ')); + } + _text.prepend(returnType); + } } } @@ -529,6 +535,12 @@ void TypePrettyPrinter::visit(Function *type) _text += QLatin1String(spec->chars()); } } + + if (_overview->showReturnTypes && _overview->trailingReturnType) { + const QString returnType = retAndArgOverview.prettyType(type->returnType()); + if (!returnType.isEmpty()) + _text.append(" -> ").append(returnType); + } } void TypePrettyPrinter::appendSpace() diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 93845b51c8..c0ee38d6e2 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -6137,7 +6137,7 @@ struct Derived : public Base { original = "#include \"file.h\"\n"; expected = R"DELIM(#include "file.h" -void Derived::func() const &&noexcept {} +auto Derived::func() const &&noexcept -> void {} )DELIM"; testDocuments << CppTestDocument::create("file.cpp", original, expected); diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 7afc867297..6ed9736f3e 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -6234,6 +6234,13 @@ QString definitionSignature(const CppQuickFixInterface *assist, oo.showArgumentNames = true; oo.showEnclosingTemplate = true; oo.showTemplateParameters = true; + oo.trailingReturnType = functionDefinitionAST->declarator + && functionDefinitionAST->declarator->postfix_declarator_list + && functionDefinitionAST->declarator->postfix_declarator_list->value + && functionDefinitionAST->declarator->postfix_declarator_list + ->value->asFunctionDeclarator() + && functionDefinitionAST->declarator->postfix_declarator_list + ->value->asFunctionDeclarator()->trailing_return_type; const Name *name = func->name(); if (name && nameIncludesOperatorName(name)) { CoreDeclaratorAST *coreDeclarator = functionDefinitionAST->declarator->core_declarator; -- cgit v1.2.1