Merge "hidl2aidl: Handle fixed sized arrays"
diff --git a/hidl2aidl/AidlTranslate.cpp b/hidl2aidl/AidlTranslate.cpp
index 7ba907c..2c23760 100644
--- a/hidl2aidl/AidlTranslate.cpp
+++ b/hidl2aidl/AidlTranslate.cpp
@@ -245,7 +245,12 @@
     const std::string inputAccess = "in." + field.fullName +
                                     (parent->style() == CompoundType::STYLE_SAFE_UNION ? "()" : "");
     if (field.field->type().isArray()) {
-        elementType = static_cast<const ArrayType*>(field.field->get())->getElementType();
+        auto fieldArray = static_cast<const ArrayType*>(field.field->get());
+        if (fieldArray->getConstantExpressions()[0]->castSizeT() == 0) {
+            // Nothing to translate for 0 sized arrays!
+            return;
+        }
+        elementType = fieldArray->getElementType();
         javaSizeAccess = inputAccess + ".length";
         javaElementAccess = "[i]";
         cppSize = "sizeof(" + inputAccess + ")/sizeof(" + inputAccess + "[0])";
@@ -312,10 +317,21 @@
                 } else {
                     out << field.field->name();
                 }
-
-                out << ".push_back("
-                    << wrapCppSource(inputAccessElement, *elementType, parent->fqName(), backend)
-                    << ");\n";
+                // Arrays with explicit size use std::array instead of std::vector
+                if (field.field->type().isArray() &&
+                    static_cast<const ArrayType*>(field.field->get())
+                                    ->getConstantExpressions()
+                                    .size() > 0) {
+                    out << "[i] = "
+                        << wrapCppSource(inputAccessElement, *elementType, parent->fqName(),
+                                         backend)
+                        << ";\n";
+                } else {
+                    out << ".push_back("
+                        << wrapCppSource(inputAccessElement, *elementType, parent->fqName(),
+                                         backend)
+                        << ");\n";
+                }
             });
             out << "}\n";
         });
diff --git a/hidl2aidl/AidlType.cpp b/hidl2aidl/AidlType.cpp
index 7ba9d21..73e6fa7 100644
--- a/hidl2aidl/AidlType.cpp
+++ b/hidl2aidl/AidlType.cpp
@@ -53,7 +53,13 @@
         return getAidlType(*vec.getElementType(), relativeTo) + "[]";
     } else if (type.isArray()) {
         const ArrayType& arr = static_cast<const ArrayType&>(type);
-        return getAidlType(*arr.getElementType(), relativeTo) + "[]";
+        auto sizes = arr.getConstantExpressions();
+        CHECK(sizes.size() > 0) << "Failed to get array dimensions for " << arr.definedName();
+        std::string typeStr = getAidlType(*arr.getElementType(), relativeTo);
+        for (const auto& size : sizes) {
+            typeStr += "[" + size->value() + "]";
+        }
+        return typeStr;
     } else if (type.isNamedType()) {
         const NamedType& namedType = static_cast<const NamedType&>(type);
         if (getAidlPackage(relativeTo) == getAidlPackage(namedType.fqName())) {
diff --git a/hidl2aidl/test/1.2/types.hal b/hidl2aidl/test/1.2/types.hal
index e12c8ad..9de344d 100644
--- a/hidl2aidl/test/1.2/types.hal
+++ b/hidl2aidl/test/1.2/types.hal
@@ -67,6 +67,8 @@
     uint32_t[12] b;
     @1.1::Value[12] c;
     string[2] d;
+    int8_t[0] e;
+    int8_t[@1.1::Value:E + 1] f;
 };
 
 struct VectorFoo {
diff --git a/hidl2aidl/test/TranslateJavaTest.java b/hidl2aidl/test/TranslateJavaTest.java
index d32262d..32c06f2 100644
--- a/hidl2aidl/test/TranslateJavaTest.java
+++ b/hidl2aidl/test/TranslateJavaTest.java
@@ -286,6 +286,7 @@
         hidl2aidl.test.V1_2.ArrayFoo source = new hidl2aidl.test.V1_2.ArrayFoo();
         source.a[0] = 42;
         source.a[0] = 42;
+        assertThat(source.e.length, is(0));
         dest = Translate.h2aTranslate(source);
         assertThat(source.a[0], is(dest.a[0]));
     }
diff --git a/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/ArrayFoo.aidl b/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/ArrayFoo.aidl
index 1dce1a2..467085f 100644
--- a/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/ArrayFoo.aidl
+++ b/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/ArrayFoo.aidl
@@ -20,8 +20,10 @@
 package hidl2aidl.test;
 @VintfStability
 parcelable ArrayFoo {
-  byte[] a;
-  int[] b;
-  hidl2aidl.test.Value[] c;
-  String[] d;
+  byte[12] a;
+  int[12] b;
+  hidl2aidl.test.Value[12] c;
+  String[2] d;
+  byte[0] e;
+  byte[28] f;
 }
diff --git a/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/SafeUnionBar.aidl b/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/SafeUnionBar.aidl
index b49a082..2cba44f 100644
--- a/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/SafeUnionBar.aidl
+++ b/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/SafeUnionBar.aidl
@@ -33,7 +33,7 @@
   char i;
   byte[] j;
   hidl2aidl.test.Value[] k;
-  byte[] l;
+  byte[2] l;
   float m;
   @VintfStability
   parcelable InnerStructBar {
diff --git a/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/extension/ArrayFoo.aidl b/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/extension/ArrayFoo.aidl
index 4fd7104..9edc5bd 100644
--- a/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/extension/ArrayFoo.aidl
+++ b/hidl2aidl/test/aidl_api/hidl2aidl_test_gen/current/hidl2aidl/test/extension/ArrayFoo.aidl
@@ -21,5 +21,5 @@
 @VintfStability
 parcelable ArrayFoo {
   hidl2aidl.test.ArrayFoo base;
-  byte[] e;
+  byte[12] e;
 }
diff --git a/hidl2aidl/test/translate_cpp_test.cpp b/hidl2aidl/test/translate_cpp_test.cpp
index 6ba4e09..19a5024 100644
--- a/hidl2aidl/test/translate_cpp_test.cpp
+++ b/hidl2aidl/test/translate_cpp_test.cpp
@@ -241,6 +241,7 @@
     hidl2aidl::test::V1_2::ArrayFoo source;
     source.a[0] = 42;
     source.a[1] = 8;
+    ASSERT_EQ(sizeof(source.e), 0u);
     ASSERT_TRUE(h2a::translate(source, &dest));
     ASSERT_EQ(12u, dest.a.size());
     EXPECT_EQ(source.a[0], dest.a[0]);
diff --git a/hidl2aidl/test/translate_ndk_test.cpp b/hidl2aidl/test/translate_ndk_test.cpp
index 5913a01..9b72135 100644
--- a/hidl2aidl/test/translate_ndk_test.cpp
+++ b/hidl2aidl/test/translate_ndk_test.cpp
@@ -241,6 +241,7 @@
     hidl2aidl::test::V1_2::ArrayFoo source;
     source.a[0] = 42;
     source.a[1] = 8;
+    ASSERT_EQ(sizeof(source.e), 0u);
     ASSERT_TRUE(h2a::translate(source, &dest));
     ASSERT_EQ(12u, dest.a.size());
     EXPECT_EQ(source.a[0], dest.a[0]);