CSPackageWriter.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. //
  2. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  3. // LICENSE: Atomic Game Engine Editor and Tools EULA
  4. // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
  5. // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
  6. //
  7. #include <Atomic/IO/File.h>
  8. #include <Atomic/IO/FileSystem.h>
  9. #include <Atomic/Core/StringUtils.h>
  10. #include "../JSBind.h"
  11. #include "../JSBFunction.h"
  12. #include "../JSBModule.h"
  13. #include "../JSBPackage.h"
  14. #include "../JSBEnum.h"
  15. #include "../JSBClass.h"
  16. #include "CSTypeHelper.h"
  17. #include "CSModuleWriter.h"
  18. #include "CSPackageWriter.h"
  19. namespace ToolCore
  20. {
  21. CSPackageWriter::CSPackageWriter(JSBPackage *package) : JSBPackageWriter(package)
  22. {
  23. }
  24. void CSPackageWriter::GenNativeFunctionSignature(JSBFunction* function, String& sig)
  25. {
  26. JSBClass* klass = function->GetClass();
  27. Vector<JSBFunctionType*>& parameters = function->GetParameters();
  28. Vector<String> args;
  29. if (!function->IsConstructor())
  30. {
  31. args.Push(ToString("%s* self", klass->GetNativeName().CString()));
  32. }
  33. if (parameters.Size())
  34. {
  35. for (unsigned int i = 0; i < parameters.Size(); i++)
  36. {
  37. JSBFunctionType* ptype = parameters.At(i);
  38. // ignore "Context" parameters
  39. if (ptype->type_->asClassType())
  40. {
  41. JSBClassType* classType = ptype->type_->asClassType();
  42. JSBClass* klass = classType->class_;
  43. if (klass->GetName() == "Context")
  44. {
  45. continue;
  46. }
  47. args.Push(ToString("%s* %s", klass->GetNativeName().CString(), ptype->name_.CString()));
  48. }
  49. else
  50. {
  51. args.Push(CSTypeHelper::GetNativeTypeString(ptype) + " " + ptype->name_);
  52. }
  53. }
  54. }
  55. if (function->GetReturnClass() && function->GetReturnClass()->IsNumberArray())
  56. {
  57. args.Push(ToString("%s* returnValue", function->GetReturnClass()->GetNativeName().CString()));
  58. }
  59. sig.Join(args, ", ");
  60. }
  61. void CSPackageWriter::GenerateNativeHeader()
  62. {
  63. String source = "// This file was autogenerated by AtomicTool, changes will be lost\n\n";
  64. source += "#pragma once\n\n";
  65. if (package_->name_ != "Atomic")
  66. {
  67. source += "#include \"../../Atomic/Native/CSPackageAtomic.h\"\n";
  68. source += "using namespace Atomic;\n";
  69. }
  70. // enum includes
  71. PODVector<JSBHeader*> enumHeaders;
  72. for (unsigned i = 0; i < package_->modules_.Size(); i++)
  73. {
  74. Vector<SharedPtr<JSBEnum>> enums = package_->modules_[i]->GetEnums();
  75. for (unsigned j = 0; j < enums.Size(); j++)
  76. {
  77. JSBHeader* header = enums[j]->GetHeader();
  78. if (!enumHeaders.Contains(header))
  79. enumHeaders.Push(header);
  80. }
  81. }
  82. for (unsigned i = 0; i < enumHeaders.Size(); i++)
  83. {
  84. JSBHeader* header = enumHeaders[i];
  85. String headerPath = GetPath(header->GetFilePath());
  86. String headerfile = GetFileNameAndExtension(header->GetFilePath());
  87. JSBind* jsbind = header->GetSubsystem<JSBind>();
  88. headerPath.Replace(jsbind->GetSourceRootFolder() + "Source/", "");
  89. source.AppendWithFormat("#include <%s%s>\n", headerPath.CString(), headerfile.CString());
  90. }
  91. // forward declarations of package classes
  92. source += ToString("namespace %s\n{\n\n", package_->GetNamespace().CString());
  93. Indent();
  94. PODVector<JSBClass*>& allClasses = package_->GetAllClasses();
  95. for (unsigned i = 0; i < allClasses.Size(); i++)
  96. {
  97. JSBClass* cls = allClasses[i];
  98. source += IndentLine(ToString("class %s;\n", cls->GetNativeName().CString()));
  99. }
  100. Dedent();
  101. source += "\n}\n";
  102. JSBind* jsbind = package_->GetSubsystem<JSBind>();
  103. String filepath = jsbind->GetDestNativeFolder() + "/CSPackage" + package_->name_ + ".h";
  104. File file(package_->GetContext());
  105. file.Open(filepath, FILE_WRITE);
  106. file.Write(source.CString(), source.Length());
  107. file.Close();
  108. }
  109. void CSPackageWriter::GenerateNativeSource()
  110. {
  111. GenerateNativeHeader();
  112. String source = "// This file was autogenerated by AtomicTool, changes will be lost\n\n";
  113. const char* packageName = package_->name_.CString();
  114. String packageHeader = "CSPackage" + package_->name_ + ".h";
  115. source += ToString("#include \"%s\"\n", packageHeader.CString());
  116. if (package_->name_ != "Atomic")
  117. source += "using namespace Atomic;\n";
  118. // begin namespace
  119. // source += ToString("using namespace %s;\n", packageName);
  120. source += ToString("namespace %s\n{\n", packageName);
  121. // end of namespace
  122. source += "\n}\n";
  123. JSBind* jsbind = package_->GetSubsystem<JSBind>();
  124. String filepath = jsbind->GetDestNativeFolder() + "/CSPackage" + package_->name_ + ".cpp";
  125. File file(package_->GetContext());
  126. file.Open(filepath, FILE_WRITE);
  127. file.Write(source.CString(), source.Length());
  128. file.Close();
  129. }
  130. void CSPackageWriter::GenerateManagedSource()
  131. {
  132. }
  133. void CSPackageWriter::GenerateSource()
  134. {
  135. GenerateNativeSource();
  136. GenerateManagedSource();
  137. for (unsigned i = 0; i < package_->modules_.Size(); i++)
  138. {
  139. CSModuleWriter writer(package_->modules_[i]);
  140. writer.GenerateSource();
  141. }
  142. }
  143. }