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
26namespace OHOS {
27namespace Idl {
28class TsCodeEmitter : public CodeEmitter {
29public:
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
63private:
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