blob: 7e519e91abbb7f83f0819eb4f203c9a1c1a87485 [file] [log] [blame]
Andreas Huber1aec3972016-08-26 09:26:32 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huber3599d922016-08-09 10:42:57 -070017#include "Annotation.h"
18
Steven Morelanddb1b1b62017-01-10 09:50:55 -080019#include <android-base/logging.h>
Iliyan Malcheva72e0d22016-09-09 11:03:08 -070020#include <hidl-util/Formatter.h>
Yifan Hong932464e2017-03-30 15:40:22 -070021#include <hidl-util/StringHelper.h>
Andreas Huber3599d922016-08-09 10:42:57 -070022#include <vector>
23
24namespace android {
25
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070026AnnotationParam::AnnotationParam(const std::string& name) : mName(name) {}
Steven Morelandd537ab02016-09-12 10:32:01 -070027
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070028const std::string& AnnotationParam::getName() const {
Steven Morelandd537ab02016-09-12 10:32:01 -070029 return mName;
30}
31
Timur Iskhakovcec46c42017-08-09 00:22:02 -070032status_t AnnotationParam::evaluate() {
33 return OK;
34}
35
36status_t AnnotationParam::validate() const {
37 return OK;
38}
39
Steven Morelanddb1b1b62017-01-10 09:50:55 -080040std::string AnnotationParam::getSingleString() const {
41 std::string value = getSingleValue();
42
43 CHECK(value.size() >= 2 && value[0] == '"' && value[value.size() - 1] == '"')
44 << mName << " must be a string";
45
46 // unquote string
47 value = value.substr(1, value.size() - 2);
48
49 return value;
50}
51
52bool AnnotationParam::getSingleBool() const {
53 std::string value = getSingleString();
54
55 if (value == "true") {
56 return true;
57 } else if (value == "false") {
58 return false;
59 }
60
61 CHECK(false) << mName << " must be of boolean value (true/false).";
62 return false;
63}
64
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070065StringAnnotationParam::StringAnnotationParam(const std::string& name,
66 std::vector<std::string>* values)
67 : AnnotationParam(name), mValues(values) {}
68
69std::vector<std::string> StringAnnotationParam::getValues() const {
70 return *mValues;
Andreas Huber3599d922016-08-09 10:42:57 -070071}
72
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070073std::string StringAnnotationParam::getSingleValue() const {
74 CHECK_EQ(mValues->size(), 1u) << mName << " requires one value but has multiple";
75 return mValues->at(0);
76}
77
78ConstantExpressionAnnotationParam::ConstantExpressionAnnotationParam(
79 const std::string& name, std::vector<ConstantExpression*>* values)
80 : AnnotationParam(name), mValues(values) {}
81
Timur Iskhakovcec46c42017-08-09 00:22:02 -070082std::string convertToString(const ConstantExpression* value) {
Timur Iskhakov505e5612017-08-27 18:26:48 -070083 if (value->descriptionIsTrivial()) {
84 return value->value();
85 }
Timur Iskhakovcec46c42017-08-09 00:22:02 -070086 return value->value() + " /* " + value->description() + " */";
87}
88
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070089std::vector<std::string> ConstantExpressionAnnotationParam::getValues() const {
90 std::vector<std::string> ret;
Timur Iskhakovcec46c42017-08-09 00:22:02 -070091 for (const auto* value : *mValues) {
92 ret.push_back(convertToString(value));
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070093 };
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070094 return ret;
95}
96
97std::string ConstantExpressionAnnotationParam::getSingleValue() const {
98 CHECK_EQ(mValues->size(), 1u) << mName << " requires one value but has multiple";
99 return convertToString(mValues->at(0));
100}
101
Timur Iskhakovcec46c42017-08-09 00:22:02 -0700102status_t ConstantExpressionAnnotationParam::evaluate() {
103 for (auto* value : *mValues) {
104 value->evaluate();
105 }
106 return AnnotationParam::evaluate();
Timur Iskhakov7a85dc22017-08-10 19:06:41 -0700107}
108
109Annotation::Annotation(const char* name, AnnotationParamVector* params)
110 : mName(name), mParams(params) {}
111
Andreas Huber3599d922016-08-09 10:42:57 -0700112std::string Annotation::name() const {
113 return mName;
114}
115
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700116const AnnotationParamVector &Annotation::params() const {
Steven Morelandd537ab02016-09-12 10:32:01 -0700117 return *mParams;
118}
119
Andreas Huber019d21d2016-10-03 12:59:47 -0700120const AnnotationParam *Annotation::getParam(const std::string &name) const {
Steven Morelandd537ab02016-09-12 10:32:01 -0700121 for (auto *i: *mParams) {
122 if (i->getName() == name) {
123 return i;
124 }
125 }
126
127 return nullptr;
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700128}
129
Timur Iskhakovcec46c42017-08-09 00:22:02 -0700130status_t Annotation::evaluate() {
131 for (auto* param : *mParams) {
132 status_t err = param->evaluate();
133 if (err != OK) return err;
134 }
135 return OK;
136}
137
138status_t Annotation::validate() const {
139 for (const auto* param : *mParams) {
140 status_t err = param->validate();
141 if (err != OK) return err;
142 }
143 return OK;
144}
145
Andreas Huber3599d922016-08-09 10:42:57 -0700146void Annotation::dump(Formatter &out) const {
147 out << "@" << mName;
148
Steven Morelandd537ab02016-09-12 10:32:01 -0700149 if (mParams->size() == 0) {
Andreas Huber3599d922016-08-09 10:42:57 -0700150 return;
151 }
152
153 out << "(";
154
Steven Morelandd537ab02016-09-12 10:32:01 -0700155 for (size_t i = 0; i < mParams->size(); ++i) {
Andreas Huber3599d922016-08-09 10:42:57 -0700156 if (i > 0) {
157 out << ", ";
158 }
159
Steven Morelandd537ab02016-09-12 10:32:01 -0700160 const AnnotationParam* param = mParams->at(i);
Andreas Huber3599d922016-08-09 10:42:57 -0700161
Steven Morelandd537ab02016-09-12 10:32:01 -0700162 out << param->getName() << "=";
163
Timur Iskhakov7a85dc22017-08-10 19:06:41 -0700164 const std::vector<std::string>& values = param->getValues();
165 if (values.size() > 1) {
Andreas Huber3599d922016-08-09 10:42:57 -0700166 out << "{";
167 }
168
Timur Iskhakov7a85dc22017-08-10 19:06:41 -0700169 out << StringHelper::JoinStrings(values, ", ");
Andreas Huber3599d922016-08-09 10:42:57 -0700170
Timur Iskhakov7a85dc22017-08-10 19:06:41 -0700171 if (values.size() > 1) {
Andreas Huber3599d922016-08-09 10:42:57 -0700172 out << "}";
173 }
174 }
175
176 out << ")";
177}
178
179} // namespace android
180