aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2012-12-06 13:16:39 +0000
committerDaniel Jasper <djasper@google.com>2012-12-06 13:16:39 +0000
commitd56a737842f28db4403430082c4d2686bc6cc3b3 (patch)
tree8dd53289fdb8f05835b1c149dc3996a3b3bd5e98
parent4a29065eb189b6132b82c071f75af84799ede0e7 (diff)
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
-rw-r--r--lib/Format/Format.cpp12
-rw-r--r--unittests/Format/FormatTest.cpp3
2 files changed, 15 insertions, 0 deletions
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) {