CppEditor: Try to handle "declaration macros"

Fixes: QTCREATORBUG-13640
Change-Id: I6566add09011388627c62394dfc3e47d29bac9cd
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Christian Kandeler
2024-02-23 17:09:58 +01:00
parent 8c5c849b71
commit 2607e07b20
3 changed files with 28 additions and 7 deletions

View File

@@ -346,6 +346,7 @@ void addQtcStatementMacros(clang::format::FormatStyle &style)
"Q_GADGET", "Q_GADGET",
"Q_GADGET_EXPORT", "Q_GADGET_EXPORT",
"Q_INTERFACES", "Q_INTERFACES",
"Q_LOGGING_CATEGORY",
"Q_MOC_INCLUDE", "Q_MOC_INCLUDE",
"Q_NAMESPACE", "Q_NAMESPACE",
"Q_NAMESPACE_EXPORT", "Q_NAMESPACE_EXPORT",

View File

@@ -152,6 +152,12 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
case T_GREATER_GREATER: break; case T_GREATER_GREATER: break;
case T_LBRACKET: break; case T_LBRACKET: break;
case T_NAMESPACE: leave(); enter(namespace_start); break; case T_NAMESPACE: leave(); enter(namespace_start); break;
case T_IDENTIFIER:
if (isStatementMacroOrEquivalent()) {
enter(qt_like_macro);
break;
}
[[fallthrough]];
default: tryExpression(true); break; default: tryExpression(true); break;
} break; } break;
@@ -272,7 +278,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
case T_SEMICOLON: leave(true); break; case T_SEMICOLON: leave(true); break;
case T_LBRACE: enter(brace_list_open); break; case T_LBRACE: enter(brace_list_open); break;
case T_RBRACE: leave(true); continue; 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; default: tryExpression(); break;
} break; } break;
@@ -754,6 +767,16 @@ void CodeFormatter::correctIndentation(const QTextBlock &block)
adjustIndent(m_tokens, lexerState, &m_indentDepth, &m_paddingDepth); 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) bool CodeFormatter::tryExpression(bool alsoExpression)
{ {
int newState = -1; int newState = -1;
@@ -838,12 +861,7 @@ bool CodeFormatter::tryDeclaration()
return true; return true;
case T_IDENTIFIER: case T_IDENTIFIER:
if (m_tokenIndex == 0) { if (m_tokenIndex == 0) {
const QStringView tokenText = currentTokenText(); if (isStatementMacroOrEquivalent()) {
if (tokenText.startsWith(QLatin1String("Q_"))
|| tokenText.startsWith(QLatin1String("QT_"))
|| tokenText.startsWith(QLatin1String("QML_"))
|| tokenText.startsWith(QLatin1String("QDOC_"))
|| m_statementMacros.contains(tokenText)) {
enter(qt_like_macro); enter(qt_like_macro);
return true; return true;
} }

View File

@@ -209,6 +209,8 @@ private:
void leave(bool statementDone = false); void leave(bool statementDone = false);
void correctIndentation(const QTextBlock &block); void correctIndentation(const QTextBlock &block);
bool isStatementMacroOrEquivalent() const;
private: private:
static QStack<State> initialState(); static QStack<State> initialState();