blob: e02090ae0765b365817b53b7614f8b1f59285bb4 [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 Huberc9410c72016-07-28 12:18:40 -070017#ifndef COMPOUND_TYPE_H_
18
19#define COMPOUND_TYPE_H_
20
Timur Iskhakov505316c2017-08-05 03:38:59 +000021#include "Reference.h"
Andreas Huberc9410c72016-07-28 12:18:40 -070022#include "Scope.h"
23
Andreas Huber881227d2016-08-02 14:20:21 -070024#include <vector>
Andreas Huberc9410c72016-07-28 12:18:40 -070025
26namespace android {
27
Andreas Huberc9410c72016-07-28 12:18:40 -070028struct CompoundType : public Scope {
29 enum Style {
30 STYLE_STRUCT,
31 STYLE_UNION,
Nirav Atre0ab82652018-06-04 11:49:14 -070032 STYLE_SAFE_UNION,
Andreas Huberc9410c72016-07-28 12:18:40 -070033 };
34
Timur Iskhakov565b0132017-09-06 18:07:11 -070035 CompoundType(Style style, const char* localName, const FQName& fullName,
36 const Location& location, Scope* parent);
Andreas Huberc9410c72016-07-28 12:18:40 -070037
Yifan Hong27e85db2016-11-09 15:45:52 -080038 Style style() const;
39
Timur Iskhakovcec46c42017-08-09 00:22:02 -070040 void setFields(std::vector<NamedReference<Type>*>* fields);
Andreas Huberc9410c72016-07-28 12:18:40 -070041
Andreas Huberf630bc82016-09-09 14:52:25 -070042 bool isCompoundType() const override;
43
Timur Iskhakov5dc72fe2017-09-07 23:13:44 -070044 bool deepCanCheckEquality(std::unordered_set<const Type*>* visited) const override;
Yifan Hongc6752dc2016-12-20 14:00:14 -080045
Steven Moreland0ecc7b82017-07-19 12:59:23 -070046 std::string typeName() const override;
47
Timur Iskhakovb58f4182017-08-29 15:19:24 -070048 std::vector<const Reference<Type>*> getReferences() const override;
Timur Iskhakov33431e62017-08-21 17:31:23 -070049
Timur Iskhakovcec46c42017-08-09 00:22:02 -070050 status_t validate() const override;
51 status_t validateUniqueNames() const;
Nirav Atre0ab82652018-06-04 11:49:14 -070052 status_t validateSubTypeNames() const;
Timur Iskhakovcec46c42017-08-09 00:22:02 -070053
Steven Moreland979e0992016-09-07 09:18:08 -070054 std::string getCppType(StorageMode mode,
Steven Moreland979e0992016-09-07 09:18:08 -070055 bool specifyNamespaces) const override;
Andreas Huber881227d2016-08-02 14:20:21 -070056
Yifan Hong4ed13472016-11-02 10:44:11 -070057 std::string getJavaType(bool forInitializer) const override;
Andreas Huber85eabdb2016-08-25 11:24:49 -070058
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -070059 std::string getVtsType() const override;
60
Andreas Huber881227d2016-08-02 14:20:21 -070061 void emitReaderWriter(
62 Formatter &out,
63 const std::string &name,
64 const std::string &parcelObj,
65 bool parcelObjIsPointer,
66 bool isReader,
67 ErrorMode mode) const override;
68
69 void emitReaderWriterEmbedded(
70 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -070071 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -070072 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -070073 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -070074 bool nameIsPointer,
75 const std::string &parcelObj,
76 bool parcelObjIsPointer,
77 bool isReader,
78 ErrorMode mode,
79 const std::string &parentName,
80 const std::string &offsetText) const override;
81
Yifan Hongbf459bc2016-08-23 16:50:37 -070082 void emitResolveReferences(
83 Formatter &out,
84 const std::string &name,
85 bool nameIsPointer,
86 const std::string &parcelObj,
87 bool parcelObjIsPointer,
88 bool isReader,
89 ErrorMode mode) const override;
90
91 void emitResolveReferencesEmbedded(
92 Formatter &out,
93 size_t depth,
94 const std::string &name,
95 const std::string &sanitizedName,
96 bool nameIsPointer,
97 const std::string &parcelObj,
98 bool parcelObjIsPointer,
99 bool isReader,
100 ErrorMode mode,
101 const std::string &parentName,
102 const std::string &offsetText) const override;
103
Andreas Huber85eabdb2016-08-25 11:24:49 -0700104 void emitJavaReaderWriter(
105 Formatter &out,
106 const std::string &parcelObj,
107 const std::string &argName,
108 bool isReader) const override;
109
110 void emitJavaFieldInitializer(
111 Formatter &out, const std::string &fieldName) const override;
112
Nirav Atre66842a92018-06-28 18:14:13 -0700113 void emitJavaFieldDefaultInitialValue(
114 Formatter &out, const std::string &declaredFieldName) const override;
115
Andreas Huber85eabdb2016-08-25 11:24:49 -0700116 void emitJavaFieldReaderWriter(
117 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700118 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700119 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700120 const std::string &blobName,
121 const std::string &fieldName,
122 const std::string &offset,
123 bool isReader) const override;
124
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800125 void emitTypeDeclarations(Formatter& out) const override;
Timur Iskhakovfd3f2502017-09-05 16:25:02 -0700126 void emitTypeForwardDeclaration(Formatter& out) const override;
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800127 void emitPackageTypeDeclarations(Formatter& out) const override;
Steven Moreland09c6ebe2018-10-09 10:15:48 -0700128 void emitPackageTypeHeaderDefinitions(Formatter& out) const override;
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800129 void emitPackageHwDeclarations(Formatter& out) const override;
Andreas Huber881227d2016-08-02 14:20:21 -0700130
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800131 void emitTypeDefinitions(Formatter& out, const std::string& prefix) const override;
Andreas Huber881227d2016-08-02 14:20:21 -0700132
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800133 void emitJavaTypeDeclarations(Formatter& out, bool atTopLevel) const override;
Andreas Huber85eabdb2016-08-25 11:24:49 -0700134
Andreas Huber881227d2016-08-02 14:20:21 -0700135 bool needsEmbeddedReadWrite() const override;
Timur Iskhakov5dc72fe2017-09-07 23:13:44 -0700136 bool deepNeedsResolveReferences(std::unordered_set<const Type*>* visited) const override;
Andreas Huber881227d2016-08-02 14:20:21 -0700137 bool resultNeedsDeref() const override;
138
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800139 void emitVtsTypeDeclarations(Formatter& out) const override;
140 void emitVtsAttributeType(Formatter& out) const override;
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700141
Timur Iskhakov5dc72fe2017-09-07 23:13:44 -0700142 bool deepIsJavaCompatible(std::unordered_set<const Type*>* visited) const override;
143 bool deepContainsPointer(std::unordered_set<const Type*>* visited) const override;
Andreas Huber70a59e12016-08-16 12:57:01 -0700144
Andreas Huber85eabdb2016-08-25 11:24:49 -0700145 void getAlignmentAndSize(size_t *align, size_t *size) const;
146
Howard Chenecfb4512017-11-21 18:28:53 +0800147 bool containsInterface() const;
Andreas Huberc9410c72016-07-28 12:18:40 -0700148private:
Nirav Atre0ab82652018-06-04 11:49:14 -0700149
150 struct Layout {
151 size_t offset;
152 size_t align;
153 size_t size;
154
155 Layout() : offset(0), align(1), size(0) {}
156 static size_t getPad(size_t offset, size_t align);
157 };
158
159 struct CompoundLayout {
160 Layout overall;
161 Layout innerStruct;
162 Layout discriminator;
163 };
164
Andreas Huberc9410c72016-07-28 12:18:40 -0700165 Style mStyle;
Timur Iskhakov7fa79f62017-08-09 11:04:54 -0700166 std::vector<NamedReference<Type>*>* mFields;
Andreas Huber881227d2016-08-02 14:20:21 -0700167
Nirav Atre0ab82652018-06-04 11:49:14 -0700168 void emitLayoutAsserts(Formatter& out, const Layout& localLayout,
169 const std::string& localLayoutName) const;
170
171 void emitInvalidSubTypeNamesError(const std::string& subTypeName,
172 const Location& location) const;
173
174 void emitSafeUnionTypeDefinitions(Formatter& out) const;
175 void emitSafeUnionTypeConstructors(Formatter& out) const;
176 void emitSafeUnionTypeDeclarations(Formatter& out) const;
177 std::unique_ptr<ScalarType> getUnionDiscriminatorType() const;
178
Steven Moreland5add34d2018-11-08 16:31:30 -0800179 void emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value,
180 bool fatal) const;
Nirav Atree3cae852018-07-16 12:19:16 -0700181
Nirav Atre64868d32018-07-15 19:15:18 -0700182 void emitSafeUnionCopyAndAssignDefinition(Formatter& out,
183 const std::string& parameterName,
184 bool isCopyConstructor,
185 bool usesMoveSemantics) const;
186
Nirav Atre71ce0082018-08-01 15:39:49 -0700187 struct SafeUnionEnumElement {
188 std::string fieldName;
189 std::string fieldTypeName;
190 };
191
192 std::vector<SafeUnionEnumElement> getSafeUnionEnumElements(bool useCppTypeName) const;
193
Nirav Atre0ab82652018-06-04 11:49:14 -0700194 CompoundLayout getCompoundAlignmentAndSize() const;
195
Nirav Atreca7a5022018-06-29 20:43:49 -0700196 void emitSafeUnionReaderWriterForInterfaces(
197 Formatter &out,
198 const std::string &name,
199 const std::string &parcelObj,
200 bool parcelObjIsPointer,
201 bool isReader,
202 ErrorMode mode) const;
203
Andreas Huber881227d2016-08-02 14:20:21 -0700204 void emitStructReaderWriter(
205 Formatter &out, const std::string &prefix, bool isReader) const;
Chih-Hung Hsieh8c90cc52017-08-03 14:51:13 -0700206 void emitResolveReferenceDef(Formatter& out, const std::string& prefix, bool isReader) const;
Andreas Huberc9410c72016-07-28 12:18:40 -0700207
208 DISALLOW_COPY_AND_ASSIGN(CompoundType);
209};
210
Andreas Huberc9410c72016-07-28 12:18:40 -0700211} // namespace android
212
213#endif // COMPOUND_TYPE_H_
214