From 5f2a02cbcefe60616b6173e978ddcf1b6b36049a Mon Sep 17 00:00:00 2001 From: zhangliang Date: Thu, 5 Aug 2021 11:11:41 +0800 Subject: [PATCH 01/14] init --- .gitignore | 24 + tools/tars2dart/CMakeLists.txt | 1 + tools/tars2dart/interface_analysis.cpp | 100 ++ tools/tars2dart/interface_analysis.h | 47 + tools/tars2dart/main.cpp | 159 ++ tools/tars2dart/tars2dart.cpp | 2020 ++++++++++++++++++++++++ tools/tars2dart/tars2dart.h | 384 +++++ tools/tars2dart/tars_filter.cpp | 61 + tools/tars2dart/tars_filter.h | 39 + 9 files changed, 2835 insertions(+) create mode 100644 .gitignore create mode 100644 tools/tars2dart/CMakeLists.txt create mode 100644 tools/tars2dart/interface_analysis.cpp create mode 100644 tools/tars2dart/interface_analysis.h create mode 100644 tools/tars2dart/main.cpp create mode 100644 tools/tars2dart/tars2dart.cpp create mode 100644 tools/tars2dart/tars2dart.h create mode 100644 tools/tars2dart/tars_filter.cpp create mode 100644 tools/tars2dart/tars_filter.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f1df49b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +CMakeFiles/ +*.cmake +bin/ +tmp/ +src/ +Makefile +CMakeCache.txt +download/ +*.a +install_manifest.txt +servant/servant/AdminF.h +servant/servant/AuthF.h +servant/servant/BaseF.h +servant/servant/ConfigF.h +servant/servant/EndpointF.h +servant/servant/LogF.h +servant/servant/NodeF.h +servant/servant/NotifyF.h +servant/servant/PropertyF.h +servant/servant/QueryF.h +servant/servant/StatF.h +servant/tup/RequestF.h +tools/tarsgrammar/tars.lex.cpp +tools/tarsgrammar/tars.tab.hpp diff --git a/tools/tars2dart/CMakeLists.txt b/tools/tars2dart/CMakeLists.txt new file mode 100644 index 00000000..c3b1977c --- /dev/null +++ b/tools/tars2dart/CMakeLists.txt @@ -0,0 +1 @@ +tars2language("tars2dart") diff --git a/tools/tars2dart/interface_analysis.cpp b/tools/tars2dart/interface_analysis.cpp new file mode 100644 index 00000000..72a16c5c --- /dev/null +++ b/tools/tars2dart/interface_analysis.cpp @@ -0,0 +1,100 @@ +/** + * Tencent is pleased to support the open source community by making Tars available. + * + * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +#include "interface_analysis.h" + +#include + +InterfaceAnalysis::InterfaceAnalysis() { +} + +void InterfaceAnalysis::analysis(const vector& interfacePtrs) { + for (size_t index = 0; index < interfacePtrs.size(); ++index) { + analysis(interfacePtrs[index]); + } +} + +void InterfaceAnalysis::analysis(const InterfacePtr& interfacePtr) { + const vector& operations = interfacePtr->getAllOperationPtr(); + + for (size_t operationIndex = 0; operationIndex < operations.size(); ++operationIndex) { + const OperationPtr& operation = operations[operationIndex]; + + analysis(operation->getReturnPtr()->getTypePtr()); + + const vector& paramDecls = operation->getAllParamDeclPtr(); + + for (size_t paramIndex = 0; paramIndex < paramDecls.size(); paramIndex++) { + const ParamDeclPtr& paramDeclPtr = paramDecls[paramIndex]; + analysis(paramDeclPtr->getTypeIdPtr()->getTypePtr()); + } + } +} + +void InterfaceAnalysis::analysis(const StructPtr& structPtr) { + const vector& allMembersPtr = structPtr->getAllMemberPtr(); + for (size_t index = 0; index < allMembersPtr.size(); ++index) { + analysis(allMembersPtr[index]->getTypePtr()); + } +} + +void InterfaceAnalysis::analysis(const TypePtr& typePtr) { + VectorPtr vPtr = VectorPtr::dynamicCast(typePtr); + if (vPtr) { + analysis(vPtr->getTypePtr()); + return ; + } + + MapPtr mPtr = MapPtr::dynamicCast(typePtr); + if (mPtr) { + analysis(mPtr->getLeftTypePtr()); + analysis(mPtr->getRightTypePtr()); + return ; + } + + StructPtr sPtr = StructPtr::dynamicCast(typePtr); + if (sPtr) { + // 说明已经分析过,并且找到了 + if (mAllStructs.find(sPtr->getSid()) != mAllStructs.end()) { + return ; + } + + mAllStructs.insert(std::pair(sPtr->getSid(), sPtr)); + analysis(sPtr); + } + + EnumPtr ePtr = EnumPtr::dynamicCast(typePtr); + if (ePtr) { + if (mAllEnums.find(ePtr->getSid()) != mAllEnums.end()) { + return ; + } + + mAllEnums.insert(std::pair(ePtr->getSid(), ePtr)); + } +} + +const std::map& InterfaceAnalysis::getAllStructs() const { + return mAllStructs; +} + +const std::map& InterfaceAnalysis::getAllEnums() const { + return mAllEnums; +} + +const std::map& InterfaceAnalysis::getAllConsts() const { + return mAllConsts; +} + + diff --git a/tools/tars2dart/interface_analysis.h b/tools/tars2dart/interface_analysis.h new file mode 100644 index 00000000..5b0e301f --- /dev/null +++ b/tools/tars2dart/interface_analysis.h @@ -0,0 +1,47 @@ +/** + * Tencent is pleased to support the open source community by making Tars available. + * + * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +#ifndef INTERFACE_ANALYSIS_H_ +#define INTERFACE_ANALYSIS_H_ + +#include "parse.h" +#include +#include + +class InterfaceAnalysis { +public: + InterfaceAnalysis(); + + const std::map& getAllStructs() const; + const std::map& getAllEnums() const; + const std::map& getAllConsts() const; + + void analysis(const InterfacePtr& interfacePtr); + void analysis(const vector& interfacePtrs); + +private: + void analysis(const StructPtr& structPtr); + void analysis(const TypePtr& typePtr); + +private: + std::map mAllStructs; + std::map mAllEnums; + std::map mAllConsts; +}; + + + +#endif /* INTERFACE_ANALYSIS_H_ */ diff --git a/tools/tars2dart/main.cpp b/tools/tars2dart/main.cpp new file mode 100644 index 00000000..7367dd8e --- /dev/null +++ b/tools/tars2dart/main.cpp @@ -0,0 +1,159 @@ +/** + * Tencent is pleased to support the open source community by making Tars available. + * + * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +#include "util/tc_option.h" +#include "util/tc_file.h" +#include "tars2dart.h" + +void usage() +{ + cout << "Usage : tars2dart [OPTION] tarsfile" << endl; + cout << " tars2dart support type: bool byte short int long float double vector map" << endl; + cout << "supported [OPTION]:" << endl; + cout << " --help help,print this" << endl; + cout << " --dir=DIRECTORY generate dart file to DIRECTORY(default to current)" << endl; + cout << " --base-package=NAME package prefix, default(com.qq.)" << endl; + cout << " --not-force-array default changed byte vector to byte[], use this for list" << endl; + cout << " --check-default= optional field not package(default package)" << endl; + cout << " --extends-package=NAME set the extends package name"<< endl; + cout << " --with-charset set charset, default UTF8" << endl; + cout << " --with-JavaBeanRule support javabeab, default not support" << endl; + cout << " --include=dir1;dir2;dir3 set search path of tars proto files" << endl; + + cout << endl; + exit(0); +} + +void check(vector &vTars) +{ + for(size_t i = 0; i < vTars.size(); i++) + { + string ext = tars::TC_File::extractFileExt(vTars[i]); + if(ext == "tars") + { + if(!tars::TC_File::isFileExist(vTars[i])) + { + cerr << "file '" << vTars[i] << "' not exists" << endl; + usage(); + exit(0); + } + } + else + { + cerr << "only support tars file." << endl; + exit(0); + } + } +} + +int main(int argc, char* argv[]) +{ + if(argc < 2) + { + usage(); + } + + tars::TC_Option option; + option.decode(argc, argv); + vector vTars = option.getSingle(); + + check(vTars); + + if(option.hasParam("help")) + { + usage(); + } + + Tars2Dart t2d; + + g_parse->setTars(option.hasParam("with-tars")); + + if(option.getValue("dir") != "") + { + t2d.setBaseDir(option.getValue("dir")); + } + else + { + t2d.setBaseDir("."); + } + + if(option.hasParam("base-package")) + { + t2d.setBasePackage(option.getValue("base-package")); + } + else + { + t2d.setBasePackage("prx."); + } + + if (option.hasParam("not-force-array")) + { + t2d.setForceArray(false); + } + else + { + t2d.setForceArray(true); + } + + if (option.hasParam("extends-package")) + { + t2d.setTafPacket(option.getValue("extends-package")); + } + + t2d.setCheckDefault(tars::TC_Common::lower(option.getValue("check-default")) == "true"?true:false); + + + if (option.hasParam("with-charset")) + { + t2d.setCharset(option.getValue("with-charset")); + } + else + { + t2d.setCharset("UTF8"); + } + + if(option.hasParam("with-JavaBeanRule")) + { + t2d.setWithJbr(true); + } + else + { + t2d.setWithJbr(false); + } + + t2d.setWithCompact(false); + t2d.setEnumCompact(true); + + t2d.setWithGenerateInterfaceDependencies(true); + t2d.setWithFilterRomTars(true); + + try + { + //增加include搜索路径 + g_parse->addIncludePath(option.getValue("include")); + + for(size_t i = 0; i < vTars.size(); i++) + { + g_parse->parse(vTars[i]); + t2d.createFile(vTars[i]); + } + }catch(exception& e) + { + cerr< + +#define TAB g_parse->getTab() +#define INC_TAB g_parse->incTab() +#define DEL_TAB g_parse->delTab() + +static string g_default_package = "com.tars"; +////////////////////////////////////////////////////////////////////////////////// +// +Tars2Dart::Tars2Dart() +{ + _bForceArray = false; + _bCheckDefault = false; + _bWithJbr = false; + _bWithCompact = false; + s_TARS_PACKAGE = g_default_package + TARS_PACKAGE; + s_PROXY_PACKAGE = g_default_package + PROXY_PACKAGE; + s_WUP_PACKAGE = g_default_package + WUP_PACKAGE; +} + +string Tars2Dart::writeTo(const TypeIdPtr& pPtr) const +{ + ostringstream s; + if (EnumPtr::dynamicCast(pPtr->getTypePtr())) + { + s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl; + } + else + { + s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl; + } + + return s.str(); +} + +string Tars2Dart::readFrom(const TypeIdPtr& pPtr) const +{ + ostringstream s; + if (EnumPtr::dynamicCast(pPtr->getTypePtr())) + { + s << TAB << "_is.read((tars::Int32&)" << pPtr->getId(); + } + else + { + s << TAB << "_is.read(" << pPtr->getId(); + } + + s << ", " << pPtr->getTag() << ", " << (pPtr->isRequire() ? "true" : "false") << ");" << endl; + + return s.str(); +} + +string Tars2Dart::display(const TypeIdPtr& pPtr) const +{ + ostringstream s; + if (EnumPtr::dynamicCast(pPtr->getTypePtr())) + { + s << TAB << "_ds.display((tars::Int32)" << pPtr->getId() << ",\"" << pPtr->getId() << "\");" << endl;; + } + else + { + s << TAB << "_ds.display(" << pPtr->getId() << ",\"" << pPtr->getId() << "\");" << endl;; + } + + return s.str(); +} + +string Tars2Dart::toTypeInit(const TypePtr& pPtr) const +{ + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); + if (bPtr) + { + switch (bPtr->kind()) + { + case Builtin::KindBool: + return "false;"; + case Builtin::KindByte: + return "0;"; + case Builtin::KindShort: + return "0;"; + case Builtin::KindInt: + return "0;"; + case Builtin::KindLong: + return "0L;"; + case Builtin::KindFloat: + return "0.0f;"; + case Builtin::KindDouble: + return "0.0;"; + case Builtin::KindString: + return "\"\";"; + default: + return ""; + } + } + + VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); + if (vPtr) + { + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + if (bPtr && bPtr->kind() == Builtin::KindByte) + { + return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + tostr(vPtr->getTypePtr()) + "[1];"; + } + + if (_bForceArray) + { + string sType; + size_t iPosBegin, iPosEnd; + sType = tostr(vPtr->getTypePtr()); + //map<>的数组去掉 '<...>' + if ((iPosBegin = sType.find("<")) != string::npos && (iPosEnd = sType.rfind(">")) != string::npos) + { + sType = sType.substr(0, iPosBegin) + sType.substr(iPosEnd + 1); + } + //[] (数组)的数组变为[1] + sType = tars::TC_Common::replace(sType, "[]", "[1]"); + return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + sType + "[1];";; + } + + return "new " + tostrVector(vPtr) + "();"; + } + + MapPtr mPtr = MapPtr::dynamicCast(pPtr); + if (mPtr) return "new " + tostrMap(mPtr, true) + "();"; + + StructPtr sPtr = StructPtr::dynamicCast(pPtr); + if (sPtr) return "new " + tostrStruct(sPtr) + "();"; + + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); + if (ePtr) return "0;"; + + return ""; +} + + +string Tars2Dart::toObjStr(const TypePtr& pPtr) const +{ + string sType = tostr(pPtr); + + if (sType == "boolean") return "Boolean"; + if (sType == "byte") return "Byte"; + if (sType == "short") return "Short"; + if (sType == "int") return "Integer"; + if (sType == "long") return "Long"; + if (sType == "float") return "Float"; + if (sType == "double") return "Double"; + + return sType; +} + +bool Tars2Dart::isObjType(const TypePtr& pPtr) const +{ + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); + if (ePtr) + { + return false; + } + + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); + if (bPtr) + { + switch (bPtr->kind()) + { + case Builtin::KindBool: + return false; + case Builtin::KindByte: + return false; + case Builtin::KindShort: + return false; + case Builtin::KindInt: + return false; + case Builtin::KindLong: + return false; + case Builtin::KindFloat: + return false; + case Builtin::KindDouble: + return false; + default: + return true; + } + } + + return true; +} + +string Tars2Dart::tostr(const TypePtr& pPtr) const +{ + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); + if (bPtr) return tostrBuiltin(bPtr); + + VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); + if (vPtr) return tostrVector(vPtr); + + MapPtr mPtr = MapPtr::dynamicCast(pPtr); + if (mPtr) return tostrMap(mPtr); + + StructPtr sPtr = StructPtr::dynamicCast(pPtr); + if (sPtr) return tostrStruct(sPtr); + + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); + if (ePtr) return tostrEnum(ePtr); + + if (!pPtr) return "void"; + + assert(false); + return ""; +} + +/*******************************BuiltinPtr********************************/ +string Tars2Dart::tostrBuiltin(const BuiltinPtr& pPtr) const +{ + string s; + + switch (pPtr->kind()) + { + case Builtin::KindBool: + s = "boolean"; + break; + case Builtin::KindByte: + s = "byte"; + break; + case Builtin::KindShort: + s = "short"; + break; + case Builtin::KindInt: + s = "int"; + break; + case Builtin::KindLong: + s = "long"; + break; + case Builtin::KindFloat: + s = "float"; + break; + case Builtin::KindDouble: + s = "double"; + break; + case Builtin::KindString: + s = "String"; + break; + case Builtin::KindVector: + s = "java.util.ArrayList"; + break; + case Builtin::KindMap: + s = "java.util.HashMap"; + break; + default: + assert(false); + break; + } + + return s; +} +/*******************************VectorPtr********************************/ +string Tars2Dart::tostrVector(const VectorPtr& pPtr) const +{ + string s; + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr()); + if (bPtr && bPtr->kind() == Builtin::KindByte) + { + s = "byte []"; + } + else if (_bForceArray) + { + s = tostr(pPtr->getTypePtr()) + "[]"; + } + else + { + s = "java.util.ArrayList" + string("<") + toObjStr(pPtr->getTypePtr()) + ">"; + } + return s; +} + +/*******************************MapPtr********************************/ +string Tars2Dart::tostrMap(const MapPtr& pPtr, bool bNew) const +{ + string s; + if (!bNew) + { + s = "java.util.Map"; + } + else + { + s = "java.util.HashMap"; + } + s += string("<") + toObjStr(pPtr->getLeftTypePtr()) + ", " + toObjStr(pPtr->getRightTypePtr()) + ">"; + + return s; +} + +string Tars2Dart::tostrStruct(const StructPtr& pPtr) const +{ + return _packagePrefix + tars::TC_Common::replace(pPtr->getSid(), "::", "."); +} + +string Tars2Dart::tostrEnum(const EnumPtr& pPtr) const +{ + return "int"; +} + +///////////////////////////////////////////////////////////////////// + +string Tars2Dart::MD5(const StructPtr& pPtr) const +{ + string s; + vector& member = pPtr->getAllMemberPtr(); + for (size_t j = 0; j < member.size(); j++) + { + s += "_" + tostr(member[j]->getTypePtr()); + } + + return "\"" + tars::TC_MD5::md5str(s) + "\""; +} + +string Tars2Dart::generateDart(const ParamDeclPtr& pPtr) const +{ + ostringstream s; + + TypePtr typePtr = pPtr->getTypeIdPtr()->getTypePtr(); + if (!pPtr->isOut()) + { + s << tostr(typePtr); + } + + s << " " << pPtr->getTypeIdPtr()->getId(); + + return s.str(); +} + +struct SortOperation +{ + bool operator ()(const OperationPtr& o1, const OperationPtr& o2) + { + return o1->getId() < o2->getId(); + } +}; + +string Tars2Dart::generateDart(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const +{ + ostringstream s; + generateAndroidStub(pPtr, nPtr); + return s.str(); +} + +string Tars2Dart::generateDefautElem(const TypePtr& pPtr, const string& sElemName) const +{ + static int iCount = 0; + ostringstream s; + + if (sElemName.empty()) + { + iCount++; + } + + VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); + if (vPtr) + { + int iId = iCount; + string sVar = sElemName.empty() ? "__var_" + tars::TC_Common::tostr(iId) : sElemName; + if (sElemName.empty()) + { + s << TAB << toObjStr(vPtr) << " " << sVar + << " = " << toTypeInit(vPtr) << endl; + } + + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + if (bPtr && bPtr->kind() == Builtin::KindByte) + { + iCount++; + s << TAB << "byte __var_" << tars::TC_Common::tostr(iCount) + << " = 0;" << endl; + + s << TAB << "((" << tostr(vPtr->getTypePtr()) << "[])" << sVar + << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl; + } + else if (_bForceArray) + { + s << generateDefautElem(vPtr->getTypePtr(), ""); + s << TAB << "((" << tostr(vPtr->getTypePtr()) << "[])" << sVar + << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl; + } + else + { + s << generateDefautElem(vPtr->getTypePtr(), ""); + s << TAB << "((" << tostr(pPtr) << ")" << sVar << ").add(__var_" << tars::TC_Common::tostr(iId + 1) << ");" << endl; + } + + return s.str(); + } + + MapPtr mPtr = MapPtr::dynamicCast(pPtr); + if (mPtr) + { + int iId = iCount; + string sVar = sElemName.empty() ? "__var_" + tars::TC_Common::tostr(iId) : sElemName; + + if (sElemName.empty()) + { + s << TAB << toObjStr(mPtr) << " " << sVar + << " = " << toTypeInit(mPtr) << endl; + } + + s << generateDefautElem(mPtr->getLeftTypePtr(), ""); + int iIdRight = iCount + 1; + s << generateDefautElem(mPtr->getRightTypePtr(), ""); + + s << TAB << sVar << ".put(__var_" << tars::TC_Common::tostr(iId + 1) << ", __var_" + << tars::TC_Common::tostr(iIdRight) << ");" << endl; + + return s.str(); + } + + //首个非map、vector调用,不用生成默认元素 + if (!sElemName.empty()) + { + return s.str(); + } + + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); + if (bPtr) + { + s << TAB << toObjStr(bPtr) << " __var_" << tars::TC_Common::tostr(iCount) + << " = " << toTypeInit(bPtr) << endl; + return s.str(); + } + + StructPtr sPtr = StructPtr::dynamicCast(pPtr); + if (sPtr) + { + s << TAB << toObjStr(sPtr) << " __var_" << tars::TC_Common::tostr(iCount) + << " = " << toTypeInit(sPtr) << endl; + return s.str(); + } + + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); + if (ePtr) + { + s << TAB << toObjStr(ePtr) << " __var_" << tars::TC_Common::tostr(iCount) + << " = " << toTypeInit(ePtr) << endl; + return s.str(); + } + + return s.str(); +} + + +/******************************StructPtr***************************************/ +string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) const +{ + ostringstream s; + s << g_parse->printHeaderRemark(); + + vector key = pPtr->getKey(); + vector& member = pPtr->getAllMemberPtr(); + + s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; + s << endl; + + bool bHasImpPrefix = false; + +// if (_bWithWsp) +// { +// s << TAB << "import java.util.HashMap" << ";" << endl; +// s << endl; +// +// s << TAB << "import "<< s_WSP_PACKAGE << ";" << endl; +// s << endl; +// } + +// if (_bJson) +// { +// s << TAB << "import com.qq.component.json.JSON;" << endl; +// s << TAB << "import com.qq.component.json.JSONException;" << endl; +// s << endl; +// } + + s << TAB << "public final class " << pPtr->getId() << " extends " << s_TARS_PACKAGE << ".TarsStruct"; +// if (_bWithWsp) +// { +// s << " implements WspStruct"; +// bHasImpPrefix = true; +// } + + if (key.size() > 0) + { + if (bHasImpPrefix) + { + s << ", Comparable<" << pPtr->getId() << ">"; + } + else + { + s << " implements Comparable<" << pPtr->getId() << ">"; + bHasImpPrefix = true; + } + } + + if (!_bWithCompact) + { + if (bHasImpPrefix) + { + s << ", java.lang.Cloneable"; + } + else + { + s << " implements java.lang.Cloneable"; + } + } + s << endl; + s << TAB << "{" << endl; + INC_TAB; + + if (!_bWithCompact) + { + //生成结构名称 + s << TAB << "public String className()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return " << "\"" << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + + // 生成带包前缀的结构名 + s << TAB << "public String fullClassName()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return " << "\"" << _packagePrefix << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + } + +// if (_bWithWsp) +// { +// s << TAB <<"private HashMap arr = new HashMap();"<hasDefault()) + { + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + //string转义 + if (bPtr && bPtr->kind() == Builtin::KindString) + { + sDefalut = tars::TC_Common::replace(member[i]->def(), "\"", "\\\""); + //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")\"" + sDefalut + "\""; + sDefalut = " = \"" + sDefalut + "\""; + } + else if (ePtr) + { + + std::string sdef = member[i]->def(); + std::string::size_type pos = sdef.rfind("::"); + if (pos != std::string::npos && pos + 2 < sdef.size()) + { + sdef = sdef.substr(pos + 2); + } + + if (_bEnumCompact) + { + sDefalut = " = " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "._" + sdef; + } + else + { + sDefalut = " = " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "." + sdef + ".value()"; + } + } + else + { + //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")" + member[i]->def(); + sDefalut = " = " + member[i]->def(); + } + s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << sDefalut << ";" << endl; + } + else + { + sDefalut = " = " + toTypeInit(member[i]->getTypePtr()); + //s << TAB << "public " << tostr(member[i]->getTypePtr()) << " "<< member[i]->getId() << sDefalut << endl; + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + if ((!bPtr && !ePtr) || (bPtr && bPtr->kind() == Builtin::KindString)) + { + s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << " = null;" << endl; + } + else + { + s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << sDefalut << endl; + } + } + s << endl; + } + + if (!_bWithCompact) + { + //成员变量get/set for java bean + for (size_t i = 0; i < member.size(); i++) + { + string sName = ""; + //支持javabean规范,并且第二个字符是大写 + if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z') + { + sName = member[i]->getId(); + } + else + { + sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); + } + s << TAB << "public " << tostr(member[i]->getTypePtr()) << " get" << sName + << "()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return " << member[i]->getId() << ";" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + s << TAB << "public void " << " set" << sName << "(" << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << ")" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl; +// if (_bWithWsp) +// { +// s << TAB <<"arr.put(\""<getId()<<"\","<< member[i]->getId()<<");"<getId() << "()" << endl; + s << TAB << "{" << endl; + INC_TAB; +// if (_bWithWsp) +// { +// s << TAB << "buildIndex();" << endl; +// } +// else + { +/* + * 无参的够造函数,不用调用成员设置方法 + for (size_t i = 0; i < member.size(); i++) + { + string sName = ""; + //支持javabean规范,并且第二个字符是大写 + if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' ) + { + sName = member[i]->getId(); + } + else + { + sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); + } + s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl; + } +*/ + } + + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //(constructor)(...) + s << TAB << "public " << pPtr->getId() << "("; + for (size_t i = 0; i < member.size(); i++) + { + s << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() + << ((i < member.size() - 1) ? ", " : ""); + } + s << ")" << endl; + s << TAB << "{" << endl; + INC_TAB; + for (size_t i = 0; i < member.size(); i++) + { + s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl; + } + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //compareTo() + if (key.size() > 0) + { + s << TAB << "public int compareTo(" << pPtr->getId() << " o)" << endl; + s << TAB << "{" << endl; + INC_TAB; + + s << TAB << "int[] r = " << endl; + s << TAB << "{" << endl; + INC_TAB; + + for (size_t i = 0; i < key.size(); i++) + { + s << TAB << s_TARS_PACKAGE << ".TarsUtil.compareTo(" << key[i] << ", o." + << key[i] << ")" << ((i < key.size() - 1) ? ", " : "") << endl; + } + DEL_TAB; + s << TAB << "};" << endl; + + s << TAB << "for(int i = 0; i < r.length; ++i)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "if(r[i] != 0) return r[i];" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "return 0;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + } + + if (!_bWithCompact) + { + //equals() + s << TAB << "public boolean equals(Object o)" << endl; + s << TAB << "{" << endl; + INC_TAB; + + s << TAB << "if(o == null)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return false;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + s << TAB << pPtr->getId() << " t = (" << pPtr->getId() << ") o;" << endl; + s << TAB << "return (" << endl; + + INC_TAB; + + //定义了key + if (key.size() > 0) + { + for (size_t i = 0; i < key.size(); i++) + { + s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << key[i] << ", t." << key[i] << ")" + << ((i < key.size() - 1) ? " && " : " );") << endl; + } + } + else + { + //使用所有元素比较 + for (size_t i = 0; i < member.size(); i++) + { + s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << member[i]->getId() << ", t." << member[i]->getId() << ")" + << ((i < member.size() - 1) ? " && " : " );") << endl; + } + } + DEL_TAB; + + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + } + + if (!_bWithCompact) + { + //hashCode() + if (key.size() > 0) + { + s << TAB << "public int hashCode()" << endl; + s << TAB << "{" << endl; + INC_TAB; + + s << TAB << "int [] hc = { " << endl; + INC_TAB; + for (size_t i = 0; i < key.size(); i++) + { + s << TAB << s_TARS_PACKAGE << ".TarsUtil.hashCode(" << key[i] + << ")" << ((i < key.size() - 1) ? ", " : "") << endl; + } + DEL_TAB; + s << TAB << "};" << endl; + s << TAB << "return java.util.Arrays.hashCode(hc);" << endl; + + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + } + else //生成异常代码 + { + s << TAB << "public int hashCode()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "try" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "throw new Exception(\"Need define key first!\");" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "catch(Exception ex)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "ex.printStackTrace();" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "return 0;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + } + } + + if (!_bWithCompact) + { + //clone() + s << TAB << "public java.lang.Object clone()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "java.lang.Object o = null;" << endl; + s << TAB << "try" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "o = super.clone();" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "catch(CloneNotSupportedException ex)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "assert false; // impossible" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "return o;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + } + + //writeTo() + s << TAB << "public void writeTo(" << s_TARS_PACKAGE << ".TarsOutputStream _os)" << endl; + s << TAB << "{" << endl; + INC_TAB; + for (size_t i = 0; i < member.size(); i++) + { + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + if (!member[i]->isRequire() && ((!bPtr && !ePtr) || (bPtr && bPtr->kind() == Builtin::KindString))) + { + s << TAB << "if (null != " << member[i]->getId() << ")" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; + DEL_TAB; + s << TAB << "}" << endl; + } + else if (EnumPtr::dynamicCast(member[i]->getTypePtr())) + { + s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; + } + else + { + //s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl; + MapPtr mPtr = MapPtr::dynamicCast(member[i]->getTypePtr()); + VectorPtr vPtr = VectorPtr::dynamicCast(member[i]->getTypePtr()); + + if (!_bCheckDefault || member[i]->isRequire() || (!member[i]->hasDefault() && !mPtr && !vPtr)) + { + s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; + } + else + { + string sDefault = member[i]->def(); + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + + if (bPtr && bPtr->kind() == Builtin::KindString) + { + sDefault = "\"" + tars::TC_Common::replace(member[i]->def(), "\"", "\\\"") + "\""; + } + + if (mPtr) + { + s << TAB << "if (" << member[i]->getId() << ".size() > 0)" << endl; + } + else if (vPtr) + { + BuiltinPtr newPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + if (newPtr && newPtr->kind() == Builtin::KindByte) + { + s << TAB << "if (" << member[i]->getId() << ".length > 0)" << endl; + } + else if (_bForceArray) + { + s << TAB << "if (" << member[i]->getId() << ".length > 0)" << endl; + } + else + { + s << TAB << "if (" << member[i]->getId() << ".size() > 0)" << endl; + } + } + else if (bPtr && bPtr->kind() == Builtin::KindString) + { + s << TAB << "if (!(" << sDefault << ".equals(" << member[i]->getId() << ")))" << endl; + } + else + { + s << TAB << "if (" << member[i]->getId() << " != " << sDefault << ")" << endl; + } + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; + DEL_TAB; + s << TAB << "}" << endl; + } + } + } + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + for (size_t i = 0; i < member.size(); i++) + { + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + if (!bPtr) + { + string prefix = "cache_"; + s << TAB << "static " << tostr(member[i]->getTypePtr()) << " cache_" << member[i]->getId() << ";" << endl; + s << TAB << "static {" << endl; + INC_TAB; + s << TAB << prefix << member[i]->getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl; + s << generateDefautElem(member[i]->getTypePtr(), prefix + member[i]->getId()); + DEL_TAB; + s << TAB << "}" << endl; + } + } + s << endl; + //readFrom() + s << TAB << "public void readFrom(" << s_TARS_PACKAGE << ".TarsInputStream _is)" << endl; + s << TAB << "{" << endl; + INC_TAB; + for (size_t i = 0; i < member.size(); i++) + { + string prefix = ""; + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + if (!bPtr && !ePtr) + { + prefix = "cache_"; + } + //if (!bPtr && !ePtr) + //{ + // prefix = "cache_"; + // //放置默认元素用于识别类型 + // s << TAB <<"if(null == "<getId()<<")"<getId()<<" = " << toTypeInit(member[i]->getTypePtr()) << endl; + // s << generateDefautElem(member[i]->getTypePtr(), prefix+member[i]->getId()); + // DEL_TAB; + // s << TAB <<"}"<getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl; + // //s << generateDefautElem(member[i]->getTypePtr(), member[i]->getId()); + + //} + + //string特殊处理 + if (bPtr && bPtr->kind() == Builtin::KindString) + { + s << TAB << "this." << member[i]->getId() << " = " + << " _is.readString(" << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + } + else + { + s << TAB << "this." << member[i]->getId() << " = (" + tostr(member[i]->getTypePtr()) + ")" + << " _is.read(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + } + } + + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + +// if (_bJson) +// { +// //writeToJsonString +// s << TAB << "public String writeToJsonString() throws JSONException" << endl; +// s << TAB << "{" << endl; +// INC_TAB; +// s << TAB << "return JSON.toJSONString(this);" << endl; +// DEL_TAB; +// s << TAB << "}" << endl; +// s << endl; +// +// //readFromJsonString +// s << TAB << "public void readFromJsonString(String text) throws JSONException" << endl; +// s << TAB << "{" << endl; +// INC_TAB; +// s << TAB << pPtr->getId() << " temp = " << "JSON.parseObject(text, " << pPtr->getId() << ".class);" << endl; +// for (size_t i = 0; i < member.size(); i++) +// { +// s << TAB << "this." << member[i]->getId() << " = temp." << member[i]->getId() << ";" << endl; +// } +// DEL_TAB; +// s << TAB << "}" << endl; +// s << endl; +// } + + if (!_bWithCompact) + { + //display() + s << TAB << "public void display(java.lang.StringBuilder _os, int _level)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << s_TARS_PACKAGE << ".TarsDisplayer _ds = new " << s_TARS_PACKAGE << ".TarsDisplayer(_os, _level);" << endl; + for (size_t i = 0; i < member.size(); i++) + { + s << TAB << "_ds.display(" << member[i]->getId() + << ", \"" << member[i]->getId() << "\");" << endl; + } + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //displaySimple() +// s << TAB << "public void displaySimple(java.lang.StringBuilder _os, int _level)" << endl; +// s << TAB << "{" << endl; +// INC_TAB; +// s << TAB << s_TARS_PACKAGE << ".TarsDisplayer _ds = new " << s_TARS_PACKAGE << ".TarsDisplayer(_os, _level);" << endl; +// for (size_t i = 0; i < member.size(); i++) +// { +// if(i != member.size() - 1) +// { +// s << TAB << "_ds.displaySimple(" << member[i]->getId() << ", true);" << endl; +// } +// else +// { +// s << TAB << "_ds.displaySimple(" << member[i]->getId() << ", false);" << endl; +// } +// } +// DEL_TAB; +// s << TAB << "}" << endl; +// s << endl; + } + + +// if (_bWithWsp) +// { +// s << TAB << "public Object getFieldByName(String name)" << endl; +// s << TAB << "{" << endl; +// INC_TAB; +// s << TAB <<"return arr.get(name);"<getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' ) +// { +// sName = member[i]->getId(); +// } +// else +// { +// sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); +// } +// s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl; +// } +// DEL_TAB; +// s << TAB << "}" << endl; +// } + + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + + + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java"; + tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); + tars::TC_File::save2file(fileJava, s.str()); + + return s.str(); +} + +/******************************EnumPtr***************************************/ +string Tars2Dart::generateDart(const EnumPtr& pPtr, const NamespacePtr& nPtr) const +{ + ostringstream s; + s << g_parse->printHeaderRemark(); + + s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; + s << endl; + + s << TAB << "public final class " << pPtr->getId() << " implements java.io.Serializable" << endl; + s << TAB << "{" << endl; + INC_TAB; + + if (_bEnumCompact) + { + //成员变量 + vector& member = pPtr->getAllMemberPtr(); + bool bFlag = false; + string sValue; + for (size_t i = 0; i < member.size(); i++) + { + s << TAB << "public static final int _" << member[i]->getId() << " = "; + if (member[i]->hasDefault()) + { + bFlag = true; + sValue = member[i]->def(); + s << sValue; + } + else + { + if (bFlag == true) + { + assert(i > 0); + string stem = tars::TC_Common::tostr(tars::TC_Common::strto(sValue) + 1); + sValue = stem; + s << stem; + } + else + { + s << tars::TC_Common::tostr(i); + } + } + s << ";" << endl; + } + } + else + { + //成员变量 + vector& member = pPtr->getAllMemberPtr(); + s << TAB << "private static " << pPtr->getId() + << "[] __values = new " << pPtr->getId() + << "[" << tars::TC_Common::tostr(member.size()) << "];" << endl; + s << TAB << "private int __value;" << endl; + + s << TAB << "private String __T = new String();" << endl; + s << endl; + + bool bFlag = false; + string sValue; + for (size_t i = 0; i < member.size(); i++) + { + s << TAB << "public static final int _" << member[i]->getId() << " = "; + if (member[i]->hasDefault()) + { + bFlag = true; + sValue = member[i]->def(); + s << sValue; + } + else + { + if (bFlag == true) + { + assert(i > 0); + string stem = tars::TC_Common::tostr(tars::TC_Common::strto(sValue) + 1); + sValue = stem; + s << stem; + } + else + { + s << tars::TC_Common::tostr(i); + } + } + s << ";" << endl; + s << TAB << "public static final " << pPtr->getId() << " " + << member[i]->getId() << " = new " << pPtr->getId() << "(" << i << ",_" + << member[i]->getId() << ",\"" << member[i]->getId() << "\");" << endl; + } + s << endl; + + + //convert(int) + s << TAB << "public static " << pPtr->getId() << " convert(int val)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "for(int __i = 0; __i < __values.length; ++__i)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "if(__values[__i].value() == val)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return __values[__i];" << endl; + DEL_TAB; + s << TAB << "}" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "assert false;" << endl; + s << TAB << "return null;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //convert(String) + s << TAB << "public static " << pPtr->getId() << " convert(String val)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "for(int __i = 0; __i < __values.length; ++__i)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "if(__values[__i].toString().equals(val))" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return __values[__i];" << endl; + DEL_TAB; + s << TAB << "}" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "assert false;" << endl; + s << TAB << "return null;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //value() + s << TAB << "public int value()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return __value;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //toString() + s << TAB << "public String toString()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "return __T;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + //(constructor)(int) + s << TAB << "private " << pPtr->getId() << "(int index, int val, String s)" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "__T = s;" << endl; + s << TAB << "__value = val;" << endl; + s << TAB << "__values[index] = this;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + } + DEL_TAB; + s << TAB << "}" << endl; + + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java"; + tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); + tars::TC_File::save2file(fileJava, s.str()); + + + return s.str(); +} + +/******************************ConstPtr***************************************/ +void Tars2Dart::generateDart(const ConstPtr& pPtr, const NamespacePtr& nPtr) const +{ + ostringstream s; + s << g_parse->printHeaderRemark(); + + //const类型的包单独放到一个const目录下面 + s << TAB << "package " << _packagePrefix << nPtr->getId() << ".cnst" << ";" << endl; + s << endl; + + s << TAB << "public interface " << pPtr->getTypeIdPtr()->getId() << endl; + s << TAB << "{" << endl; + INC_TAB; + + //TODO: String转义 / long 识别 / byte 范围 + if (pPtr->getConstGrammarPtr()->t == ConstGrammar::STRING) + { + string tmp = tars::TC_Common::replace(pPtr->getConstGrammarPtr()->v, "\"", "\\\""); + s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = \"" + << tmp << "\";" << endl; + } + else if (tostr(pPtr->getTypeIdPtr()->getTypePtr()) == "long") + { + s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = " + << pPtr->getConstGrammarPtr()->v << "L;" << endl; + } + else + { + s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = " + << pPtr->getConstGrammarPtr()->v << ";" << endl; + } + + DEL_TAB; + s << TAB << "}" << endl; + + string fileJava = getFilePath(nPtr->getId()) + "/cnst/" + pPtr->getTypeIdPtr()->getId() + ".java"; + tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId() + "/cnst/")); + tars::TC_File::save2file(fileJava, s.str()); + + return; +} + +/******************************Tars2Dart***************************************/ + +void Tars2Dart::generateDart(const ContextPtr& pPtr) const +{ + ostringstream s; + + vector namespaces = pPtr->getNamespaces(); + + for (size_t i = 0; i < namespaces.size(); i++) + { + generateDart(namespaces[i]); + } + +} + +void Tars2Dart::createFile(const string& file) +{ + std::vector contexts = g_parse->getContexts(); + for (size_t i = 0; i < contexts.size(); i++) + { + if (file == contexts[i]->getFileName()) + { + generateDart(contexts[i]); + } + } +} + +void Tars2Dart::setBaseDir(const string& dir) +{ + _baseDir = dir; +} + + +void Tars2Dart::setBasePackage(const string& prefix) +{ + _packagePrefix = prefix; + if (_packagePrefix.length() != 0 + && _packagePrefix.substr(_packagePrefix.length() - 1, 1) != ".") + { + _packagePrefix += "."; + } +} + + +string Tars2Dart::getFilePath(const string& ns) const +{ + return _baseDir + FILE_SEP + tars::TC_Common::replace(_packagePrefix, ".", FILE_SEP) + FILE_SEP + ns + FILE_SEP; +} + +// 增加的函数 +static string firstCharUpper(const string& castStr) { + string resultStr = castStr; + if (castStr.size() > 0) { + resultStr[0] = toupper(castStr[0]); + } + return resultStr; +} + +void Tars2Dart::generateDart(const NamespacePtr &pPtr) const +{ + vector &is = pPtr->getAllInterfacePtr(); + vector &ss = pPtr->getAllStructPtr(); + vector &es = pPtr->getAllEnumPtr(); + vector &cs = pPtr->getAllConstPtr(); + + InterfaceAnalysis interfaceAnalysis; + + if (_bWithGenerateInterfaceDependencies) { + interfaceAnalysis.analysis(is); + } + + for (size_t i = 0; i < is.size(); i++) + { + generateDart(is[i], pPtr); + } + + TarsFilter romTarsFilter; + std::map needGenerateStructMap; + if (_bWithGenerateInterfaceDependencies) { + if (_bWithFilterRomTars) { + romTarsFilter.filterStructs( + interfaceAnalysis.getAllStructs(), needGenerateStructMap); + } else { + needGenerateStructMap = interfaceAnalysis.getAllStructs(); + } + } + + for (size_t i = 0; i < ss.size(); i++) + { + generateDart(ss[i], pPtr); + needGenerateStructMap.erase(ss[i]->getSid()); + } + for (std::map::const_iterator + it = needGenerateStructMap.begin(); it != needGenerateStructMap.end(); ++it) { + generateDart(it->second, pPtr); + } + + std::map needGenerateEnumMap; + if (_bWithGenerateInterfaceDependencies) { + if (_bWithFilterRomTars) { + romTarsFilter.filterEnums( + interfaceAnalysis.getAllEnums(), needGenerateEnumMap); + } else { + needGenerateEnumMap = interfaceAnalysis.getAllEnums(); + } + } + + for (size_t i = 0; i < es.size(); i++) + { + generateDart(es[i], pPtr); + needGenerateEnumMap.erase(es[i]->getSid()); + } + for (std::map::const_iterator + it = needGenerateEnumMap.begin(); it != needGenerateEnumMap.end(); ++it) { + generateDart(it->second, pPtr); + } + + for (size_t i = 0; i < cs.size(); i++) + { + generateDart(cs[i], pPtr); + } + + return; +} + +// 增加的实现 +string Tars2Dart::generateConstructor(const TypePtr& vType) const { + stringstream s; + + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vType); + if (bPtr) { + switch (bPtr->kind()) { + case Builtin::KindBool: { + s << "Boolean.valueOf(false)"; + } break; + case Builtin::KindByte: { + s << "Byte.valueOf((byte)0)"; + } break; + case Builtin::KindShort: { + s << "Short.valueOf((short)0)"; + } break; + case Builtin::KindInt: { + s << "Integer.valueOf(0)"; + } break; + case Builtin::KindLong: { + s << "Long.valueOf(0)"; + } break; + case Builtin::KindFloat : { + s << "Float.valueOf((float)0)"; + } break; + case Builtin::KindDouble : { + s << "Double.valueOf((double)0)"; + } break; + default:{ + s << "new " << toObjStr(vType) << "()"; + } break; + } + } else { + s << "new " << toObjStr(vType) << "()"; + } + + return s.str(); +} + +string Tars2Dart::generateAndroidJavaParams( + const vector& vParamDecl + , bool needParamType + , bool needOutParam) const { + ostringstream s; + + bool needDot = false; + for (size_t index = 0; index < vParamDecl.size(); ++index) { + ParamDeclPtr paramDeclPtr = vParamDecl[index]; + + if (!paramDeclPtr->isOut()) { + if (!needDot) { + needDot = true; + } else { + s << ", "; + } + if (needParamType) { + s << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " "; + } + s << "in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()); + } else if (needOutParam){ + if (!needDot) { + needDot = true; + } else { + s << ", "; + } + if (needParamType) { + s << "WupOutWrapper<" << toObjStr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << "> "; + } + s<< "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()); + } + } + return s.str(); +} + +string Tars2Dart::generateAndroidStub(const InterfacePtr &pPtr, const NamespacePtr &nPtr) const { + ostringstream s; + + s << g_parse->printHeaderRemark(); + s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; + + s << endl; + s << TAB << "import java.util.concurrent.Semaphore;" << endl; + s << TAB << "import com.tars.wupagent.api.WupConstants.WUP_ERROR_CODE;" << endl; + s << TAB << "import com.tars.wupagent.api.*;" << endl; + + s << TAB << "import com.tars.wup.UniPacket;" << endl; + s << endl; + + s << TAB << "public class " << firstCharUpper(pPtr->getId()) << "Agent extends WupAgent {" << endl << endl; + INC_TAB; + + s << TAB << "public " << firstCharUpper(pPtr->getId()) << "Agent(String servantName) {" << endl; + INC_TAB; + s << TAB << "super(servantName);" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + + string sParams; + vector& vOperation = pPtr->getAllOperationPtr(); + std::sort(vOperation.begin(), vOperation.end(), SortOperation()); + + for (size_t i = 0; i < vOperation.size(); i++) + { + vector& vParamDecl = vOperation[i]->getAllParamDeclPtr(); + + TypeIdPtr& returnType = vOperation[i]->getReturnPtr(); + bool isReturnTypeVoid = false; + if (!returnType->getTypePtr()) { + isReturnTypeVoid = true; + } + + + // generate Result + s << TAB << "public static class " << firstCharUpper(vOperation[i]->getId()) << "Result extends WupBaseResult " << "{" << endl; + + INC_TAB; + + s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result() {" << endl; + s << TAB << "}" << endl << endl; + + s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result(int errorCode, String errorMsg) {" << endl; + INC_TAB; + s << TAB << "super(errorCode, errorMsg);" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { + + ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; + + string inOrOutPrefix = "in"; + if (paramDeclPtr->isOut()) { + inOrOutPrefix = "out"; + } + + s << TAB << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " "; + s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; + + s << TAB << "public " << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) + << " get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "() {" << endl; + INC_TAB; + + s << TAB << "return "; + s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; + + DEL_TAB; + + s << TAB << "}" << endl; + + + s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result" + << " set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "(" << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) + << " " << paramDeclPtr->getTypeIdPtr()->getId() + << ") {" << endl; + INC_TAB; + s << TAB << "this." << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << " = " << paramDeclPtr->getTypeIdPtr()->getId() << ";" << endl; + s << TAB << "return this;" << endl; + DEL_TAB; + + s << TAB << "}" << endl << endl; + + } + + if (!isReturnTypeVoid) { + s << TAB << tostr(returnType->getTypePtr()) << " ret;" << endl; + s << TAB << "public " << tostr(returnType->getTypePtr()) + << " getRet() {" << endl; + INC_TAB; + s << TAB << " return ret;" << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result" + << " setRet(" << tostr(returnType->getTypePtr()) << " ret) {" << endl; + INC_TAB; + s << TAB << "this.ret = ret;" << endl; + s << TAB << "return this;" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + } + + DEL_TAB; + + s << TAB << "}" << endl << endl; + + s << TAB << "public static interface I" << firstCharUpper(vOperation[i]->getId()) << "Callback {" << endl; + INC_TAB; + s << TAB << "public void on" << firstCharUpper(vOperation[i]->getId()) << "Callback(" + << firstCharUpper(vOperation[i]->getId()) << "Result result);" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + // generate BaseMethod + + s << TAB << "private static abstract class " + << firstCharUpper(vOperation[i]->getId()) << "BaseMethod extends AsyncWupMethod {" << endl; + INC_TAB; + + s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) + << "BaseMethod(String servantName, WupOption wupOption) {" << endl; + INC_TAB; + s << TAB << "super(servantName, \"" << vOperation[i]->getId() << "\", wupOption);" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { + ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; + + string inOrOutPrefix = "in"; + bool generateSet = true; + if (paramDeclPtr->isOut()) { + inOrOutPrefix = "out"; + generateSet = false; + } + + s << TAB << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " "; + s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; + + s << TAB << "public " << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) + << " get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "() {" << endl; + INC_TAB; + + s << TAB << "return "; + s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; + + DEL_TAB; + s << TAB << "}" << endl; + + if (generateSet) { + + s << TAB << "public void set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "(" << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) + << " " << paramDeclPtr->getTypeIdPtr()->getId() + << ") {" << endl; + INC_TAB; + s << TAB << "this." << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << " = " << paramDeclPtr->getTypeIdPtr()->getId() << ";" << endl; + DEL_TAB; + s << TAB << "}" << endl; + } + + s << endl; + } + + if (!isReturnTypeVoid) { + s << TAB << tostr(returnType->getTypePtr()) << " ret;" << endl; + s << TAB << "public " << tostr(returnType->getTypePtr()) + << " getRet() {" << endl; + INC_TAB; + s << TAB << " return ret;" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + } + + s << TAB << "@Override" << endl; + s << TAB << "protected void fillReqUniPacket(UniPacket reqPacket) {" << endl; + INC_TAB; + for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { + ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; + + if (!paramDeclPtr->isOut()) { + s << TAB << "reqPacket.put(\"" << paramDeclPtr->getTypeIdPtr()->getId() + << "\", in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ");" << endl; + } + } + DEL_TAB; + s << TAB << "}" << endl <getTypePtr()) << ");" << endl; + } + + for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { + ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; + if (paramDeclPtr->isOut()) { + s << TAB << "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << " = respPacket.get(\"" << paramDeclPtr->getTypeIdPtr()->getId() + << "\", " << generateConstructor(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << ");" << endl; + } + } + + DEL_TAB; + s << TAB << "}" << endl <getId()) + << "Method extends " << firstCharUpper(vOperation[i]->getId()) << "BaseMethod {" << endl; + INC_TAB; + s << TAB << "private I" << firstCharUpper(vOperation[i]->getId()) + << "Callback m" << firstCharUpper(vOperation[i]->getId()) << "Callback;" << endl; + + s << TAB << "public Async" << firstCharUpper(vOperation[i]->getId()) << "Method(String servantName" + << ", WupOption wupOption" + << ", I" << firstCharUpper(vOperation[i]->getId()) + << "Callback " << vOperation[i]->getId() << "Callback) {" << endl; + INC_TAB; + s << TAB << "super(servantName, wupOption);" << endl; + s << TAB << "this.m" << firstCharUpper(vOperation[i]->getId()) << "Callback = " + << vOperation[i]->getId() << "Callback;" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + s << TAB << "@Override" << endl; + s << TAB << "protected void onError(int errorCode, String errorMsg) {" << endl; + INC_TAB; + s << TAB << firstCharUpper(vOperation[i]->getId()) + << "Result result = new " << firstCharUpper(vOperation[i]->getId()) << "Result(errorCode, errorMsg);" << endl; + s << TAB << "result.setRequestId(getRequestId());" << endl; + s << TAB << "m" << firstCharUpper(vOperation[i]->getId()) + << "Callback.on" << firstCharUpper(vOperation[i]->getId()) << "Callback(result);" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + s << TAB << "@Override" << endl; + s << TAB << "protected void onFinished() {" << endl; + INC_TAB; + s << TAB << firstCharUpper(vOperation[i]->getId()) + << "Result result = new " << firstCharUpper(vOperation[i]->getId()) << "Result();" << endl; + s << TAB << "result.setRequestId(getRequestId());" << endl; + for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { + ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; + + s << TAB << "result.set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "(get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << "());" << endl; + } + if (!isReturnTypeVoid) { + s << TAB << "result.setRet(getRet());" << endl; + } + s << TAB << "m" << firstCharUpper(vOperation[i]->getId()) + << "Callback.on" << firstCharUpper(vOperation[i]->getId()) << "Callback(result);" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + DEL_TAB; + s << TAB << "}" << endl << endl; + + // generate AsyncMethod end + + // generate SyncMethod + s << TAB << "private static class Sync" << firstCharUpper(vOperation[i]->getId()) + << "Method extends " << firstCharUpper(vOperation[i]->getId()) << "BaseMethod {" << endl; + INC_TAB; + s << TAB << "private Semaphore mSemaphore;" << endl; + s << TAB << "private WupException mWupException;" << endl; + + s << TAB << "public Sync" << firstCharUpper(vOperation[i]->getId()) + << "Method(String servantName, WupOption wupOption) {" << endl; + INC_TAB; + s << TAB << "super(servantName, wupOption);" << endl; + s << TAB << "mSemaphore = new Semaphore(0);" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + s << TAB << "public void waitResponse() throws InterruptedException {" << endl; + INC_TAB; + s << TAB << "mSemaphore.acquire();" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + s << TAB << "@Override" << endl; + s << TAB << "protected void handleFinished() {" << endl; + INC_TAB; + s << TAB << "mSemaphore.release();" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + s << TAB << "@Override" << endl; + s << TAB << "protected void handleError(final int errorCode, final String errorMsg) {" << endl; + INC_TAB; + s << TAB << "mWupException = new WupException(errorCode, errorMsg);" << endl; + s << TAB << "mSemaphore.release();" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + s << TAB << "public WupException getWupException() {" << endl; + INC_TAB; + s << TAB << "return mWupException;" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + DEL_TAB; + s << TAB << "}" << endl << endl; + + // generate SyncMethod end + + // async api + s << TAB << "public WupHandle async_" << vOperation[i]->getId() << "("; + if (vParamDecl.size()) + { + s << generateAndroidJavaParams(vParamDecl, true, false) << ", "; + } + s << "I" << firstCharUpper(vOperation[i]->getId()) << "Callback " + << vOperation[i]->getId() << "Callback) throws WupException { " << endl; + INC_TAB; + s << TAB << "if (" << vOperation[i]->getId() << "Callback == null) {" << endl; + INC_TAB; + s << TAB << "throw new IllegalArgumentException(\"" << vOperation[i]->getId() + << "Callback should not be null\");" << endl; + DEL_TAB; + s << TAB << "}" << endl; + + s << TAB << "WupOption asyncWupOption = new WupOption(wupOption);" << endl; + + for (size_t index = 0; index < vParamDecl.size(); ++index) { + ParamDeclPtr paramDeclPtr = vParamDecl[index]; + + if (!paramDeclPtr->isOut() && isObjType(paramDeclPtr->getTypeIdPtr()->getTypePtr())) { + s << TAB << "if (in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " == null) {" << endl; + INC_TAB; + s << TAB << "throw new IllegalArgumentException(\"in" + << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " should not be null\");" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + } + + } + + s << TAB << "Async" << firstCharUpper(vOperation[i]->getId()) << "Method " + << vOperation[i]->getId() << "Method = new Async" + << firstCharUpper(vOperation[i]->getId()) + << "Method(getServantName(), asyncWupOption, " << vOperation[i]->getId() << "Callback);" << endl; + + for (size_t index = 0; index < vParamDecl.size(); ++index) { + ParamDeclPtr paramDeclPtr = vParamDecl[index]; + + if (!paramDeclPtr->isOut()) { + s << TAB << vOperation[i]->getId() << "Method.set" + << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "(in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ");" << endl; + } + + } + + s << TAB << vOperation[i]->getId() << "Method.start();" << endl; + s << TAB << "return new WupHandle(" << vOperation[i]->getId() << "Method);" << endl; + + DEL_TAB; + s << TAB << "}" << endl << endl; + + // async api end + + // sync api + s << TAB << "public " << tostr(returnType->getTypePtr()) + << " " << vOperation[i]->getId() << "(" + << generateAndroidJavaParams(vParamDecl, true, true) + << ") throws WupException {" << endl; + INC_TAB; + + for (size_t index = 0; index < vParamDecl.size(); ++index) { + ParamDeclPtr paramDeclPtr = vParamDecl[index]; + + string prefix = "in"; + if (paramDeclPtr->isOut()) { + prefix = "out"; + } + if (isObjType(paramDeclPtr->getTypeIdPtr()->getTypePtr())) { + s << TAB << "if (" << prefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " == null) {" << endl; + INC_TAB; + s << TAB << "throw new IllegalArgumentException(\"" << prefix + << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " should not be null\");" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + } + + } + + s << TAB << "Sync" << firstCharUpper(vOperation[i]->getId()) + << "Method " << "sync" << firstCharUpper(vOperation[i]->getId()) + << "Method = " << "new Sync" + << firstCharUpper(vOperation[i]->getId()) + << "Method(getServantName(), wupOption);" + << endl; + + for (size_t index = 0; index < vParamDecl.size(); ++index) { + ParamDeclPtr paramDeclPtr = vParamDecl[index]; + + if (!paramDeclPtr->isOut()) { + s << TAB << "sync" << firstCharUpper(vOperation[i]->getId()) + << "Method.set" + << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "(in" + << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << ");" << endl; + } + + } + + s << TAB << "sync" << firstCharUpper(vOperation[i]->getId()) + << "Method.start();" << endl << endl; + s << TAB << "try {" << endl; + INC_TAB; + s << TAB << "sync" << firstCharUpper(vOperation[i]->getId()) + << "Method.waitResponse();" << endl; + DEL_TAB; + s << TAB << "} catch (InterruptedException e) {" << endl; + INC_TAB; + s << TAB << "throw new WupException(WUP_ERROR_CODE.WUP_INNER_ERROR, e.getMessage());" + << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + s << TAB << "if (sync" << firstCharUpper(vOperation[i]->getId()) + << "Method.getWupException() != null) {" << endl; + INC_TAB; + s << TAB << "throw sync" << firstCharUpper(vOperation[i]->getId()) + << "Method.getWupException();" << endl; + DEL_TAB; + s << TAB << "}" << endl << endl; + + for (size_t index = 0; index < vParamDecl.size(); ++index) { + ParamDeclPtr paramDeclPtr = vParamDecl[index]; + + if (paramDeclPtr->isOut()) { + s << TAB << "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << ".setOut" + << "(sync" << firstCharUpper(vOperation[i]->getId()) << "Method.get" + << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) + << "());" << endl; + } + } + + if (!isReturnTypeVoid) { + s << TAB << "return sync" << firstCharUpper(vOperation[i]->getId()) + << "Method.getRet();" << endl; + } + + DEL_TAB; + s << TAB << "}" << endl << endl; + // sync api end + } + + DEL_TAB; + s << TAB << "}" << endl << endl; + + + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + "Agent.java"; + tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); + tars::TC_File::save2file(fileJava, s.str()); + + return s.str(); +} + + diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h new file mode 100644 index 00000000..f8a6aac2 --- /dev/null +++ b/tools/tars2dart/tars2dart.h @@ -0,0 +1,384 @@ +/** + * Tencent is pleased to support the open source community by making Tars available. + * + * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +#ifndef _TARS2DART_H +#define _TARS2DART_H + +#include "parse.h" + +#include +#include + +#define TARS_PACKAGE ".tup.tars" +#define PROXY_PACKAGE ".proxy" +#define WUP_PACKAGE ".tup" + +/** + * 根据tars生成dart文件 + * 包括结构的编解码以及生成Proxy和Servant + */ +class Tars2Dart +{ +public: + Tars2Dart(); + + /** + * 设置代码生成的根目录 + * @param dir + */ + void setBaseDir(const string& dir); + + /** + * 设置包前缀 + * @param prefix + */ + void setBasePackage(const string& prefix); + + /** + * 默认将非byte的vector转list 加上该参数后转数组 + */ + void setForceArray(bool bArray) { _bForceArray = bArray; } + + void setCheckDefault(bool bCheck) { _bCheckDefault = bCheck; } + + /*支持自定义字符集*/ + void setCharset(string charset) { _sCharset = charset; } + /*支持javabean规范*/ + void setWithJbr(bool bJbr) { _bWithJbr = bJbr;} + /*去掉属性的read write方法、 cloneable、equals、hashCode、clone、display*/ + void setWithCompact(bool bCompact) { _bWithCompact = bCompact;} + + /*生成枚举类时,采用int方式实现*/ + void setEnumCompact(bool bCompact) { _bEnumCompact = bCompact;} + + /*tars与json互相转换*/ + void setJsonSupport(bool bJson) { _bJson = bJson;} + + void setWithGenerateInterfaceDependencies(bool bWithGenerateInterfaceDependencies) + { + _bWithGenerateInterfaceDependencies = bWithGenerateInterfaceDependencies; + } + void setWithFilterRomTars(bool bWithFilterRomTars) + { + _bWithFilterRomTars = bWithFilterRomTars; + } + +// 增加的接口定义 + string generateConstructor(const TypePtr& vType) const; + string generateAndroidJavaParams(const vector& vParamDecl, bool needParamType, bool needOutParam) const; + string generateAndroidStub(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成 + * @param file + * @param isFramework 是否是框架 + */ + void createFile(const string& file); + + /** + * 设置TAF库的报名 + */ + void setTafPacket(const std::string& sPacket) + { + s_TARS_PACKAGE = sPacket + TARS_PACKAGE; + s_PROXY_PACKAGE = sPacket + PROXY_PACKAGE; + s_WUP_PACKAGE = sPacket + WUP_PACKAGE; + } + +protected: + /** + * 根据命名空间获取文件路径 + * @param ns 命名空间 + * + * @return string + */ + string getFilePath(const string& ns) const; + + string _packagePrefix; + string _baseDir; + bool _bForceArray; + bool _bCheckDefault; + string _sCharset; + bool _bWithJbr; + bool _bWithCompact; + bool _bEnumCompact; + bool _bJson; + + bool _bWithGenerateInterfaceDependencies; + bool _bWithFilterRomTars; + +protected: + + /** + * 生成某类型的解码源码 + * @param pPtr + * + * @return string + */ + string writeTo(const TypeIdPtr& pPtr) const; + + /** + * 生成某类型的编码源码 + * @param pPtr + * + * @return string + */ + string readFrom(const TypeIdPtr& pPtr) const; + + /** + * + * 这个函数目前是用不到的 + * @param pPtr + * + * @return string + */ + string display(const TypeIdPtr& pPtr) const; + + //下面是类型描述的源码生成 +protected: + + /* + * 生成某类型的初始化字符串 + * @param pPtr + * + * @return string + */ + string toTypeInit(const TypePtr& pPtr) const; + + /** + * 生成某类型的对应对象的字符串描述源码 + * @param pPtr + * + * @return string + */ + string toObjStr(const TypePtr& pPtr) const; + + /** + * 判断是否是对象类型 + */ + bool isObjType(const TypePtr& pPtr) const; + + /** + * 生成某类型的字符串描述源码 + * @param pPtr + * + * @return string + */ + string tostr(const TypePtr& pPtr) const; + + /** + * 生成内建类型的字符串源码 + * @param pPtr + * + * @return string + */ + string tostrBuiltin(const BuiltinPtr& pPtr) const; + /** + * 生成vector的字符串描述 + * @param pPtr + * + * @return string + */ + string tostrVector(const VectorPtr& pPtr) const; + + /** + * 生成map的字符串描述 + * @param pPtr + * + * @return string + */ + string tostrMap(const MapPtr& pPtr, bool bNew = false) const; + + /** + * 生成某种结构的符串描述 + * @param pPtr + * + * @return string + */ + string tostrStruct(const StructPtr& pPtr) const; + + /** + * 生成某种枚举的符串描述 + * @param pPtr + * + * @return string + */ + string tostrEnum(const EnumPtr& pPtr) const; + + /** + * 生成类型变量的解码源码 + * @param pPtr + * + * @return string + */ + string decode(const TypeIdPtr& pPtr) const; + + /** + * 生成类型变量的编码源码 + * @param pPtr + * + * @return string + */ + string encode(const TypeIdPtr& pPtr) const; + + //以下是h和dart文件的具体生成 +protected: + /** + * 结构的md5 + * @param pPtr + * + * @return string + */ + string MD5(const StructPtr& pPtr) const; + + /** + * 生成结构的Holder类,用于引用传递 + * @param pPtr + * @param nPtr + * + * @return string + */ + string generateHolder(const StructPtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 放置默认元素用于识别map/list类型 + * @param pPtr + * @param sElemName 元素名称 + * + * @return string + */ + string generateDefautElem(const TypePtr& pPtr, const string& sElemName) const; + + /** + * 生成结构的dart文件内容 + * @param pPtr + * + * @return string + */ + string generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成容器的dart源码 + * @param pPtr + * + * @return string + */ + string generateDart(const ContainerPtr& pPtr) const; + + /** + * 生成参数声明的dart文件内容 + * @param pPtr + * + * @return string + */ + string generateDart(const ParamDeclPtr& pPtr) const; + + /** + * 生成作操作的proxy的dart文件内容 + * @param pPtr + * @param cn + * + * @return string + */ + string generateDart(const OperationPtr& pPtr, const string& cn) const; + + /** + * 生成操作dart文件函数调用分发的源码 + * @param pPtr + * @param cn + * + * @return string + */ + string generateDispatchJava(const OperationPtr& pPtr, const string& cn) const; + + /** + * 生成接口的dart文件的源码 + * @param pPtr + * @param nPtr + * + * @return string + */ + string generateDart(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成Proxy接口的dart文件的源码 + * @param pPtr + * @param nPtr + * + * @return string + */ + string generatePrx(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成Proxy帮助类的dart文件的源码 + * @param pPtr + * @param nPtr + * + * @return string + */ + string generatePrxHelper(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成Proxy回调类的dart文件的源码 + * @param pPtr + * @param nPtr + * + * @return string + */ + string generatePrxCallback(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成枚举的头文件源码 + * @param pPtr + * + * @return string + */ + string generateDart(const EnumPtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成常量dart源码 + * @param pPtr + * + * @return string + */ + void generateDart(const ConstPtr& pPtr, const NamespacePtr& nPtr) const; + + /** + * 生成名字空间dart文件源码 + * @param pPtr + * + * @return string + */ + void generateDart(const NamespacePtr& pPtr) const; + + /** + * 生成每个tars文件的dart文件源码 + * @param pPtr + * + * @return string + */ + void generateDart(const ContextPtr& pPtr) const; + +private: + std::string s_TARS_PACKAGE; + std::string s_PROXY_PACKAGE; + std::string s_HOLDER_PACKAGE; + std::string s_SERVER_PACKAGE; + std::string s_WUP_PACKAGE; +}; + +#endif + + diff --git a/tools/tars2dart/tars_filter.cpp b/tools/tars2dart/tars_filter.cpp new file mode 100644 index 00000000..81d46108 --- /dev/null +++ b/tools/tars2dart/tars_filter.cpp @@ -0,0 +1,61 @@ +/** + * Tencent is pleased to support the open source community by making Tars available. + * + * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +#include "tars_filter.h" + +TarsFilter::TarsFilter() { + addSid("TRom::E_ROM_DEVICE_TYPE"); + addSid("TRom::EAPNTYPE"); + addSid("TRom::EIPType"); + addSid("TRom::ELOGINRET"); + addSid("TRom::ENETTYPE"); + addSid("TRom::IPListReq"); + addSid("TRom::IPListRsp"); + addSid("TRom::JoinIPInfo"); + addSid("TRom::LoginReq"); + addSid("TRom::LoginRsp"); + addSid("TRom::RomBaseInfo"); + addSid("TRom::SECPROXY_RETCODE"); + addSid("TRom::SecureReq"); + addSid("TRom::SecureRsp"); +} + +void TarsFilter::addSid(const std::string& sid) { + mFilterTarsSidMap.insert(std::pair(sid, true)); +} + +void TarsFilter::filterStructs( + const std::map& orignalMap + , std::map& resultMap) const { + for (std::map::const_iterator it = orignalMap.begin() + ; it != orignalMap.end(); ++it) { + if (mFilterTarsSidMap.find(it->first) != mFilterTarsSidMap.end()) { + continue; + } + resultMap.insert(std::pair(it->first, it->second)); + } +} + +void TarsFilter::filterEnums( + const std::map& orignalMap + , std::map& resultMap) const { + for (std::map::const_iterator it = orignalMap.begin() + ; it != orignalMap.end(); ++it) { + if (mFilterTarsSidMap.find(it->first) != mFilterTarsSidMap.end()) { + continue; + } + resultMap.insert(std::pair(it->first, it->second)); + } +} diff --git a/tools/tars2dart/tars_filter.h b/tools/tars2dart/tars_filter.h new file mode 100644 index 00000000..b3eb3900 --- /dev/null +++ b/tools/tars2dart/tars_filter.h @@ -0,0 +1,39 @@ +/** + * Tencent is pleased to support the open source community by making Tars available. + * + * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +#ifndef TARS_FILTER_H_WILEY +#define TARS_FILTER_H_WILEY + +#include "parse.h" +#include + +class TarsFilter { +public: + TarsFilter(); + + void filterStructs(const std::map& orignalMap + , std::map& resultMap) const; + void filterEnums(const std::map& orignalMap + , std::map& resultMap) const; + +private: + void addSid(const std::string& sid); + + std::map mFilterTarsSidMap; +}; + + + +#endif /* TARS_FILTER_H_ */ From 0674debea359d1f6b2d18de2455503e11295aff4 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Thu, 5 Aug 2021 17:49:13 +0800 Subject: [PATCH 02/14] dart file build --- tools/CMakeLists.txt | 1 + tools/tars2dart/main.cpp | 2 +- tools/tars2dart/tars2dart.cpp | 625 ++++++++++++++++++---------------- tools/tars2dart/tars2dart.h | 12 +- 4 files changed, 336 insertions(+), 304 deletions(-) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 6121c70b..4519ae11 100755 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -40,6 +40,7 @@ add_subdirectory(tars2php) add_subdirectory(tars2android) add_subdirectory(tars2node) add_subdirectory(tars2case) +add_subdirectory(tars2dart) IF(TARS_PROTOBUF) add_subdirectory(pb2tarscpp) diff --git a/tools/tars2dart/main.cpp b/tools/tars2dart/main.cpp index 7367dd8e..804e27f8 100644 --- a/tools/tars2dart/main.cpp +++ b/tools/tars2dart/main.cpp @@ -7,7 +7,7 @@ * in compliance with the License. You may obtain a copy of the License at * * https://opensource.org/licenses/BSD-3-Clause - * + * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 101a2875..ce789a95 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -235,22 +235,22 @@ string Tars2Dart::tostrBuiltin(const BuiltinPtr& pPtr) const switch (pPtr->kind()) { case Builtin::KindBool: - s = "boolean"; + s = "bool"; break; case Builtin::KindByte: - s = "byte"; + s = "Uint8List"; break; case Builtin::KindShort: - s = "short"; + s = "int"; break; case Builtin::KindInt: s = "int"; break; case Builtin::KindLong: - s = "long"; + s = "int"; break; case Builtin::KindFloat: - s = "float"; + s = "double"; break; case Builtin::KindDouble: s = "double"; @@ -259,10 +259,10 @@ string Tars2Dart::tostrBuiltin(const BuiltinPtr& pPtr) const s = "String"; break; case Builtin::KindVector: - s = "java.util.ArrayList"; + s = "List"; break; case Builtin::KindMap: - s = "java.util.HashMap"; + s = "Map"; break; default: assert(false); @@ -463,6 +463,46 @@ string Tars2Dart::generateDefautElem(const TypePtr& pPtr, const string& sElemNam return s.str(); } +string Tars2Dart::getDefaultValue(const TypeIdPtr& pPtr, const string sp) const{ + string sDefalut; + if (pPtr -> hasDefault()){ + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr()); + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr->getTypePtr()); + //string转义 + if (bPtr && bPtr->kind() == Builtin::KindString) + { + sDefalut = tars::TC_Common::replace(pPtr->def(), "\"", "\\\""); + //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")\"" + sDefalut + "\""; + sDefalut = " " + sp +" \"" + sDefalut + "\""; + } + else if (ePtr) + { + std::string sdef = pPtr->def(); + std::string::size_type pos = sdef.rfind("::"); + if (pos != std::string::npos && pos + 2 < sdef.size()) + { + sdef = sdef.substr(pos + 2); + } + + if (_bEnumCompact) + { + sDefalut = " " + sp + " " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "._" + sdef; + } + else + { + sDefalut = " " + sp + " " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "." + sdef + ".value()"; + } + } + else + { + //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")" + member[i]->def(); + sDefalut = " " + sp + " " + pPtr->def(); + } + }else{ + sDefalut = " " + sp + " " + toTypeInit(pPtr->getTypePtr()); + } + return sDefalut; +} /******************************StructPtr***************************************/ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) const @@ -473,7 +513,16 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) vector key = pPtr->getKey(); vector& member = pPtr->getAllMemberPtr(); - s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; + // s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; + // s << endl; + + s << TAB << "import 'dart:core';"<< endl; + s << TAB << "import '" << _tarsPackage << "tars_input_stream.dart';"<< endl; + s << TAB << "import '" << _tarsPackage << "tars_output_stream.dart';"<< endl; + s << TAB << "import '" << _tarsPackage << "tars_struct.dart';"<< endl; + s << TAB << "import '" << _tarsPackage << "tars_displayer.dart';"<< endl; + s << TAB << "import '" << _tarsPackage << "tars_util.dart';"<< endl; + s << endl; s << endl; bool bHasImpPrefix = false; @@ -494,37 +543,37 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) // s << endl; // } - s << TAB << "public final class " << pPtr->getId() << " extends " << s_TARS_PACKAGE << ".TarsStruct"; + s << TAB << "class " << pPtr->getId() << " extends " << "TarsStruct"; // if (_bWithWsp) // { // s << " implements WspStruct"; // bHasImpPrefix = true; // } - if (key.size() > 0) - { - if (bHasImpPrefix) - { - s << ", Comparable<" << pPtr->getId() << ">"; - } - else - { - s << " implements Comparable<" << pPtr->getId() << ">"; - bHasImpPrefix = true; - } - } - - if (!_bWithCompact) - { - if (bHasImpPrefix) - { - s << ", java.lang.Cloneable"; - } - else - { - s << " implements java.lang.Cloneable"; - } - } + // if (key.size() > 0) + // { + // if (bHasImpPrefix) + // { + // s << ", Comparable<" << pPtr->getId() << ">"; + // } + // else + // { + // s << " implements Comparable<" << pPtr->getId() << ">"; + // bHasImpPrefix = true; + // } + // } + + // if (!_bWithCompact) + // { + // if (bHasImpPrefix) + // { + // s << ", java.lang.Cloneable"; + // } + // else + // { + // s << " implements java.lang.Cloneable"; + // } + // } s << endl; s << TAB << "{" << endl; INC_TAB; @@ -532,23 +581,23 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) if (!_bWithCompact) { //生成结构名称 - s << TAB << "public String className()" << endl; + s << TAB << "String className()" << endl; s << TAB << "{" << endl; INC_TAB; - s << TAB << "return " << "\"" << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl; + s << TAB << "return " << "\"" << pPtr->getId() << "\"" << ";" << endl; DEL_TAB; s << TAB << "}" << endl; s << endl; // 生成带包前缀的结构名 - s << TAB << "public String fullClassName()" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return " << "\"" << _packagePrefix << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; + // s << TAB << "public String fullClassName()" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "return " << "\"" << _packagePrefix << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << endl; } // if (_bWithWsp) @@ -564,136 +613,108 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) { BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); - //string转义 - if (bPtr && bPtr->kind() == Builtin::KindString) - { - sDefalut = tars::TC_Common::replace(member[i]->def(), "\"", "\\\""); - //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")\"" + sDefalut + "\""; - sDefalut = " = \"" + sDefalut + "\""; - } - else if (ePtr) - { - - std::string sdef = member[i]->def(); - std::string::size_type pos = sdef.rfind("::"); - if (pos != std::string::npos && pos + 2 < sdef.size()) - { - sdef = sdef.substr(pos + 2); - } - - if (_bEnumCompact) - { - sDefalut = " = " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "._" + sdef; - } - else - { - sDefalut = " = " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "." + sdef + ".value()"; - } - } - else - { - //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")" + member[i]->def(); - sDefalut = " = " + member[i]->def(); - } - s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << sDefalut << ";" << endl; + s << TAB << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],"=") << ";" << endl; } else { - sDefalut = " = " + toTypeInit(member[i]->getTypePtr()); //s << TAB << "public " << tostr(member[i]->getTypePtr()) << " "<< member[i]->getId() << sDefalut << endl; BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); if ((!bPtr && !ePtr) || (bPtr && bPtr->kind() == Builtin::KindString)) { - s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << " = null;" << endl; + s << TAB << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() << ";" << endl; } else { - s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << sDefalut << endl; + s << TAB << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],"=") << endl; } } s << endl; } - if (!_bWithCompact) - { - //成员变量get/set for java bean - for (size_t i = 0; i < member.size(); i++) - { - string sName = ""; - //支持javabean规范,并且第二个字符是大写 - if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z') - { - sName = member[i]->getId(); - } - else - { - sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); - } - s << TAB << "public " << tostr(member[i]->getTypePtr()) << " get" << sName - << "()" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return " << member[i]->getId() << ";" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - s << TAB << "public void " << " set" << sName << "(" << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << ")" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl; -// if (_bWithWsp) -// { -// s << TAB <<"arr.put(\""<getId()<<"\","<< member[i]->getId()<<");"<getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z') +// { +// sName = member[i]->getId(); +// } +// else +// { +// sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); +// } +// s << TAB << "public " << tostr(member[i]->getTypePtr()) << " get" << sName +// << "()" << endl; +// s << TAB << "{" << endl; +// INC_TAB; +// s << TAB << "return " << member[i]->getId() << ";" << endl; +// DEL_TAB; +// s << TAB << "}" << endl; +// s << endl; + +// s << TAB << "public void " << " set" << sName << "(" << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << ")" << endl; +// s << TAB << "{" << endl; +// INC_TAB; +// s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl; +// // if (_bWithWsp) +// // { +// // s << TAB <<"arr.put(\""<getId()<<"\","<< member[i]->getId()<<");"<getId() << "()" << endl; - s << TAB << "{" << endl; - INC_TAB; -// if (_bWithWsp) -// { -// s << TAB << "buildIndex();" << endl; -// } -// else - { -/* - * 无参的够造函数,不用调用成员设置方法 - for (size_t i = 0; i < member.size(); i++) - { - string sName = ""; - //支持javabean规范,并且第二个字符是大写 - if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' ) - { - sName = member[i]->getId(); - } - else - { - sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); - } - s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl; - } -*/ - } - - DEL_TAB; - s << TAB << "}" << endl; - s << endl; + // s << TAB << "" << pPtr->getId() << "();" << endl; + +// s << TAB << "{" << endl; +// INC_TAB; +// // if (_bWithWsp) +// // { +// // s << TAB << "buildIndex();" << endl; +// // } +// // else +// { +// /* +// * 无参的够造函数,不用调用成员设置方法 +// for (size_t i = 0; i < member.size(); i++) +// { +// string sName = ""; +// //支持javabean规范,并且第二个字符是大写 +// if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' ) +// { +// sName = member[i]->getId(); +// } +// else +// { +// sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); +// } +// s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl; +// } +// */ +// } + +// DEL_TAB; +// s << TAB << "}" << endl; +// s << endl; //(constructor)(...) - s << TAB << "public " << pPtr->getId() << "("; + s << TAB << "" << pPtr->getId() << "({"; for (size_t i = 0; i < member.size(); i++) { - s << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); + s << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() + << getDefaultValue(member[i],":") << ((i < member.size() - 1) ? ", " : ""); } - s << ")" << endl; + s << "})" << endl; s << TAB << "{" << endl; INC_TAB; for (size_t i = 0; i < member.size(); i++) @@ -705,155 +726,155 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << endl; //compareTo() - if (key.size() > 0) - { - s << TAB << "public int compareTo(" << pPtr->getId() << " o)" << endl; - s << TAB << "{" << endl; - INC_TAB; - - s << TAB << "int[] r = " << endl; - s << TAB << "{" << endl; - INC_TAB; - - for (size_t i = 0; i < key.size(); i++) - { - s << TAB << s_TARS_PACKAGE << ".TarsUtil.compareTo(" << key[i] << ", o." - << key[i] << ")" << ((i < key.size() - 1) ? ", " : "") << endl; - } - DEL_TAB; - s << TAB << "};" << endl; - - s << TAB << "for(int i = 0; i < r.length; ++i)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "if(r[i] != 0) return r[i];" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "return 0;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - } - - if (!_bWithCompact) - { - //equals() - s << TAB << "public boolean equals(Object o)" << endl; - s << TAB << "{" << endl; - INC_TAB; - - s << TAB << "if(o == null)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return false;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - s << TAB << pPtr->getId() << " t = (" << pPtr->getId() << ") o;" << endl; - s << TAB << "return (" << endl; - - INC_TAB; - - //定义了key - if (key.size() > 0) - { - for (size_t i = 0; i < key.size(); i++) - { - s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << key[i] << ", t." << key[i] << ")" - << ((i < key.size() - 1) ? " && " : " );") << endl; - } - } - else - { - //使用所有元素比较 - for (size_t i = 0; i < member.size(); i++) - { - s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << member[i]->getId() << ", t." << member[i]->getId() << ")" - << ((i < member.size() - 1) ? " && " : " );") << endl; - } - } - DEL_TAB; - - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - } - - if (!_bWithCompact) - { - //hashCode() - if (key.size() > 0) - { - s << TAB << "public int hashCode()" << endl; - s << TAB << "{" << endl; - INC_TAB; - - s << TAB << "int [] hc = { " << endl; - INC_TAB; - for (size_t i = 0; i < key.size(); i++) - { - s << TAB << s_TARS_PACKAGE << ".TarsUtil.hashCode(" << key[i] - << ")" << ((i < key.size() - 1) ? ", " : "") << endl; - } - DEL_TAB; - s << TAB << "};" << endl; - s << TAB << "return java.util.Arrays.hashCode(hc);" << endl; - - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - } - else //生成异常代码 - { - s << TAB << "public int hashCode()" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "try" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "throw new Exception(\"Need define key first!\");" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "catch(Exception ex)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "ex.printStackTrace();" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "return 0;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - } - } - - if (!_bWithCompact) - { - //clone() - s << TAB << "public java.lang.Object clone()" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "java.lang.Object o = null;" << endl; - s << TAB << "try" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "o = super.clone();" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "catch(CloneNotSupportedException ex)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "assert false; // impossible" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "return o;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - } + // if (key.size() > 0) + // { + // s << TAB << "int compareTo(" << pPtr->getId() << " o)" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + + // s << TAB << "int[] r = " << endl; + // s << TAB << "{" << endl; + // INC_TAB; + + // for (size_t i = 0; i < key.size(); i++) + // { + // s << TAB << s_TARS_PACKAGE << ".TarsUtil.compareTo(" << key[i] << ", o." + // << key[i] << ")" << ((i < key.size() - 1) ? ", " : "") << endl; + // } + // DEL_TAB; + // s << TAB << "};" << endl; + + // s << TAB << "for(int i = 0; i < r.length; ++i)" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "if(r[i] != 0) return r[i];" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << TAB << "return 0;" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << endl; + // } + + // if (!_bWithCompact) + // { + // //equals() + // s << TAB << "boolean equals(Object o)" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + + // s << TAB << "if(o == null)" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "return false;" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << endl; + + // s << TAB << pPtr->getId() << " t = (" << pPtr->getId() << ") o;" << endl; + // s << TAB << "return (" << endl; + + // INC_TAB; + + // //定义了key + // if (key.size() > 0) + // { + // for (size_t i = 0; i < key.size(); i++) + // { + // s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << key[i] << ", t." << key[i] << ")" + // << ((i < key.size() - 1) ? " && " : " );") << endl; + // } + // } + // else + // { + // //使用所有元素比较 + // for (size_t i = 0; i < member.size(); i++) + // { + // s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << member[i]->getId() << ", t." << member[i]->getId() << ")" + // << ((i < member.size() - 1) ? " && " : " );") << endl; + // } + // } + // DEL_TAB; + + // DEL_TAB; + // s << TAB << "}" << endl; + // s << endl; + // } + + // if (!_bWithCompact) + // { + // //hashCode() + // if (key.size() > 0) + // { + // s << TAB << "int hashCode()" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + + // s << TAB << "int [] hc = { " << endl; + // INC_TAB; + // for (size_t i = 0; i < key.size(); i++) + // { + // s << TAB << s_TARS_PACKAGE << ".TarsUtil.hashCode(" << key[i] + // << ")" << ((i < key.size() - 1) ? ", " : "") << endl; + // } + // DEL_TAB; + // s << TAB << "};" << endl; + // s << TAB << "return java.util.Arrays.hashCode(hc);" << endl; + + // DEL_TAB; + // s << TAB << "}" << endl; + // s << endl; + // } + // else //生成异常代码 + // { + // s << TAB << "int hashCode()" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "try" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "throw new Exception(\"Need define key first!\");" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << TAB << "catch(Exception ex)" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "ex.printStackTrace();" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << TAB << "return 0;" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // } + // } + + // if (!_bWithCompact) + // { + // //clone() + // s << TAB << "java.lang.Object clone()" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "java.lang.Object o = null;" << endl; + // s << TAB << "try" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "o = super.clone();" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << TAB << "catch(CloneNotSupportedException ex)" << endl; + // s << TAB << "{" << endl; + // INC_TAB; + // s << TAB << "assert false; // impossible" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << TAB << "return o;" << endl; + // DEL_TAB; + // s << TAB << "}" << endl; + // s << endl; + // } //writeTo() - s << TAB << "public void writeTo(" << s_TARS_PACKAGE << ".TarsOutputStream _os)" << endl; + s << TAB << "void writeTo(" << "TarsOutputStream _os)" << endl; s << TAB << "{" << endl; INC_TAB; for (size_t i = 0; i < member.size(); i++) @@ -950,7 +971,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) } s << endl; //readFrom() - s << TAB << "public void readFrom(" << s_TARS_PACKAGE << ".TarsInputStream _is)" << endl; + s << TAB << "void readFrom(" << "TarsInputStream _is)" << endl; s << TAB << "{" << endl; INC_TAB; for (size_t i = 0; i < member.size(); i++) @@ -1025,10 +1046,10 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) if (!_bWithCompact) { //display() - s << TAB << "public void display(java.lang.StringBuilder _os, int _level)" << endl; + s << TAB << "void display(StringBuffer _os, int _level)" << endl; s << TAB << "{" << endl; INC_TAB; - s << TAB << s_TARS_PACKAGE << ".TarsDisplayer _ds = new " << s_TARS_PACKAGE << ".TarsDisplayer(_os, _level);" << endl; + s << TAB << "TarsDisplayer _ds = new " << "TarsDisplayer(_os, level : _level);" << endl; for (size_t i = 0; i < member.size(); i++) { s << TAB << "_ds.display(" << member[i]->getId() @@ -1116,7 +1137,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) - string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java"; + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".dart"; tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); tars::TC_File::save2file(fileJava, s.str()); @@ -1287,7 +1308,7 @@ string Tars2Dart::generateDart(const EnumPtr& pPtr, const NamespacePtr& nPtr) co DEL_TAB; s << TAB << "}" << endl; - string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java"; + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".dart"; tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); tars::TC_File::save2file(fileJava, s.str()); @@ -1330,7 +1351,7 @@ void Tars2Dart::generateDart(const ConstPtr& pPtr, const NamespacePtr& nPtr) con DEL_TAB; s << TAB << "}" << endl; - string fileJava = getFilePath(nPtr->getId()) + "/cnst/" + pPtr->getTypeIdPtr()->getId() + ".java"; + string fileJava = getFilePath(nPtr->getId()) + "/cnst/" + pPtr->getTypeIdPtr()->getId() + ".dart"; tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId() + "/cnst/")); tars::TC_File::save2file(fileJava, s.str()); @@ -2010,7 +2031,7 @@ string Tars2Dart::generateAndroidStub(const InterfacePtr &pPtr, const NamespaceP s << TAB << "}" << endl << endl; - string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + "Agent.java"; + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + "Agent.dart"; tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); tars::TC_File::save2file(fileJava, s.str()); diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h index f8a6aac2..b73493bf 100644 --- a/tools/tars2dart/tars2dart.h +++ b/tools/tars2dart/tars2dart.h @@ -88,10 +88,11 @@ class Tars2Dart void createFile(const string& file); /** - * 设置TAF库的报名 + * 设置TAF库的包名 */ void setTafPacket(const std::string& sPacket) { + _tarsPackage = sPacket; s_TARS_PACKAGE = sPacket + TARS_PACKAGE; s_PROXY_PACKAGE = sPacket + PROXY_PACKAGE; s_WUP_PACKAGE = sPacket + WUP_PACKAGE; @@ -118,6 +119,7 @@ class Tars2Dart bool _bWithGenerateInterfaceDependencies; bool _bWithFilterRomTars; + string _tarsPackage; protected: @@ -233,6 +235,14 @@ class Tars2Dart */ string encode(const TypeIdPtr& pPtr) const; + /** + * 获得类型变量的默认值 + * @param pPtr + * + * @return string + */ + string getDefaultValue(const TypeIdPtr& pPtr, const string sp) const; + //以下是h和dart文件的具体生成 protected: /** From 8c1b89ae310c7aa64a267ca57abf3cb6f371203a Mon Sep 17 00:00:00 2001 From: zhangliang Date: Thu, 5 Aug 2021 19:10:54 +0800 Subject: [PATCH 03/14] dart file build --- tools/tars2dart/tars2dart.cpp | 112 +++++++++++++++++++--------------- tools/tars2dart/tars2dart.h | 8 +++ 2 files changed, 70 insertions(+), 50 deletions(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index ce789a95..6bd6e334 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -117,38 +117,17 @@ string Tars2Dart::toTypeInit(const TypePtr& pPtr) const VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); if (vPtr) { - BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); - if (bPtr && bPtr->kind() == Builtin::KindByte) - { - return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + tostr(vPtr->getTypePtr()) + "[1];"; - } - - if (_bForceArray) - { - string sType; - size_t iPosBegin, iPosEnd; - sType = tostr(vPtr->getTypePtr()); - //map<>的数组去掉 '<...>' - if ((iPosBegin = sType.find("<")) != string::npos && (iPosEnd = sType.rfind(">")) != string::npos) - { - sType = sType.substr(0, iPosBegin) + sType.substr(iPosEnd + 1); - } - //[] (数组)的数组变为[1] - sType = tars::TC_Common::replace(sType, "[]", "[1]"); - return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + sType + "[1];";; - } - - return "new " + tostrVector(vPtr) + "();"; + return "null"; } MapPtr mPtr = MapPtr::dynamicCast(pPtr); - if (mPtr) return "new " + tostrMap(mPtr, true) + "();"; + if (mPtr) return "null"; StructPtr sPtr = StructPtr::dynamicCast(pPtr); - if (sPtr) return "new " + tostrStruct(sPtr) + "();"; + if (sPtr) return "null"; EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); - if (ePtr) return "0;"; + if (ePtr) return "0"; return ""; } @@ -158,13 +137,13 @@ string Tars2Dart::toObjStr(const TypePtr& pPtr) const { string sType = tostr(pPtr); - if (sType == "boolean") return "Boolean"; - if (sType == "byte") return "Byte"; - if (sType == "short") return "Short"; - if (sType == "int") return "Integer"; - if (sType == "long") return "Long"; - if (sType == "float") return "Float"; - if (sType == "double") return "Double"; + if (sType == "boolean") return "bool"; + if (sType == "byte") return "Uint8List"; + if (sType == "short") return "int"; + if (sType == "int") return "int"; + if (sType == "long") return "int"; + if (sType == "float") return "double"; + if (sType == "double") return "double"; return sType; } @@ -227,6 +206,36 @@ string Tars2Dart::tostr(const TypePtr& pPtr) const return ""; } +vector Tars2Dart::toImportStrs(const TypePtr& pPtr) const{ + vector result; + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); + if (bPtr) return result; + + VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); + if (vPtr){ + StructPtr vsPtr = StructPtr::dynamicCast(vPtr->getTypePtr()); + if (vsPtr){ result.push_back(vsPtr->getId()); return result; } + } + + MapPtr mPtr = MapPtr::dynamicCast(pPtr); + if (mPtr) { + StructPtr mlPtr = StructPtr::dynamicCast(mPtr->getLeftTypePtr()); + StructPtr mrPtr = StructPtr::dynamicCast(mPtr->getRightTypePtr()); + if(mlPtr && mrPtr){ result.push_back(mlPtr->getId());result.push_back(mrPtr->getId()); return result; } + if (mlPtr) { result.push_back(mlPtr->getId()); return result; } + if (mrPtr) { result.push_back(mrPtr->getId()); return result; } + } + + StructPtr sPtr = StructPtr::dynamicCast(pPtr); + if (sPtr) { result.push_back(sPtr->getId()); return result; } + + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); + if (ePtr){ result.push_back(ePtr->getId()); return result; } + + return result; +} + + /*******************************BuiltinPtr********************************/ string Tars2Dart::tostrBuiltin(const BuiltinPtr& pPtr) const { @@ -278,15 +287,11 @@ string Tars2Dart::tostrVector(const VectorPtr& pPtr) const BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr()); if (bPtr && bPtr->kind() == Builtin::KindByte) { - s = "byte []"; - } - else if (_bForceArray) - { - s = tostr(pPtr->getTypePtr()) + "[]"; + s = "Uint8List"; } else { - s = "java.util.ArrayList" + string("<") + toObjStr(pPtr->getTypePtr()) + ">"; + s = "List" + string("<") + toObjStr(pPtr->getTypePtr()) + ">"; } return s; } @@ -295,14 +300,7 @@ string Tars2Dart::tostrVector(const VectorPtr& pPtr) const string Tars2Dart::tostrMap(const MapPtr& pPtr, bool bNew) const { string s; - if (!bNew) - { - s = "java.util.Map"; - } - else - { - s = "java.util.HashMap"; - } + s = "Map"; s += string("<") + toObjStr(pPtr->getLeftTypePtr()) + ", " + toObjStr(pPtr->getRightTypePtr()) + ">"; return s; @@ -310,7 +308,8 @@ string Tars2Dart::tostrMap(const MapPtr& pPtr, bool bNew) const string Tars2Dart::tostrStruct(const StructPtr& pPtr) const { - return _packagePrefix + tars::TC_Common::replace(pPtr->getSid(), "::", "."); + // return _packagePrefix + tars::TC_Common::replace(pPtr->getSid(), "::", "."); + return pPtr->getId(); } string Tars2Dart::tostrEnum(const EnumPtr& pPtr) const @@ -523,6 +522,18 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << TAB << "import '" << _tarsPackage << "tars_displayer.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_util.dart';"<< endl; s << endl; + + //导入tars定义的结构体 + for (size_t i = 0; i < member.size(); i++) + { + vector packages = toImportStrs(member[i]->getTypePtr()); + if(!packages.empty()){ + for (size_t j = 0; j < packages.size(); j++){ + s << TAB << "import '" << packages[j] << ".dart';"<< endl; + } + } + } + s << endl; bool bHasImpPrefix = false; @@ -542,7 +553,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) // s << TAB << "import com.qq.component.json.JSONException;" << endl; // s << endl; // } - + //class定义部分 s << TAB << "class " << pPtr->getId() << " extends " << "TarsStruct"; // if (_bWithWsp) // { @@ -705,6 +716,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) // s << TAB << "}" << endl; // s << endl; + //带参数的构造函数,格式为: TestData({int id : 0, String? code : ""}){...} //(constructor)(...) s << TAB << "" << pPtr->getId() << "({"; for (size_t i = 0; i < member.size(); i++) @@ -1008,9 +1020,9 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) } else { - s << TAB << "this." << member[i]->getId() << " = (" + tostr(member[i]->getTypePtr()) + ")" + s << TAB << "this." << member[i]->getId() << " = " << " _is.read(" << prefix + member[i]->getId() - << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ")" << " as " << tostr(member[i]->getTypePtr()) << ";" << endl; } } diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h index b73493bf..dbc6ebe2 100644 --- a/tools/tars2dart/tars2dart.h +++ b/tools/tars2dart/tars2dart.h @@ -243,6 +243,14 @@ class Tars2Dart */ string getDefaultValue(const TypeIdPtr& pPtr, const string sp) const; + /** + * 获得类型变量的导入类名 + * @param pPtr + * + * @return string,不需要导入返回"" + */ + vector toImportStrs(const TypePtr& pPtr) const; + //以下是h和dart文件的具体生成 protected: /** From d991d9a0f4f9b6cfb0661f27f21fcf77bf7424bc Mon Sep 17 00:00:00 2001 From: zhangliang Date: Thu, 5 Aug 2021 22:10:08 +0800 Subject: [PATCH 04/14] dart file build --- tools/tars2dart/tars2dart.cpp | 145 +++++++++++++++++++++++++++++++--- tools/tars2dart/tars2dart.h | 16 ++++ 2 files changed, 149 insertions(+), 12 deletions(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 6bd6e334..77932d36 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -102,7 +102,7 @@ string Tars2Dart::toTypeInit(const TypePtr& pPtr) const case Builtin::KindInt: return "0;"; case Builtin::KindLong: - return "0L;"; + return "0;"; case Builtin::KindFloat: return "0.0f;"; case Builtin::KindDouble: @@ -117,14 +117,22 @@ string Tars2Dart::toTypeInit(const TypePtr& pPtr) const VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); if (vPtr) { - return "null"; + // BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + // if (bPtr && bPtr->kind() == Builtin::KindByte) + // { + // return "Uint8List(1);"; + // } + + // return "" + tostrVector(vPtr) + "();"; + return "null"; } MapPtr mPtr = MapPtr::dynamicCast(pPtr); + // if (mPtr) return " " + tostrMap(mPtr, true) + "();"; if (mPtr) return "null"; StructPtr sPtr = StructPtr::dynamicCast(pPtr); - if (sPtr) return "null"; + if (sPtr) return " " + tostrStruct(sPtr) + "();"; EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); if (ePtr) return "0"; @@ -395,7 +403,7 @@ string Tars2Dart::generateDefautElem(const TypePtr& pPtr, const string& sElemNam else if (_bForceArray) { s << generateDefautElem(vPtr->getTypePtr(), ""); - s << TAB << "((" << tostr(vPtr->getTypePtr()) << "[])" << sVar + s << TAB << "(List<" << tostr(vPtr->getTypePtr()) << ">)" << sVar << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl; } else @@ -503,6 +511,111 @@ string Tars2Dart::getDefaultValue(const TypeIdPtr& pPtr, const string sp) const{ return sDefalut; } +string Tars2Dart::generateNewElem(const TypePtr& pPtr) const +{ + ostringstream s; + + VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); + if (vPtr) + { + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + if (bPtr && bPtr->kind() == Builtin::KindByte) + { + return "Uint8List.fromList(List.filled(1,0))"; + } + + return "" + tostrVector(vPtr) + "()"; + } + + MapPtr mPtr = MapPtr::dynamicCast(pPtr); + if (mPtr) + { + s << " " << tostrMap(mPtr, true) << "()" << endl; + return s.str(); + } + + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); + if (bPtr) + { + switch (bPtr->kind()) + { + case Builtin::KindBool: + return "false"; + case Builtin::KindByte: + return "0"; + case Builtin::KindShort: + return "0"; + case Builtin::KindInt: + return "0"; + case Builtin::KindLong: + return "0"; + case Builtin::KindFloat: + return "0.0f"; + case Builtin::KindDouble: + return "0.0"; + case Builtin::KindString: + return "\"\""; + default: + return ""; + } + } + + StructPtr sPtr = StructPtr::dynamicCast(pPtr); + if (sPtr) return " " + tostrStruct(sPtr) + "()"; + + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); + if (ePtr) return "0"; + + return ""; +} + +string Tars2Dart::tostrCache(const TypeIdPtr& pPtr) const +{ + string prefix = "cache"; + string cacheName = prefix +"_" + pPtr->getId(); + + static int iCount = 0; + string cacheCodeStr = ""; + + VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr()); + if (vPtr) + { + int iId = iCount; + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + if (bPtr && bPtr->kind() == Builtin::KindByte) + { + cacheCodeStr = "static Uint8List " + cacheName+ " = Uint8List.fromList(List.filled(1,0))"; + }else{ + cacheCodeStr = "static List<" + tostr(vPtr->getTypePtr()) + "> " + cacheName + " = List.filled(1,"+ generateNewElem(vPtr->getTypePtr()) +")"; + } + } + + MapPtr mPtr = MapPtr::dynamicCast(pPtr->getTypePtr()); + if (mPtr) + { + string leftType = tostr(mPtr->getLeftTypePtr()); + string rightType = tostr(mPtr->getRightTypePtr()); + + cacheCodeStr = "static Map<"+ leftType +", "+ rightType +"> " + cacheName + + " = Map.fromEntries(List>.filled(1,MapEntry<"+ leftType +", "+ rightType +">("+ generateNewElem(mPtr->getLeftTypePtr()) +","+ generateNewElem(mPtr->getRightTypePtr()) + ")))"; + } + + StructPtr sPtr = StructPtr::dynamicCast(pPtr->getTypePtr()); + if (sPtr) + { + cacheCodeStr = "static "+ toObjStr(sPtr) +" " + cacheName+ " = "+ generateNewElem(sPtr) ; + } + + EnumPtr ePtr = EnumPtr::dynamicCast(pPtr->getTypePtr()); + if (ePtr) + { + cacheCodeStr = "static "+ toObjStr(ePtr) +" " + cacheName+ " = "+ generateNewElem(ePtr) ; + } + + return cacheCodeStr; +} + /******************************StructPtr***************************************/ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) const { @@ -516,6 +629,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) // s << endl; s << TAB << "import 'dart:core';"<< endl; + s << TAB << "import 'dart:typed_data';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_input_stream.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_output_stream.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_struct.dart';"<< endl; @@ -966,22 +1080,29 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << TAB << "}" << endl; s << endl; + + //生成cache for (size_t i = 0; i < member.size(); i++) { BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); if (!bPtr) { - string prefix = "cache_"; - s << TAB << "static " << tostr(member[i]->getTypePtr()) << " cache_" << member[i]->getId() << ";" << endl; - s << TAB << "static {" << endl; - INC_TAB; - s << TAB << prefix << member[i]->getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl; - s << generateDefautElem(member[i]->getTypePtr(), prefix + member[i]->getId()); - DEL_TAB; - s << TAB << "}" << endl; + s << TAB << tostrCache(member[i]) << ";" << endl; + + // string prefix = "cache_"; + // s << TAB << "static " << tostr(member[i]->getTypePtr()) << " cache_" << member[i]->getId() << ";" << endl; + // s << TAB << "static {" << endl; + // INC_TAB; + // s << TAB << prefix << member[i]->getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl; + // s << generateDefautElem(member[i]->getTypePtr(), prefix + member[i]->getId()); + // DEL_TAB; + // s << TAB << "}" << endl; } } s << endl; + + + //readFrom() s << TAB << "void readFrom(" << "TarsInputStream _is)" << endl; s << TAB << "{" << endl; diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h index dbc6ebe2..c990870f 100644 --- a/tools/tars2dart/tars2dart.h +++ b/tools/tars2dart/tars2dart.h @@ -251,6 +251,22 @@ class Tars2Dart */ vector toImportStrs(const TypePtr& pPtr) const; + /** + * 生成非原生类型的cache代码 + * @param pPtr + * + * @return string + */ + string tostrCache(const TypeIdPtr& pPtr) const; + + /** + * 生成非原生类型的新对象 + * @param pPtr + * + * @return string + */ + string generateNewElem(const TypePtr& pPtr) const; + //以下是h和dart文件的具体生成 protected: /** From 7bdc9ea614da3a8539d79fe317a8ef98a58658f8 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Thu, 5 Aug 2021 22:21:22 +0800 Subject: [PATCH 05/14] dart file build --- tools/tars2dart/tars2dart.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 77932d36..43eae2dd 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -94,21 +94,21 @@ string Tars2Dart::toTypeInit(const TypePtr& pPtr) const switch (bPtr->kind()) { case Builtin::KindBool: - return "false;"; + return "false"; case Builtin::KindByte: - return "0;"; + return "0"; case Builtin::KindShort: - return "0;"; + return "0"; case Builtin::KindInt: - return "0;"; + return "0"; case Builtin::KindLong: - return "0;"; + return "0"; case Builtin::KindFloat: - return "0.0f;"; + return "0.0f"; case Builtin::KindDouble: - return "0.0;"; + return "0.0"; case Builtin::KindString: - return "\"\";"; + return "\"\""; default: return ""; } @@ -132,7 +132,8 @@ string Tars2Dart::toTypeInit(const TypePtr& pPtr) const if (mPtr) return "null"; StructPtr sPtr = StructPtr::dynamicCast(pPtr); - if (sPtr) return " " + tostrStruct(sPtr) + "();"; + // if (sPtr) return " " + tostrStruct(sPtr) + "();"; + if (sPtr) return "null"; EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); if (ePtr) return "0"; @@ -524,7 +525,7 @@ string Tars2Dart::generateNewElem(const TypePtr& pPtr) const return "Uint8List.fromList(List.filled(1,0))"; } - return "" + tostrVector(vPtr) + "()"; + return "List<"+tostr(vPtr->getTypePtr())+">.filled(1,"+ generateNewElem(vPtr->getTypePtr()) +")"; } MapPtr mPtr = MapPtr::dynamicCast(pPtr); @@ -751,7 +752,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) } else { - s << TAB << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],"=") << endl; + s << TAB << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],"=") << ";" << endl; } } s << endl; From 3c5ad73d5da7e7c725fa5ef9eddbd5cfa3b8a0b4 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 6 Aug 2021 12:02:54 +0800 Subject: [PATCH 06/14] class build finished --- tools/tars2dart/main.cpp | 2 +- tools/tars2dart/tars2dart.cpp | 107 ++++++++++++++++++++-------------- tools/tars2dart/tars2dart.h | 1 + 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/tools/tars2dart/main.cpp b/tools/tars2dart/main.cpp index 804e27f8..7367dd8e 100644 --- a/tools/tars2dart/main.cpp +++ b/tools/tars2dart/main.cpp @@ -7,7 +7,7 @@ * in compliance with the License. You may obtain a copy of the License at * * https://opensource.org/licenses/BSD-3-Clause - * + * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 43eae2dd..ba0b3c23 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -507,7 +507,12 @@ string Tars2Dart::getDefaultValue(const TypeIdPtr& pPtr, const string sp) const{ sDefalut = " " + sp + " " + pPtr->def(); } }else{ - sDefalut = " " + sp + " " + toTypeInit(pPtr->getTypePtr()); + string typeDefault = toTypeInit(pPtr->getTypePtr()); + if(typeDefault == "" || typeDefault == "null"){ + sDefalut = ""; + }else{ + sDefalut = " " + sp + " " + toTypeInit(pPtr->getTypePtr()); + } } return sDefalut; } @@ -635,15 +640,20 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << TAB << "import '" << _tarsPackage << "tars_output_stream.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_struct.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_displayer.dart';"<< endl; - s << TAB << "import '" << _tarsPackage << "tars_util.dart';"<< endl; + // s << TAB << "import '" << _tarsPackage << "tars_util.dart';"<< endl; s << endl; //导入tars定义的结构体 + map mapImport; for (size_t i = 0; i < member.size(); i++) { vector packages = toImportStrs(member[i]->getTypePtr()); if(!packages.empty()){ for (size_t j = 0; j < packages.size(); j++){ + if(mapImport.count(packages[j])){ + continue; + } + mapImport.insert(pair(packages[j] , true)); s << TAB << "import '" << packages[j] << ".dart';"<< endl; } } @@ -653,21 +663,6 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) bool bHasImpPrefix = false; -// if (_bWithWsp) -// { -// s << TAB << "import java.util.HashMap" << ";" << endl; -// s << endl; -// -// s << TAB << "import "<< s_WSP_PACKAGE << ";" << endl; -// s << endl; -// } - -// if (_bJson) -// { -// s << TAB << "import com.qq.component.json.JSON;" << endl; -// s << TAB << "import com.qq.component.json.JSONException;" << endl; -// s << endl; -// } //class定义部分 s << TAB << "class " << pPtr->getId() << " extends " << "TarsStruct"; // if (_bWithWsp) @@ -1111,41 +1106,67 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) for (size_t i = 0; i < member.size(); i++) { string prefix = ""; - BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); - EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + TypePtr& tPtr = member[i]->getTypePtr(); + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(tPtr); + EnumPtr ePtr = EnumPtr::dynamicCast(tPtr); + VectorPtr vPtr = VectorPtr::dynamicCast(tPtr); + MapPtr mPtr = MapPtr::dynamicCast(tPtr); + StructPtr sPtr = StructPtr::dynamicCast(tPtr); + if (!bPtr && !ePtr) { prefix = "cache_"; } - //if (!bPtr && !ePtr) - //{ - // prefix = "cache_"; - // //放置默认元素用于识别类型 - // s << TAB <<"if(null == "<getId()<<")"<getId()<<" = " << toTypeInit(member[i]->getTypePtr()) << endl; - // s << generateDefautElem(member[i]->getTypePtr(), prefix+member[i]->getId()); - // DEL_TAB; - // s << TAB <<"}"<getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl; - // //s << generateDefautElem(member[i]->getTypePtr(), member[i]->getId()); - - //} - - //string特殊处理 - if (bPtr && bPtr->kind() == Builtin::KindString) + + //基础类型 + if (bPtr){ + s << TAB << "this." << member[i]->getId() << " = " + << " _is.read<" << toObjStr(member[i]->getTypePtr()) << ">(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ")" << ";" << endl; + } + + //数组 + if (vPtr) { s << TAB << "this." << member[i]->getId() << " = " - << " _is.readString(" << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + << " _is.read<" << toObjStr(vPtr->getTypePtr()) << ">(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; } - else + + //map + if (mPtr) { - s << TAB << "this." << member[i]->getId() << " = " - << " _is.read(" << prefix + member[i]->getId() - << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ")" << " as " << tostr(member[i]->getTypePtr()) << ";" << endl; + VectorPtr svPtr = VectorPtr::dynamicCast(mPtr->getRightTypePtr()); + MapPtr smPtr = MapPtr::dynamicCast(mPtr->getRightTypePtr()); + if (svPtr) + { + //Map> 结构 + s << TAB << "this." << member[i]->getId() << " = " + << " _is.readMapList<" << toObjStr(mPtr->getLeftTypePtr()) << "," << toObjStr(svPtr->getTypePtr()) << ">(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + }else if (smPtr) + { + //Map> 结构 + s << TAB << "this." << member[i]->getId() << " = " + << " _is.readMapMap<" << toObjStr(mPtr->getLeftTypePtr()) << "," << toObjStr(smPtr->getLeftTypePtr()) << "," << toObjStr(smPtr->getRightTypePtr()) << ">(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + }else{ + //普通 Map 结构 + s << TAB << "this." << member[i]->getId() << " = " + << " _is.readMap<" << toObjStr(mPtr->getLeftTypePtr()) << "," << toObjStr(mPtr->getRightTypePtr()) << ">(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + } } + + //自定义结构体 + if (sPtr) + { + s << TAB << "this." << member[i]->getId() << " = " + << " _is.read<" << toObjStr(member[i]->getTypePtr()) << ">(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; + } + + } DEL_TAB; diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h index c990870f..1e3a472d 100644 --- a/tools/tars2dart/tars2dart.h +++ b/tools/tars2dart/tars2dart.h @@ -20,6 +20,7 @@ #include #include +#include #define TARS_PACKAGE ".tup.tars" #define PROXY_PACKAGE ".proxy" From f66b7fbcd8bd5894e6e52b1a336faaa7c31ad271 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 6 Aug 2021 15:41:08 +0800 Subject: [PATCH 07/14] enum ok --- tools/tars2dart/main.cpp | 11 +- tools/tars2dart/tars2dart.cpp | 196 ++++++++-------------------------- tools/tars2dart/tars2dart.h | 9 ++ 3 files changed, 56 insertions(+), 160 deletions(-) diff --git a/tools/tars2dart/main.cpp b/tools/tars2dart/main.cpp index 7367dd8e..d6b5aa5a 100644 --- a/tools/tars2dart/main.cpp +++ b/tools/tars2dart/main.cpp @@ -24,13 +24,10 @@ void usage() cout << "supported [OPTION]:" << endl; cout << " --help help,print this" << endl; cout << " --dir=DIRECTORY generate dart file to DIRECTORY(default to current)" << endl; - cout << " --base-package=NAME package prefix, default(com.qq.)" << endl; - cout << " --not-force-array default changed byte vector to byte[], use this for list" << endl; - cout << " --check-default= optional field not package(default package)" << endl; - cout << " --extends-package=NAME set the extends package name"<< endl; + cout << " --base-package=NAME package prefix, default(tars_idl)" << endl; + cout << " --extends-package=NAME set the extends package name, default(/tars/)"<< endl; cout << " --with-charset set charset, default UTF8" << endl; - cout << " --with-JavaBeanRule support javabeab, default not support" << endl; - cout << " --include=dir1;dir2;dir3 set search path of tars proto files" << endl; + cout << endl; exit(0); @@ -95,7 +92,7 @@ int main(int argc, char* argv[]) } else { - t2d.setBasePackage("prx."); + t2d.setBasePackage("tars_idl."); } if (option.hasParam("not-force-array")) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index ba0b3c23..6c986e9a 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -25,7 +25,9 @@ #define INC_TAB g_parse->incTab() #define DEL_TAB g_parse->delTab() -static string g_default_package = "com.tars"; +static string g_default_package = "tars_idl"; +static string g_default_tars_package = "/tars/"; + ////////////////////////////////////////////////////////////////////////////////// // Tars2Dart::Tars2Dart() @@ -37,6 +39,7 @@ Tars2Dart::Tars2Dart() s_TARS_PACKAGE = g_default_package + TARS_PACKAGE; s_PROXY_PACKAGE = g_default_package + PROXY_PACKAGE; s_WUP_PACKAGE = g_default_package + WUP_PACKAGE; + _tarsPackage = g_default_tars_package; } string Tars2Dart::writeTo(const TypeIdPtr& pPtr) const @@ -217,31 +220,34 @@ string Tars2Dart::tostr(const TypePtr& pPtr) const vector Tars2Dart::toImportStrs(const TypePtr& pPtr) const{ vector result; + itrToImportStrs(pPtr, result); + return result; +} + +void Tars2Dart::itrToImportStrs(const TypePtr& pPtr, vector& result) const{ BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); - if (bPtr) return result; + if (bPtr) return; VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); if (vPtr){ - StructPtr vsPtr = StructPtr::dynamicCast(vPtr->getTypePtr()); - if (vsPtr){ result.push_back(vsPtr->getId()); return result; } + itrToImportStrs(vPtr->getTypePtr(), result); + return; } MapPtr mPtr = MapPtr::dynamicCast(pPtr); if (mPtr) { - StructPtr mlPtr = StructPtr::dynamicCast(mPtr->getLeftTypePtr()); - StructPtr mrPtr = StructPtr::dynamicCast(mPtr->getRightTypePtr()); - if(mlPtr && mrPtr){ result.push_back(mlPtr->getId());result.push_back(mrPtr->getId()); return result; } - if (mlPtr) { result.push_back(mlPtr->getId()); return result; } - if (mrPtr) { result.push_back(mrPtr->getId()); return result; } + itrToImportStrs(mPtr->getLeftTypePtr(), result); + itrToImportStrs(mPtr->getRightTypePtr(), result); + return; } StructPtr sPtr = StructPtr::dynamicCast(pPtr); - if (sPtr) { result.push_back(sPtr->getId()); return result; } + if (sPtr) { result.push_back(sPtr->getId()); return; } EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); - if (ePtr){ result.push_back(ePtr->getId()); return result; } + if (ePtr){ result.push_back(ePtr->getId()); return; } - return result; + return; } @@ -643,6 +649,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) // s << TAB << "import '" << _tarsPackage << "tars_util.dart';"<< endl; s << endl; + //导入tars定义的结构体 map mapImport; for (size_t i = 0; i < member.size(); i++) @@ -1201,10 +1208,10 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) if (!_bWithCompact) { //display() - s << TAB << "void display(StringBuffer _os, int _level)" << endl; + s << TAB << "void displayAsString(StringBuffer _os, int _level)" << endl; s << TAB << "{" << endl; INC_TAB; - s << TAB << "TarsDisplayer _ds = new " << "TarsDisplayer(_os, level : _level);" << endl; + s << TAB << "TarsDisplayer _ds = " << "TarsDisplayer(_os, level : _level);" << endl; for (size_t i = 0; i < member.size(); i++) { s << TAB << "_ds.display(" << member[i]->getId() @@ -1305,161 +1312,44 @@ string Tars2Dart::generateDart(const EnumPtr& pPtr, const NamespacePtr& nPtr) co ostringstream s; s << g_parse->printHeaderRemark(); - s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; + s << TAB << "import 'dart:core';"<< endl; s << endl; - s << TAB << "public final class " << pPtr->getId() << " implements java.io.Serializable" << endl; + s << TAB << "class " << pPtr->getId() << "" << endl; s << TAB << "{" << endl; INC_TAB; - if (_bEnumCompact) + + //成员变量 + vector& member = pPtr->getAllMemberPtr(); + bool bFlag = false; + string sValue; + for (size_t i = 0; i < member.size(); i++) { - //成员变量 - vector& member = pPtr->getAllMemberPtr(); - bool bFlag = false; - string sValue; - for (size_t i = 0; i < member.size(); i++) + s << TAB << "static const int _" << member[i]->getId() << " = "; + if (member[i]->hasDefault()) { - s << TAB << "public static final int _" << member[i]->getId() << " = "; - if (member[i]->hasDefault()) - { - bFlag = true; - sValue = member[i]->def(); - s << sValue; - } - else - { - if (bFlag == true) - { - assert(i > 0); - string stem = tars::TC_Common::tostr(tars::TC_Common::strto(sValue) + 1); - sValue = stem; - s << stem; - } - else - { - s << tars::TC_Common::tostr(i); - } - } - s << ";" << endl; + bFlag = true; + sValue = member[i]->def(); + s << sValue; } - } - else - { - //成员变量 - vector& member = pPtr->getAllMemberPtr(); - s << TAB << "private static " << pPtr->getId() - << "[] __values = new " << pPtr->getId() - << "[" << tars::TC_Common::tostr(member.size()) << "];" << endl; - s << TAB << "private int __value;" << endl; - - s << TAB << "private String __T = new String();" << endl; - s << endl; - - bool bFlag = false; - string sValue; - for (size_t i = 0; i < member.size(); i++) + else { - s << TAB << "public static final int _" << member[i]->getId() << " = "; - if (member[i]->hasDefault()) + if (bFlag == true) { - bFlag = true; - sValue = member[i]->def(); - s << sValue; + assert(i > 0); + string stem = tars::TC_Common::tostr(tars::TC_Common::strto(sValue) + 1); + sValue = stem; + s << stem; } else { - if (bFlag == true) - { - assert(i > 0); - string stem = tars::TC_Common::tostr(tars::TC_Common::strto(sValue) + 1); - sValue = stem; - s << stem; - } - else - { - s << tars::TC_Common::tostr(i); - } + s << tars::TC_Common::tostr(i); } - s << ";" << endl; - s << TAB << "public static final " << pPtr->getId() << " " - << member[i]->getId() << " = new " << pPtr->getId() << "(" << i << ",_" - << member[i]->getId() << ",\"" << member[i]->getId() << "\");" << endl; } - s << endl; - - - //convert(int) - s << TAB << "public static " << pPtr->getId() << " convert(int val)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "for(int __i = 0; __i < __values.length; ++__i)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "if(__values[__i].value() == val)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return __values[__i];" << endl; - DEL_TAB; - s << TAB << "}" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "assert false;" << endl; - s << TAB << "return null;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - //convert(String) - s << TAB << "public static " << pPtr->getId() << " convert(String val)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "for(int __i = 0; __i < __values.length; ++__i)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "if(__values[__i].toString().equals(val))" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return __values[__i];" << endl; - DEL_TAB; - s << TAB << "}" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "assert false;" << endl; - s << TAB << "return null;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - //value() - s << TAB << "public int value()" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return __value;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - //toString() - s << TAB << "public String toString()" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "return __T;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - //(constructor)(int) - s << TAB << "private " << pPtr->getId() << "(int index, int val, String s)" << endl; - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "__T = s;" << endl; - s << TAB << "__value = val;" << endl; - s << TAB << "__values[index] = this;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; + s << ";" << endl; } + DEL_TAB; s << TAB << "}" << endl; diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h index 1e3a472d..b3a72699 100644 --- a/tools/tars2dart/tars2dart.h +++ b/tools/tars2dart/tars2dart.h @@ -252,6 +252,15 @@ class Tars2Dart */ vector toImportStrs(const TypePtr& pPtr) const; + /** + * 获得类型变量的导入类名 + * @param pPtr + * @param result + * + * @return + */ + void itrToImportStrs(const TypePtr& pPtr, vector& result) const; + /** * 生成非原生类型的cache代码 * @param pPtr From 1862105be249efce2f8379b658f37b7317132489 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Fri, 6 Aug 2021 16:32:30 +0800 Subject: [PATCH 08/14] optimize code --- tools/tars2dart/main.cpp | 21 - tools/tars2dart/tars2dart.cpp | 1042 +-------------------------------- tools/tars2dart/tars2dart.h | 13 - 3 files changed, 6 insertions(+), 1070 deletions(-) diff --git a/tools/tars2dart/main.cpp b/tools/tars2dart/main.cpp index d6b5aa5a..64cece30 100644 --- a/tools/tars2dart/main.cpp +++ b/tools/tars2dart/main.cpp @@ -95,32 +95,11 @@ int main(int argc, char* argv[]) t2d.setBasePackage("tars_idl."); } - if (option.hasParam("not-force-array")) - { - t2d.setForceArray(false); - } - else - { - t2d.setForceArray(true); - } - if (option.hasParam("extends-package")) { t2d.setTafPacket(option.getValue("extends-package")); } - t2d.setCheckDefault(tars::TC_Common::lower(option.getValue("check-default")) == "true"?true:false); - - - if (option.hasParam("with-charset")) - { - t2d.setCharset(option.getValue("with-charset")); - } - else - { - t2d.setCharset("UTF8"); - } - if(option.hasParam("with-JavaBeanRule")) { t2d.setWithJbr(true); diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 6c986e9a..6c23043b 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -32,9 +32,6 @@ static string g_default_tars_package = "/tars/"; // Tars2Dart::Tars2Dart() { - _bForceArray = false; - _bCheckDefault = false; - _bWithJbr = false; _bWithCompact = false; s_TARS_PACKAGE = g_default_package + TARS_PACKAGE; s_PROXY_PACKAGE = g_default_package + PROXY_PACKAGE; @@ -372,7 +369,7 @@ struct SortOperation string Tars2Dart::generateDart(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const { ostringstream s; - generateAndroidStub(pPtr, nPtr); + //generateAndroidStub(pPtr, nPtr); return s.str(); } @@ -380,100 +377,6 @@ string Tars2Dart::generateDefautElem(const TypePtr& pPtr, const string& sElemNam { static int iCount = 0; ostringstream s; - - if (sElemName.empty()) - { - iCount++; - } - - VectorPtr vPtr = VectorPtr::dynamicCast(pPtr); - if (vPtr) - { - int iId = iCount; - string sVar = sElemName.empty() ? "__var_" + tars::TC_Common::tostr(iId) : sElemName; - if (sElemName.empty()) - { - s << TAB << toObjStr(vPtr) << " " << sVar - << " = " << toTypeInit(vPtr) << endl; - } - - BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); - if (bPtr && bPtr->kind() == Builtin::KindByte) - { - iCount++; - s << TAB << "byte __var_" << tars::TC_Common::tostr(iCount) - << " = 0;" << endl; - - s << TAB << "((" << tostr(vPtr->getTypePtr()) << "[])" << sVar - << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl; - } - else if (_bForceArray) - { - s << generateDefautElem(vPtr->getTypePtr(), ""); - s << TAB << "(List<" << tostr(vPtr->getTypePtr()) << ">)" << sVar - << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl; - } - else - { - s << generateDefautElem(vPtr->getTypePtr(), ""); - s << TAB << "((" << tostr(pPtr) << ")" << sVar << ").add(__var_" << tars::TC_Common::tostr(iId + 1) << ");" << endl; - } - - return s.str(); - } - - MapPtr mPtr = MapPtr::dynamicCast(pPtr); - if (mPtr) - { - int iId = iCount; - string sVar = sElemName.empty() ? "__var_" + tars::TC_Common::tostr(iId) : sElemName; - - if (sElemName.empty()) - { - s << TAB << toObjStr(mPtr) << " " << sVar - << " = " << toTypeInit(mPtr) << endl; - } - - s << generateDefautElem(mPtr->getLeftTypePtr(), ""); - int iIdRight = iCount + 1; - s << generateDefautElem(mPtr->getRightTypePtr(), ""); - - s << TAB << sVar << ".put(__var_" << tars::TC_Common::tostr(iId + 1) << ", __var_" - << tars::TC_Common::tostr(iIdRight) << ");" << endl; - - return s.str(); - } - - //首个非map、vector调用,不用生成默认元素 - if (!sElemName.empty()) - { - return s.str(); - } - - BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr); - if (bPtr) - { - s << TAB << toObjStr(bPtr) << " __var_" << tars::TC_Common::tostr(iCount) - << " = " << toTypeInit(bPtr) << endl; - return s.str(); - } - - StructPtr sPtr = StructPtr::dynamicCast(pPtr); - if (sPtr) - { - s << TAB << toObjStr(sPtr) << " __var_" << tars::TC_Common::tostr(iCount) - << " = " << toTypeInit(sPtr) << endl; - return s.str(); - } - - EnumPtr ePtr = EnumPtr::dynamicCast(pPtr); - if (ePtr) - { - s << TAB << toObjStr(ePtr) << " __var_" << tars::TC_Common::tostr(iCount) - << " = " << toTypeInit(ePtr) << endl; - return s.str(); - } - return s.str(); } @@ -672,36 +575,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) //class定义部分 s << TAB << "class " << pPtr->getId() << " extends " << "TarsStruct"; -// if (_bWithWsp) -// { -// s << " implements WspStruct"; -// bHasImpPrefix = true; -// } - - // if (key.size() > 0) - // { - // if (bHasImpPrefix) - // { - // s << ", Comparable<" << pPtr->getId() << ">"; - // } - // else - // { - // s << " implements Comparable<" << pPtr->getId() << ">"; - // bHasImpPrefix = true; - // } - // } - - // if (!_bWithCompact) - // { - // if (bHasImpPrefix) - // { - // s << ", java.lang.Cloneable"; - // } - // else - // { - // s << " implements java.lang.Cloneable"; - // } - // } + s << endl; s << TAB << "{" << endl; INC_TAB; @@ -717,21 +591,8 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << TAB << "}" << endl; s << endl; - - // 生成带包前缀的结构名 - // s << TAB << "public String fullClassName()" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "return " << "\"" << _packagePrefix << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << endl; } -// if (_bWithWsp) -// { -// s << TAB <<"private HashMap arr = new HashMap();"<getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z') -// { -// sName = member[i]->getId(); -// } -// else -// { -// sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); -// } -// s << TAB << "public " << tostr(member[i]->getTypePtr()) << " get" << sName -// << "()" << endl; -// s << TAB << "{" << endl; -// INC_TAB; -// s << TAB << "return " << member[i]->getId() << ";" << endl; -// DEL_TAB; -// s << TAB << "}" << endl; -// s << endl; - -// s << TAB << "public void " << " set" << sName << "(" << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << ")" << endl; -// s << TAB << "{" << endl; -// INC_TAB; -// s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl; -// // if (_bWithWsp) -// // { -// // s << TAB <<"arr.put(\""<getId()<<"\","<< member[i]->getId()<<");"<getId() << "();" << endl; - -// s << TAB << "{" << endl; -// INC_TAB; -// // if (_bWithWsp) -// // { -// // s << TAB << "buildIndex();" << endl; -// // } -// // else -// { -// /* -// * 无参的够造函数,不用调用成员设置方法 -// for (size_t i = 0; i < member.size(); i++) -// { -// string sName = ""; -// //支持javabean规范,并且第二个字符是大写 -// if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' ) -// { -// sName = member[i]->getId(); -// } -// else -// { -// sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); -// } -// s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl; -// } -// */ -// } - -// DEL_TAB; -// s << TAB << "}" << endl; -// s << endl; + //带参数的构造函数,格式为: TestData({int id : 0, String? code : ""}){...} //(constructor)(...) @@ -853,154 +642,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) DEL_TAB; s << TAB << "}" << endl; s << endl; - - //compareTo() - // if (key.size() > 0) - // { - // s << TAB << "int compareTo(" << pPtr->getId() << " o)" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - - // s << TAB << "int[] r = " << endl; - // s << TAB << "{" << endl; - // INC_TAB; - - // for (size_t i = 0; i < key.size(); i++) - // { - // s << TAB << s_TARS_PACKAGE << ".TarsUtil.compareTo(" << key[i] << ", o." - // << key[i] << ")" << ((i < key.size() - 1) ? ", " : "") << endl; - // } - // DEL_TAB; - // s << TAB << "};" << endl; - - // s << TAB << "for(int i = 0; i < r.length; ++i)" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "if(r[i] != 0) return r[i];" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << TAB << "return 0;" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << endl; - // } - - // if (!_bWithCompact) - // { - // //equals() - // s << TAB << "boolean equals(Object o)" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - - // s << TAB << "if(o == null)" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "return false;" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << endl; - - // s << TAB << pPtr->getId() << " t = (" << pPtr->getId() << ") o;" << endl; - // s << TAB << "return (" << endl; - - // INC_TAB; - - // //定义了key - // if (key.size() > 0) - // { - // for (size_t i = 0; i < key.size(); i++) - // { - // s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << key[i] << ", t." << key[i] << ")" - // << ((i < key.size() - 1) ? " && " : " );") << endl; - // } - // } - // else - // { - // //使用所有元素比较 - // for (size_t i = 0; i < member.size(); i++) - // { - // s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << member[i]->getId() << ", t." << member[i]->getId() << ")" - // << ((i < member.size() - 1) ? " && " : " );") << endl; - // } - // } - // DEL_TAB; - - // DEL_TAB; - // s << TAB << "}" << endl; - // s << endl; - // } - - // if (!_bWithCompact) - // { - // //hashCode() - // if (key.size() > 0) - // { - // s << TAB << "int hashCode()" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - - // s << TAB << "int [] hc = { " << endl; - // INC_TAB; - // for (size_t i = 0; i < key.size(); i++) - // { - // s << TAB << s_TARS_PACKAGE << ".TarsUtil.hashCode(" << key[i] - // << ")" << ((i < key.size() - 1) ? ", " : "") << endl; - // } - // DEL_TAB; - // s << TAB << "};" << endl; - // s << TAB << "return java.util.Arrays.hashCode(hc);" << endl; - - // DEL_TAB; - // s << TAB << "}" << endl; - // s << endl; - // } - // else //生成异常代码 - // { - // s << TAB << "int hashCode()" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "try" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "throw new Exception(\"Need define key first!\");" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << TAB << "catch(Exception ex)" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "ex.printStackTrace();" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << TAB << "return 0;" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // } - // } - - // if (!_bWithCompact) - // { - // //clone() - // s << TAB << "java.lang.Object clone()" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "java.lang.Object o = null;" << endl; - // s << TAB << "try" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "o = super.clone();" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << TAB << "catch(CloneNotSupportedException ex)" << endl; - // s << TAB << "{" << endl; - // INC_TAB; - // s << TAB << "assert false; // impossible" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << TAB << "return o;" << endl; - // DEL_TAB; - // s << TAB << "}" << endl; - // s << endl; - // } + //writeTo() s << TAB << "void writeTo(" << "TarsOutputStream _os)" << endl; @@ -1025,58 +667,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) } else { - //s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl; - MapPtr mPtr = MapPtr::dynamicCast(member[i]->getTypePtr()); - VectorPtr vPtr = VectorPtr::dynamicCast(member[i]->getTypePtr()); - - if (!_bCheckDefault || member[i]->isRequire() || (!member[i]->hasDefault() && !mPtr && !vPtr)) - { - s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; - } - else - { - string sDefault = member[i]->def(); - BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); - - if (bPtr && bPtr->kind() == Builtin::KindString) - { - sDefault = "\"" + tars::TC_Common::replace(member[i]->def(), "\"", "\\\"") + "\""; - } - - if (mPtr) - { - s << TAB << "if (" << member[i]->getId() << ".size() > 0)" << endl; - } - else if (vPtr) - { - BuiltinPtr newPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); - if (newPtr && newPtr->kind() == Builtin::KindByte) - { - s << TAB << "if (" << member[i]->getId() << ".length > 0)" << endl; - } - else if (_bForceArray) - { - s << TAB << "if (" << member[i]->getId() << ".length > 0)" << endl; - } - else - { - s << TAB << "if (" << member[i]->getId() << ".size() > 0)" << endl; - } - } - else if (bPtr && bPtr->kind() == Builtin::KindString) - { - s << TAB << "if (!(" << sDefault << ".equals(" << member[i]->getId() << ")))" << endl; - } - else - { - s << TAB << "if (" << member[i]->getId() << " != " << sDefault << ")" << endl; - } - s << TAB << "{" << endl; - INC_TAB; - s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; - DEL_TAB; - s << TAB << "}" << endl; - } + s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl; } } DEL_TAB; @@ -1091,15 +682,6 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) if (!bPtr) { s << TAB << tostrCache(member[i]) << ";" << endl; - - // string prefix = "cache_"; - // s << TAB << "static " << tostr(member[i]->getTypePtr()) << " cache_" << member[i]->getId() << ";" << endl; - // s << TAB << "static {" << endl; - // INC_TAB; - // s << TAB << prefix << member[i]->getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl; - // s << generateDefautElem(member[i]->getTypePtr(), prefix + member[i]->getId()); - // DEL_TAB; - // s << TAB << "}" << endl; } } s << endl; @@ -1179,32 +761,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) DEL_TAB; s << TAB << "}" << endl; s << endl; - -// if (_bJson) -// { -// //writeToJsonString -// s << TAB << "public String writeToJsonString() throws JSONException" << endl; -// s << TAB << "{" << endl; -// INC_TAB; -// s << TAB << "return JSON.toJSONString(this);" << endl; -// DEL_TAB; -// s << TAB << "}" << endl; -// s << endl; -// -// //readFromJsonString -// s << TAB << "public void readFromJsonString(String text) throws JSONException" << endl; -// s << TAB << "{" << endl; -// INC_TAB; -// s << TAB << pPtr->getId() << " temp = " << "JSON.parseObject(text, " << pPtr->getId() << ".class);" << endl; -// for (size_t i = 0; i < member.size(); i++) -// { -// s << TAB << "this." << member[i]->getId() << " = temp." << member[i]->getId() << ";" << endl; -// } -// DEL_TAB; -// s << TAB << "}" << endl; -// s << endl; -// } - + if (!_bWithCompact) { //display() @@ -1220,79 +777,8 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) DEL_TAB; s << TAB << "}" << endl; s << endl; - - //displaySimple() -// s << TAB << "public void displaySimple(java.lang.StringBuilder _os, int _level)" << endl; -// s << TAB << "{" << endl; -// INC_TAB; -// s << TAB << s_TARS_PACKAGE << ".TarsDisplayer _ds = new " << s_TARS_PACKAGE << ".TarsDisplayer(_os, _level);" << endl; -// for (size_t i = 0; i < member.size(); i++) -// { -// if(i != member.size() - 1) -// { -// s << TAB << "_ds.displaySimple(" << member[i]->getId() << ", true);" << endl; -// } -// else -// { -// s << TAB << "_ds.displaySimple(" << member[i]->getId() << ", false);" << endl; -// } -// } -// DEL_TAB; -// s << TAB << "}" << endl; -// s << endl; } - -// if (_bWithWsp) -// { -// s << TAB << "public Object getFieldByName(String name)" << endl; -// s << TAB << "{" << endl; -// INC_TAB; -// s << TAB <<"return arr.get(name);"<getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' ) -// { -// sName = member[i]->getId(); -// } -// else -// { -// sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1); -// } -// s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl; -// } -// DEL_TAB; -// s << TAB << "}" << endl; -// } - DEL_TAB; s << TAB << "}" << endl; s << endl; @@ -1364,42 +850,6 @@ string Tars2Dart::generateDart(const EnumPtr& pPtr, const NamespacePtr& nPtr) co /******************************ConstPtr***************************************/ void Tars2Dart::generateDart(const ConstPtr& pPtr, const NamespacePtr& nPtr) const { - ostringstream s; - s << g_parse->printHeaderRemark(); - - //const类型的包单独放到一个const目录下面 - s << TAB << "package " << _packagePrefix << nPtr->getId() << ".cnst" << ";" << endl; - s << endl; - - s << TAB << "public interface " << pPtr->getTypeIdPtr()->getId() << endl; - s << TAB << "{" << endl; - INC_TAB; - - //TODO: String转义 / long 识别 / byte 范围 - if (pPtr->getConstGrammarPtr()->t == ConstGrammar::STRING) - { - string tmp = tars::TC_Common::replace(pPtr->getConstGrammarPtr()->v, "\"", "\\\""); - s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = \"" - << tmp << "\";" << endl; - } - else if (tostr(pPtr->getTypeIdPtr()->getTypePtr()) == "long") - { - s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = " - << pPtr->getConstGrammarPtr()->v << "L;" << endl; - } - else - { - s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = " - << pPtr->getConstGrammarPtr()->v << ";" << endl; - } - - DEL_TAB; - s << TAB << "}" << endl; - - string fileJava = getFilePath(nPtr->getId()) + "/cnst/" + pPtr->getTypeIdPtr()->getId() + ".dart"; - tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId() + "/cnst/")); - tars::TC_File::save2file(fileJava, s.str()); - return; } @@ -1602,485 +1052,5 @@ string Tars2Dart::generateAndroidJavaParams( return s.str(); } -string Tars2Dart::generateAndroidStub(const InterfacePtr &pPtr, const NamespacePtr &nPtr) const { - ostringstream s; - - s << g_parse->printHeaderRemark(); - s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl; - - s << endl; - s << TAB << "import java.util.concurrent.Semaphore;" << endl; - s << TAB << "import com.tars.wupagent.api.WupConstants.WUP_ERROR_CODE;" << endl; - s << TAB << "import com.tars.wupagent.api.*;" << endl; - - s << TAB << "import com.tars.wup.UniPacket;" << endl; - s << endl; - - s << TAB << "public class " << firstCharUpper(pPtr->getId()) << "Agent extends WupAgent {" << endl << endl; - INC_TAB; - - s << TAB << "public " << firstCharUpper(pPtr->getId()) << "Agent(String servantName) {" << endl; - INC_TAB; - s << TAB << "super(servantName);" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << endl; - - string sParams; - vector& vOperation = pPtr->getAllOperationPtr(); - std::sort(vOperation.begin(), vOperation.end(), SortOperation()); - - for (size_t i = 0; i < vOperation.size(); i++) - { - vector& vParamDecl = vOperation[i]->getAllParamDeclPtr(); - - TypeIdPtr& returnType = vOperation[i]->getReturnPtr(); - bool isReturnTypeVoid = false; - if (!returnType->getTypePtr()) { - isReturnTypeVoid = true; - } - - - // generate Result - s << TAB << "public static class " << firstCharUpper(vOperation[i]->getId()) << "Result extends WupBaseResult " << "{" << endl; - - INC_TAB; - - s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result() {" << endl; - s << TAB << "}" << endl << endl; - - s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result(int errorCode, String errorMsg) {" << endl; - INC_TAB; - s << TAB << "super(errorCode, errorMsg);" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { - - ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; - - string inOrOutPrefix = "in"; - if (paramDeclPtr->isOut()) { - inOrOutPrefix = "out"; - } - - s << TAB << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " "; - s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; - - s << TAB << "public " << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) - << " get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "() {" << endl; - INC_TAB; - - s << TAB << "return "; - s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; - - DEL_TAB; - - s << TAB << "}" << endl; - - - s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result" - << " set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "(" << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) - << " " << paramDeclPtr->getTypeIdPtr()->getId() - << ") {" << endl; - INC_TAB; - s << TAB << "this." << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << " = " << paramDeclPtr->getTypeIdPtr()->getId() << ";" << endl; - s << TAB << "return this;" << endl; - DEL_TAB; - - s << TAB << "}" << endl << endl; - - } - - if (!isReturnTypeVoid) { - s << TAB << tostr(returnType->getTypePtr()) << " ret;" << endl; - s << TAB << "public " << tostr(returnType->getTypePtr()) - << " getRet() {" << endl; - INC_TAB; - s << TAB << " return ret;" << endl; - DEL_TAB; - s << TAB << "}" << endl; - s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result" - << " setRet(" << tostr(returnType->getTypePtr()) << " ret) {" << endl; - INC_TAB; - s << TAB << "this.ret = ret;" << endl; - s << TAB << "return this;" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - } - - DEL_TAB; - - s << TAB << "}" << endl << endl; - - s << TAB << "public static interface I" << firstCharUpper(vOperation[i]->getId()) << "Callback {" << endl; - INC_TAB; - s << TAB << "public void on" << firstCharUpper(vOperation[i]->getId()) << "Callback(" - << firstCharUpper(vOperation[i]->getId()) << "Result result);" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - // generate BaseMethod - - s << TAB << "private static abstract class " - << firstCharUpper(vOperation[i]->getId()) << "BaseMethod extends AsyncWupMethod {" << endl; - INC_TAB; - - s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) - << "BaseMethod(String servantName, WupOption wupOption) {" << endl; - INC_TAB; - s << TAB << "super(servantName, \"" << vOperation[i]->getId() << "\", wupOption);" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { - ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; - - string inOrOutPrefix = "in"; - bool generateSet = true; - if (paramDeclPtr->isOut()) { - inOrOutPrefix = "out"; - generateSet = false; - } - - s << TAB << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " "; - s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; - - s << TAB << "public " << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) - << " get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "() {" << endl; - INC_TAB; - - s << TAB << "return "; - s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl; - - DEL_TAB; - s << TAB << "}" << endl; - - if (generateSet) { - - s << TAB << "public void set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "(" << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) - << " " << paramDeclPtr->getTypeIdPtr()->getId() - << ") {" << endl; - INC_TAB; - s << TAB << "this." << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << " = " << paramDeclPtr->getTypeIdPtr()->getId() << ";" << endl; - DEL_TAB; - s << TAB << "}" << endl; - } - - s << endl; - } - - if (!isReturnTypeVoid) { - s << TAB << tostr(returnType->getTypePtr()) << " ret;" << endl; - s << TAB << "public " << tostr(returnType->getTypePtr()) - << " getRet() {" << endl; - INC_TAB; - s << TAB << " return ret;" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - } - - s << TAB << "@Override" << endl; - s << TAB << "protected void fillReqUniPacket(UniPacket reqPacket) {" << endl; - INC_TAB; - for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { - ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; - - if (!paramDeclPtr->isOut()) { - s << TAB << "reqPacket.put(\"" << paramDeclPtr->getTypeIdPtr()->getId() - << "\", in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ");" << endl; - } - } - DEL_TAB; - s << TAB << "}" << endl <getTypePtr()) << ");" << endl; - } - - for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { - ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; - if (paramDeclPtr->isOut()) { - s << TAB << "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << " = respPacket.get(\"" << paramDeclPtr->getTypeIdPtr()->getId() - << "\", " << generateConstructor(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << ");" << endl; - } - } - - DEL_TAB; - s << TAB << "}" << endl <getId()) - << "Method extends " << firstCharUpper(vOperation[i]->getId()) << "BaseMethod {" << endl; - INC_TAB; - s << TAB << "private I" << firstCharUpper(vOperation[i]->getId()) - << "Callback m" << firstCharUpper(vOperation[i]->getId()) << "Callback;" << endl; - - s << TAB << "public Async" << firstCharUpper(vOperation[i]->getId()) << "Method(String servantName" - << ", WupOption wupOption" - << ", I" << firstCharUpper(vOperation[i]->getId()) - << "Callback " << vOperation[i]->getId() << "Callback) {" << endl; - INC_TAB; - s << TAB << "super(servantName, wupOption);" << endl; - s << TAB << "this.m" << firstCharUpper(vOperation[i]->getId()) << "Callback = " - << vOperation[i]->getId() << "Callback;" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - s << TAB << "@Override" << endl; - s << TAB << "protected void onError(int errorCode, String errorMsg) {" << endl; - INC_TAB; - s << TAB << firstCharUpper(vOperation[i]->getId()) - << "Result result = new " << firstCharUpper(vOperation[i]->getId()) << "Result(errorCode, errorMsg);" << endl; - s << TAB << "result.setRequestId(getRequestId());" << endl; - s << TAB << "m" << firstCharUpper(vOperation[i]->getId()) - << "Callback.on" << firstCharUpper(vOperation[i]->getId()) << "Callback(result);" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - s << TAB << "@Override" << endl; - s << TAB << "protected void onFinished() {" << endl; - INC_TAB; - s << TAB << firstCharUpper(vOperation[i]->getId()) - << "Result result = new " << firstCharUpper(vOperation[i]->getId()) << "Result();" << endl; - s << TAB << "result.setRequestId(getRequestId());" << endl; - for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) { - ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex]; - - s << TAB << "result.set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "(get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << "());" << endl; - } - if (!isReturnTypeVoid) { - s << TAB << "result.setRet(getRet());" << endl; - } - s << TAB << "m" << firstCharUpper(vOperation[i]->getId()) - << "Callback.on" << firstCharUpper(vOperation[i]->getId()) << "Callback(result);" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - DEL_TAB; - s << TAB << "}" << endl << endl; - - // generate AsyncMethod end - - // generate SyncMethod - s << TAB << "private static class Sync" << firstCharUpper(vOperation[i]->getId()) - << "Method extends " << firstCharUpper(vOperation[i]->getId()) << "BaseMethod {" << endl; - INC_TAB; - s << TAB << "private Semaphore mSemaphore;" << endl; - s << TAB << "private WupException mWupException;" << endl; - - s << TAB << "public Sync" << firstCharUpper(vOperation[i]->getId()) - << "Method(String servantName, WupOption wupOption) {" << endl; - INC_TAB; - s << TAB << "super(servantName, wupOption);" << endl; - s << TAB << "mSemaphore = new Semaphore(0);" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - s << TAB << "public void waitResponse() throws InterruptedException {" << endl; - INC_TAB; - s << TAB << "mSemaphore.acquire();" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - s << TAB << "@Override" << endl; - s << TAB << "protected void handleFinished() {" << endl; - INC_TAB; - s << TAB << "mSemaphore.release();" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - s << TAB << "@Override" << endl; - s << TAB << "protected void handleError(final int errorCode, final String errorMsg) {" << endl; - INC_TAB; - s << TAB << "mWupException = new WupException(errorCode, errorMsg);" << endl; - s << TAB << "mSemaphore.release();" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - s << TAB << "public WupException getWupException() {" << endl; - INC_TAB; - s << TAB << "return mWupException;" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - DEL_TAB; - s << TAB << "}" << endl << endl; - - // generate SyncMethod end - - // async api - s << TAB << "public WupHandle async_" << vOperation[i]->getId() << "("; - if (vParamDecl.size()) - { - s << generateAndroidJavaParams(vParamDecl, true, false) << ", "; - } - s << "I" << firstCharUpper(vOperation[i]->getId()) << "Callback " - << vOperation[i]->getId() << "Callback) throws WupException { " << endl; - INC_TAB; - s << TAB << "if (" << vOperation[i]->getId() << "Callback == null) {" << endl; - INC_TAB; - s << TAB << "throw new IllegalArgumentException(\"" << vOperation[i]->getId() - << "Callback should not be null\");" << endl; - DEL_TAB; - s << TAB << "}" << endl; - - s << TAB << "WupOption asyncWupOption = new WupOption(wupOption);" << endl; - - for (size_t index = 0; index < vParamDecl.size(); ++index) { - ParamDeclPtr paramDeclPtr = vParamDecl[index]; - - if (!paramDeclPtr->isOut() && isObjType(paramDeclPtr->getTypeIdPtr()->getTypePtr())) { - s << TAB << "if (in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " == null) {" << endl; - INC_TAB; - s << TAB << "throw new IllegalArgumentException(\"in" - << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " should not be null\");" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - } - - } - - s << TAB << "Async" << firstCharUpper(vOperation[i]->getId()) << "Method " - << vOperation[i]->getId() << "Method = new Async" - << firstCharUpper(vOperation[i]->getId()) - << "Method(getServantName(), asyncWupOption, " << vOperation[i]->getId() << "Callback);" << endl; - - for (size_t index = 0; index < vParamDecl.size(); ++index) { - ParamDeclPtr paramDeclPtr = vParamDecl[index]; - - if (!paramDeclPtr->isOut()) { - s << TAB << vOperation[i]->getId() << "Method.set" - << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "(in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ");" << endl; - } - - } - - s << TAB << vOperation[i]->getId() << "Method.start();" << endl; - s << TAB << "return new WupHandle(" << vOperation[i]->getId() << "Method);" << endl; - - DEL_TAB; - s << TAB << "}" << endl << endl; - - // async api end - - // sync api - s << TAB << "public " << tostr(returnType->getTypePtr()) - << " " << vOperation[i]->getId() << "(" - << generateAndroidJavaParams(vParamDecl, true, true) - << ") throws WupException {" << endl; - INC_TAB; - - for (size_t index = 0; index < vParamDecl.size(); ++index) { - ParamDeclPtr paramDeclPtr = vParamDecl[index]; - - string prefix = "in"; - if (paramDeclPtr->isOut()) { - prefix = "out"; - } - if (isObjType(paramDeclPtr->getTypeIdPtr()->getTypePtr())) { - s << TAB << "if (" << prefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " == null) {" << endl; - INC_TAB; - s << TAB << "throw new IllegalArgumentException(\"" << prefix - << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " should not be null\");" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - } - - } - - s << TAB << "Sync" << firstCharUpper(vOperation[i]->getId()) - << "Method " << "sync" << firstCharUpper(vOperation[i]->getId()) - << "Method = " << "new Sync" - << firstCharUpper(vOperation[i]->getId()) - << "Method(getServantName(), wupOption);" - << endl; - - for (size_t index = 0; index < vParamDecl.size(); ++index) { - ParamDeclPtr paramDeclPtr = vParamDecl[index]; - - if (!paramDeclPtr->isOut()) { - s << TAB << "sync" << firstCharUpper(vOperation[i]->getId()) - << "Method.set" - << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "(in" - << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << ");" << endl; - } - - } - - s << TAB << "sync" << firstCharUpper(vOperation[i]->getId()) - << "Method.start();" << endl << endl; - s << TAB << "try {" << endl; - INC_TAB; - s << TAB << "sync" << firstCharUpper(vOperation[i]->getId()) - << "Method.waitResponse();" << endl; - DEL_TAB; - s << TAB << "} catch (InterruptedException e) {" << endl; - INC_TAB; - s << TAB << "throw new WupException(WUP_ERROR_CODE.WUP_INNER_ERROR, e.getMessage());" - << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - s << TAB << "if (sync" << firstCharUpper(vOperation[i]->getId()) - << "Method.getWupException() != null) {" << endl; - INC_TAB; - s << TAB << "throw sync" << firstCharUpper(vOperation[i]->getId()) - << "Method.getWupException();" << endl; - DEL_TAB; - s << TAB << "}" << endl << endl; - - for (size_t index = 0; index < vParamDecl.size(); ++index) { - ParamDeclPtr paramDeclPtr = vParamDecl[index]; - - if (paramDeclPtr->isOut()) { - s << TAB << "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << ".setOut" - << "(sync" << firstCharUpper(vOperation[i]->getId()) << "Method.get" - << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) - << "());" << endl; - } - } - - if (!isReturnTypeVoid) { - s << TAB << "return sync" << firstCharUpper(vOperation[i]->getId()) - << "Method.getRet();" << endl; - } - - DEL_TAB; - s << TAB << "}" << endl << endl; - // sync api end - } - - DEL_TAB; - s << TAB << "}" << endl << endl; - - - string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + "Agent.dart"; - tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); - tars::TC_File::save2file(fileJava, s.str()); - - return s.str(); -} diff --git a/tools/tars2dart/tars2dart.h b/tools/tars2dart/tars2dart.h index b3a72699..6b86c4ce 100644 --- a/tools/tars2dart/tars2dart.h +++ b/tools/tars2dart/tars2dart.h @@ -47,15 +47,6 @@ class Tars2Dart */ void setBasePackage(const string& prefix); - /** - * 默认将非byte的vector转list 加上该参数后转数组 - */ - void setForceArray(bool bArray) { _bForceArray = bArray; } - - void setCheckDefault(bool bCheck) { _bCheckDefault = bCheck; } - - /*支持自定义字符集*/ - void setCharset(string charset) { _sCharset = charset; } /*支持javabean规范*/ void setWithJbr(bool bJbr) { _bWithJbr = bJbr;} /*去掉属性的read write方法、 cloneable、equals、hashCode、clone、display*/ @@ -79,7 +70,6 @@ class Tars2Dart // 增加的接口定义 string generateConstructor(const TypePtr& vType) const; string generateAndroidJavaParams(const vector& vParamDecl, bool needParamType, bool needOutParam) const; - string generateAndroidStub(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const; /** * 生成 @@ -110,9 +100,6 @@ class Tars2Dart string _packagePrefix; string _baseDir; - bool _bForceArray; - bool _bCheckDefault; - string _sCharset; bool _bWithJbr; bool _bWithCompact; bool _bEnumCompact; From 5a295a76314fc3416405adc30eca8ea35ef5bd98 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Mon, 9 Aug 2021 11:31:17 +0800 Subject: [PATCH 09/14] add deepCopy --- tools/tars2dart/tars2dart.cpp | 93 ++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 6c23043b..3c2a67a7 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -549,7 +549,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << TAB << "import '" << _tarsPackage << "tars_output_stream.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_struct.dart';"<< endl; s << TAB << "import '" << _tarsPackage << "tars_displayer.dart';"<< endl; - // s << TAB << "import '" << _tarsPackage << "tars_util.dart';"<< endl; + s << TAB << "import '" << _tarsPackage << "tars_deep_copyable.dart';"<< endl; s << endl; @@ -645,6 +645,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) //writeTo() + s << TAB << "@override" << endl; s << TAB << "void writeTo(" << "TarsOutputStream _os)" << endl; s << TAB << "{" << endl; INC_TAB; @@ -689,6 +690,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) //readFrom() + s << TAB << "@override" << endl; s << TAB << "void readFrom(" << "TarsInputStream _is)" << endl; s << TAB << "{" << endl; INC_TAB; @@ -765,6 +767,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) if (!_bWithCompact) { //display() + s << TAB << "@override" << endl; s << TAB << "void displayAsString(StringBuffer _os, int _level)" << endl; s << TAB << "{" << endl; INC_TAB; @@ -779,11 +782,99 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) s << endl; } + //deepCopy() + s << TAB << "@override" << endl; + s << TAB << "Object deepCopy()" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "var o = " << pPtr->getId() << "();" << endl; + for (size_t i = 0; i < member.size(); i++) + { + + string prefix = ""; + TypePtr& tPtr = member[i]->getTypePtr(); + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(tPtr); + EnumPtr ePtr = EnumPtr::dynamicCast(tPtr); + VectorPtr vPtr = VectorPtr::dynamicCast(tPtr); + MapPtr mPtr = MapPtr::dynamicCast(tPtr); + StructPtr sPtr = StructPtr::dynamicCast(tPtr); + + if (!bPtr && !ePtr) + { + prefix = "cache_"; + } + + //基础类型 + if (bPtr || ePtr){ + s << TAB << "o." << member[i]->getId() << " = " << "this." << member[i]->getId() << ";" << endl; + } + + + //数组 + if (vPtr) + { + BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); + if (bPtr && bPtr->kind() == Builtin::KindByte) + { + s << TAB << "o." << member[i]->getId() << " = " << "this." << member[i]->getId() << ";" << endl; + } else { + s << TAB << "if (null != " << member[i]->getId() << ")" << endl; + s << TAB << "{" << endl; + INC_TAB; + s << TAB << "o." << member[i]->getId() << " = " + << " listDeepCopy<" << toObjStr(vPtr->getTypePtr()) << ">(this." << member[i]->getId() << "!);" << endl; + DEL_TAB; + s << TAB << "}" << endl; + } + } + + //map + if (mPtr) + { + s << TAB << "if (null != " << member[i]->getId() << ")" << endl; + s << TAB << "{" << endl; + INC_TAB; + VectorPtr svPtr = VectorPtr::dynamicCast(mPtr->getRightTypePtr()); + MapPtr smPtr = MapPtr::dynamicCast(mPtr->getRightTypePtr()); + if (svPtr) + { + //Map> 结构 + s << TAB << "o." << member[i]->getId() << " = " + << " mapListDeepCopy<" << toObjStr(mPtr->getLeftTypePtr()) << "," << toObjStr(svPtr->getTypePtr()) << ">(this." << member[i]->getId() << "!);" << endl; + + }else if (smPtr) + { + //Map> 结构 + s << TAB << "o." << member[i]->getId() << " = " + << " mapMapDeepCopy<" << toObjStr(mPtr->getLeftTypePtr()) << "," << toObjStr(smPtr->getLeftTypePtr()) << "," << toObjStr(smPtr->getRightTypePtr()) << "!);" << endl; + + }else{ + //普通 Map 结构 + s << TAB << "o." << member[i]->getId() << " = " + << " mapDeepCopy<" << toObjStr(mPtr->getLeftTypePtr()) << "," << toObjStr(mPtr->getRightTypePtr()) << ">(this." << member[i]->getId() << "!);" << endl; + } + DEL_TAB; + s << TAB << "}" << endl; + } + + //自定义结构体 + if (sPtr) + { + s << TAB << "o." << member[i]->getId() << " = this." << member[i]->getId() << "?.deepCopy() as " << toObjStr(member[i]->getTypePtr()) << "?;" << endl; + } + + } + s << TAB << "return o;" << endl; + DEL_TAB; s << TAB << "}" << endl; s << endl; + DEL_TAB; + s << TAB << "}" << endl; + s << endl; + string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".dart"; tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId())); From 804e3434801c8972020f6803928a3fb3d6a8c464 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Tue, 10 Aug 2021 10:39:53 +0800 Subject: [PATCH 10/14] optimize code --- tools/tars2dart/tars2dart.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index 3c2a67a7..f67a5577 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -26,7 +26,7 @@ #define DEL_TAB g_parse->delTab() static string g_default_package = "tars_idl"; -static string g_default_tars_package = "/tars/"; +static string g_default_tars_package = "/tars/codec/"; ////////////////////////////////////////////////////////////////////////////////// // @@ -436,10 +436,10 @@ string Tars2Dart::generateNewElem(const TypePtr& pPtr) const BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); if (bPtr && bPtr->kind() == Builtin::KindByte) { - return "Uint8List.fromList(List.filled(1,0))"; + return "[0x0]"; } - return "List<"+tostr(vPtr->getTypePtr())+">.filled(1,"+ generateNewElem(vPtr->getTypePtr()) +")"; + return "["+ generateNewElem(vPtr->getTypePtr()) +"]"; } MapPtr mPtr = MapPtr::dynamicCast(pPtr); @@ -499,9 +499,9 @@ string Tars2Dart::tostrCache(const TypeIdPtr& pPtr) const BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr()); if (bPtr && bPtr->kind() == Builtin::KindByte) { - cacheCodeStr = "static Uint8List " + cacheName+ " = Uint8List.fromList(List.filled(1,0))"; + cacheCodeStr = "static Uint8List " + cacheName+ " = Uint8List.fromList([0x0])"; }else{ - cacheCodeStr = "static List<" + tostr(vPtr->getTypePtr()) + "> " + cacheName + " = List.filled(1,"+ generateNewElem(vPtr->getTypePtr()) +")"; + cacheCodeStr = "static List<" + tostr(vPtr->getTypePtr()) + "> " + cacheName + " = ["+ generateNewElem(vPtr->getTypePtr()) +"]"; } } @@ -512,8 +512,7 @@ string Tars2Dart::tostrCache(const TypeIdPtr& pPtr) const string rightType = tostr(mPtr->getRightTypePtr()); cacheCodeStr = "static Map<"+ leftType +", "+ rightType +"> " + cacheName - + " = Map.fromEntries(List>.filled(1,MapEntry<"+ leftType +", "+ rightType +">("+ generateNewElem(mPtr->getLeftTypePtr()) +","+ generateNewElem(mPtr->getRightTypePtr()) + ")))"; + + " = {"+ generateNewElem(mPtr->getLeftTypePtr()) +":"+ generateNewElem(mPtr->getRightTypePtr()) + "}"; } StructPtr sPtr = StructPtr::dynamicCast(pPtr->getTypePtr()); From ee958cdd448f14969074f3684cf3cb1e59175bae Mon Sep 17 00:00:00 2001 From: brook Date: Tue, 17 Aug 2021 21:24:36 +0800 Subject: [PATCH 11/14] bug fix --- tools/tars2dart/tars2dart.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index f67a5577..cd2047ba 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -259,7 +259,7 @@ string Tars2Dart::tostrBuiltin(const BuiltinPtr& pPtr) const s = "bool"; break; case Builtin::KindByte: - s = "Uint8List"; + s = "int"; break; case Builtin::KindShort: s = "int"; From b27323c9bef3610d2e97b6c4f80bba6b79b4c8d4 Mon Sep 17 00:00:00 2001 From: brook Date: Fri, 27 Aug 2021 14:18:52 +0800 Subject: [PATCH 12/14] bug fix --- tools/tars2dart/tars2dart.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index cd2047ba..f86ac19a 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -902,7 +902,7 @@ string Tars2Dart::generateDart(const EnumPtr& pPtr, const NamespacePtr& nPtr) co string sValue; for (size_t i = 0; i < member.size(); i++) { - s << TAB << "static const int _" << member[i]->getId() << " = "; + s << TAB << "static const int " << member[i]->getId() << " = "; if (member[i]->hasDefault()) { bFlag = true; From 0816d130138da14a567854602de2dcf4de1f00ab Mon Sep 17 00:00:00 2001 From: brook Date: Thu, 23 Sep 2021 20:42:00 +0800 Subject: [PATCH 13/14] bugfix --- tools/tars2dart/tars2dart.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/tars2dart/tars2dart.cpp b/tools/tars2dart/tars2dart.cpp index f86ac19a..e0774599 100644 --- a/tools/tars2dart/tars2dart.cpp +++ b/tools/tars2dart/tars2dart.cpp @@ -614,7 +614,7 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) } else { - s << TAB << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],"=") << ";" << endl; + s << TAB << tostr(member[i]->getTypePtr()) << (( ePtr || (bPtr && bPtr->isSimple()))? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],"=") << ";" << endl; } } s << endl; @@ -627,7 +627,8 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) for (size_t i = 0; i < member.size(); i++) { BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); - s << tostr(member[i]->getTypePtr()) << ((bPtr && bPtr->isSimple())? " " :"? ") << member[i]->getId() + EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + s << tostr(member[i]->getTypePtr()) << (( ePtr || (bPtr && bPtr->isSimple()))? " " :"? ") << member[i]->getId() << getDefaultValue(member[i],":") << ((i < member.size() - 1) ? ", " : ""); } @@ -679,7 +680,8 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) for (size_t i = 0; i < member.size(); i++) { BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr()); - if (!bPtr) + EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr()); + if (!bPtr && !ePtr) { s << TAB << tostrCache(member[i]) << ";" << endl; } @@ -756,6 +758,12 @@ string Tars2Dart::generateDart(const StructPtr& pPtr, const NamespacePtr& nPtr) << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl; } + //枚举 + if (ePtr){ + s << TAB << "this." << member[i]->getId() << " = " + << " _is.read(" << prefix + member[i]->getId() + << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ")" << ";" << endl; + } } From 78ad51b3fc0597894529f845119058ef3e458f30 Mon Sep 17 00:00:00 2001 From: brook Date: Wed, 3 Nov 2021 14:54:43 +0800 Subject: [PATCH 14/14] modify doc --- tools/README.md | 1 + tools/README.zh.md | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/README.md b/tools/README.md index 7318150b..92a59192 100755 --- a/tools/README.md +++ b/tools/README.md @@ -17,5 +17,6 @@ tars2php | Source code implementation of IDL tool for generating PHP code t tars2python | Source code implementation of IDL tool for generating Python code through tars file tars2node | Source code implementation of IDL tool for generating Node.js code through tars file tars2android | Source code implementation of IDL tool for generating Android code through tars file +tars2dart | Source code implementation of IDL tool for generating Dart(Flutter) code through tars file,[Dependences](https://github.com/brooklet/dart_tars_protocol) tars2case | Generate test case for tars server pb2tarscpp | Generate protoc plugin source code for tars C++ code via proto file diff --git a/tools/README.zh.md b/tools/README.zh.md index 7705cec6..f4f08dbd 100755 --- a/tools/README.zh.md +++ b/tools/README.zh.md @@ -16,4 +16,5 @@ tars2python | 通过tars文件生成 Python 代码的IDL工具的源码实现 tars2node | 通过tars文件生成 Node.js 代码的IDL工具的源码实现 tars2android | 通过tars文件生成 Android 代码的IDL工具的源码实现 tars2case | 通过tars文件生成 tars 服务生成测试用例 +tars2dart | 通过tars文件生成 Dart(Flutter) 代码的IDL工具的源码实现,[依赖库](https://github.com/brooklet/dart_tars_protocol) pb2tarscpp | 通过proto文件生成tars C++ 代码的protoc插件源码实现