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