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 ¶) 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