blob: eefead15e229f3ae94e8e9fbbe05b7509c9d2f27 [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>
Timur Iskhakovb58f4182017-08-29 15:19:24 -070022#include <algorithm>
Neel Mehta69920a62019-07-22 16:22:13 -070023#include <string>
Andreas Huber3599d922016-08-09 10:42:57 -070024#include <vector>
25
26namespace android {
27
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070028AnnotationParam::AnnotationParam(const std::string& name) : mName(name) {}
Steven Morelandd537ab02016-09-12 10:32:01 -070029
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070030const std::string& AnnotationParam::getName() const {
Steven Morelandd537ab02016-09-12 10:32:01 -070031 return mName;
32}
33
Timur Iskhakovb58f4182017-08-29 15:19:24 -070034std::vector<ConstantExpression*> AnnotationParam::getConstantExpressions() {
35 const auto& constRet = static_cast<const AnnotationParam*>(this)->getConstantExpressions();
36 std::vector<ConstantExpression*> ret(constRet.size());
37 std::transform(constRet.begin(), constRet.end(), ret.begin(),
38 [](const auto* ce) { return const_cast<ConstantExpression*>(ce); });
39 return ret;
40}
41
42std::vector<const ConstantExpression*> AnnotationParam::getConstantExpressions() const {
Timur Iskhakov891a8662017-08-25 21:53:48 -070043 return {};
Timur Iskhakovcec46c42017-08-09 00:22:02 -070044}
45
Steven Morelanddb1b1b62017-01-10 09:50:55 -080046std::string AnnotationParam::getSingleString() const {
47 std::string value = getSingleValue();
48
49 CHECK(value.size() >= 2 && value[0] == '"' && value[value.size() - 1] == '"')
50 << mName << " must be a string";
51
52 // unquote string
53 value = value.substr(1, value.size() - 2);
54
55 return value;
56}
57
58bool AnnotationParam::getSingleBool() const {
59 std::string value = getSingleString();
60
61 if (value == "true") {
62 return true;
63 } else if (value == "false") {
64 return false;
65 }
66
67 CHECK(false) << mName << " must be of boolean value (true/false).";
68 return false;
69}
70
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070071StringAnnotationParam::StringAnnotationParam(const std::string& name,
72 std::vector<std::string>* values)
73 : AnnotationParam(name), mValues(values) {}
74
75std::vector<std::string> StringAnnotationParam::getValues() const {
76 return *mValues;
Andreas Huber3599d922016-08-09 10:42:57 -070077}
78
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070079std::string StringAnnotationParam::getSingleValue() const {
80 CHECK_EQ(mValues->size(), 1u) << mName << " requires one value but has multiple";
81 return mValues->at(0);
82}
83
84ConstantExpressionAnnotationParam::ConstantExpressionAnnotationParam(
85 const std::string& name, std::vector<ConstantExpression*>* values)
86 : AnnotationParam(name), mValues(values) {}
87
88std::vector<std::string> ConstantExpressionAnnotationParam::getValues() const {
89 std::vector<std::string> ret;
Timur Iskhakovcec46c42017-08-09 00:22:02 -070090 for (const auto* value : *mValues) {
Steven Morelandf21962d2018-08-09 12:44:40 -070091 ret.push_back(value->value());
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070092 };
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070093 return ret;
94}
95
96std::string ConstantExpressionAnnotationParam::getSingleValue() const {
97 CHECK_EQ(mValues->size(), 1u) << mName << " requires one value but has multiple";
Steven Morelandf21962d2018-08-09 12:44:40 -070098 return mValues->at(0)->value();
Timur Iskhakov7a85dc22017-08-10 19:06:41 -070099}
100
Timur Iskhakovb58f4182017-08-29 15:19:24 -0700101std::vector<const ConstantExpression*> ConstantExpressionAnnotationParam::getConstantExpressions()
102 const {
103 std::vector<const ConstantExpression*> ret;
104 ret.insert(ret.end(), mValues->begin(), mValues->end());
105 return ret;
Timur Iskhakov7a85dc22017-08-10 19:06:41 -0700106}
107
Neel Mehta69920a62019-07-22 16:22:13 -0700108Annotation::Annotation(const std::string& name, AnnotationParamVector* params)
Timur Iskhakov7a85dc22017-08-10 19:06:41 -0700109 : mName(name), mParams(params) {}
110
Andreas Huber3599d922016-08-09 10:42:57 -0700111std::string Annotation::name() const {
112 return mName;
113}
114
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700115const AnnotationParamVector &Annotation::params() const {
Steven Morelandd537ab02016-09-12 10:32:01 -0700116 return *mParams;
117}
118
Andreas Huber019d21d2016-10-03 12:59:47 -0700119const AnnotationParam *Annotation::getParam(const std::string &name) const {
Timur Iskhakov891a8662017-08-25 21:53:48 -0700120 for (const auto* i : *mParams) {
Steven Morelandd537ab02016-09-12 10:32:01 -0700121 if (i->getName() == name) {
122 return i;
123 }
124 }
125
126 return nullptr;
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700127}
128
Timur Iskhakovb58f4182017-08-29 15:19:24 -0700129std::vector<ConstantExpression*> Annotation::getConstantExpressions() {
130 const auto& constRet = static_cast<const Annotation*>(this)->getConstantExpressions();
131 std::vector<ConstantExpression*> ret(constRet.size());
132 std::transform(constRet.begin(), constRet.end(), ret.begin(),
133 [](const auto* ce) { return const_cast<ConstantExpression*>(ce); });
134 return ret;
135}
136
137std::vector<const ConstantExpression*> Annotation::getConstantExpressions() const {
138 std::vector<const ConstantExpression*> ret;
Timur Iskhakovcec46c42017-08-09 00:22:02 -0700139 for (const auto* param : *mParams) {
Timur Iskhakov891a8662017-08-25 21:53:48 -0700140 const auto& retParam = param->getConstantExpressions();
141 ret.insert(ret.end(), retParam.begin(), retParam.end());
Timur Iskhakovcec46c42017-08-09 00:22:02 -0700142 }
Timur Iskhakov891a8662017-08-25 21:53:48 -0700143 return ret;
Timur Iskhakovcec46c42017-08-09 00:22:02 -0700144}
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
Neel Mehta3b414a82019-07-02 15:47:48 -0700162 out << param->getName() << " = ";
Steven Morelandd537ab02016-09-12 10:32:01 -0700163
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