1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef OHOS_IDL_TSCODEEMITTER_H
17 #define OHOS_IDL_TSCODEEMITTER_H
18 
19 #include <string>
20 #include <vector>
21 #include <unordered_map>
22 
23 #include "codegen/code_emitter.h"
24 #include "util/string_builder.h"
25 
26 namespace OHOS {
27 namespace Idl {
28 class TsCodeEmitter : public CodeEmitter {
29 public:
TsCodeEmitter(MetaComponent * mc)30     TsCodeEmitter(MetaComponent* mc)
31         : CodeEmitter(mc)
32     {}
33 
34     void EmitInterface() override;
35 
36     void EmitInterfaceProxy() override;
37 
38     void EmitInterfaceStub() override;
39 
40     struct Parameter {
41         bool operator< (const Parameter &para) const
42         {
43             if (this->attr_ == ATTR_IN) {
44                 return this->attr_ < para.attr_;
45             } else {
46                 return false;
47             }
48         }
49         std::string name_;
50         std::string type_;
51         unsigned int attr_ = 0;
52     };
53 
54     struct Method {
55         Parameter retParameter_;
56         std::vector<Parameter> parameters_;
57         std::string callbackName_;
58         std::string name_;
59         std::string exportFunction_;
60         unsigned int properties_;
61     };
62 
63 private:
64     void EmitInterfaceImports(StringBuilder& stringBuilder);
65 
66     void EmitInterfaceProxyImports(StringBuilder& stringBuilder);
67 
68     void EmitInterfaceSelfDefinedTypeImports(StringBuilder& stringBuilder);
69 
70     void EmitInterfaceDefinition(StringBuilder& stringBuilder);
71 
72     void EmitInterfaceMethods(StringBuilder& stringBuilder, const String& prefix);
73 
74     void EmitInterfaceMethod(MetaMethod* metaMethod, StringBuilder& stringBuilder, const String& prefix);
75 
76     void EmitInterfaceMethodLastPara(MetaMethod* metaMethod, const String& prefix, Method& method,
77         StringBuilder& methodStr, bool haveOutPara);
78 
79     void EmitInterfaceMethodCallback(
80         MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, const String& prefix, bool haveOutPara);
81 
82     void EmitInterfaceMethodCallbackInner(MetaType* returnType,
83         MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, const String& prefix, bool haveOutPara);
84 
85     void EmitInterfaceMethodParameter(MetaParameter* mp, StringBuilder& stringBuilder, const String& prefix);
86 
87     void EmitMethodInParameter(StringBuilder& stringBuilder, const std::string& name, const std::string& type,
88         const String& prefix);
89 
90     void EmitInterfaceMethodExportCallback(Method& m, const Parameter& para, bool isLast);
91 
92     void EmitInterfaceProxyImpl(StringBuilder& stringBuilder);
93 
94     void EmitInterfaceProxyConstructor(StringBuilder& stringBuilder, const String& prefix);
95 
96     void EmitInterfaceProxyMethodImpls(StringBuilder& stringBuilder, const String& prefix);
97 
98     void EmitInterfaceProxyMethodImpl(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder,
99         const String& prefix);
100 
101     void EmitInterfaceProxyMethodBody(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder,
102         const String& prefix);
103 
104     void EmitWriteMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& stringBuilder,
105         const String& prefix);
106 
107     void EmitReadMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& stringBuilder,
108         const String& prefix);
109 
110     void EmitInterfaceStubImpl(StringBuilder& stringBuilder);
111 
112     void EmitInterfaceStubConstructor(StringBuilder& stringBuilder, const String& prefix);
113 
114     void EmitInterfaceStubMethodImpls(StringBuilder& stringBuilder, const String& prefix);
115 
116     void EmitInterfaceStubMethodImpl(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder,
117         const String& prefix);
118 
119     void EmitInterfaceStubMethodPromiseImpl(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder,
120         const String& prefix, bool haveOutPara);
121 
122     void EmitInterfaceMethodCommands(StringBuilder& stringBuilder);
123 
124     void EmitLicense(StringBuilder& stringBuilder);
125 
126     void EmitWriteVariable(const String& parcelName, const std::string& name, MetaType* mt,
127         StringBuilder& stringBuilder, const String& prefix);
128 
129     void EmitWriteVariableObject(const String& parcelName, const std::string& name, MetaType* mt,
130         StringBuilder& stringBuilder, const String& prefix);
131 
132     void EmitReadVariable(const String& parcelName, const std::string& name, MetaType* mt, unsigned int attributes,
133         StringBuilder& stringBuilder, const String& prefix);
134 
135     void EmitReadVariableObject(const String& parcelName, const std::string& name, MetaType* mt,
136         unsigned int attributes, StringBuilder& stringBuilder, const String& prefix);
137 
138     void EmitReadOutVariable(const String& parcelName, const std::string& name, MetaType* mt,
139         StringBuilder& stringBuilder, const String& prefix);
140 
141     void EmitReadOutVariableObject(const String& parcelName, const std::string& name, MetaType* mt,
142         StringBuilder& stringBuilder, const String& prefix);
143 
144     void EmitReadArrayVariable(const String& parcelName, const std::string& name, MetaType* mt,
145         unsigned int attributes,
146         StringBuilder& stringBuilder,
147         const String& prefix);
148 
149     void EmitWriteArrayVariable(const String& parcelName, const std::string& name, MetaType* mt,
150         StringBuilder& stringBuilder,
151         const String& prefix);
152 
153     void EmitReadOutArrayVariable(const String& parcelName, const std::string& name, MetaType* mt,
154         StringBuilder& stringBuilder,
155         const String& prefix);
156 
157     String EmitType(MetaType* mt);
158 
159     String FileName(const String& name);
160 
161     String MethodName(const String& name);
162 
163     String ConstantName(const String& name);
164 
165     String StubName(const String& name);
166 
167     bool CheckInterfaceType();
168 
169     const std::string UnderlineAdded(const String& name);
170 
171     const std::string SuffixAdded(const String& name);
172 
173     std::vector<Method> methods_;
174 
175     std::unordered_map<TypeKind, std::string> typekind_read_array_ = {
176         {TypeKind::Boolean, "readBooleanArray"},
177         {TypeKind::Char, "readCharArray"},
178         {TypeKind::Byte, "readByteArray"},
179         {TypeKind::Short, "readShortArray"},
180         {TypeKind::Integer, "readIntArray"},
181         {TypeKind::Long, "readLongArray"},
182         {TypeKind::Float, "readFloatArray"},
183         {TypeKind::Double, "readDoubleArray"},
184         {TypeKind::String, "readStringArray"},
185     };
186 };
187 } // namespace Idl
188 } // namespace OHOS
189 #endif // OHOS_IDL_TSCODEEMITTER_H
190