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]);