Type.cpp revision 30bb6a869be0f3f82497b7b11c71ec9d47652ed0
11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/*
21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project
31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License.
61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at
71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software
111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and
141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License.
151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */
161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber
17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Type.h"
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
197c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber#include "Annotation.h"
208d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber#include "ScalarType.h"
21881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
22a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <android-base/logging.h>
24881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
277c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas HuberType::Type()
287c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    : mAnnotations(nullptr) {
297c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
307c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::~Type() {}
32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
337c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Hubervoid Type::setAnnotations(std::vector<Annotation *> *annotations) {
347c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    mAnnotations = annotations;
357c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
367c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
377c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huberconst std::vector<Annotation *> &Type::annotations() const {
387c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    return *mAnnotations;
397c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
407c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
415345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huberbool Type::isScope() const {
425345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    return false;
435345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber}
445345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber
45a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huberbool Type::isInterface() const {
46a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    return false;
47a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber}
48a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber
498d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isEnum() const {
508d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
518d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
528d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
538d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isTypeDef() const {
548d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
558d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
568d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
57295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huberbool Type::isBinder() const {
58295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    return false;
59295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber}
60295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber
6139fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huberbool Type::isNamedType() const {
6239fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber    return false;
6339fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber}
6439fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber
65f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huberbool Type::isCompoundType() const {
66f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    return false;
67f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber}
68f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber
69709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isArray() const {
70709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
71709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
72709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
73709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isVector() const {
7499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    return false;
7599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen}
7699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
7799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenbool Type::isPointer() const {
78709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
79709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
80709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
8130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Morelandstd::string Type::typeName() const {
8230bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    return "";
8330bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland}
8430bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
85737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const {
86737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return NULL;
87737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
88737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
898d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const {
908d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    const ScalarType *scalarType = resolveToScalarType();
918d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
928d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    if (scalarType == NULL) {
938d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        return false;
948d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    }
958d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
968d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return scalarType->isValidEnumStorageType();
978d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
988d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
993b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppType(StorageMode, bool) const {
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return std::string();
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1043b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::decorateCppName(
1053b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong        const std::string &name, StorageMode mode, bool specifyNamespaces) const {
1063b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(mode, specifyNamespaces) + " " + name;
1073b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong}
1083b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
1094ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string Type::getJavaType(bool /* forInitializer */) const {
1104c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    CHECK(!"Should not be here");
1114c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    return std::string();
1124c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber}
1134c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
11485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstd::string Type::getJavaWrapperType() const {
1154ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    return getJavaType();
11685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string Type::getJavaSuffix() const {
1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(!"Should not be here");
1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return std::string();
1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
123c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string Type::getVtsType() const {
124c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    CHECK(!"Should not be here");
125c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    return std::string();
126c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang}
127c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter(
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
134881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode) const {
135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
138bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferences(
139bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
140bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
141bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
142bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
143bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
144bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
145bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode) const {
146bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
147bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
148bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
149bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferencesEmbedded(
150bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
151bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        size_t,
152bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
153bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
154bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
155bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
156bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
157bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
158bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode,
159bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
160bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &) const {
161bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
162bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
163bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
16400f471711684903fd747e7871edf437ca54ed397Yifan Hongbool Type::useParentInEmitResolveReferencesEmbedded() const {
165244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return needsResolveReferences();
166244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong}
167244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
168244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongbool Type::useNameInEmitReaderWriterEmbedded(bool) const {
169244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return needsEmbeddedReadWrite();
17000f471711684903fd747e7871edf437ca54ed397Yifan Hong}
17100f471711684903fd747e7871edf437ca54ed397Yifan Hong
172881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded(
173881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
174f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        size_t,
175881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
176be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong        const std::string &,
177881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
178881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
179881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
180881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
181881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode,
182881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
183881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &) const {
184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
185881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
186881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriter(
1882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
1892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
1902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
1912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader) const {
1922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    emitJavaReaderWriterWithSuffix(
1932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out,
1942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            parcelObj,
1952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            argName,
1962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            isReader,
1972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            getJavaSuffix(),
1982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            "" /* extra */);
1992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
2002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
20185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldInitializer(
20285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
20385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName) const {
2044ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    out << getJavaType()
20585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " "
20685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
20785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ";\n";
20885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
20985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
21085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldReaderWriter(
21185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &,
2124c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber        size_t,
21385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
21485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
21585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
216709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        const std::string &,
21785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool) const {
21885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
21985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
22085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
221881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const {
222881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
223881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
224881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
225549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* _hidl_err ignored! */\n\n";
226881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
227881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
228881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
229881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
230881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
231549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n";
232881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
234881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
236881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
237549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { break; }\n\n";
238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
239881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
240737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
241737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
242737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
243549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n";
244737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
245737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
247881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
248881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
249881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError2(Formatter &out, ErrorMode mode) const {
250881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
251881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
252881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
253549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "goto _hidl_error;\n";
254881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
255881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
256737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
257881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
258881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
259881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "break;\n";
260881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
261881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
262737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
263881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
264881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
265549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* ignoring _hidl_error! */";
266881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
267881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
268737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
269737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
270737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
271549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "return _hidl_err;\n";
272737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
273737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
274881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
275881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
276881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
277881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName(
278881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
280881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
281881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
285881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
286881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText,
287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &typeName,
288244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string &childName,
289244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string &funcNamespace) const {
290244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
291244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string parcelObjDeref =
292881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
293881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
294881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjPointer =
295881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
296881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
297244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    const std::string nameDerefed = nameIsPointer ? ("*" + name) : name;
298881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string namePointer = nameIsPointer ? name : ("&" + name);
299881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
300549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    out << "_hidl_err = ";
301881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
302244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    if (!funcNamespace.empty()) {
303244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        out << funcNamespace << "::";
304244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    }
305244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
306244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out << (isReader ? "readEmbeddedFromParcel(\n" : "writeEmbeddedToParcel(\n");
307244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
308244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out.indent();
309244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out.indent();
310244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
311881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
312881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "const_cast<"
313881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << typeName
314881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " *>("
315881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << namePointer
316244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            << "),\n";
317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
318244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        out << nameDerefed
319244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            << ",\n";
320881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
321881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
322881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << (isReader ? parcelObjDeref : parcelObjPointer)
323881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
324881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << parentName
325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
326881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << offsetText;
327881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
328881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (!childName.empty()) {
329881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << ", &"
330881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << childName;
331881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
332881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
333881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << ");\n\n";
334881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
335881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
336881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
337881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
338881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    handleError(out, mode);
339881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
340881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
341881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const {
342881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
343881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
344881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
345e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huberstatus_t Type::emitGlobalTypeDeclarations(Formatter &) const {
346e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    return OK;
347e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber}
348e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber
349244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongstatus_t Type::emitGlobalHwDeclarations(Formatter &) const {
350244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return OK;
351244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong}
352244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
353881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions(
354881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &, const std::string) const {
355881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
356881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
357881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
35885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t Type::emitJavaTypeDeclarations(Formatter &, bool) const {
3592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
3602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
3612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
362881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const {
363881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
364881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
365881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
366bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongbool Type::needsResolveReferences() const {
367bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    return false;
368bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
369bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
370881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const {
371881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
372881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
373881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3743b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppStackType(bool specifyNamespaces) const {
3753b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Stack, specifyNamespaces);
376881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
377881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3783b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppResultType(bool specifyNamespaces) const {
3793b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Result, specifyNamespaces);
380881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
381881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3823b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppArgumentType(bool specifyNamespaces) const {
3833b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Argument, specifyNamespaces);
384881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
385881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriterWithSuffix(
3872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
3882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
3892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
3902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader,
3912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &suffix,
3922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &extra) const {
3932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << parcelObj
3942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "."
3952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << (isReader ? "read" : "write")
3962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << suffix
3972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "(";
3982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (isReader) {
4002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << extra;
4012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    } else {
4022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << (extra.empty() ? "" : (extra + ", "));
4032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << argName;
4042831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
4052831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << ");\n";
4072831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
4082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4095158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t Type::emitVtsTypeDeclarations(Formatter &) const {
4105158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
4115158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
4125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
413864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Type::emitVtsAttributeType(Formatter &out) const {
4145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return emitVtsTypeDeclarations(out);
4155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
4165158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
41770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Type::isJavaCompatible() const {
41870a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    return true;
41970a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber}
42070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
42185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::getAlignmentAndSize(size_t *, size_t *) const {
42285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
42385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
42485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
425019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid Type::appendToExportedTypesVector(
426019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber        std::vector<const Type *> * /* exportedTypes */) const {
427019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
428019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
4291c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huberstatus_t Type::emitExportedHeader(
4301c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber        Formatter & /* out */, bool /* forJava */) const {
431019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    return OK;
432019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
433019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
434bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong////////////////////////////////////////
435bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
436bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTemplatedType::TemplatedType() : mElementType(nullptr) {
437bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
43830bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
439bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid TemplatedType::setElementType(Type *elementType) {
440bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(mElementType == nullptr); // can only be set once.
44130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    CHECK(isCompatibleElementType(elementType));
442bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    mElementType = elementType;
443bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
444bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
445c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
446c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
447