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 22 #include "codegen/code_emitter.h" 23 #include "util/string_builder.h" 24 25 namespace OHOS { 26 namespace Idl { 27 class TsCodeEmitter : public CodeEmitter { 28 public: TsCodeEmitter(MetaComponent * mc)29 TsCodeEmitter(MetaComponent* mc) 30 : CodeEmitter(mc) 31 {} 32 33 void EmitInterface() override; 34 35 void EmitInterfaceProxy() override; 36 37 void EmitInterfaceStub() override; 38 39 struct Parameter { 40 bool operator< (const Parameter ¶) const 41 { 42 if (this->attr_ == ATTR_IN) { 43 return this->attr_ < para.attr_; 44 } else { 45 return false; 46 } 47 } 48 std::string name_; 49 std::string type_; 50 unsigned int attr_ = 0; 51 }; 52 53 struct Method { 54 Parameter retParameter_; 55 std::vector<Parameter> parameters_; 56 std::string callbackName_; 57 std::string name_; 58 std::string exportFunction_; 59 unsigned int properties_; 60 }; 61 62 private: 63 void EmitInterfaceImports(StringBuilder& stringBuilder); 64 65 void EmitInterfaceProxyImports(StringBuilder& stringBuilder); 66 67 void EmitInterfaceSelfDefinedTypeImports(StringBuilder& stringBuilder); 68 69 void EmitInterfaceDefinition(StringBuilder& stringBuilder); 70 71 void EmitInterfaceMethods(StringBuilder& stringBuilder, const String& prefix); 72 73 void EmitInterfaceMethod(MetaMethod* metaMethod, StringBuilder& stringBuilder, const String& prefix); 74 75 void EmitInterfaceMethodCallback( 76 MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, const String& prefix, bool haveOutPara); 77 78 void EmitInterfaceMethodCallbackInner(MetaType* returnType, 79 MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, const String& prefix, bool haveOutPara); 80 81 void EmitInterfaceMethodParameter(MetaParameter* mp, StringBuilder& stringBuilder, const String& prefix); 82 83 void EmitMethodInParameter(StringBuilder& stringBuilder, const std::string& name, const std::string& type, 84 const String& prefix); 85 86 void EmitInterfaceMethodExportCallback(Method& m, const Parameter& para, bool isLast); 87 88 void EmitInterfaceProxyImpl(StringBuilder& stringBuilder); 89 90 void EmitInterfaceProxyConstructor(StringBuilder& stringBuilder, const String& prefix); 91 92 void EmitInterfaceProxyMethodImpls(StringBuilder& stringBuilder, const String& prefix); 93 94 void EmitInterfaceProxyMethodImpl(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, 95 const String& prefix); 96 97 void EmitInterfaceProxyMethodBody(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, 98 const String& prefix); 99 100 void EmitWriteMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& stringBuilder, 101 const String& prefix); 102 103 void EmitReadMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& stringBuilder, 104 const String& prefix); 105 106 void EmitInterfaceStubImpl(StringBuilder& stringBuilder); 107 108 void EmitInterfaceStubConstructor(StringBuilder& stringBuilder, const String& prefix); 109 110 void EmitInterfaceStubMethodImpls(StringBuilder& stringBuilder, const String& prefix); 111 112 void EmitInterfaceStubMethodImpl(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, 113 const String& prefix); 114 115 void EmitInterfaceStubMethodPromiseImpl(MetaMethod* metaMethod, int methodIndex, StringBuilder& stringBuilder, 116 const String& prefix, bool haveOutPara); 117 118 void EmitInterfaceMethodCommands(StringBuilder& stringBuilder); 119 120 void EmitLicense(StringBuilder& stringBuilder); 121 122 void EmitWriteVariable(const String& parcelName, const std::string& name, MetaType* mt, 123 StringBuilder& stringBuilder, 124 const String& prefix); 125 126 void EmitReadVariable(const String& parcelName, const std::string& name, MetaType* mt, unsigned int attributes, 127 StringBuilder& stringBuilder, 128 const String& prefix); 129 130 void EmitReadOutVariable(const String& parcelName, const std::string& name, MetaType* mt, 131 StringBuilder& stringBuilder, 132 const String& prefix); 133 134 void EmitReadArrayVariable(const String& parcelName, const std::string& name, MetaType* mt, 135 unsigned int attributes, 136 StringBuilder& stringBuilder, 137 const String& prefix); 138 139 void EmitWriteArrayVariable(const String& parcelName, const std::string& name, MetaType* mt, 140 StringBuilder& stringBuilder, 141 const String& prefix); 142 143 void EmitReadOutArrayVariable(const String& parcelName, const std::string& name, MetaType* mt, 144 StringBuilder& stringBuilder, 145 const String& prefix); 146 147 String EmitType(MetaType* mt); 148 149 String FileName(const String& name); 150 151 String MethodName(const String& name); 152 153 String ConstantName(const String& name); 154 155 String StubName(const String& name); 156 157 bool CheckInterfaceType(); 158 159 const std::string UnderlineAdded(const String& name); 160 161 const std::string SuffixAdded(const String& name); 162 163 std::vector<Method> methods_; 164 }; 165 } // namespace Idl 166 } // namespace OHOS 167 #endif // OHOS_IDL_TSCODEEMITTER_H 168