| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- //
- // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
- // LICENSE: Atomic Game Engine Editor and Tools EULA
- // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
- // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
- //
- #include <Atomic/IO/FileSystem.h>
- #include "../JSBind.h"
- #include "../JSBModule.h"
- #include "../JSBPackage.h"
- #include "../JSBEnum.h"
- #include "../JSBClass.h"
- #include "../JSBFunction.h"
- #include "CSBClassWriter.h"
- #include "CSBFunctionWriter.h"
- namespace ToolCore
- {
- CSBClassWriter::CSBClassWriter(JSBClass *klass) : klass_(klass)
- {
- }
- void CSBClassWriter::WriteFunctions(String& source)
- {
- for (unsigned i = 0; i < klass_->functions_.Size(); i++)
- {
- JSBFunction* function = klass_->functions_.At(i);
- if (function->Skip())
- continue;
- if (function->IsDestructor())
- continue;
- CSBFunctionWriter writer(function);
- writer.GenerateSource(source);
- }
- }
- void CSBClassWriter::GenerateSource(String& sourceOut)
- {
- String source = "";
- if (klass_->IsNumberArray())
- return;
- WriteFunctions(source);
- String packageName = klass_->GetModule()->GetPackage()->GetName();
- source.AppendWithFormat("static void jsb_class_define_%s(JSVM* vm)\n{\n", klass_->GetName().CString());
- source.Append("duk_context* ctx = vm->GetJSContext();\n");
- source.AppendWithFormat("js_class_get_prototype(ctx, \"%s\", \"%s\");\n", packageName.CString(), klass_->GetName().CString());
- for (unsigned i = 0; i < klass_->functions_.Size(); i++)
- {
- JSBFunction* function = klass_->functions_.At(i);
- if (function->Skip())
- continue;
- if (function->IsConstructor() || function->IsDestructor())
- continue;
- if (function->FirstDefaultParameter() != -1)
- {
- source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, DUK_VARARGS);\n", klass_->GetName().CString(), function->GetName().CString());
- }
- else
- {
- source.AppendWithFormat("duk_push_c_function(ctx, jsb_class_%s_%s, %i);\n", klass_->GetName().CString(), function->GetName().CString(), (int) function->GetParameters().Size());
- }
- String scriptName = function->GetName();
- scriptName[0] = tolower(scriptName[0]);
- source.AppendWithFormat("duk_put_prop_string(ctx, -2, \"%s\");\n", scriptName.CString());
- }
- source.Append("duk_pop(ctx);\n");
- source.Append("}\n");
- sourceOut += source;
- }
- }
|