CSBClassWriter.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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/FileSystem.h>
  8. #include "../JSBind.h"
  9. #include "../JSBModule.h"
  10. #include "../JSBPackage.h"
  11. #include "../JSBEnum.h"
  12. #include "../JSBClass.h"
  13. #include "../JSBFunction.h"
  14. #include "CSBClassWriter.h"
  15. #include "CSBFunctionWriter.h"
  16. namespace ToolCore
  17. {
  18. CSBClassWriter::CSBClassWriter(JSBClass *klass) : klass_(klass)
  19. {
  20. }
  21. void CSBClassWriter::WriteFunctions(String& source)
  22. {
  23. for (unsigned i = 0; i < klass_->functions_.Size(); i++)
  24. {
  25. JSBFunction* function = klass_->functions_.At(i);
  26. if (function->Skip())
  27. continue;
  28. if (function->IsDestructor())
  29. continue;
  30. CSBFunctionWriter writer(function);
  31. writer.GenerateSource(source);
  32. }
  33. }
  34. void CSBClassWriter::GenerateSource(String& sourceOut)
  35. {
  36. String source = "";
  37. if (klass_->IsNumberArray())
  38. return;
  39. WriteFunctions(source);
  40. String packageName = klass_->GetModule()->GetPackage()->GetName();
  41. source.AppendWithFormat("static void jsb_class_define_%s(JSVM* vm)\n{\n", klass_->GetName().CString());
  42. source.Append("duk_context* ctx = vm->GetJSContext();\n");
  43. source.AppendWithFormat("js_class_get_prototype(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
  44. for (unsigned i = 0; i < klass_->functions_.Size(); i++)
  45. {
  46. JSBFunction* function = klass_->functions_.At(i);
  47. if (function->Skip())
  48. continue;
  49. if (function->IsConstructor() || function->IsDestructor())
  50. continue;
  51. if (function->FirstDefaultParameter() != -1)
  52. {
  53. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
  54. }
  55. else
  56. {
  57. source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int) function->GetParameters().Size());
  58. }
  59. String scriptName = function->GetName();
  60. scriptName[0] = tolower(scriptName[0]);
  61. source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
  62. }
  63. source.Append("duk_pop(ctx);\n");
  64. source.Append("}\n");
  65. sourceOut += source;
  66. }
  67. }