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