CSPackageWriter.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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\nnamespace Atomic\n{\n}\n";
  65. /*
  66. if (package_->name_ != "Atomic")
  67. {
  68. source += "#include \"../../Atomic/Native/CSPackageAtomic.h\"\n";
  69. source += "using namespace Atomic;\n";
  70. }
  71. // enum includes
  72. PODVector<JSBHeader*> enumHeaders;
  73. for (unsigned i = 0; i < package_->modules_.Size(); i++)
  74. {
  75. Vector<SharedPtr<JSBEnum>> enums = package_->modules_[i]->GetEnums();
  76. for (unsigned j = 0; j < enums.Size(); j++)
  77. {
  78. JSBHeader* header = enums[j]->GetHeader();
  79. if (!enumHeaders.Contains(header))
  80. enumHeaders.Push(header);
  81. }
  82. }
  83. for (unsigned i = 0; i < enumHeaders.Size(); i++)
  84. {
  85. JSBHeader* header = enumHeaders[i];
  86. String headerPath = GetPath(header->GetFilePath());
  87. String headerfile = GetFileNameAndExtension(header->GetFilePath());
  88. JSBind* jsbind = header->GetSubsystem<JSBind>();
  89. headerPath.Replace(jsbind->GetSourceRootFolder() + "Source/", "");
  90. source.AppendWithFormat("#include <%s%s>\n", headerPath.CString(), headerfile.CString());
  91. }
  92. // forward declarations of package classes
  93. source += ToString("namespace %s\n{\n\n", package_->GetNamespace().CString());
  94. Indent();
  95. PODVector<JSBClass*>& allClasses = package_->GetAllClasses();
  96. for (unsigned i = 0; i < allClasses.Size(); i++)
  97. {
  98. JSBClass* cls = allClasses[i];
  99. source += IndentLine(ToString("class %s;\n", cls->GetNativeName().CString()));
  100. }
  101. Dedent();
  102. source += "\n}\n";
  103. */
  104. JSBind* jsbind = package_->GetSubsystem<JSBind>();
  105. String filepath = jsbind->GetDestNativeFolder() + "/CSPackage" + package_->name_ + ".h";
  106. File file(package_->GetContext());
  107. file.Open(filepath, FILE_WRITE);
  108. file.Write(source.CString(), source.Length());
  109. file.Close();
  110. }
  111. void CSPackageWriter::GenerateNativeSource()
  112. {
  113. GenerateNativeHeader();
  114. String source = "// This file was autogenerated by AtomicTool, changes will be lost\n\n";
  115. const char* packageName = package_->name_.CString();
  116. String packageHeader = "CSPackage" + package_->name_ + ".h";
  117. source += ToString("#include \"%s\"\n", packageHeader.CString());
  118. if (package_->name_ != "Atomic")
  119. source += "using namespace Atomic;\n";
  120. // begin namespace
  121. // source += ToString("using namespace %s;\n", packageName);
  122. source += ToString("namespace %s\n{\n", packageName);
  123. // end of namespace
  124. source += "\n}\n";
  125. JSBind* jsbind = package_->GetSubsystem<JSBind>();
  126. String filepath = jsbind->GetDestNativeFolder() + "/CSPackage" + package_->name_ + ".cpp";
  127. File file(package_->GetContext());
  128. file.Open(filepath, FILE_WRITE);
  129. file.Write(source.CString(), source.Length());
  130. file.Close();
  131. }
  132. void CSPackageWriter::GenerateManagedSource()
  133. {
  134. }
  135. void CSPackageWriter::GenerateSource()
  136. {
  137. GenerateNativeSource();
  138. GenerateManagedSource();
  139. for (unsigned i = 0; i < package_->modules_.Size(); i++)
  140. {
  141. CSModuleWriter writer(package_->modules_[i]);
  142. writer.GenerateSource();
  143. }
  144. }
  145. }