diff options
author | Daniel Jasper <djasper@google.com> | 2013-01-10 11:14:08 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-01-10 11:14:08 +0000 |
commit | 5cf7cf317f684dc61b8a0e4476440b5635b80db4 (patch) | |
tree | 89c93ff86a8c6c57ef45b83918abdf56568bcd76 | |
parent | a2d37a51846fc748833b744076098a5ea002ab00 (diff) |
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
-rw-r--r-- | lib/Format/Format.cpp | 32 | ||||
-rw-r--r-- | 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<int *, int *> a;"); verifyFormat("A<int **, int **> a;"); verifyFormat("Type *A = static_cast<Type *>(P);"); - verifyFormat("Type *A = (Type *) P;"); - verifyFormat("Type *A = (vector<Type *, int *>) P;"); + verifyFormat("Type *A = (Type *)P;"); + verifyFormat("Type *A = (vector<Type *, int *>)P;"); verifyFormat( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" |