• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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_NATIVE_BUFFER:
57         case TypeKind::TYPE_POINTER: {
58             StringBuilder paramStr;
59             if (attr_->value_ == ParamAttr::PARAM_IN) {
60                 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).c_str(), name_.c_str());
61             } else {
62                 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
63             }
64             if (type_->GetTypeKind() == TypeKind::TYPE_STRING && attr_->value_ == ParamAttr::PARAM_OUT) {
65                 paramStr.AppendFormat(", uint32_t %sLen", name_.c_str());
66             }
67             return paramStr.ToString();
68         }
69         case TypeKind::TYPE_ARRAY:
70         case TypeKind::TYPE_LIST: {
71             StringBuilder paramStr;
72             if (attr_->value_ == ParamAttr::PARAM_IN) {
73                 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_IN).c_str(), name_.c_str());
74             } else {
75                 paramStr.AppendFormat("%s %s", type_->EmitCType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
76             }
77             paramStr.AppendFormat(
78                 ", uint32_t%s %sLen", (attr_->value_ == ParamAttr::PARAM_IN) ? "" : "*", name_.c_str());
79             return paramStr.ToString();
80         }
81         default:
82             return StringHelper::Format("unknow type %s", name_.c_str());
83     }
84     return sb.ToString();
85 }
86 
EmitCppParameter()87 std::string ASTParameter::EmitCppParameter()
88 {
89     if (attr_->value_ == ParamAttr::PARAM_IN) {
90         return StringHelper::Format("%s %s", type_->EmitCppType(TypeMode::PARAM_IN).c_str(), name_.c_str());
91     } else {
92         return StringHelper::Format("%s %s", type_->EmitCppType(TypeMode::PARAM_OUT).c_str(), name_.c_str());
93     }
94 }
95 
EmitJavaParameter()96 std::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_POINTER:
119         case TypeKind::TYPE_ARRAY:
120         case TypeKind::TYPE_LIST:
121         case TypeKind::TYPE_MAP: {
122             return StringHelper::Format("%s %s", type_->EmitJavaType(TypeMode::NO_MODE, false).c_str(), name_.c_str());
123         }
124         default:
125             return StringHelper::Format("unknow type %s", name_.c_str());
126     }
127 
128     return sb.ToString();
129 }
130 
EmitCLocalVar()131 std::string ASTParameter::EmitCLocalVar()
132 {
133     StringBuilder sb;
134     sb.AppendFormat("%s %s", type_->EmitCType(TypeMode::LOCAL_VAR).c_str(), name_.c_str());
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         case TypeKind::TYPE_NATIVE_BUFFER:
158             sb.Append(" = NULL");
159             break;
160         case TypeKind::TYPE_FILEDESCRIPTOR:
161             sb.Append(" = -1");
162             break;
163         default:
164             break;
165     }
166     sb.Append(";");
167     return sb.ToString();
168 }
169 
EmitCppLocalVar()170 std::string ASTParameter::EmitCppLocalVar()
171 {
172     StringBuilder sb;
173     sb.AppendFormat("%s %s", type_->EmitCppType(TypeMode::LOCAL_VAR).c_str(), name_.c_str());
174     switch (type_->GetTypeKind()) {
175         case TypeKind::TYPE_BOOLEAN:
176             sb.Append(" = false");
177             break;
178         case TypeKind::TYPE_BYTE:
179         case TypeKind::TYPE_SHORT:
180         case TypeKind::TYPE_INT:
181         case TypeKind::TYPE_LONG:
182         case TypeKind::TYPE_UCHAR:
183         case TypeKind::TYPE_USHORT:
184         case TypeKind::TYPE_UINT:
185         case TypeKind::TYPE_ULONG:
186         case TypeKind::TYPE_FLOAT:
187         case TypeKind::TYPE_DOUBLE:
188             sb.Append(" = 0");
189             break;
190         case TypeKind::TYPE_FILEDESCRIPTOR:
191             sb.Append(" = -1");
192             break;
193         case TypeKind::TYPE_SEQUENCEABLE:
194             sb.Append(" = nullptr");
195             break;
196         default:
197             break;
198     }
199     sb.Append(";");
200     return sb.ToString();
201 }
202 
EmitJavaLocalVar() const203 std::string ASTParameter::EmitJavaLocalVar() const
204 {
205     return "";
206 }
207 
EmitCWriteVar(const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const208 void ASTParameter::EmitCWriteVar(const std::string &parcelName, const std::string &ecName, const std::string &gotoLabel,
209     StringBuilder &sb, const std::string &prefix) const
210 {
211     if (type_ == nullptr) {
212         return;
213     }
214 
215     type_->EmitCWriteVar(parcelName, name_, ecName, gotoLabel, sb, prefix);
216 }
217 
EmitCProxyWriteOutVar(const std::string & parcelName,const std::string & ecName,const std::string & gotoLabel,StringBuilder & sb,const std::string & prefix) const218 bool ASTParameter::EmitCProxyWriteOutVar(const std::string &parcelName, const std::string &ecName,
219     const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const
220 {
221     if (type_ == nullptr) {
222         return false;
223     }
224 
225     if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) {
226         type_->EmitCProxyWriteOutVar(parcelName, name_, ecName, gotoLabel, sb, prefix);
227         return true;
228     }
229 
230     return false;
231 }
232 
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) const233 void ASTParameter::EmitCStubReadOutVar(const std::string &buffSizeName, const std::string &memFlagName,
234     const std::string &parcelName, const std::string &ecName, const std::string &gotoLabel, StringBuilder &sb,
235     const std::string &prefix) const
236 {
237     if (type_ == nullptr) {
238         return;
239     }
240 
241     if (type_->IsStringType() || type_->IsArrayType() || type_->IsListType()) {
242         type_->EmitCStubReadOutVar(buffSizeName, memFlagName, parcelName, name_, ecName, gotoLabel, sb, prefix);
243     }
244 }
245 
EmitJavaWriteVar(const std::string & parcelName,StringBuilder & sb,const std::string & prefix) const246 void ASTParameter::EmitJavaWriteVar(const std::string &parcelName, StringBuilder &sb, const std::string &prefix) const
247 {
248     if (attr_->value_ == ParamAttr::PARAM_IN) {
249         type_->EmitJavaWriteVar(parcelName, name_, sb, prefix);
250     } else {
251         if (type_->GetTypeKind() == TypeKind::TYPE_ARRAY) {
252             sb.Append(prefix).AppendFormat("if (%s == null) {\n", name_.c_str());
253             sb.Append(prefix + TAB).AppendFormat("%s.writeInt(-1);\n", parcelName.c_str());
254             sb.Append(prefix).Append("} else {\n");
255             sb.Append(prefix + TAB).AppendFormat("%s.writeInt(%s.length);\n", parcelName.c_str(), name_.c_str());
256             sb.Append(prefix).Append("}\n");
257         }
258     }
259 }
260 
EmitJavaReadVar(const std::string & parcelName,StringBuilder & sb,const std::string & prefix) const261 void ASTParameter::EmitJavaReadVar(const std::string &parcelName, StringBuilder &sb, const std::string &prefix) const
262 {
263     if (attr_->value_ == ParamAttr::PARAM_OUT) {
264         type_->EmitJavaReadVar(parcelName, name_, sb, prefix);
265     }
266 }
267 } // namespace HDI
268 } // namespace OHOS