1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "ast/ast_parameter.h"
10 #include "ast/ast_array_type.h"
11 #include "util/string_builder.h"
12
13 namespace OHOS {
14 namespace HDI {
Dump(const std::string & prefix)15 std::string ASTParameter::Dump(const std::string &prefix)
16 {
17 StringBuilder sb;
18
19 sb.Append(prefix);
20 sb.Append('[');
21
22 if (attr_->value_ == ParamAttr::PARAM_IN) {
23 sb.Append("in");
24 } else {
25 sb.Append("out");
26 }
27
28 sb.Append("] ");
29 sb.Append(type_->ToString()).Append(' ');
30 sb.Append(name_);
31
32 return sb.ToString();
33 }
34
EmitCParameter()35 std::string ASTParameter::EmitCParameter()
36 {
37 StringBuilder sb;
38 switch (type_->GetTypeKind()) {
39 case TypeKind::TYPE_BOOLEAN:
40 case TypeKind::TYPE_BYTE:
41 case TypeKind::TYPE_SHORT:
42 case TypeKind::TYPE_INT:
43 case TypeKind::TYPE_LONG:
44 case TypeKind::TYPE_UCHAR:
45 case TypeKind::TYPE_USHORT:
46 case TypeKind::TYPE_UINT:
47 case TypeKind::TYPE_ULONG:
48 case TypeKind::TYPE_FLOAT:
49 case TypeKind::TYPE_DOUBLE:
50 case TypeKind::TYPE_ENUM:
51 case TypeKind::TYPE_FILEDESCRIPTOR:
52 case TypeKind::TYPE_INTERFACE:
53 case TypeKind::TYPE_STRING:
54 case TypeKind::TYPE_STRUCT:
55 case TypeKind::TYPE_UNION:
56 case TypeKind::TYPE_VOID: {
57 StringBuilder paramStr;
58 if (attr_->value_ == ParamAttr::PARAM_IN) {
59 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).c_str(), name_.c_str());
60 } else {
61 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
62 }
63 if (type_->GetTypeKind() == TypeKind::TYPE_STRING && attr_->value_ == ParamAttr::PARAM_OUT) {
64 paramStr.AppendFormat(", uint32_t %sLen", name_.c_str());
65 }
66 return paramStr.ToString();
67 }
68 case TypeKind::TYPE_ARRAY:
69 case TypeKind::TYPE_LIST: {
70 StringBuilder paramStr;
71 if (attr_->value_ == ParamAttr::PARAM_IN) {
72 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).c_str(), name_.c_str());
73 } else {
74 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
75 }
76 paramStr.AppendFormat(
77 ", uint32_t%s %sLen", (attr_->value_ == ParamAttr::PARAM_IN) ? "" : "*", name_.c_str());
78 return paramStr.ToString();
79 }
80 default:
81 return StringHelper::Format("unknow type %s", name_.c_str());
82 }
83 return sb.ToString();
84 }
85
EmitCppParameter()86 std::string ASTParameter::EmitCppParameter()
87 {
88 if (attr_->value_ == ParamAttr::PARAM_IN) {
89 return StringHelper::Format("%s %s", type_->EmitCppType(TypeMode::PARAM_IN).c_str(), name_.c_str());
90 } else {
91 return StringHelper::Format("%s %s", type_->EmitCppType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
92 }
93 }
94
EmitJavaParameter()95 std::string ASTParameter::EmitJavaParameter()
96 {
97 StringBuilder sb;
98 switch (type_->GetTypeKind()) {
99 case TypeKind::TYPE_BOOLEAN:
100 case TypeKind::TYPE_BYTE:
101 case TypeKind::TYPE_SHORT:
102 case TypeKind::TYPE_INT:
103 case TypeKind::TYPE_LONG:
104 case TypeKind::TYPE_UCHAR:
105 case TypeKind::TYPE_USHORT:
106 case TypeKind::TYPE_UINT:
107 case TypeKind::TYPE_ULONG:
108 case TypeKind::TYPE_FLOAT:
109 case TypeKind::TYPE_DOUBLE:
110 case TypeKind::TYPE_ENUM:
111 case TypeKind::TYPE_FILEDESCRIPTOR:
112 case TypeKind::TYPE_STRING:
113 case TypeKind::TYPE_SEQUENCEABLE:
114 case TypeKind::TYPE_INTERFACE:
115 case TypeKind::TYPE_STRUCT:
116 case TypeKind::TYPE_UNION:
117 case TypeKind::TYPE_VOID:
118 case TypeKind::TYPE_ARRAY:
119 case TypeKind::TYPE_LIST:
120 case TypeKind::TYPE_MAP: {
121 return StringHelper::Format("%s %s", type_->EmitJavaType(TypeMode::NO_MODE, false).c_str(), name_.c_str());
122 }
123 default:
124 return StringHelper::Format("unknow type %s", name_.c_str());
125 }
126
127 return sb.ToString();
128 }
129
EmitCLocalVar()130 std::string ASTParameter::EmitCLocalVar()
131 {
132 StringBuilder sb;
133 sb.AppendFormat("%s %s", type_->EmitCType(TypeMode::LOCAL_VAR).c_str(), name_.c_str());
134 switch (type_->GetTypeKind()) {
135 case TypeKind::TYPE_BOOLEAN:
136 sb.Append(" = false");
137 break;
138 case TypeKind::TYPE_BYTE:
139 case TypeKind::TYPE_SHORT:
140 case TypeKind::TYPE_INT:
141 case TypeKind::TYPE_LONG:
142 case TypeKind::TYPE_UCHAR:
143 case TypeKind::TYPE_USHORT:
144 case TypeKind::TYPE_UINT:
145 case TypeKind::TYPE_ULONG:
146 case TypeKind::TYPE_FLOAT:
147 case TypeKind::TYPE_DOUBLE:
148 sb.Append(" = 0");
149 break;
150 case TypeKind::TYPE_STRING:
151 case TypeKind::TYPE_ARRAY:
152 case TypeKind::TYPE_LIST:
153 case TypeKind::TYPE_STRUCT:
154 case TypeKind::TYPE_UNION:
155 case TypeKind::TYPE_INTERFACE:
156 sb.Append(" = NULL");
157 break;
158 case TypeKind::TYPE_FILEDESCRIPTOR:
159 sb.Append(" = -1");
160 break;
161 default:
162 break;
163 }
164 sb.Append(";");
165 return sb.ToString();
166 }
167
EmitCppLocalVar()168 std::string ASTParameter::EmitCppLocalVar()
169 {
170 StringBuilder sb;
171 sb.AppendFormat("%s %s", type_->EmitCppType(TypeMode::LOCAL_VAR).c_str(), name_.c_str());
172 switch (type_->GetTypeKind()) {
173 case TypeKind::TYPE_BOOLEAN:
174 sb.Append(" = false");
175 break;
176 case TypeKind::TYPE_BYTE:
177 case TypeKind::TYPE_SHORT:
178 case TypeKind::TYPE_INT:
179 case TypeKind::TYPE_LONG:
180 case TypeKind::TYPE_UCHAR:
181 case TypeKind::TYPE_USHORT:
182 case TypeKind::TYPE_UINT:
183 case TypeKind::TYPE_ULONG:
184 case TypeKind::TYPE_FLOAT:
185 case TypeKind::TYPE_DOUBLE:
186 sb.Append(" = 0");
187 break;
188 case TypeKind::TYPE_FILEDESCRIPTOR:
189 sb.Append(" = -1");
190 break;
191 case TypeKind::TYPE_SEQUENCEABLE:
192 sb.Append(" = nullptr");
193 break;
194 default:
195 break;
196 }
197 sb.Append(";");
198 return sb.ToString();
199 }
200
EmitJavaLocalVar()201 std::string ASTParameter::EmitJavaLocalVar()
202 {
203 return "";
204 }
205
EmitCWriteVar(const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const206 void ASTParameter::EmitCWriteVar(const std::string &parcelName, const std::string &ecName, const std::string &gotoLabel,
207 StringBuilder &sb, const std::string &prefix) const
208 {
209 if (type_ == nullptr) {
210 return;
211 }
212
213 type_->EmitCWriteVar(parcelName, name_, ecName, gotoLabel, sb, prefix);
214 }
215
EmitCProxyWriteOutVar(const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const216 bool ASTParameter::EmitCProxyWriteOutVar(const std::string &parcelName, const std::string &ecName,
217 const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const
218 {
219 if (type_ == nullptr) {
220 return false;
221 }
222
223 if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) {
224 type_->EmitCProxyWriteOutVar(parcelName, name_, ecName, gotoLabel, sb, prefix);
225 return true;
226 }
227
228 return false;
229 }
230
EmitCStubReadOutVar(const std::string & buffSizeName,const std::string & memFlagName,const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const231 void ASTParameter::EmitCStubReadOutVar(const std::string &buffSizeName, const std::string &memFlagName,
232 const std::string &parcelName, const std::string &ecName, const std::string &gotoLabel, StringBuilder &sb,
233 const std::string &prefix) const
234 {
235 if (type_ == nullptr) {
236 return;
237 }
238
239 if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) {
240 type_->EmitCStubReadOutVar(buffSizeName, memFlagName, parcelName, name_, ecName, gotoLabel, sb, prefix);
241 }
242 }
243
EmitJavaWriteVar(const std::string & parcelName,StringBuilder & sb,const std::string & prefix) const244 void ASTParameter::EmitJavaWriteVar(const std::string &parcelName, StringBuilder &sb, const std::string &prefix) const
245 {
246 if (attr_->value_ == ParamAttr::PARAM_IN) {
247 type_->EmitJavaWriteVar(parcelName, name_, sb, prefix);
248 } else {
249 if (type_->GetTypeKind() == TypeKind::TYPE_ARRAY) {
250 sb.Append(prefix).AppendFormat("if (%s == null) {\n", name_.c_str());
251 sb.Append(prefix + TAB).AppendFormat("%s.writeInt(-1);\n", parcelName.c_str());
252 sb.Append(prefix).Append("} else {\n");
253 sb.Append(prefix + TAB).AppendFormat("%s.writeInt(%s.length);\n", parcelName.c_str(), name_.c_str());
254 sb.Append(prefix).Append("}\n");
255 }
256 }
257 }
258
EmitJavaReadVar(const std::string & parcelName,StringBuilder & sb,const std::string & prefix) const259 void ASTParameter::EmitJavaReadVar(const std::string &parcelName, StringBuilder &sb, const std::string &prefix) const
260 {
261 if (attr_->value_ == ParamAttr::PARAM_OUT) {
262 type_->EmitJavaReadVar(parcelName, name_, sb, prefix);
263 }
264 }
265 } // namespace HDI
266 } // namespace OHOS