Union can be @JavaOnlyImmutable
For now it doesn't affect generated code, but it enables immutable
parcelables can have immutable unions. Upcoming change will make
generated class immutable when a union is annotated as
@JavaOnlyImmutable.
Introduced "AidlWithFields" which can handles fields of parcelable
classes(AidlStructuredParcelable and AidlUnionDeclaration).
Bug: 171637180
Test: aidl_unittests / aidl_integration_test
Change-Id: I492722eeed36e8a7e6f0eb81ef292d2caff5d624
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index 7803521..d55460f 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -392,8 +392,7 @@
TEST_P(AidlTest, RejectsDuplicatedFieldNames) {
const string method = "package a; parcelable Foo { int a; String a; }";
- const string expected_stderr =
- "ERROR: a/Foo.aidl:1.22-26: The parcelable 'Foo' has duplicate field name 'a'\n";
+ const string expected_stderr = "ERROR: a/Foo.aidl:1.42-44: 'Foo' has duplicate field name 'a'\n";
CaptureStderr();
EXPECT_EQ(nullptr, Parse("a/Foo.aidl", method, typenames_, GetLanguage()));
EXPECT_EQ(expected_stderr, GetCapturedStderr());
@@ -2842,7 +2841,19 @@
io_delegate_.SetFileContents("Foo.aidl", "@JavaOnlyImmutable parcelable Foo { Bar bar; }");
io_delegate_.SetFileContents("Bar.aidl", "parcelable Bar { String a; }");
string expected_error =
- "ERROR: Foo.aidl:1.40-44: The @JavaOnlyImmutable parcelable 'Foo' has a non-immutable field "
+ "ERROR: Foo.aidl:1.40-44: The @JavaOnlyImmutable 'Foo' has a non-immutable field "
+ "named 'bar'.\n";
+ CaptureStderr();
+ Options options = Options::From("aidl --lang=java Foo.aidl -I .");
+ EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
+ EXPECT_EQ(expected_error, GetCapturedStderr());
+}
+
+TEST_F(AidlTest, RejectMutableParcelableFromJavaOnlyImmutableUnion) {
+ io_delegate_.SetFileContents("Foo.aidl", "@JavaOnlyImmutable union Foo { Bar bar; }");
+ io_delegate_.SetFileContents("Bar.aidl", "parcelable Bar { String a; }");
+ string expected_error =
+ "ERROR: Foo.aidl:1.35-39: The @JavaOnlyImmutable 'Foo' has a non-immutable field "
"named 'bar'.\n";
CaptureStderr();
Options options = Options::From("aidl --lang=java Foo.aidl -I .");
@@ -2878,8 +2889,8 @@
io_delegate_.SetFileContents("Foo.aidl", "@JavaOnlyImmutable parcelable Foo { int a; int A; }");
Options options = Options::From("aidl --lang=java Foo.aidl");
const string expected_stderr =
- "ERROR: Foo.aidl:1.30-34: The parcelable 'Foo' has duplicate field name 'A' after "
- "capitalizing the first letter\n";
+ "ERROR: Foo.aidl:1.47-49: 'Foo' has duplicate field name 'A' after capitalizing the first "
+ "letter\n";
CaptureStderr();
EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
EXPECT_EQ(expected_stderr, GetCapturedStderr());