Java annotation declaration being handled correctly
authorHans Wennborg <hans@hanshq.net>
Fri, 19 Oct 2018 16:19:52 +0000 (16:19 +0000)
committerHans Wennborg <hans@hanshq.net>
Fri, 19 Oct 2018 16:19:52 +0000 (16:19 +0000)
Previously, Java annotation declarations (@interface AnnotationName) were being
handled as ObjC interfaces. This caused the brace formatting to mess up, so
that when you had a class with an interface defined in it, it would indent the
final brace of the class.

It used to format this class like so:

  class A {
    @interface B {}
    }

But will now just skip the @interface and format it like so:

  class A {
    @interface B {}
  }

Patch by Sam Maier!

Differential Revision: https://reviews.llvm.org/D53434

llvm-svn: 344789

clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTestJava.cpp

index 4debdd1..3cd3c8f 100644 (file)
@@ -1130,6 +1130,10 @@ void UnwrappedLineParser::parseStructuralElement() {
         nextToken();
         parseBracedList();
         break;
+      } else if (Style.Language == FormatStyle::LK_Java &&
+                 FormatTok->is(Keywords.kw_interface)) {
+        nextToken();
+        break;
       }
       switch (FormatTok->Tok.getObjCKeywordID()) {
       case tok::objc_public:
index aee8a99..f12d7fb 100644 (file)
@@ -155,6 +155,15 @@ TEST_F(FormatTestJava, ClassDeclarations) {
                "  void doStuff(int theStuff);\n"
                "  void doMoreStuff(int moreStuff);\n"
                "}");
+  verifyFormat("class A {\n"
+               "  public @interface SomeInterface {\n"
+               "    int stuff;\n"
+               "    void doMoreStuff(int moreStuff);\n"
+               "  }\n"
+               "}");
+  verifyFormat("class A {\n"
+               "  public @interface SomeInterface {}\n"
+               "}");
 }
 
 TEST_F(FormatTestJava, AnonymousClasses) {