• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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