Merge "@export: add export_parent"
diff --git a/Annotation.cpp b/Annotation.cpp
index d3b4d01..1205079 100644
--- a/Annotation.cpp
+++ b/Annotation.cpp
@@ -16,6 +16,7 @@
#include "Annotation.h"
+#include <android-base/logging.h>
#include <hidl-util/Formatter.h>
#include <vector>
@@ -43,6 +44,36 @@
return mValues;
}
+const std::string &AnnotationParam::getSingleValue() const {
+ CHECK_EQ(mValues->size(), 1u) << mName << " requires one values but has multiple";
+ return mValues->at(0);
+}
+
+std::string AnnotationParam::getSingleString() const {
+ std::string value = getSingleValue();
+
+ CHECK(value.size() >= 2 && value[0] == '"' && value[value.size() - 1] == '"')
+ << mName << " must be a string";
+
+ // unquote string
+ value = value.substr(1, value.size() - 2);
+
+ return value;
+}
+
+bool AnnotationParam::getSingleBool() const {
+ std::string value = getSingleString();
+
+ if (value == "true") {
+ return true;
+ } else if (value == "false") {
+ return false;
+ }
+
+ CHECK(false) << mName << " must be of boolean value (true/false).";
+ return false;
+}
+
Annotation::Annotation(const char *name,AnnotationParamVector *params)
: mName(name),
mParams(params) {
diff --git a/Annotation.h b/Annotation.h
index 063b8e4..18d9ab0 100644
--- a/Annotation.h
+++ b/Annotation.h
@@ -37,6 +37,14 @@
const std::string &getName() const;
const std::vector<std::string> *getValues() const;
+ const std::string &getSingleValue() const;
+
+ /* Returns unquoted version of getSingleValue */
+ std::string getSingleString() const;
+
+ /* Returns value interpretted as a boolean */
+ bool getSingleBool() const;
+
private:
const std::string mName;
std::vector<std::string> *mValues;
diff --git a/EnumType.cpp b/EnumType.cpp
index 0f0542a..6ce8010 100644
--- a/EnumType.cpp
+++ b/EnumType.cpp
@@ -406,33 +406,37 @@
const AnnotationParam *nameParam = annotation->getParam("name");
if (nameParam != nullptr) {
- CHECK_EQ(nameParam->getValues()->size(), 1u);
+ name = nameParam->getSingleString();
+ }
- std::string quotedString = nameParam->getValues()->at(0);
- name = quotedString.substr(1, quotedString.size() - 2);
+ bool exportParent = true;
+ const AnnotationParam *exportParentParam = annotation->getParam("export_parent");
+ if (exportParentParam != nullptr) {
+ exportParent = exportParentParam->getSingleBool();
}
std::string valuePrefix;
const AnnotationParam *prefixParam = annotation->getParam("value_prefix");
if (prefixParam != nullptr) {
- CHECK_EQ(prefixParam->getValues()->size(), 1u);
-
- std::string quotedString = prefixParam->getValues()->at(0);
- valuePrefix = quotedString.substr(1, quotedString.size() - 2);
+ valuePrefix = prefixParam->getSingleString();
}
std::string valueSuffix;
const AnnotationParam *suffixParam = annotation->getParam("value_suffix");
if (suffixParam != nullptr) {
- CHECK_EQ(suffixParam->getValues()->size(), 1u);
-
- std::string quotedString = suffixParam->getValues()->at(0);
- valueSuffix = quotedString.substr(1, quotedString.size() - 2);
+ valueSuffix = suffixParam->getSingleString();
}
const ScalarType *scalarType = mStorageType->resolveToScalarType();
CHECK(scalarType != nullptr);
+ std::vector<const EnumType *> chain;
+ if (exportParent) {
+ getTypeChain(&chain);
+ } else {
+ chain = { this };
+ }
+
if (forJava) {
if (!name.empty()) {
out << "public final class "
@@ -447,9 +451,6 @@
const std::string typeName =
scalarType->getJavaType(false /* forInitializer */);
- std::vector<const EnumType *> chain;
- getTypeChain(&chain);
-
for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
const auto &type = *it;
@@ -495,9 +496,6 @@
out.indent();
- std::vector<const EnumType *> chain;
- getTypeChain(&chain);
-
for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
const auto &type = *it;
diff --git a/test/vendor/1.0/Android.bp b/test/vendor/1.0/Android.bp
index 7f3aa3e..869b03a 100644
--- a/test/vendor/1.0/Android.bp
+++ b/test/vendor/1.0/Android.bp
@@ -5,9 +5,11 @@
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -rtests:system/tools/hidl/test/ -randroid.hidl:system/libhidl/transport tests.vendor@1.0",
srcs: [
+ "types.hal",
"IVendor.hal",
],
out: [
+ "tests/vendor/1.0/types.cpp",
"tests/vendor/1.0/VendorAll.cpp",
],
}
@@ -17,9 +19,11 @@
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -rtests:system/tools/hidl/test/ -randroid.hidl:system/libhidl/transport tests.vendor@1.0",
srcs: [
+ "types.hal",
"IVendor.hal",
],
out: [
+ "tests/vendor/1.0/types.h",
"tests/vendor/1.0/IVendor.h",
"tests/vendor/1.0/IHwVendor.h",
"tests/vendor/1.0/BnVendor.h",
diff --git a/test/vendor/1.0/Android.mk b/test/vendor/1.0/Android.mk
new file mode 100644
index 0000000..ee341d4
--- /dev/null
+++ b/test/vendor/1.0/Android.mk
@@ -0,0 +1,40 @@
+# This file is autogenerated by hidl-gen. Do not edit manually.
+
+LOCAL_PATH := $(call my-dir)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := tests.vendor@1.0-java-constants
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+intermediates := $(local-generated-sources-dir)
+
+HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
+#
+GEN := $(intermediates)/tests/vendor/V1_0/Constants.java
+$(GEN): $(HIDL)
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/IVendor.hal
+
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+ $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+ -Ljava-constants \
+ -rtests:system/tools/hidl/test/ \
+ -randroid.hidl:system/libhidl/transport \
+ tests.vendor@1.0
+
+$(GEN):
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+# Avoid dependency cycle of framework.jar -> this-library -> framework.jar
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVA_LIBRARIES := core-oj
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/test/vendor/1.0/types.hal b/test/vendor/1.0/types.hal
new file mode 100644
index 0000000..511389e
--- /dev/null
+++ b/test/vendor/1.0/types.hal
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.vendor@1.0;
+
+enum Bar : uint32_t {
+ A
+};
+
+/* WARNING:
+ *
+ * @export is used to expose this enumeration in a C header using -Lexport-header.
+ *
+ * It should only be used to make a backwards compatible header definition so that
+ * constant values defined in a .hal file can be used in a C library.
+ *
+ * export_parent below is used to test the functionality of export_parent. Typically,
+ * you would only use it when inheriting from a parent type. Obviously if name is not empty,
+ * then export_parent isn't required.
+ */
+@export(name="") // export_parent is implicitly true
+enum Foo : Bar {
+ B,
+ C
+};
+
+@export(name="", export_parent="false")
+enum FooToo : Foo {
+ D
+};
\ No newline at end of file
diff --git a/test/vendor/1.0/update-base.sh b/test/vendor/1.0/update-base.sh
new file mode 100755
index 0000000..8c7d688
--- /dev/null
+++ b/test/vendor/1.0/update-base.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+# WARNING: vendor-base is placed here only for testing.
+# It should typically be created elsewhere.
+
+options="-Lexport-header \
+ -r tests:system/tools/hidl/test/\
+ -r android.hidl:system/libhidl/transport"
+
+hidl-gen $options \
+ -o system/tools/hidl/test/vendor/1.0/vendor-base.h \
+ tests.vendor@1.0
\ No newline at end of file
diff --git a/test/vendor/1.0/vendor-base.h b/test/vendor/1.0/vendor-base.h
new file mode 100644
index 0000000..b9775f4
--- /dev/null
+++ b/test/vendor/1.0/vendor-base.h
@@ -0,0 +1,25 @@
+// This file is autogenerated by hidl-gen. Do not edit manually.
+// Source: tests.vendor@1.0
+
+#ifndef HIDL_GENERATED_TESTS_VENDOR_V1_0_EXPORTED_CONSTANTS_H_
+#define HIDL_GENERATED_TESTS_VENDOR_V1_0_EXPORTED_CONSTANTS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ A = 0u, // 0
+ B = 1u, // 1
+ C = 2u, // 2
+};
+
+enum {
+ D = 3u, // 3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HIDL_GENERATED_TESTS_VENDOR_V1_0_EXPORTED_CONSTANTS_H_