clang-format: [Java] Support anonymous classes after = and return.

Before:
  A a = new A(){public String toString(){return "NotReallyA";
  }
  }
  ;

After:
  A a = return new A() {
    public String toString() {
      return "NotReallyA";
    }
  };

This fixes llvm.org/PR22878.

llvm-svn: 232042
This commit is contained in:
Daniel Jasper 2015-03-12 14:44:29 +00:00
parent bbdb712765
commit 6acf513099
3 changed files with 42 additions and 0 deletions

View File

@ -868,6 +868,9 @@ void UnwrappedLineParser::parseStructuralElement() {
case tok::l_square:
parseSquare();
break;
case tok::kw_new:
parseNew();
break;
default:
nextToken();
break;
@ -1274,6 +1277,31 @@ void UnwrappedLineParser::parseNamespace() {
// FIXME: Add error handling.
}
void UnwrappedLineParser::parseNew() {
assert(FormatTok->is(tok::kw_new) && "'new' expected");
nextToken();
if (Style.Language != FormatStyle::LK_Java)
return;
// In Java, we can parse everything up to the parens, which aren't optional.
do {
// There should not be a ;, { or } before the new's open paren.
if (FormatTok->isOneOf(tok::semi, tok::l_brace, tok::r_brace))
return;
// Consume the parens.
if (FormatTok->is(tok::l_paren)) {
parseParens();
// If there is a class body of an anonymous class, consume that as child.
if (FormatTok->is(tok::l_brace))
parseChildBlock();
return;
}
nextToken();
} while (!eof());
}
void UnwrappedLineParser::parseForOrWhileLoop() {
assert((FormatTok->Tok.is(tok::kw_for) || FormatTok->Tok.is(tok::kw_while) ||
FormatTok->IsForEachMacro) &&

View File

@ -95,6 +95,7 @@ private:
void parseCaseLabel();
void parseSwitch();
void parseNamespace();
void parseNew();
void parseAccessSpecifier();
void parseEnum();
void parseJavaEnumBody();

View File

@ -153,6 +153,19 @@ TEST_F(FormatTestJava, ClassDeclarations) {
"}");
}
TEST_F(FormatTestJava, AnonymousClasses) {
verifyFormat("return new A() {\n"
" public String toString() {\n"
" return \"NotReallyA\";\n"
" }\n"
"};");
verifyFormat("A a = new A() {\n"
" public String toString() {\n"
" return \"NotReallyA\";\n"
" }\n"
"};");
}
TEST_F(FormatTestJava, EnumDeclarations) {
verifyFormat("enum SomeThing { ABC, CDE }");
verifyFormat("enum SomeThing {\n"