From 5cf7cf317f684dc61b8a0e4476440b5635b80db4 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Thu, 10 Jan 2013 11:14:08 +0000 Subject: [PATCH] Improve clang-format's understanding of casts. This fixes llvm.org/PR14684. Before: int *pa = (int *) & a; After: int *pa = (int *)&a; We still don't understand all kinds of casts. I added a FIXME to address that. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172056 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/Format.cpp | 32 ++++++++++++++++++++------------ unittests/Format/FormatTest.cpp | 5 +++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 4de26e2b4e..dfb43afafa 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -27,21 +27,22 @@ namespace clang { namespace format { enum TokenType { - TT_Unknown, - TT_TemplateOpener, - TT_TemplateCloser, TT_BinaryOperator, - TT_UnaryOperator, - TT_TrailingUnaryOperator, - TT_OverloadedOperator, - TT_PointerOrReference, + TT_BlockComment, + TT_CastRParen, TT_ConditionalExpr, TT_CtorInitializerColon, - TT_LineComment, - TT_BlockComment, TT_DirectorySeparator, + TT_LineComment, + TT_ObjCMethodSpecifier, + TT_OverloadedOperator, + TT_PointerOrReference, TT_PureVirtualSpecifier, - TT_ObjCMethodSpecifier + TT_TemplateCloser, + TT_TemplateOpener, + TT_TrailingUnaryOperator, + TT_UnaryOperator, + TT_Unknown }; enum LineType { @@ -897,6 +898,11 @@ private: Current.Type = TT_LineComment; else Current.Type = TT_BlockComment; + } else if (Current.is(tok::r_paren) && + (Current.Parent->Type == TT_PointerOrReference || + Current.Parent->Type == TT_TemplateCloser)) { + // FIXME: We need to get smarter and understand more cases of casts. + Current.Type = TT_CastRParen; } } @@ -919,7 +925,8 @@ private: if (PrevToken.Tok.is(tok::l_paren) || PrevToken.Tok.is(tok::l_square) || PrevToken.Tok.is(tok::comma) || PrevToken.Tok.is(tok::kw_return) || - PrevToken.Tok.is(tok::colon) || Tok.Parent->Type == TT_BinaryOperator) + PrevToken.Tok.is(tok::colon) || Tok.Parent->Type == TT_BinaryOperator || + Tok.Parent->Type == TT_CastRParen) return TT_UnaryOperator; if (PrevToken.Tok.isLiteral() || NextToken.Tok.isLiteral() || @@ -1050,7 +1057,8 @@ private: return false; if (Tok.is(tok::colon)) return RootToken.isNot(tok::kw_case) && (!Tok.Children.empty()); - if (Tok.Parent->Type == TT_UnaryOperator) + if (Tok.Parent->Type == TT_UnaryOperator || + Tok.Parent->Type == TT_CastRParen) return false; if (Tok.Type == TT_UnaryOperator) return Tok.Parent->isNot(tok::l_paren) && diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 739bcdd80f..51a0bd6488 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -980,6 +980,7 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyFormat("a * -b;"); verifyFormat("a * ++b;"); verifyFormat("a * --b;"); + verifyFormat("int *pa = (int *)&a;"); verifyFormat("InvalidRegions[*R] = 0;"); @@ -988,8 +989,8 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyFormat("A a;"); verifyFormat("A a;"); verifyFormat("Type *A = static_cast(P);"); - verifyFormat("Type *A = (Type *) P;"); - verifyFormat("Type *A = (vector) P;"); + verifyFormat("Type *A = (Type *)P;"); + verifyFormat("Type *A = (vector)P;"); verifyFormat( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" -- 2.40.0