| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
- // Please see LICENSE.md in repository root for license information
- // https://github.com/AtomicGameEngine/AtomicGameEngine
- #include <Atomic/Atomic.h>
- #include <Atomic/IO/Log.h>
- #include <Atomic/Core/ProcessUtils.h>
- #include <Atomic/Resource/ResourceCache.h>
- #include "JSBind.h"
- #include "JSBPackage.h"
- #include "JSBModule.h"
- #include "JSBFunction.h"
- #include "JSBDoc.h"
- namespace ToolCore
- {
- static String GetScriptType(JSBFunctionType* ftype)
- {
- String scriptType = "number";
- if (ftype->type_->asPrimitiveType())
- {
- JSBPrimitiveType* ptype = ftype->type_->asPrimitiveType();
- if (ptype->kind_ == JSBPrimitiveType::Bool)
- scriptType = "boolean";
- }
- if (ftype->type_->asStringHashType() || ftype->type_->asStringType())
- scriptType = "string";
- if (ftype->type_->asEnumType())
- scriptType = "Atomic." + ftype->type_->asEnumType()->enum_->GetName();
- if (ftype->type_->asEnumType())
- scriptType = "Atomic." + ftype->type_->asEnumType()->enum_->GetName();
- if (ftype->type_->asClassType())
- scriptType = "Atomic." + ftype->type_->asClassType()->class_->GetName();
- return scriptType;
- }
- void JSBDoc::Begin()
- {
- source_ += "//Atomic JSDoc Definitions\n\n\n";
- source_ += "/**\n * Atomic Game Engine\n * @namespace\n*/\n var Atomic = {}\n\n";
- }
- void JSBDoc::End()
- {
- }
- String JSBDoc::GenFunctionDoc(JSBFunction* function)
- {
- if (function->Skip())
- return "";
- String params;
- Vector<JSBFunctionType*>& parameters = function->GetParameters();
- for (unsigned i = 0; i < parameters.Size(); i++)
- {
- JSBFunctionType* ftype = parameters.At(i);
- String scriptType = GetScriptType(ftype);
- if (scriptType == "Atomic.Context")
- continue;
- // mark as optional
- if (ftype->initializer_.Length())
- scriptType += "=";
- params += " * @param {" + scriptType + "} " + ftype->name_ + "\n";
- }
- String returns;
- if (function->GetReturnType())
- returns = " * @returns { " + GetScriptType(function->GetReturnType()) + "}\n";
- String docString;
- if (function->IsConstructor())
- {
- docString.AppendWithFormat("%s", params.CString());
- }
- else
- {
- docString.AppendWithFormat(" * %s\n * @memberof Atomic.%s.prototype\n%s%s\n",
- function->GetDocString().CString(),
- function->GetClass()->GetName().CString(),
- params.CString(),
- returns.CString());
- }
- return docString;
- }
- void JSBDoc::ExportModuleClasses(JSBModule* module)
- {
- Vector<SharedPtr<JSBClass>> classes = module->GetClasses();
- if (!classes.Size())
- return;
- source_ += "\n";
- for (unsigned i = 0; i < classes.Size(); i++)
- {
- JSBClass* klass = classes.At(i);
- source_ += "/**\n * @class\n* @memberof Atomic\n";
- if (klass->GetBaseClass())
- source_ += " * @augments Atomic." + klass->GetBaseClass()->GetName()+ "\n";
- // PROPERTIES
- Vector<String> propertyNames;
- klass->GetPropertyNames(propertyNames);
- for (unsigned j = 0; j < propertyNames.Size(); j++)
- {
- JSBProperty* prop = klass->GetProperty(propertyNames[j]);
- JSBFunctionType* ftype = NULL;
- String desc;
- if (prop->getter_ && !prop->getter_->Skip())
- {
- desc = prop->getter_->GetDocString();
- ftype = prop->getter_->GetReturnType();
- }
- else if (prop->setter_ && !prop->setter_->Skip())
- {
- ftype = prop->setter_->GetParameters()[0];
- }
- if (prop->setter_ && prop->setter_->GetDocString().Length())
- {
- // overwrite getter docstring if it exsists
- desc = prop->setter_->GetDocString();
- }
- if (!ftype)
- continue;
- String scriptType = GetScriptType(ftype);
- String scriptName = propertyNames[j];
- scriptName[0] = tolower(scriptName[0]);
- if (desc.Length())
- {
- source_ += " * @property {" + scriptType + "} " + scriptName + " - " + desc + "\n";
- }
- else
- {
- source_ += " * @property {" + scriptType + "} " + scriptName + "\n";
- }
- }
- JSBFunction* constructor = klass->GetConstructor();
- if (constructor)
- {
- String docs = GenFunctionDoc(constructor);
- source_ += docs;
- }
- source_ += "*/ \nfunction " + klass->GetName() + "() {};\n\n";
- // FUNCTIONS
- PODVector<JSBFunction*>& functions = klass->GetFunctions();
- for (unsigned j = 0; j < functions.Size(); j++)
- {
- JSBFunction* func = functions[j];
- if (func->IsConstructor() || func->IsDestructor() || func->Skip())
- continue;
- String docs = GenFunctionDoc(func);
- String scriptName = func->GetName();
- scriptName[0] = tolower(scriptName[0]);
- if (scriptName == "delete")
- scriptName = "__delete";
- String docString;
- docString.AppendWithFormat("/**\n %s */\n function %s() {};\n\n",
- docs.CString(),
- scriptName.CString());
- source_ += docString;
- }
- }
- }
- void JSBDoc::ExportModuleConstants(JSBModule* module)
- {
- Vector<String>& constants = module->GetConstants();
- if (!constants.Size())
- return;
- source_ += "\n";
- for (unsigned i = 0; i < constants.Size(); i++)
- {
- const String& cname = constants.At(i);
- source_ += "/**\n * @memberof Atomic\n * @type {number}\n */\nvar " + cname + ";\n";
- }
- source_ += "\n";
- }
- void JSBDoc::ExportModuleEnums(JSBModule* module)
- {
- Vector<SharedPtr<JSBEnum>> enums = module->GetEnums();
- for (unsigned i = 0; i < enums.Size(); i++)
- {
- JSBEnum* _enum = enums.At(i);
- source_ += "/**\n * @memberof Atomic\n * @readonly\n * @enum {number}\n */\n";
- source_ += " var " + _enum->GetName() + " = {\n";
- Vector<String>& values = _enum->GetValues();
- for (unsigned j = 0; j < values.Size(); j++)
- {
- source_ += " " + values[j] + " : undefined";
- if (j != values.Size() - 1)
- source_ += ",\n";
- }
- source_ += "\n\n};\n\n";
- }
- }
- void JSBDoc::WriteToFile(const String &path)
- {
- File file(package_->GetContext());
- file.Open(path, FILE_WRITE);
- file.Write(source_.CString(), source_.Length());
- file.Close();
- }
- void JSBDoc::Emit(JSBPackage* package, const String& path)
- {
- package_ = package;
- Vector<SharedPtr<JSBModule>>& modules = package->GetModules();
- Begin();
- for (unsigned i = 0; i < modules.Size(); i++)
- {
- ExportModuleEnums(modules[i]);
- }
- for (unsigned i = 0; i < modules.Size(); i++)
- {
- ExportModuleConstants(modules[i]);
- }
- for (unsigned i = 0; i < modules.Size(); i++)
- {
- source_ += "\n//----------------------------------------------------\n";
- source_ += "// MODULE: " + modules[i]->GetName() + "\n";
- source_ += "//----------------------------------------------------\n\n";
- ExportModuleClasses(modules[i]);
- }
- End();
- WriteToFile(path);
- }
- }
|