Type.cpp revision c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02
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 {
74709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
75709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
76709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
77737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const {
78737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return NULL;
79737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
80737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
818d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const {
828d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    const ScalarType *scalarType = resolveToScalarType();
838d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
848d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    if (scalarType == NULL) {
858d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        return false;
868d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    }
878d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
888d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return scalarType->isValidEnumStorageType();
898d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
908d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
91979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppType(StorageMode, std::string *, bool) const {
92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return std::string();
94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
964c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huberstd::string Type::getJavaType(
974c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber        std::string *extra, bool /* forInitializer */) const {
984c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    CHECK(!"Should not be here");
994c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    extra->clear();
1004c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    return std::string();
1014c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber}
1024c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
10385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstd::string Type::getJavaWrapperType() const {
1044c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    std::string extra;
1054c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    return getJavaType(&extra);
10685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
10785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
1082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string Type::getJavaSuffix() const {
1092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(!"Should not be here");
1102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return std::string();
1112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
113c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string Type::getVtsType() const {
114c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    CHECK(!"Should not be here");
115c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    return std::string();
116c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang}
117c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
118881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter(
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
121881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
122881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
123881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode) const {
125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
128bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferences(
129bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
130bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
131bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
132bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
133bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
134bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
135bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode) const {
136bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
137bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
138bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
139bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferencesEmbedded(
140bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
141bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        size_t,
142bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
143bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
144bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
145bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
146bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
147bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
148bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode,
149bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
150bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &) const {
151bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
152bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
153bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
15400f471711684903fd747e7871edf437ca54ed397Yifan Hongbool Type::useParentInEmitResolveReferencesEmbedded() const {
15500f471711684903fd747e7871edf437ca54ed397Yifan Hong    return true;
15600f471711684903fd747e7871edf437ca54ed397Yifan Hong}
15700f471711684903fd747e7871edf437ca54ed397Yifan Hong
158881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded(
159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
160f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        size_t,
161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
162be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong        const std::string &,
163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode,
168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &) const {
170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
171881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
172881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriter(
1742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
1752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
1762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
1772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader) const {
1782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    emitJavaReaderWriterWithSuffix(
1792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out,
1802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            parcelObj,
1812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            argName,
1822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            isReader,
1832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            getJavaSuffix(),
1842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            "" /* extra */);
1852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
18785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldInitializer(
18885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
18985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName) const {
1904c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    std::string extra;
1914c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    out << getJavaType(&extra)
19285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " "
19385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
19485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ";\n";
19585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
19685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
19785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldReaderWriter(
19885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &,
1994c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber        size_t,
20085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
20185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
20285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
203709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        const std::string &,
20485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool) const {
20585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
20685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
20785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
208881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const {
209881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
210881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
211881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
212549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* _hidl_err ignored! */\n\n";
213881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
214881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
215881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
216881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
217881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
218549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n";
219881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
220881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
221881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
222881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
223881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
224549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { break; }\n\n";
225881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
226881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
227737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
228737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
229737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
230549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n";
231737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
232737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
234881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
236881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError2(Formatter &out, ErrorMode mode) const {
237881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
239881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
240549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "goto _hidl_error;\n";
241881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
242881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
243737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
244881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
245881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "break;\n";
247881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
248881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
249737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
250881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
251881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
252549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* ignoring _hidl_error! */";
253881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
254881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
255737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
256737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
257737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
258549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "return _hidl_err;\n";
259737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
260737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
261881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
262881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
263881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
264881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName(
265881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
266881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
267881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
268881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
269881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
270881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
271881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
272881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
273881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText,
274881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &typeName,
275881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &childName) const {
276881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjDeref =
277881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
278881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjPointer =
280881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
281881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string namePointer = nameIsPointer ? name : ("&" + name);
284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
285549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    out << "_hidl_err = ";
286881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
288881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "const_cast<"
289881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << typeName
290881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " *>("
291881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << namePointer
292881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ")->readEmbeddedFromParcel(\n";
293881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
294881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << nameDeref
295881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "writeEmbeddedToParcel(\n";
296881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
297881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
298881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
299881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
300881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
301881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << (isReader ? parcelObjDeref : parcelObjPointer)
302881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
303881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << parentName
304881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
305881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << offsetText;
306881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
307881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (!childName.empty()) {
308881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << ", &"
309881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << childName;
310881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
311881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
312881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << ");\n\n";
313881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
314881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
315881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
316881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    handleError(out, mode);
318881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
319881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
320881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const {
321881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
322881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
323881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
324881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions(
325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &, const std::string) const {
326881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
327881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
328881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
32985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t Type::emitJavaTypeDeclarations(Formatter &, bool) const {
3302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
3312831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
3322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
333881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const {
334881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
335881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
336881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
337bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongbool Type::needsResolveReferences() const {
338bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    return false;
339bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
340bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
341881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const {
342881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
343881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
344881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
345979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppType(std::string *extra,
346979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                             bool specifyNamespaces) const {
347979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return getCppType(StorageMode_Stack, extra, specifyNamespaces);
348881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
349881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
350979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppResultType(std::string *extra,
351979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                   bool specifyNamespaces) const {
352979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return getCppType(StorageMode_Result, extra, specifyNamespaces);
353881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
354881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
355979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppArgumentType(std::string *extra,
356979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                     bool specifyNamespaces) const {
357979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return getCppType(StorageMode_Argument, extra, specifyNamespaces);
358881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
359881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriterWithSuffix(
3612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
3622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
3632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
3642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader,
3652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &suffix,
3662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &extra) const {
3672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << parcelObj
3682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "."
3692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << (isReader ? "read" : "write")
3702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << suffix
3712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "(";
3722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (isReader) {
3742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << extra;
3752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    } else {
3762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << (extra.empty() ? "" : (extra + ", "));
3772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << argName;
3782831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
3792831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << ");\n";
3812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
3822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3835158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t Type::emitVtsTypeDeclarations(Formatter &) const {
3845158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
3855158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
3865158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
387864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Type::emitVtsAttributeType(Formatter &out) const {
3885158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return emitVtsTypeDeclarations(out);
3895158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
3905158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
39170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Type::isJavaCompatible() const {
39270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    return true;
39370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber}
39470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
39585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::getAlignmentAndSize(size_t *, size_t *) const {
39685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
39785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
39885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
399019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid Type::appendToExportedTypesVector(
400019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber        std::vector<const Type *> * /* exportedTypes */) const {
401019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
402019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
403019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huberstatus_t Type::emitExportedHeader(Formatter & /* out */) const {
404019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    return OK;
405019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
406019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
407bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong////////////////////////////////////////
408bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
409bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTemplatedType::TemplatedType() : mElementType(nullptr) {
410bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
411bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid TemplatedType::setElementType(Type *elementType) {
412bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(mElementType == nullptr); // can only be set once.
413bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    mElementType = elementType;
414bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
415bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
416c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
417c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
418