Fix formatting over overloaded operators.

This fixes llvm.org/pr14686.

We used to add too many spaces for different versions of overloaded operator
function declarations/definitions. This patch changes, e.g.

  operator *() {}
  operator >() {}
  operator () () {}

to

  operator*() {}
  operator>() {}
  operator()() {}

llvm-svn: 171028
This commit is contained in:
Daniel Jasper 2012-12-24 10:56:04 +00:00
parent 3ee6b10dd4
commit 537a29638d
2 changed files with 35 additions and 3 deletions

View File

@ -553,9 +553,19 @@ public:
Annotations[CurrentIndex].Type = TokenAnnotation::TT_BinaryOperator;
break;
case tok::kw_operator:
if (!Tokens[Index].Tok.is(tok::l_paren))
if (Tokens[Index].Tok.is(tok::l_paren)) {
Annotations[Index].Type = TokenAnnotation::TT_OverloadedOperator;
next();
next();
if (Index < Tokens.size() && Tokens[Index].Tok.is(tok::r_paren)) {
Annotations[Index].Type = TokenAnnotation::TT_OverloadedOperator;
next();
}
} else {
while (Index < Tokens.size() && !Tokens[Index].Tok.is(tok::l_paren)) {
Annotations[Index].Type = TokenAnnotation::TT_OverloadedOperator;
next();
}
}
break;
case tok::question:
parseConditional();
@ -633,6 +643,13 @@ public:
if (Annotation.Type == TokenAnnotation::TT_CtorInitializerColon) {
Annotation.MustBreakBefore = true;
Annotation.SpaceRequiredBefore = true;
} else if (Annotation.Type == TokenAnnotation::TT_OverloadedOperator) {
Annotation.SpaceRequiredBefore =
Line.Tokens[i].Tok.is(tok::identifier) || Line.Tokens[i].Tok.is(
tok::kw_new) || Line.Tokens[i].Tok.is(tok::kw_delete);
} else if (
Annotations[i - 1].Type == TokenAnnotation::TT_OverloadedOperator) {
Annotation.SpaceRequiredBefore = false;
} else if (IsObjCMethodDecl && Line.Tokens[i].Tok.is(tok::identifier) &&
(i != e - 1) && Line.Tokens[i + 1].Tok.is(tok::colon) &&
Line.Tokens[i - 1].Tok.is(tok::identifier)) {

View File

@ -589,7 +589,22 @@ TEST_F(FormatTest, UnderstandsUnaryOperators) {
}
TEST_F(FormatTest, UndestandsOverloadedOperators) {
verifyFormat("bool operator<() {\n}");
verifyFormat("bool operator<();");
verifyFormat("bool operator>();");
verifyFormat("bool operator=();");
verifyFormat("bool operator==();");
verifyFormat("bool operator!=();");
verifyFormat("int operator+();");
verifyFormat("int operator++();");
verifyFormat("bool operator();");
verifyFormat("bool operator()();");
verifyFormat("bool operator[]();");
verifyFormat("operator bool();");
verifyFormat("operator SomeType<int>();");
verifyFormat("void *operator new(std::size_t size);");
verifyFormat("void *operator new[](std::size_t size);");
verifyFormat("void operator delete(void *ptr);");
verifyFormat("void operator delete[](void *ptr);");
}
TEST_F(FormatTest, UnderstandsUsesOfStar) {