tars2oc.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "tars2oc.h"
  17. #include "util/tc_md5.h"
  18. #include "util/tc_file.h"
  19. #include "util/tc_common.h"
  20. #include <string>
  21. #define TAB g_parse->getTab()
  22. #define INC_TAB g_parse->incTab()
  23. #define DEL_TAB g_parse->delTab()
  24. //////////////////////////////////////////////////////////////////////////////////
  25. string Tars2OC::toClassName(const TypePtr &pPtr) const
  26. {
  27. string s;
  28. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  29. if (bPtr)
  30. {
  31. switch (bPtr->kind())
  32. {
  33. case Builtin::KindBool: s = "bool"; break;
  34. case Builtin::KindByte: s = "char"; break;
  35. case Builtin::KindShort: s = "short"; break;
  36. case Builtin::KindInt: s = "int32"; break;
  37. case Builtin::KindLong: s = "int64"; break;
  38. case Builtin::KindFloat: s = "float"; break;
  39. case Builtin::KindDouble: s = "double"; break;
  40. case Builtin::KindString: s = "string"; break;
  41. default: assert(false); break;
  42. }
  43. return s;
  44. }
  45. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  46. if (vPtr) return tostrVector(vPtr);
  47. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  48. if (mPtr) return tostrMap(mPtr);
  49. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  50. if (sPtr) return tostrStruct(sPtr);
  51. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  52. if (ePtr) return tostrEnum(ePtr);
  53. if (!pPtr) return "void";
  54. assert(false);
  55. return "";
  56. }
  57. string Tars2OC::toAddtionalClassName(const TypePtr &pPtr) const
  58. {
  59. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  60. if (bPtr)
  61. {
  62. string s = "";
  63. switch (bPtr->kind())
  64. {
  65. case Builtin::KindBool:
  66. case Builtin::KindByte:
  67. case Builtin::KindShort:
  68. case Builtin::KindInt:
  69. case Builtin::KindLong:
  70. case Builtin::KindFloat:
  71. case Builtin::KindDouble:
  72. {
  73. s = "ONSNumber";
  74. break;
  75. }
  76. case Builtin::KindString:
  77. {
  78. s = "ONSString";
  79. break;
  80. }
  81. default: assert(false); break;
  82. }
  83. return s;
  84. }
  85. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  86. if (vPtr)
  87. {
  88. string s = "";
  89. if (toClassName(vPtr) == "list<char>")
  90. {
  91. s = "ONSData";
  92. }
  93. else
  94. {
  95. s = "V" + toAddtionalClassName(vPtr->getTypePtr());
  96. }
  97. return s;
  98. }
  99. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  100. if (mPtr)
  101. {
  102. string sKey = toAddtionalClassName(mPtr->getLeftTypePtr());
  103. string sValue = toAddtionalClassName(mPtr->getRightTypePtr());
  104. ostringstream osKeyLen;
  105. {
  106. int iLen = sKey.length();
  107. assert(iLen <= 99 && iLen >=0);
  108. char sLen[3];
  109. snprintf(&sLen[0],3,"%.2d",iLen);
  110. osKeyLen <<sLen;
  111. }
  112. return "M" + osKeyLen.str() + sKey + sValue;
  113. }
  114. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  115. if (sPtr)
  116. {
  117. return "O" + tostrStruct(sPtr);//TC_Common::replace(sPtr->getSid(), "::", "");
  118. }
  119. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  120. if (ePtr)
  121. {
  122. return "ONSNumber";
  123. }
  124. if (!pPtr) return "void";
  125. assert(false);
  126. return "";
  127. }
  128. /*******************************BuiltinPtr********************************/
  129. string Tars2OC::tostr(const TypePtr &pPtr) const
  130. {
  131. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  132. if (bPtr) return tostrBuiltin(bPtr);
  133. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  134. if (vPtr)
  135. {
  136. if (toClassName(vPtr) == "list<char>")
  137. {
  138. return "NSData*";
  139. }
  140. else
  141. {
  142. ostringstream s;
  143. s << "NSArray<" << (isNumberType(vPtr->getTypePtr()) ? "NSNumber*" : tostr(vPtr->getTypePtr())) << ">*";
  144. return s.str();
  145. }
  146. }
  147. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  148. if (mPtr) {
  149. ostringstream s;
  150. s << "NSDictionary<" << (isNumberType(mPtr->getLeftTypePtr()) ? "NSNumber*" : tostr(mPtr->getLeftTypePtr())) << ", " << (isNumberType(mPtr->getRightTypePtr()) ? "NSNumber*" : tostr(mPtr->getRightTypePtr())) << ">*";
  151. return s.str();
  152. }
  153. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  154. if (sPtr) return tostrStruct(sPtr)+ "*";
  155. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  156. if (ePtr) return tostrEnum(ePtr);
  157. if (!pPtr) return "void";
  158. assert(false);
  159. return "";
  160. }
  161. bool Tars2OC::isNumberType(const TypePtr &pPtr) const
  162. {
  163. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  164. bool ret = false;
  165. if (bPtr)
  166. {
  167. switch (bPtr->kind())
  168. {
  169. case Builtin::KindBool:
  170. case Builtin::KindByte:
  171. case Builtin::KindShort:
  172. case Builtin::KindInt:
  173. case Builtin::KindLong:
  174. case Builtin::KindFloat:
  175. case Builtin::KindDouble:
  176. {
  177. ret = true;
  178. break;
  179. }
  180. default:
  181. ret = false;
  182. break;
  183. }
  184. }
  185. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  186. if (ePtr)
  187. {
  188. ret = true;
  189. }
  190. return ret;
  191. }
  192. string Tars2OC::tostrBuiltin(const BuiltinPtr &pPtr) const
  193. {
  194. string s;
  195. switch (pPtr->kind())
  196. {
  197. case Builtin::KindBool:
  198. s = "TarsBool";
  199. break;
  200. case Builtin::KindByte:
  201. s = "TarsInt8";
  202. break;
  203. case Builtin::KindShort:
  204. s = (pPtr->isUnsigned()?"TarsUInt8":"TarsInt16");
  205. break;
  206. case Builtin::KindInt:
  207. s = (pPtr->isUnsigned()?"TarsUInt16":"TarsInt32");
  208. break;
  209. case Builtin::KindLong:
  210. s = (pPtr->isUnsigned()?"TarsUInt32":"TarsInt64");
  211. break;
  212. case Builtin::KindFloat:
  213. s = "TarsFloat";
  214. break;
  215. case Builtin::KindDouble:
  216. s = "TarsDouble";
  217. break;
  218. case Builtin::KindString:
  219. s = "NSString*";
  220. break;
  221. default:
  222. assert(false);
  223. break;
  224. }
  225. return s;
  226. }
  227. /*******************************VectorPtr********************************/
  228. string Tars2OC::tostrVector(const VectorPtr &pPtr) const
  229. {
  230. string s = string("list<") + toClassName(pPtr->getTypePtr());
  231. if (MapPtr::dynamicCast(pPtr->getTypePtr()) || VectorPtr::dynamicCast(pPtr->getTypePtr()))
  232. {
  233. s += " >";
  234. }
  235. else
  236. {
  237. s += ">";
  238. }
  239. return s;
  240. }
  241. /*******************************MapPtr********************************/
  242. string Tars2OC::tostrMap(const MapPtr &pPtr) const
  243. {
  244. string s = string("map<") + toClassName(pPtr->getLeftTypePtr()) + "," + toClassName(pPtr->getRightTypePtr());
  245. if (MapPtr::dynamicCast(pPtr->getRightTypePtr()) || VectorPtr::dynamicCast(pPtr->getRightTypePtr()))
  246. {
  247. s += " >";
  248. }
  249. else
  250. {
  251. s += ">";
  252. }
  253. return s;
  254. }
  255. string Tars2OC::getReqOptionType(const TypeIdPtr &pPtr) const
  256. {
  257. return (pPtr->isRequire())?"r":"o";
  258. }
  259. string Tars2OC::toTarsV2Procstr(const TypeIdPtr &pPtr) const
  260. {
  261. ostringstream s;
  262. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  263. if (bPtr)
  264. {
  265. //
  266. s << "JV2_PROP_NM(" << getReqOptionType(pPtr) << "," << pPtr->getTag() <<","<< pPtr->getId() << ")";
  267. }
  268. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
  269. if (vPtr)
  270. {
  271. //vector<byte>
  272. if (toClassName(vPtr) == "list<char>")
  273. {
  274. s << "JV2_PROP_NM(" << getReqOptionType(pPtr) << "," << pPtr->getTag() << "," << pPtr->getId() << ")";
  275. }
  276. else
  277. {
  278. s << "JV2_PROP_EX(" << getReqOptionType(pPtr) << "," << pPtr->getTag()<< "," <<pPtr->getId()<< "," <<toAddtionalClassName(vPtr)<< ")";
  279. }
  280. }
  281. MapPtr mPtr = MapPtr::dynamicCast(pPtr->getTypePtr());
  282. if (mPtr)
  283. {
  284. s << "JV2_PROP_EX(" << getReqOptionType(pPtr) << "," << pPtr->getTag()<< "," <<pPtr->getId()<< "," << toAddtionalClassName(mPtr) << ")";
  285. }
  286. StructPtr sPtr = StructPtr::dynamicCast(pPtr->getTypePtr());
  287. if (sPtr)
  288. {
  289. s << "JV2_PROP_NM(" << getReqOptionType(pPtr) << "," << pPtr->getTag() <<","<< pPtr->getId() << ")";
  290. }
  291. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr->getTypePtr());
  292. if (ePtr)
  293. {
  294. s << "JV2_PROP_NM(" << getReqOptionType(pPtr) << "," << pPtr->getTag() <<","<< pPtr->getId() << ")";
  295. }
  296. return s.str();
  297. }
  298. /*******************************StructPtr********************************/
  299. string Tars2OC::tostrStruct(const StructPtr &pPtr) const
  300. {
  301. vector<string> vStr = TC_Common::sepstr<string>(pPtr->getSid(), "::");
  302. if(vStr.size() >= 2)
  303. {
  304. string sNamespace = getNamePrix(vStr[0]);
  305. return sNamespace + vStr[1];
  306. }
  307. return TC_Common::replace(pPtr->getSid(), "::", "");
  308. }
  309. /////////////////////////////////////////////////////////////////////
  310. string Tars2OC::tostrEnum(const EnumPtr &pPtr) const
  311. {
  312. vector<string> vStr = TC_Common::sepstr<string>(pPtr->getSid(), "::");
  313. if(vStr.size() >= 2)
  314. {
  315. string sNamespace = getNamePrix(vStr[0]);
  316. return sNamespace + vStr[1];
  317. }
  318. return TC_Common::replace(pPtr->getSid(), "::", "");
  319. }
  320. void Tars2OC::toIncludeName(const TypePtr &pPtr,map<string,int>& mReference) const
  321. {
  322. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  323. if (bPtr)
  324. {
  325. return ;
  326. }
  327. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  328. if (vPtr)
  329. {
  330. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  331. if (!bPtr)
  332. {
  333. toIncludeName(vPtr->getTypePtr(),mReference);
  334. }
  335. }
  336. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  337. if (mPtr)
  338. {
  339. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(mPtr->getLeftTypePtr());
  340. if (!bPtr)//not builin type
  341. {
  342. toIncludeName(mPtr->getLeftTypePtr(),mReference);
  343. }
  344. BuiltinPtr _bPtr = BuiltinPtr::dynamicCast(mPtr->getRightTypePtr());
  345. if (!_bPtr)
  346. {
  347. toIncludeName(mPtr->getRightTypePtr(),mReference);
  348. }
  349. }
  350. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  351. if (sPtr)
  352. {
  353. mReference[tostrStruct(sPtr)] = EM_STRUCT_TYPE;
  354. }
  355. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  356. if (ePtr)
  357. {
  358. mReference[tostrEnum(ePtr)] = EM_ENUM_TYPE;
  359. }
  360. }
  361. map<string,int> Tars2OC::getReferences(const StructPtr &pPtr, const string& namespaceId) const
  362. {
  363. map<string,int> mTemp;
  364. vector<TypeIdPtr>& vMember = pPtr->getAllMemberPtr();
  365. for (size_t j = 0; j < vMember.size(); j++)
  366. {
  367. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vMember[j]->getTypePtr());
  368. if (bPtr)
  369. {
  370. continue;
  371. }
  372. VectorPtr vPtr = VectorPtr::dynamicCast(vMember[j]->getTypePtr());
  373. if (vPtr)
  374. {
  375. //vector<byte>
  376. if (toClassName(vPtr) == "list<char>")
  377. {
  378. continue;
  379. }
  380. else
  381. {
  382. toIncludeName(vPtr,mTemp);
  383. }
  384. }
  385. MapPtr mPtr = MapPtr::dynamicCast(vMember[j]->getTypePtr());
  386. if (mPtr)
  387. {
  388. toIncludeName(mPtr,mTemp);
  389. }
  390. StructPtr sPtr = StructPtr::dynamicCast(vMember[j]->getTypePtr());
  391. if (sPtr)
  392. {
  393. mTemp[tostrStruct(sPtr)] = EM_STRUCT_TYPE;
  394. }
  395. EnumPtr ePtr = EnumPtr::dynamicCast(vMember[j]->getTypePtr());
  396. if (ePtr)
  397. {
  398. mTemp[tostrEnum(ePtr)] = EM_ENUM_TYPE;
  399. }
  400. }
  401. return mTemp;
  402. }
  403. bool Tars2OC::IsRetainType(const TypePtr &pPtr) const
  404. {
  405. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  406. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  407. if((bPtr && bPtr->kind() != Builtin::KindString) || ePtr)
  408. {
  409. return false;
  410. }
  411. else
  412. {
  413. return true;
  414. }
  415. }
  416. string Tars2OC::getNamePrix(const string& sTarsNS) const
  417. {
  418. string sNameSpace = "";
  419. if(m_bNeedNS)
  420. {
  421. if(!m_sNamespace.empty())
  422. {
  423. return m_sNamespace;
  424. }
  425. else
  426. {
  427. return sTarsNS;
  428. }
  429. }
  430. else
  431. {
  432. return sNameSpace;
  433. }
  434. }
  435. string Tars2OC::getPropertyName(const string& sId) const
  436. {
  437. return "JV2_PROP(" + sId + ")";
  438. }
  439. string Tars2OC::getSetterName(const string& sId) const
  440. {
  441. if(!sId.empty())
  442. {
  443. return "set" + TC_Common::upper(sId.substr(0,1)) + sId.substr(1) + ":";
  444. }
  445. else
  446. {
  447. return sId;
  448. }
  449. }
  450. ///////////////////////////////////////////////////////////////////////
  451. string Tars2OC::generateH(const StructPtr &pPtr, const string& namespaceId) const
  452. {
  453. ostringstream s;
  454. string sStructName = getNamePrix(namespaceId) + pPtr->getId();
  455. string fileH = m_sBaseDir + "/" + sStructName + ".h";
  456. s << g_parse->printHeaderRemark();
  457. s << "#import \"TarsObjectV2.h\"" << endl;
  458. map<string,int> mTemp = getReferences(pPtr);
  459. for(map<string,int>::iterator it = mTemp.begin();it != mTemp.end();it++)
  460. {
  461. s << "#import \"" << it->first <<".h\""<<endl;
  462. }
  463. s << endl;
  464. s << "@interface " << sStructName << " : TarsObjectV2"<< endl;
  465. s << endl;
  466. vector<TypeIdPtr>& vMember = pPtr->getAllMemberPtr();
  467. for (size_t j = 0; j < vMember.size(); j++)
  468. {
  469. string sPropType = IsRetainType(vMember[j]->getTypePtr())?"retain":"assign";
  470. s << "@property (nonatomic, "<<sPropType<<", JV2_PROP_GS_V2(" << vMember[j]->getId() << "," << getSetterName(vMember[j]->getId()) <<")) ";
  471. s << tostr(vMember[j]->getTypePtr()) << " " << toTarsV2Procstr(vMember[j]) <<";"<<endl;
  472. }
  473. s << endl;
  474. s << "@end" << endl;
  475. tars::TC_File::makeDirRecursive(m_sBaseDir);
  476. tars::TC_File::save2file(fileH, s.str());
  477. return "";
  478. }
  479. string Tars2OC::writeInit(const vector<TypeIdPtr>& vMember) const
  480. {
  481. ostringstream s;
  482. s << "- (id)init" <<endl;
  483. s << "{" <<endl;
  484. INC_TAB;
  485. s << TAB << "if (self = [super init]) {" <<endl;
  486. INC_TAB;
  487. for (size_t j = 0; j < vMember.size(); j++)
  488. {
  489. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vMember[j]->getTypePtr());
  490. if(bPtr)
  491. {
  492. if(bPtr->kind() == Builtin::KindBool)
  493. {
  494. string sBool = (vMember[j]->def() == "true")?"YES":"NO";
  495. s <<TAB << getPropertyName(vMember[j]->getId()) << " = " << sBool << ";" << endl;
  496. }
  497. else if(bPtr->kind() == Builtin::KindString)
  498. {
  499. string tmp = tars::TC_Common::replace(vMember[j]->def(), "\"", "\\\"");
  500. if(!tmp.empty())
  501. {
  502. s <<TAB << getPropertyName(vMember[j]->getId()) << " = @\"" << tmp << "\";" << endl;
  503. }
  504. else
  505. {
  506. s <<TAB << getPropertyName(vMember[j]->getId()) << " = DefaultTarsString;" << endl;
  507. }
  508. }
  509. else if((vMember[j]->def() != "0"))
  510. {
  511. s <<TAB << getPropertyName(vMember[j]->getId()) << " = " << vMember[j]->def() << ";" << endl;
  512. }
  513. }
  514. if(vMember[j]->isRequire() && IsRetainType(vMember[j]->getTypePtr()))
  515. {
  516. VectorPtr vPtr = VectorPtr::dynamicCast(vMember[j]->getTypePtr());
  517. if (vPtr)
  518. {
  519. if (toClassName(vPtr) == "list<char>")
  520. {
  521. s <<TAB << getPropertyName(vMember[j]->getId()) << " = DefaultTarsData;" << endl;
  522. }
  523. else
  524. {
  525. s <<TAB << getPropertyName(vMember[j]->getId()) << " = DefaultTarsArray;" << endl;
  526. }
  527. }
  528. MapPtr mPtr = MapPtr::dynamicCast(vMember[j]->getTypePtr());
  529. if (mPtr)
  530. {
  531. s <<TAB << getPropertyName(vMember[j]->getId()) << " = DefaultTarsDictionary;" << endl;
  532. }
  533. StructPtr sPtr = StructPtr::dynamicCast(vMember[j]->getTypePtr());
  534. if (sPtr)
  535. {
  536. s <<TAB << getPropertyName(vMember[j]->getId()) << " = ["<<tostrStruct(sPtr)<<" object];" << endl;
  537. }
  538. }
  539. }
  540. DEL_TAB;
  541. s << TAB <<"}" <<endl;
  542. s << TAB <<"return self;"<<endl;
  543. DEL_TAB;
  544. s << TAB <<"}" <<endl;
  545. return s.str();
  546. }
  547. string Tars2OC::writedealloc(const vector<TypeIdPtr>& vMember) const
  548. {
  549. ostringstream s;
  550. s << "- (void)dealloc" <<endl;
  551. s << "{" <<endl;
  552. INC_TAB;
  553. for (size_t j = 0; j < vMember.size(); j++)
  554. {
  555. //nil,NSString
  556. if(IsRetainType(vMember[j]->getTypePtr()))
  557. {
  558. s <<TAB << getPropertyName(vMember[j]->getId()) << " = nil;" <<endl;
  559. }
  560. }
  561. s << TAB << "[super dealloc];" <<endl;
  562. DEL_TAB;
  563. s << TAB <<"}" <<endl;
  564. return s.str();
  565. }
  566. string Tars2OC::writesynthesize(const vector<TypeIdPtr>& vMember) const
  567. {
  568. ostringstream s;
  569. s <<endl;
  570. for (size_t j = 0; j < vMember.size(); j++)
  571. {
  572. s <<TAB << "@synthesize " << toTarsV2Procstr(vMember[j]) <<";"<<endl;
  573. }
  574. return s.str();
  575. }
  576. string Tars2OC::writeTarsType(const StructPtr &pPtr) const
  577. {
  578. ostringstream s;
  579. s << "+ (NSString*)tarsType" <<endl;
  580. s << "{" <<endl;
  581. INC_TAB;
  582. s << TAB <<"return @"<< "\""<<TC_Common::replace(pPtr->getSid(), "::", ".")<< "\";" <<endl;
  583. DEL_TAB;
  584. s << "}" <<endl;
  585. return s.str();
  586. }
  587. string Tars2OC::writeInitialize(const StructPtr &pPtr) const
  588. {
  589. ostringstream s;
  590. s << "+ (void)initialize" <<endl;
  591. s << "{" <<endl;
  592. INC_TAB;
  593. string sStructName = tostrStruct(pPtr);//TC_Common::replace(pPtr->getSid(), "::", "");
  594. s << TAB << "if (self == [" << sStructName << " class]) {" << endl;
  595. INC_TAB;
  596. map<string,int> mTemp = getReferences(pPtr);
  597. for(map<string,int>::iterator it = mTemp.begin();it != mTemp.end();it++)
  598. {
  599. if(it->second == EM_STRUCT_TYPE)
  600. {
  601. s << TAB << "[" << it->first <<" initialize];"<< endl;
  602. }
  603. }
  604. s << TAB <<"[super initialize];" <<endl;
  605. DEL_TAB;
  606. s << TAB << "}" <<endl;
  607. DEL_TAB;
  608. s << "}" <<endl;
  609. return s.str();
  610. }
  611. ///////////////////////////////////////////////////////////////////////
  612. string Tars2OC::generateM(const EnumPtr &pPtr, const string& namespaceId) const
  613. {
  614. ostringstream s;
  615. string sEnumPrefix = getNamePrix(namespaceId) + pPtr->getId();
  616. string fileH = m_sBaseDir + FILE_SEP + sEnumPrefix + ".m";
  617. s << g_parse->printHeaderRemark();
  618. s << "#import \"TarsObjectV2.h\"" << endl;
  619. s << "#import \"" <<sEnumPrefix<<".h\""<<endl;
  620. s << endl;
  621. s << "#if TARSV2_ENUM_ETOS_AND_STOE_SUPPORTED" <<endl;
  622. s <<endl;
  623. s << "@implementation " <<sEnumPrefix<<"Helper"<<endl;
  624. s << endl;
  625. s << "+ (NSString *)etos:(" << sEnumPrefix << ")e" << endl;
  626. s << "{" << endl;
  627. INC_TAB;
  628. s << TAB << "switch(e){" << endl;
  629. INC_TAB;
  630. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  631. for(size_t i = 0; i < member.size(); i++)
  632. {
  633. string sMem = sEnumPrefix + "_" + member[i]->getId();
  634. s << TAB << "case " << sMem << ": return "<< "@\"" << sMem << "\";" << endl;
  635. }
  636. s << TAB << "default: return @\"\";" << endl;
  637. DEL_TAB;
  638. s << TAB << "}" << endl;
  639. DEL_TAB;
  640. s << TAB << "}" << endl;
  641. s << endl;
  642. s << "+ (" << sEnumPrefix << ")stoe:(NSString *)s" << endl;
  643. s << "{" << endl;
  644. INC_TAB;
  645. for(size_t i = 0; i < member.size(); i++)
  646. {
  647. string sMem = sEnumPrefix + "_" + member[i]->getId();
  648. s << TAB << "if(isTarsEnumStringEqual(s, @\"" << sMem << "\")) return " << sMem <<";"<<endl;
  649. }
  650. s << TAB << "return NSIntegerMin;" << endl;
  651. DEL_TAB;
  652. s << TAB << "}" << endl;
  653. s <<endl;
  654. s << "@end"<<endl;
  655. s <<endl;
  656. s << "#endif" <<endl;
  657. tars::TC_File::makeDirRecursive(m_sBaseDir);
  658. tars::TC_File::save2file(fileH, s.str());
  659. return "";
  660. }
  661. string Tars2OC::generateM(const StructPtr &pPtr, const string& namespaceId) const
  662. {
  663. string sStructName = getNamePrix(namespaceId) + pPtr->getId();
  664. ostringstream s;
  665. string fileM = m_sBaseDir + FILE_SEP + sStructName + ".m";
  666. s << g_parse->printHeaderRemark();
  667. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  668. ////////////////////////////////////////////////////////////
  669. s << "#import \"" <<sStructName<<".h\""<<endl;
  670. s << endl;
  671. s << "@implementation " <<sStructName<< endl;
  672. //build properties
  673. s << writesynthesize(member) <<endl;
  674. //build initialize
  675. s << writeInitialize(pPtr) <<endl;
  676. //build init method
  677. s << writeInit(member) <<endl;
  678. //build dealloc method
  679. if(!m_bARC)
  680. {
  681. s << writedealloc(member) <<endl;
  682. }
  683. //build tarsType method
  684. s << writeTarsType(pPtr) <<endl;
  685. s << "@end" << endl;
  686. tars::TC_File::makeDirRecursive(m_sBaseDir);
  687. tars::TC_File::save2file(fileM, s.str());
  688. return "";
  689. }
  690. /*******************************ContainerPtr********************************/
  691. string Tars2OC::generateH(const ContainerPtr &pPtr) const
  692. {
  693. ostringstream s;
  694. for (size_t i = 0; i < pPtr->getAllNamespacePtr().size(); i++)
  695. {
  696. s << generateH(pPtr->getAllNamespacePtr()[i]) << endl;
  697. s << endl;
  698. }
  699. return s.str();
  700. }
  701. /******************************EnumPtr***************************************/
  702. string Tars2OC::generateH(const EnumPtr &pPtr, const string& namespaceId) const
  703. {
  704. ostringstream s;
  705. string sEnumPrefix = getNamePrix(namespaceId) + pPtr->getId();
  706. string fileH = m_sBaseDir + FILE_SEP + sEnumPrefix + ".h";
  707. s << g_parse->printHeaderRemark();
  708. s << "#import \"TarsObjectV2.h\"" << endl;
  709. s << endl;
  710. s << "enum {"<<endl;
  711. INC_TAB;
  712. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  713. for (size_t i = 0; i < member.size(); i++)
  714. {
  715. s << TAB << sEnumPrefix << "_" << member[i]->getId();
  716. if (member[i]->hasDefault())
  717. {
  718. s << " = " << member[i]->def();
  719. }
  720. s << (i==member.size()-1 ? "" : ",") << endl;
  721. }
  722. DEL_TAB;
  723. s <<"};" << endl;
  724. s <<"#define "<<sEnumPrefix<<" NSInteger"<<endl;
  725. s <<endl;
  726. s << "#if TARSV2_ENUM_ETOS_AND_STOE_SUPPORTED" <<endl;
  727. s <<endl;
  728. s << "@interface " <<sEnumPrefix << "Helper: TarsEnumHelper" <<endl;
  729. s <<endl;
  730. s << "+ (NSString *)etos:(" << sEnumPrefix <<")e;"<<endl;
  731. s << "+ (" << sEnumPrefix << ")stoe:(NSString *)s;" <<endl;
  732. s <<endl;
  733. s << "@end" <<endl;
  734. s << endl;
  735. s << "#endif" <<endl;
  736. tars::TC_File::makeDirRecursive(m_sBaseDir);
  737. tars::TC_File::save2file(fileH, s.str());
  738. return "";
  739. }
  740. /******************************NamespacePtr***************************************/
  741. string Tars2OC::generate(const NamespacePtr &pPtr) const
  742. {
  743. vector<StructPtr>&ss = pPtr->getAllStructPtr();
  744. vector<EnumPtr>&es = pPtr->getAllEnumPtr();
  745. for (size_t i = 0; i < es.size(); i++)
  746. {
  747. generateH(es[i], pPtr->getId());
  748. generateM(es[i], pPtr->getId());
  749. }
  750. for (size_t i = 0; i < ss.size(); i++)
  751. {
  752. generateH(ss[i], pPtr->getId());
  753. generateM(ss[i], pPtr->getId());
  754. }
  755. return "";
  756. }
  757. /******************************Tars2OC***************************************/
  758. void Tars2OC::generate(const ContextPtr &pPtr) const
  759. {
  760. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  761. for (size_t i = 0; i < namespaces.size(); i++)
  762. {
  763. generate(namespaces[i]);
  764. }
  765. }
  766. void Tars2OC::createFile(const string &file)
  767. {
  768. std::vector<ContextPtr> contexts = g_parse->getContexts();
  769. for (size_t i = 0; i < contexts.size(); i++)
  770. {
  771. if (file == contexts[i]->getFileName())
  772. {
  773. generate(contexts[i]);
  774. }
  775. }
  776. }