aboutsummaryrefslogtreecommitdiff
path: root/generate_java.cpp
diff options
context:
space:
mode:
authorJooyung Han <jooyung@google.com>2020-10-25 10:21:49 +0900
committerJooyung Han <jooyung@google.com>2020-10-27 02:02:24 +0000
commitce62f93333b17ffe1c766a6f306981a86ecb1492 (patch)
treee32a183734f64de97ffa095eef281d14936fce89 /generate_java.cpp
parent59af9cc7d021399a73641ccd44a0d6ca5ca970d1 (diff)
downloadaidl-ce62f93333b17ffe1c766a6f306981a86ecb1492.tar.gz
no setters for @JavaOnlyImmutable union
AIDL compiler doesn't generate setters for a union-generated class when a union is annotated @JavaOnlyImmutable. Bug: 171637180 Test: aidl_unittests & aidl_integration_test Change-Id: Id8290cf86f2ba5e593c930727a3741273e615ff0
Diffstat (limited to 'generate_java.cpp')
-rw-r--r--generate_java.cpp109
1 files changed, 71 insertions, 38 deletions
diff --git a/generate_java.cpp b/generate_java.cpp
index 069a20d3..3ee3b3aa 100644
--- a/generate_java.cpp
+++ b/generate_java.cpp
@@ -642,8 +642,6 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
const string tag_type = "int";
const AidlTypeSpecifier tag_type_specifier(AIDL_LOCATION_HERE, tag_type, false /* isArray */,
nullptr /* type_params */, "");
- const string tag_name = "_tag";
- const string value_name = "_value";
const string clazz = decl->GetName();
out << "/*\n";
@@ -669,8 +667,9 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
}
out << "\n";
- out << "private " + tag_type + " " + tag_name + ";\n";
- out << "private Object " + value_name + ";\n";
+ const auto final_opt = decl->IsJavaOnlyImmutable() ? "final " : "";
+ out << "private " << final_opt << tag_type + " _tag;\n";
+ out << "private " << final_opt << "Object _value;\n";
out << "\n";
AIDL_FATAL_IF(decl->GetFields().empty(), *decl) << "Union '" << clazz << "' is empty.";
@@ -681,27 +680,35 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
// default ctor() inits with first member's default value
out << "public " + clazz + "() {\n";
out.Indent();
- out << first_type + " value = " << (first_value.empty() ? "null" : first_value) << ";\n";
- out << "_set(" + first_field->GetName() + ", value);\n";
+ out << first_type + " _value = " << (first_value.empty() ? "null" : first_value) << ";\n";
+ out << "this._tag = " << first_field->GetName() << ";\n";
+ out << "this._value = _value;\n";
out.Dedent();
out << "}\n\n";
- // ctor(Parcel)
- out << "private " + clazz + "(android.os.Parcel _aidl_parcel) {\n";
- out << " readFromParcel(_aidl_parcel);\n";
- out << "}\n\n";
+ if (!decl->IsJavaOnlyImmutable()) {
+ // private ctor(Parcel)
+ out << "private " + clazz + "(android.os.Parcel _aidl_parcel) {\n";
+ out << " readFromParcel(_aidl_parcel);\n";
+ out << "}\n\n";
+ }
- // ctor(tag, value)
- out << "private " + clazz + "(" + tag_type + " tag, Object value) {\n";
- out << " _set(tag, value);\n";
+ // private ctor(tag, value)
+ out << "private " + clazz + "(" + tag_type + " _tag, Object _value) {\n";
+ out.Indent();
+ out << "this._tag = _tag;\n";
+ out << "this._value = _value;\n";
+ out.Dedent();
out << "}\n\n";
// getTag()
out << "public " + tag_type + " " + "getTag() {\n";
- out << " return " + tag_name + ";\n";
+ out.Indent();
+ out << "return _tag;\n";
+ out.Dedent();
out << "}\n\n";
- // value ctor, getter, setter for each field
+ // value ctor, getter, setter(for mutable) for each field
for (const auto& variable : decl->GetFields()) {
auto var_name = variable->GetName();
auto var_type = JavaSignatureOf(variable->GetType(), typenames);
@@ -709,8 +716,10 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
out << "// " + variable->Signature() + ";\n";
// value ctor
out << variable->GetType().GetComments() + "\n";
- out << "public static " + clazz + " " + var_name + "(" + var_type + " " + value_name + ") {\n";
- out << " return new " + clazz + "(" + var_name + ", " + value_name + ");\n";
+ out << "public static " + clazz + " " + var_name + "(" + var_type + " _value) {\n";
+ out.Indent();
+ out << "return new " + clazz + "(" + var_name + ", _value);\n";
+ out.Dedent();
out << "}\n\n";
// getter
@@ -718,14 +727,20 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
out << "@SuppressWarnings(\"unchecked\")\n";
}
out << "public " + var_type + " " + getter_name(*variable) + "() {\n";
- out << " _assertTag(" + var_name + ");\n";
- out << " return (" + var_type + ") " + value_name + ";\n";
+ out.Indent();
+ out << "_assertTag(" + var_name + ");\n";
+ out << "return (" + var_type + ") _value;\n";
+ out.Dedent();
out << "}\n\n";
// setter
- out << "public void " + setter_name(*variable) + "(" + var_type + " " + value_name + ") {\n";
- out << " _set(" + var_name + ", " + value_name + ");\n";
- out << "}\n\n";
+ if (!decl->IsJavaOnlyImmutable()) {
+ out << "public void " + setter_name(*variable) + "(" + var_type + " _value) {\n";
+ out.Indent();
+ out << "_set(" + var_name + ", _value);\n";
+ out.Dedent();
+ out << "}\n\n";
+ }
}
if (decl->IsVintfStability()) {
@@ -739,7 +754,11 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
<< "new android.os.Parcelable.Creator<" << clazz << ">() {\n";
out << " @Override\n";
out << " public " << clazz << " createFromParcel(android.os.Parcel _aidl_source) {\n";
- out << " return new " << clazz << "(_aidl_source);\n";
+ if (decl->IsJavaOnlyImmutable()) {
+ out << " return internalCreateFromParcel(_aidl_source);\n";
+ } else {
+ out << " return new " + clazz + "(_aidl_source);\n";
+ }
out << " }\n";
out << " @Override\n";
out << " public " << clazz << "[] newArray(int _aidl_size) {\n";
@@ -766,8 +785,8 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
out << "@Override\n";
out << "public final void writeToParcel(android.os.Parcel _aidl_parcel, int _aidl_flag) {\n";
out.Indent();
- out << write_to_parcel(tag_type_specifier, tag_name, "_aidl_parcel");
- out << "switch (" + tag_name + ") {\n";
+ out << write_to_parcel(tag_type_specifier, "_tag", "_aidl_parcel");
+ out << "switch (_tag) {\n";
for (const auto& variable : decl->GetFields()) {
out << "case " + variable->GetName() + ":\n";
out.Indent();
@@ -798,8 +817,14 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
return code;
};
- // Not override, but as a user-defined parcelable, this method should be public
- out << "public void readFromParcel(android.os.Parcel _aidl_parcel) {\n";
+ if (decl->IsJavaOnlyImmutable()) {
+ // When it's immutable we don't need readFromParcel, but we can use it from createFromParcel
+ out << "private static " + clazz +
+ " internalCreateFromParcel(android.os.Parcel _aidl_parcel) {\n";
+ } else {
+ // Not override, but as a user-defined parcelable, this method should be public
+ out << "public void readFromParcel(android.os.Parcel _aidl_parcel) {\n";
+ }
out.Indent();
out << tag_type + " _aidl_tag;\n";
out << read_from_parcel(tag_type_specifier, "_aidl_tag", "_aidl_parcel");
@@ -811,8 +836,12 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
out.Indent();
out << var_type + " _aidl_value;\n";
out << read_from_parcel(variable->GetType(), "_aidl_value", "_aidl_parcel");
- out << "_set(_aidl_tag, _aidl_value);\n";
- out << "return; }\n";
+ if (decl->IsJavaOnlyImmutable()) {
+ out << "return new " << clazz << "(_aidl_tag, _aidl_value); }\n";
+ } else {
+ out << "_set(_aidl_tag, _aidl_value);\n";
+ out << "return; }\n";
+ }
out.Dedent();
}
out << "}\n";
@@ -833,22 +862,26 @@ void generate_union(CodeWriter& out, const AidlUnionDecl* decl, const AidlTypena
out << "}\n\n";
// helper: _tagString
- out << "private String _tagString(" + tag_type + " " + tag_name + ") {\n";
- out << " switch (" + tag_name + ") {\n";
+ out << "private String _tagString(" + tag_type + " _tag) {\n";
+ out << " switch (_tag) {\n";
for (const auto& variable : decl->GetFields()) {
auto var_name = variable->GetName();
out << " case " + var_name + ": return \"" + var_name + "\";\n";
}
out << " }\n";
- out << " throw new IllegalStateException(\"unknown field: \" + " + tag_name + ");\n";
- out << "}\n\n";
-
- // helper: _set
- out << "private void _set(" + tag_type + " tag, Object value) {\n";
- out << " this." + tag_name + " = tag;\n";
- out << " this." + value_name + " = value;\n";
+ out << " throw new IllegalStateException(\"unknown field: \" + _tag);\n";
out << "}\n";
+ if (!decl->IsJavaOnlyImmutable()) {
+ out << "\n";
+ out << "private void _set(int _tag, Object _value) {\n";
+ out.Indent();
+ out << "this._tag = _tag;\n";
+ out << "this._value = _value;\n";
+ out.Dedent();
+ out << "}\n";
+ }
+
out.Dedent();
out << "}\n";
}