[clang-format] Handle typename macros inside cast expressions

Before: x = (STACK_OF(uint64_t)) & a;
After:  x = (STACK_OF(uint64_t))&a;

Reviewed By: MyDeveloperDay

Differential Revision: https://reviews.llvm.org/D86930
This commit is contained in:
Alex Richardson 2020-09-07 09:26:16 +01:00
parent e7bd058c7e
commit 8aa3b8da5d
3 changed files with 12 additions and 3 deletions

View File

@ -102,6 +102,7 @@ namespace format {
TYPE(TrailingReturnArrow) \
TYPE(TrailingUnaryOperator) \
TYPE(TypenameMacro) \
TYPE(TypenameMacroParen) \
TYPE(UnaryOperator) \
TYPE(UntouchableMacroFunc) \
TYPE(CSharpStringLiteral) \

View File

@ -244,6 +244,8 @@ private:
Contexts.back().IsExpression = false;
} else if (Left->Previous && Left->Previous->is(tok::kw___attribute)) {
Left->setType(TT_AttributeParen);
} else if (Left->Previous && Left->Previous->is(TT_TypenameMacro)) {
Left->setType(TT_TypenameMacroParen);
} else if (Left->Previous && Left->Previous->is(TT_ForEachMacro)) {
// The first argument to a foreach macro is a declaration.
Contexts.back().IsForEachMacro = true;
@ -335,6 +337,8 @@ private:
if (Left->is(TT_AttributeParen))
CurrentToken->setType(TT_AttributeParen);
if (Left->is(TT_TypenameMacroParen))
CurrentToken->setType(TT_TypenameMacroParen);
if (Left->Previous && Left->Previous->is(TT_JavaAnnotation))
CurrentToken->setType(TT_JavaAnnotation);
if (Left->Previous && Left->Previous->is(TT_LeadingJavaAnnotation))
@ -1855,9 +1859,11 @@ private:
}
return T && T->is(TT_PointerOrReference);
};
bool ParensAreType = !Tok.Previous || Tok.Previous->is(TT_TemplateCloser) ||
Tok.Previous->isSimpleTypeSpecifier() ||
IsQualifiedPointerOrReference(Tok.Previous);
bool ParensAreType =
!Tok.Previous ||
Tok.Previous->isOneOf(TT_TemplateCloser, TT_TypenameMacroParen) ||
Tok.Previous->isSimpleTypeSpecifier() ||
IsQualifiedPointerOrReference(Tok.Previous);
bool ParensCouldEndDecl =
Tok.Next->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
if (ParensAreType && !ParensCouldEndDecl)

View File

@ -16557,6 +16557,8 @@ TEST_F(FormatTest, TypenameMacros) {
Macros.PointerAlignment = FormatStyle::PAS_Left;
verifyFormat("STACK_OF(int)* a;", Macros);
verifyFormat("STACK_OF(int*)* a;", Macros);
verifyFormat("x = (STACK_OF(uint64_t))*a;", Macros);
verifyFormat("x = (STACK_OF(uint64_t))&a;", Macros);
}
TEST_F(FormatTest, AmbersandInLamda) {