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