From 2607e07b20c6844b14c271ef01d14fb4988560ce Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 23 Feb 2024 17:09:58 +0100 Subject: [PATCH] CppEditor: Try to handle "declaration macros" Fixes: QTCREATORBUG-13640 Change-Id: I6566add09011388627c62394dfc3e47d29bac9cd Reviewed-by: Reviewed-by: David Schulz Reviewed-by: Christian Kandeler --- src/plugins/clangformat/clangformatutils.cpp | 1 + src/plugins/cppeditor/cppcodeformatter.cpp | 32 +++++++++++++++----- src/plugins/cppeditor/cppcodeformatter.h | 2 ++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index 747c30c2a57..7ccc9ad7188 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -346,6 +346,7 @@ void addQtcStatementMacros(clang::format::FormatStyle &style) "Q_GADGET", "Q_GADGET_EXPORT", "Q_INTERFACES", + "Q_LOGGING_CATEGORY", "Q_MOC_INCLUDE", "Q_NAMESPACE", "Q_NAMESPACE_EXPORT", diff --git a/src/plugins/cppeditor/cppcodeformatter.cpp b/src/plugins/cppeditor/cppcodeformatter.cpp index 3d015394406..447a5a04871 100644 --- a/src/plugins/cppeditor/cppcodeformatter.cpp +++ b/src/plugins/cppeditor/cppcodeformatter.cpp @@ -152,6 +152,12 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) case T_GREATER_GREATER: break; case T_LBRACKET: break; case T_NAMESPACE: leave(); enter(namespace_start); break; + case T_IDENTIFIER: + if (isStatementMacroOrEquivalent()) { + enter(qt_like_macro); + break; + } + [[fallthrough]]; default: tryExpression(true); break; } break; @@ -272,7 +278,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) case T_SEMICOLON: leave(true); break; case T_LBRACE: enter(brace_list_open); break; case T_RBRACE: leave(true); continue; - case T_RPAREN: leave(); break; + case T_RPAREN: + leave(); + if (m_currentState.top().type == qt_like_macro && m_currentState.size() > 1 + && m_currentState.at(m_currentState.size() - 2).type == declaration_start) { + leave(); + leave(); + } + break; default: tryExpression(); break; } break; @@ -754,6 +767,16 @@ void CodeFormatter::correctIndentation(const QTextBlock &block) adjustIndent(m_tokens, lexerState, &m_indentDepth, &m_paddingDepth); } +bool CodeFormatter::isStatementMacroOrEquivalent() const +{ + const QStringView tokenText = currentTokenText(); + return tokenText.startsWith(QLatin1String("Q_")) + || tokenText.startsWith(QLatin1String("QT_")) + || tokenText.startsWith(QLatin1String("QML_")) + || tokenText.startsWith(QLatin1String("QDOC_")) + || m_statementMacros.contains(tokenText); +} + bool CodeFormatter::tryExpression(bool alsoExpression) { int newState = -1; @@ -838,12 +861,7 @@ bool CodeFormatter::tryDeclaration() return true; case T_IDENTIFIER: if (m_tokenIndex == 0) { - const QStringView tokenText = currentTokenText(); - if (tokenText.startsWith(QLatin1String("Q_")) - || tokenText.startsWith(QLatin1String("QT_")) - || tokenText.startsWith(QLatin1String("QML_")) - || tokenText.startsWith(QLatin1String("QDOC_")) - || m_statementMacros.contains(tokenText)) { + if (isStatementMacroOrEquivalent()) { enter(qt_like_macro); return true; } diff --git a/src/plugins/cppeditor/cppcodeformatter.h b/src/plugins/cppeditor/cppcodeformatter.h index 98aacbc55ed..93d32faf263 100644 --- a/src/plugins/cppeditor/cppcodeformatter.h +++ b/src/plugins/cppeditor/cppcodeformatter.h @@ -209,6 +209,8 @@ private: void leave(bool statementDone = false); void correctIndentation(const QTextBlock &block); + bool isStatementMacroOrEquivalent() const; + private: static QStack initialState();