fix enum's java presentation for annotations

Annotations for types should be presented as one at a line.

Bug: n/a
Test: atest aidl_unittests
Change-Id: I8311c57e2c0fc201942c6ba8d0c51f4d6e11491a
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index 8b9cde7..4c583bf 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -2417,15 +2417,24 @@
 
 TEST_F(AidlTest, ParseJavaPassthroughAnnotation) {
   io_delegate_.SetFileContents("a/IFoo.aidl", R"--(package a;
+    import a.MyEnum;
     @JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A)")
     @JavaPassthrough(annotation="@com.android.AliceTwo")
     interface IFoo {
         @JavaPassthrough(annotation="@com.android.Bob")
-        void foo(@JavaPassthrough(annotation="@com.android.Cat") int x);
+        void foo(@JavaPassthrough(annotation="@com.android.Cat") int x, MyEnum y);
         const @JavaPassthrough(annotation="@com.android.David") int A = 3;
     })--");
+  // JavaPassthrough should work with other types as well (e.g. enum)
+  io_delegate_.SetFileContents("a/MyEnum.aidl", R"--(package a;
+    @JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A)")
+    @JavaPassthrough(annotation="@com.android.AliceTwo")
+    @Backing(type="byte")
+    enum MyEnum {
+      a, b, c
+    })--");
 
-  Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
+  Options java_options = Options::From("aidl -I . --lang=java -o out a/IFoo.aidl a/MyEnum.aidl");
   EXPECT_EQ(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
 
   string java_out;
@@ -2439,14 +2448,21 @@
   // inline annotations with space at the end
   EXPECT_THAT(java_out, testing::HasSubstr("@com.android.Cat "));
 
+  EXPECT_TRUE(io_delegate_.GetWrittenContents("out/a/MyEnum.java", &java_out));
+  // type-decl-level annotations with newline at the end
+  EXPECT_THAT(java_out, testing::HasSubstr("@com.android.Alice(arg=com.android.Alice.Value.A)\n"));
+  EXPECT_THAT(java_out, testing::HasSubstr("@com.android.AliceTwo\n"));
+
   // Other backends shouldn't be bothered
-  Options cpp_options = Options::From("aidl --lang=cpp -o out -h out a/IFoo.aidl");
+  Options cpp_options =
+      Options::From("aidl -I . --lang=cpp -o out -h out a/IFoo.aidl a/MyEnum.aidl");
   EXPECT_EQ(0, ::android::aidl::compile_aidl(cpp_options, io_delegate_));
 
-  Options ndk_options = Options::From("aidl --lang=ndk -o out -h out a/IFoo.aidl");
+  Options ndk_options =
+      Options::From("aidl -I . --lang=ndk -o out -h out a/IFoo.aidl a/MyEnum.aidl");
   EXPECT_EQ(0, ::android::aidl::compile_aidl(ndk_options, io_delegate_));
 
-  Options rust_options = Options::From("aidl --lang=rust -o out a/IFoo.aidl");
+  Options rust_options = Options::From("aidl -I . --lang=rust -o out a/IFoo.aidl a/MyEnum.aidl");
   EXPECT_EQ(0, ::android::aidl::compile_aidl(rust_options, io_delegate_));
 }
 
diff --git a/generate_java.cpp b/generate_java.cpp
index 223a258..eff0bd9 100644
--- a/generate_java.cpp
+++ b/generate_java.cpp
@@ -411,7 +411,7 @@
   code_writer->Write("package %s;\n", enum_decl->GetPackage().c_str());
   code_writer->Write("%s\n", enum_decl->GetComments().c_str());
   for (const std::string& annotation : generate_java_annotations(*enum_decl)) {
-    code_writer->Write("%s", annotation.c_str());
+    code_writer->Write("%s\n", annotation.c_str());
   }
   code_writer->Write("public @interface %s {\n", enum_decl->GetName().c_str());
   code_writer->Indent();