From: Daniel Jasper Date: Thu, 6 Dec 2012 13:16:39 +0000 (+0000) Subject: Improve clang-format's handling of unary operators. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d56a737842f28db4403430082c4d2686bc6cc3b3;p=clang Improve clang-format's handling of unary operators. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169500 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 08096866bf..51db69c5ae 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -618,12 +618,24 @@ private: bool isUnaryOperator(unsigned Index) { const Token &Tok = Line.Tokens[Index].Tok; + + // '++', '--' and '!' are always unary operators. + if (Tok.is(tok::minusminus) || Tok.is(tok::plusplus) || + Tok.is(tok::exclaim)) + return true; + + // The other possible unary operators are '+' and '-' as we + // determine the usage of '*' and '&' in determineStarAmpUsage(). if (Tok.isNot(tok::minus) && Tok.isNot(tok::plus)) return false; + + // Use heuristics to recognize unary operators. const Token &PreviousTok = Line.Tokens[Index - 1].Tok; if (PreviousTok.is(tok::equal) || PreviousTok.is(tok::l_paren) || PreviousTok.is(tok::comma) || PreviousTok.is(tok::l_square)) return true; + + // Fall back to marking the token as binary operator. return Annotations[Index - 1].Type == TokenAnnotation::TT_BinaryOperator; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 7628b34d4b..a2a37cf1a7 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -364,6 +364,9 @@ TEST_F(FormatTest, UndestandsUnaryOperators) { verifyFormat("if (i != -1) {\n}"); verifyFormat("if (i > -1) {\n}"); verifyFormat("if (i < -1) {\n}"); + verifyFormat("++(a->f());"); + verifyFormat("--(a->f());"); + verifyFormat("if (!(a->f())) {\n}"); } TEST_F(FormatTest, UndestandsOverloadedOperators) {