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_language.h b/aidl_language.h
index 73f2d66..dbd987e 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -762,7 +762,24 @@
std::string cpp_header_;
};
-class AidlStructuredParcelable : public AidlParcelable {
+class AidlWithFields {
+ public:
+ AidlWithFields(std::vector<std::unique_ptr<AidlVariableDeclaration>>* variables)
+ : variables_(std::move(*variables)) {}
+
+ const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
+ return variables_;
+ }
+
+ protected:
+ bool CheckValid(const AidlParcelable& parcel, const AidlTypenames& typenames) const;
+ bool CheckValidForGetterNames(const AidlParcelable& parcel) const;
+
+ private:
+ const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
+};
+
+class AidlStructuredParcelable : public AidlParcelable, public AidlWithFields {
public:
AidlStructuredParcelable(const AidlLocation& location, const std::string& name,
const std::string& package, const std::string& comments,
@@ -776,10 +793,6 @@
AidlStructuredParcelable& operator=(const AidlStructuredParcelable&) = delete;
AidlStructuredParcelable& operator=(AidlStructuredParcelable&&) = delete;
- const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
- return variables_;
- }
-
const AidlStructuredParcelable* AsStructuredParcelable() const override { return this; }
std::string GetPreprocessDeclarationName() const override { return "structured_parcelable"; }
@@ -789,9 +802,6 @@
bool CheckValid(const AidlTypenames& typenames) const override;
bool LanguageSpecificCheckValid(const AidlTypenames& typenames,
Options::Language lang) const override;
-
- private:
- const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
};
class AidlEnumerator : public AidlNode {
@@ -858,7 +868,7 @@
std::unique_ptr<const AidlTypeSpecifier> backing_type_;
};
-class AidlUnionDecl : public AidlParcelable {
+class AidlUnionDecl : public AidlParcelable, public AidlWithFields {
public:
AidlUnionDecl(const AidlLocation& location, const std::string& name, const std::string& package,
const std::string& comments,
@@ -876,9 +886,6 @@
const AidlNode& AsAidlNode() const override { return *this; }
- const std::vector<std::unique_ptr<AidlVariableDeclaration>>& GetFields() const {
- return variables_;
- }
bool CheckValid(const AidlTypenames& typenames) const override;
bool LanguageSpecificCheckValid(const AidlTypenames& typenames,
Options::Language lang) const override;
@@ -886,9 +893,6 @@
void Dump(CodeWriter* writer) const override;
const AidlUnionDecl* AsUnionDeclaration() const override { return this; }
-
- private:
- const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
};
class AidlInterface final : public AidlDefinedType {