From: Daniel Jasper Date: Thu, 12 Mar 2015 14:44:29 +0000 (+0000) Subject: clang-format: [Java] Support anonymous classes after = and return. X-Git-Tag: llvmorg-3.7.0-rc1~9438 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6acf5130995d9374459f86de7e42ed0e2d9838a9;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 5222418..cea6e8a 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -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) && diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h index 4b953ea..76c62cd 100644 --- a/clang/lib/Format/UnwrappedLineParser.h +++ b/clang/lib/Format/UnwrappedLineParser.h @@ -95,6 +95,7 @@ private: void parseCaseLabel(); void parseSwitch(); void parseNamespace(); + void parseNew(); void parseAccessSpecifier(); void parseEnum(); void parseJavaEnumBody(); diff --git a/clang/unittests/Format/FormatTestJava.cpp b/clang/unittests/Format/FormatTestJava.cpp index 8d6daa6..6e3f7ef 100644 --- a/clang/unittests/Format/FormatTestJava.cpp +++ b/clang/unittests/Format/FormatTestJava.cpp @@ -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"