Merge "hidl2aidl: add static asserts for enums in generated translate code" am: a452c829c0

Original change: https://android-review.googlesource.com/c/platform/system/tools/hidl/+/1515133

Change-Id: I29fb831ea6740a4393ad1471f6b5db50eb010003
diff --git a/hidl2aidl/AidlTranslate.cpp b/hidl2aidl/AidlTranslate.cpp
index 63a8aed..e747b76 100644
--- a/hidl2aidl/AidlTranslate.cpp
+++ b/hidl2aidl/AidlTranslate.cpp
@@ -72,6 +72,27 @@
            separator + AidlHelper::getAidlType(type, type.fqName());
 }
 
+static void emitEnumStaticAssert(Formatter& out, const NamedType& namedType, AidlBackend backend) {
+    CHECK(namedType.isEnum());
+    const auto& enumType = static_cast<const EnumType&>(namedType);
+    enumType.forEachValueFromRoot([&](const EnumValue* value) {
+        out << "static_assert(" << aidlTypePackage(namedType, backend) << "::" << value->name()
+            << " == static_cast<" << aidlTypePackage(namedType, backend) << ">("
+            << namedType.fullName() << "::" << value->name() << "));\n";
+    });
+    out << "\n";
+}
+
+static void emitStaticAsserts(Formatter& out, const std::set<const NamedType*>& namedTypes,
+                              AidlBackend backend) {
+    CHECK(backend != AidlBackend::JAVA);
+    for (const auto& namedType : namedTypes) {
+        if (namedType->isEnum()) {
+            emitEnumStaticAssert(out, *namedType, backend);
+        }
+    }
+}
+
 static void namedTypeTranslation(Formatter& out, const std::set<const NamedType*>& namedTypes,
                                  const FieldWithVersion& field, const CompoundType* parent,
                                  AidlBackend backend) {
@@ -356,7 +377,7 @@
     out << "#pragma once\n\n";
     for (const auto& type : namedTypes) {
         const auto& it = processedTypes.find(type);
-        if (it == processedTypes.end()) {
+        if (it == processedTypes.end() && !type->isEnum()) {
             continue;
         }
         includes.insert(aidlIncludeFile(type, backend));
@@ -390,6 +411,7 @@
         out << "#include \""
             << AidlHelper::translateHeaderFile((*namedTypes.begin())->fqName(), backend) + "\"\n\n";
         out << "namespace android::h2a {\n\n";
+        emitStaticAsserts(out, namedTypes, backend);
     }
     for (const auto& type : namedTypes) {
         const auto& it = processedTypes.find(type);