// // 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 #include #include "../JSBind.h" #include "../JSBPackage.h" #include "../JSBModule.h" #include "../JSBEnum.h" #include "../JSBClass.h" #include "../JSBFunction.h" #include "CSClassWriter.h" #include "CSModuleWriter.h" namespace ToolCore { CSModuleWriter::CSModuleWriter(JSBModule *module) : JSBModuleWriter(module) { } void CSModuleWriter::WriteIncludes(String& source) { Vector& includes = module_->includes_; for (unsigned i = 0; i < includes.Size(); i++) { if (includes[i].StartsWith("<")) source.AppendWithFormat("#include %s\n", includes[i].CString()); else source.AppendWithFormat("#include \"%s\"\n", includes[i].CString()); } Vector allheaders; HashMap >::Iterator eitr = module_->enums_.Begin(); while (eitr != module_->enums_.End()) { allheaders.Push(eitr->second_->GetHeader()); eitr++; } HashMap >::Iterator citr = module_->classes_.Begin(); while (citr != module_->classes_.End()) { allheaders.Push(citr->second_->GetHeader()); citr++; } Vector included; for (unsigned i = 0; i < allheaders.Size(); i++) { JSBHeader* header = allheaders.At(i); if (included.Contains(header)) continue; String headerPath = GetPath(header->GetFilePath()); String headerfile = GetFileNameAndExtension(header->GetFilePath()); JSBind* jsbind = header->GetSubsystem(); headerPath.Replace(jsbind->GetSourceRootFolder() + "Source/", ""); source.AppendWithFormat("#include <%s%s>\n", headerPath.CString(), headerfile.CString()); included.Push(header); } } void CSModuleWriter::GenerateNativeSource() { String source = "// This file was autogenerated by JSBind, changes will be lost\n"; source += "#ifdef ATOMIC_PLATFORM_WINDOWS\n"; source += "#pragma warning(disable: 4244) // possible loss of data\n"; source += "#endif\n"; if (module_->Requires("3D")) { source += "#ifdef ATOMIC_3D\n"; } source += "#include \n"; source += "#include \n"; source += "#include \n"; WriteIncludes(source); String ns = module_->GetPackage()->GetNamespace(); if (ns != "Atomic") { source += "\n\nusing namespace " + ns + ";\n\n"; } source += "\n\nnamespace Atomic\n{\n \n"; source += "// Begin Class Declarations\n"; source += "// End Class Declarations\n\n"; source += "// Begin Classes\n"; Vector> classes = module_->classes_.Values(); for (unsigned i = 0; i < classes.Size(); i++) { CSClassWriter clsWriter(classes[i]); clsWriter.GenerateSource(source); } source += "// End Classes\n\n"; // end Atomic namespace source += "\n}\n"; if (module_->Requires("3D")) { source += "#endif //ATOMIC_3D\n"; } JSBind* jsbind = module_->GetSubsystem(); String filepath = jsbind->GetDestNativeFolder() + "/CSModule" + module_->name_ + ".cpp"; File file(module_->GetContext()); file.Open(filepath, FILE_WRITE); file.Write(source.CString(), source.Length()); file.Close(); } void CSModuleWriter::GenerateManagedSource() { String source = "// Hello C#!"; JSBind* jsbind = module_->GetSubsystem(); String filepath = jsbind->GetDestScriptFolder() + "/CSModule" + module_->name_ + ".cs"; File file(module_->GetContext()); file.Open(filepath, FILE_WRITE); file.Write(source.CString(), source.Length()); file.Close(); } void CSModuleWriter::GenerateSource() { GenerateNativeSource(); GenerateManagedSource(); } }