diff options
author | Jooyung Han <jooyung@google.com> | 2022-04-12 14:13:20 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-04-12 14:13:20 +0000 |
commit | e26acaef7997efa568d433598d3082b81f402af8 (patch) | |
tree | 4093f6616734c391f31198fe3f2a6bc622371269 | |
parent | af9ba855fcd66c3b980cff584d3e3c47927588a3 (diff) | |
parent | 917c1299020e8aec57efa585d99922bcdb1622f4 (diff) | |
download | aidl-e26acaef7997efa568d433598d3082b81f402af8.tar.gz |
Fix @deprecated field of union in native backends am: 3497c5da19 am: cc86ab0ab5 am: 917c129902
Original change: https://android-review.googlesource.com/c/platform/system/tools/aidl/+/2060648
Change-Id: I5293eb7cc94d7ba6b55a6909c346cfa83b2fb0e7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
8 files changed, 132 insertions, 5 deletions
diff --git a/aidl_to_cpp_common.cpp b/aidl_to_cpp_common.cpp index 589bb55a..682b6c88 100644 --- a/aidl_to_cpp_common.cpp +++ b/aidl_to_cpp_common.cpp @@ -425,9 +425,16 @@ void GenerateToString(CodeWriter& out, const AidlUnionDecl& parcelable) { out << "os << \"" + parcelable.GetName() + "{\";\n"; out << "switch (getTag()) {\n"; for (const auto& f : parcelable.GetFields()) { + if (f->IsDeprecated()) { + out << "#pragma clang diagnostic push\n"; + out << "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n"; + } const string tag = f->GetName(); out << "case " << tag << ": os << \"" << tag << ": \" << " << "::android::internal::ToString(get<" + tag + ">()); break;\n"; + if (f->IsDeprecated()) { + out << "#pragma clang diagnostic pop\n"; + } } out << "}\n"; out << "os << \"}\";\n"; @@ -651,6 +658,10 @@ void UnionWriter::ReadFromParcel(CodeWriter& out, const ParcelWriterContext& ctx read_var(tag, *tag_type); out << fmt::format("switch (static_cast<Tag>({})) {{\n", tag); for (const auto& variable : decl.GetFields()) { + if (variable->IsDeprecated()) { + out << "#pragma clang diagnostic push\n"; + out << "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n"; + } out << fmt::format("case {}: {{\n", variable->GetName()); out.Indent(); const auto& type = variable->GetType(); @@ -670,6 +681,9 @@ void UnionWriter::ReadFromParcel(CodeWriter& out, const ParcelWriterContext& ctx out << "}\n"; out << fmt::format("return {}; }}\n", ctx.status_ok); out.Dedent(); + if (variable->IsDeprecated()) { + out << "#pragma clang diagnostic pop\n"; + } } out << "}\n"; out << fmt::format("return {};\n", ctx.status_bad); @@ -690,9 +704,16 @@ void UnionWriter::WriteToParcel(CodeWriter& out, const ParcelWriterContext& ctx) out << fmt::format("if ({} != {}) return {};\n", status, ctx.status_ok, status); out << "switch (getTag()) {\n"; for (const auto& variable : decl.GetFields()) { + if (variable->IsDeprecated()) { + out << "#pragma clang diagnostic push\n"; + out << "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n"; + } out << fmt::format("case {}: return ", variable->GetName()); ctx.write_func(out, "get<" + variable->GetName() + ">()", variable->GetType()); out << ";\n"; + if (variable->IsDeprecated()) { + out << "#pragma clang diagnostic pop\n"; + } } out << "}\n"; out << "__assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, \"can't reach here\");\n"; diff --git a/tests/android/aidl/tests/unions/EnumUnion.aidl b/tests/android/aidl/tests/unions/EnumUnion.aidl index 5f9bb051..817ea1cf 100644 --- a/tests/android/aidl/tests/unions/EnumUnion.aidl +++ b/tests/android/aidl/tests/unions/EnumUnion.aidl @@ -23,4 +23,6 @@ import android.aidl.tests.LongEnum; union EnumUnion { IntEnum intEnum = IntEnum.FOO; LongEnum longEnum; + /** @deprecated do not use this */ + int deprecatedField; } diff --git a/tests/golden_output/aidl-test-interface-cpp-source/gen/android/aidl/tests/unions/EnumUnion.cpp b/tests/golden_output/aidl-test-interface-cpp-source/gen/android/aidl/tests/unions/EnumUnion.cpp index b51ef52d..0261f25f 100644 --- a/tests/golden_output/aidl-test-interface-cpp-source/gen/android/aidl/tests/unions/EnumUnion.cpp +++ b/tests/golden_output/aidl-test-interface-cpp-source/gen/android/aidl/tests/unions/EnumUnion.cpp @@ -29,6 +29,19 @@ namespace unions { set<longEnum>(std::move(_aidl_value)); } return ::android::OK; } + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + case deprecatedField: { + int32_t _aidl_value; + if ((_aidl_ret_status = _aidl_parcel->readInt32(&_aidl_value)) != ::android::OK) return _aidl_ret_status; + if constexpr (std::is_trivially_copyable_v<int32_t>) { + set<deprecatedField>(_aidl_value); + } else { + // NOLINTNEXTLINE(performance-move-const-arg) + set<deprecatedField>(std::move(_aidl_value)); + } + return ::android::OK; } + #pragma clang diagnostic pop } return ::android::BAD_VALUE; } @@ -38,6 +51,10 @@ namespace unions { switch (getTag()) { case intEnum: return _aidl_parcel->writeInt32(static_cast<int32_t>(get<intEnum>())); case longEnum: return _aidl_parcel->writeInt64(static_cast<int64_t>(get<longEnum>())); + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + case deprecatedField: return _aidl_parcel->writeInt32(get<deprecatedField>()); + #pragma clang diagnostic pop } __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, "can't reach here"); } diff --git a/tests/golden_output/aidl-test-interface-cpp-source/gen/include/android/aidl/tests/unions/EnumUnion.h b/tests/golden_output/aidl-test-interface-cpp-source/gen/include/android/aidl/tests/unions/EnumUnion.h index a65f9f0b..7a41b20f 100644 --- a/tests/golden_output/aidl-test-interface-cpp-source/gen/include/android/aidl/tests/unions/EnumUnion.h +++ b/tests/golden_output/aidl-test-interface-cpp-source/gen/include/android/aidl/tests/unions/EnumUnion.h @@ -28,10 +28,12 @@ public: enum class Tag : int32_t { intEnum = 0, longEnum = 1, + deprecatedField __attribute__((deprecated("do not use this"))) = 2, }; // Expose tag symbols for legacy code static const inline Tag intEnum = Tag::intEnum; static const inline Tag longEnum = Tag::longEnum; + static const inline Tag __attribute__((deprecated("do not use this"))) deprecatedField = Tag::deprecatedField; template<typename _Tp> static constexpr bool _not_self = !std::is_same_v<std::remove_cv_t<std::remove_reference_t<_Tp>>, EnumUnion>; @@ -109,12 +111,16 @@ public: switch (getTag()) { case intEnum: os << "intEnum: " << ::android::internal::ToString(get<intEnum>()); break; case longEnum: os << "longEnum: " << ::android::internal::ToString(get<longEnum>()); break; + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + case deprecatedField: os << "deprecatedField: " << ::android::internal::ToString(get<deprecatedField>()); break; + #pragma clang diagnostic pop } os << "}"; return os.str(); } private: - std::variant<::android::aidl::tests::IntEnum, ::android::aidl::tests::LongEnum> _value; + std::variant<::android::aidl::tests::IntEnum, ::android::aidl::tests::LongEnum, int32_t> _value; }; // class EnumUnion } // namespace unions } // namespace tests @@ -124,16 +130,21 @@ namespace android { namespace aidl { namespace tests { namespace unions { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" [[nodiscard]] static inline std::string toString(EnumUnion::Tag val) { switch(val) { case EnumUnion::Tag::intEnum: return "intEnum"; case EnumUnion::Tag::longEnum: return "longEnum"; + case EnumUnion::Tag::deprecatedField: + return "deprecatedField"; default: return std::to_string(static_cast<int32_t>(val)); } } +#pragma clang diagnostic pop } // namespace unions } // namespace tests } // namespace aidl @@ -142,10 +153,12 @@ namespace android { namespace internal { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wc++17-extensions" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" template <> -constexpr inline std::array<::android::aidl::tests::unions::EnumUnion::Tag, 2> enum_values<::android::aidl::tests::unions::EnumUnion::Tag> = { +constexpr inline std::array<::android::aidl::tests::unions::EnumUnion::Tag, 3> enum_values<::android::aidl::tests::unions::EnumUnion::Tag> = { ::android::aidl::tests::unions::EnumUnion::Tag::intEnum, ::android::aidl::tests::unions::EnumUnion::Tag::longEnum, + ::android::aidl::tests::unions::EnumUnion::Tag::deprecatedField, }; #pragma clang diagnostic pop } // namespace internal diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/unions/EnumUnion.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/unions/EnumUnion.java index 937d9d59..7519fd42 100644 --- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/unions/EnumUnion.java +++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/unions/EnumUnion.java @@ -6,6 +6,7 @@ public final class EnumUnion implements android.os.Parcelable { // tags for union fields public final static int intEnum = 0; // android.aidl.tests.IntEnum intEnum; public final static int longEnum = 1; // android.aidl.tests.LongEnum longEnum; + public final static int deprecatedField = 2; // int deprecatedField; private int _tag; private Object _value; @@ -59,6 +60,23 @@ public final class EnumUnion implements android.os.Parcelable { _set(longEnum, _value); } + // int deprecatedField; + + /** @deprecated do not use this */ + @Deprecated + public static EnumUnion deprecatedField(int _value) { + return new EnumUnion(deprecatedField, _value); + } + + public int getDeprecatedField() { + _assertTag(deprecatedField); + return (int) _value; + } + + public void setDeprecatedField(int _value) { + _set(deprecatedField, _value); + } + public static final android.os.Parcelable.Creator<EnumUnion> CREATOR = new android.os.Parcelable.Creator<EnumUnion>() { @Override public EnumUnion createFromParcel(android.os.Parcel _aidl_source) { @@ -80,6 +98,9 @@ public final class EnumUnion implements android.os.Parcelable { case longEnum: _aidl_parcel.writeLong(getLongEnum()); break; + case deprecatedField: + _aidl_parcel.writeInt(getDeprecatedField()); + break; } } @@ -97,6 +118,11 @@ public final class EnumUnion implements android.os.Parcelable { _aidl_value = _aidl_parcel.readLong(); _set(_aidl_tag, _aidl_value); return; } + case deprecatedField: { + int _aidl_value; + _aidl_value = _aidl_parcel.readInt(); + _set(_aidl_tag, _aidl_value); + return; } } throw new IllegalArgumentException("union: unknown tag: " + _aidl_tag); } @@ -114,6 +140,7 @@ public final class EnumUnion implements android.os.Parcelable { switch (_tag) { case intEnum: return "android.aidl.tests.unions.EnumUnion.intEnum(" + (android.aidl.tests.IntEnum.$.toString(getIntEnum())) + ")"; case longEnum: return "android.aidl.tests.unions.EnumUnion.longEnum(" + (getLongEnum()) + ")"; + case deprecatedField: return "android.aidl.tests.unions.EnumUnion.deprecatedField(" + (getDeprecatedField()) + ")"; } throw new IllegalStateException("unknown field: " + _tag); } @@ -143,6 +170,7 @@ public final class EnumUnion implements android.os.Parcelable { switch (_tag) { case intEnum: return "intEnum"; case longEnum: return "longEnum"; + case deprecatedField: return "deprecatedField"; } throw new IllegalStateException("unknown field: " + _tag); } @@ -154,5 +182,8 @@ public final class EnumUnion implements android.os.Parcelable { public static @interface Tag { public static final int intEnum = 0; public static final int longEnum = 1; + /** @deprecated do not use this */ + @Deprecated + public static final int deprecatedField = 2; } } diff --git a/tests/golden_output/aidl-test-interface-ndk-source/gen/android/aidl/tests/unions/EnumUnion.cpp b/tests/golden_output/aidl-test-interface-ndk-source/gen/android/aidl/tests/unions/EnumUnion.cpp index bb474307..c3f473fb 100644 --- a/tests/golden_output/aidl-test-interface-ndk-source/gen/android/aidl/tests/unions/EnumUnion.cpp +++ b/tests/golden_output/aidl-test-interface-ndk-source/gen/android/aidl/tests/unions/EnumUnion.cpp @@ -34,6 +34,19 @@ binder_status_t EnumUnion::readFromParcel(const AParcel* _parcel) { set<longEnum>(std::move(_aidl_value)); } return STATUS_OK; } + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + case deprecatedField: { + int32_t _aidl_value; + if ((_aidl_ret_status = ::ndk::AParcel_readData(_parcel, &_aidl_value)) != STATUS_OK) return _aidl_ret_status; + if constexpr (std::is_trivially_copyable_v<int32_t>) { + set<deprecatedField>(_aidl_value); + } else { + // NOLINTNEXTLINE(performance-move-const-arg) + set<deprecatedField>(std::move(_aidl_value)); + } + return STATUS_OK; } + #pragma clang diagnostic pop } return STATUS_BAD_VALUE; } @@ -43,6 +56,10 @@ binder_status_t EnumUnion::writeToParcel(AParcel* _parcel) const { switch (getTag()) { case intEnum: return ::ndk::AParcel_writeData(_parcel, get<intEnum>()); case longEnum: return ::ndk::AParcel_writeData(_parcel, get<longEnum>()); + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + case deprecatedField: return ::ndk::AParcel_writeData(_parcel, get<deprecatedField>()); + #pragma clang diagnostic pop } __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, "can't reach here"); } diff --git a/tests/golden_output/aidl-test-interface-ndk-source/gen/include/aidl/android/aidl/tests/unions/EnumUnion.h b/tests/golden_output/aidl-test-interface-ndk-source/gen/include/aidl/android/aidl/tests/unions/EnumUnion.h index f52a45e3..2190f500 100644 --- a/tests/golden_output/aidl-test-interface-ndk-source/gen/include/aidl/android/aidl/tests/unions/EnumUnion.h +++ b/tests/golden_output/aidl-test-interface-ndk-source/gen/include/aidl/android/aidl/tests/unions/EnumUnion.h @@ -37,11 +37,13 @@ public: enum class Tag : int32_t { intEnum = 0, longEnum = 1, + deprecatedField __attribute__((deprecated("do not use this"))) = 2, }; // Expose tag symbols for legacy code static const inline Tag intEnum = Tag::intEnum; static const inline Tag longEnum = Tag::longEnum; + static const inline Tag __attribute__((deprecated("do not use this"))) deprecatedField = Tag::deprecatedField; template<typename _Tp> static constexpr bool _not_self = !std::is_same_v<std::remove_cv_t<std::remove_reference_t<_Tp>>, EnumUnion>; @@ -117,12 +119,16 @@ public: switch (getTag()) { case intEnum: os << "intEnum: " << ::android::internal::ToString(get<intEnum>()); break; case longEnum: os << "longEnum: " << ::android::internal::ToString(get<longEnum>()); break; + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + case deprecatedField: os << "deprecatedField: " << ::android::internal::ToString(get<deprecatedField>()); break; + #pragma clang diagnostic pop } os << "}"; return os.str(); } private: - std::variant<::aidl::android::aidl::tests::IntEnum, ::aidl::android::aidl::tests::LongEnum> _value; + std::variant<::aidl::android::aidl::tests::IntEnum, ::aidl::android::aidl::tests::LongEnum, int32_t> _value; }; } // namespace unions } // namespace tests @@ -134,16 +140,21 @@ namespace android { namespace aidl { namespace tests { namespace unions { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" [[nodiscard]] static inline std::string toString(EnumUnion::Tag val) { switch(val) { case EnumUnion::Tag::intEnum: return "intEnum"; case EnumUnion::Tag::longEnum: return "longEnum"; + case EnumUnion::Tag::deprecatedField: + return "deprecatedField"; default: return std::to_string(static_cast<int32_t>(val)); } } +#pragma clang diagnostic pop } // namespace unions } // namespace tests } // namespace aidl @@ -153,10 +164,12 @@ namespace ndk { namespace internal { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wc++17-extensions" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" template <> -constexpr inline std::array<aidl::android::aidl::tests::unions::EnumUnion::Tag, 2> enum_values<aidl::android::aidl::tests::unions::EnumUnion::Tag> = { +constexpr inline std::array<aidl::android::aidl::tests::unions::EnumUnion::Tag, 3> enum_values<aidl::android::aidl::tests::unions::EnumUnion::Tag> = { aidl::android::aidl::tests::unions::EnumUnion::Tag::intEnum, aidl::android::aidl::tests::unions::EnumUnion::Tag::longEnum, + aidl::android::aidl::tests::unions::EnumUnion::Tag::deprecatedField, }; #pragma clang diagnostic pop } // namespace internal diff --git a/tests/golden_output/aidl-test-interface-rust-source/gen/android/aidl/tests/unions/EnumUnion.rs b/tests/golden_output/aidl-test-interface-rust-source/gen/android/aidl/tests/unions/EnumUnion.rs index 4d5fe951..6f26dcc9 100644 --- a/tests/golden_output/aidl-test-interface-rust-source/gen/android/aidl/tests/unions/EnumUnion.rs +++ b/tests/golden_output/aidl-test-interface-rust-source/gen/android/aidl/tests/unions/EnumUnion.rs @@ -4,6 +4,8 @@ pub enum EnumUnion { IntEnum(crate::mangled::_7_android_4_aidl_5_tests_7_IntEnum), LongEnum(crate::mangled::_7_android_4_aidl_5_tests_8_LongEnum), + #[deprecated = "do not use this"] + DeprecatedField(i32), } impl Default for EnumUnion { fn default() -> Self { @@ -21,6 +23,10 @@ impl binder::Parcelable for EnumUnion { parcel.write(&1i32)?; parcel.write(v) } + Self::DeprecatedField(v) => { + parcel.write(&2i32)?; + parcel.write(v) + } } } fn read_from_parcel(&mut self, parcel: &binder::binder_impl::BorrowedParcel) -> std::result::Result<(), binder::StatusCode> { @@ -36,6 +42,11 @@ impl binder::Parcelable for EnumUnion { *self = Self::LongEnum(value); Ok(()) } + 2 => { + let value: i32 = parcel.read()?; + *self = Self::DeprecatedField(value); + Ok(()) + } _ => { Err(binder::StatusCode::BAD_VALUE) } @@ -51,9 +62,11 @@ pub mod Tag { #![allow(non_upper_case_globals)] use binder::declare_binder_enum; declare_binder_enum! { - Tag : [i32; 2] { + Tag : [i32; 3] { intEnum = 0, longEnum = 1, + #[deprecated = "do not use this"] + deprecatedField = 2, } } } |