| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389 |
- //
- // Copyright (c) 2008-2020 the Urho3D project.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
- //
- #include "ASResult.h"
- #include "Tuning.h"
- #include "Utils.h"
- #include <fstream>
- #include <cassert>
- #include <unordered_map>
- #include <memory>
- extern string _sourceDir;
- namespace ASBindingGenerator
- {
- ASGeneratedFile_WithRegistrationFunction::ASGeneratedFile_WithRegistrationFunction(const string& outputFilePath, const string& functionName)
- {
- outputFilePath_ = outputFilePath;
- functionName_ = functionName;
- }
- // ============================================================================
- void ASGeneratedFile_Members::Save()
- {
- ofstream out(outputFilePath_);
- out <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "#include \"../AngelScript/Manual.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n"
- "void FakeAddRef(void* ptr);\n"
- "void FakeReleaseRef(void* ptr);\n"
- "\n"
- << glue_.str() <<
- "void " << functionName_ << "(asIScriptEngine* engine)\n"
- "{\n"
- << reg_.str() <<
- "}\n"
- "\n"
- "}\n";
- }
- // ============================================================================
- ASGeneratedFile_Templates::ASGeneratedFile_Templates(const string& outputFilePath)
- {
- outputFilePath_ = outputFilePath;
- }
- void ASGeneratedFile_Templates::Save()
- {
- ofstream out(outputFilePath_);
- out <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#pragma once\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "#include \"../AngelScript/Manual.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n"
- "void FakeAddRef(void* ptr);\n"
- "void FakeReleaseRef(void* ptr);\n"
- "\n"
- << glue_.str()
- << reg_.str() <<
- "}\n";
- }
- bool ProcessedEnum::operator <(const ProcessedEnum& rhs) const
- {
- if (insideDefine_ != rhs.insideDefine_)
- return insideDefine_ < rhs.insideDefine_;
- return name_ < rhs.name_;
- }
- bool ProcessedGlobalFunction::operator <(const ProcessedGlobalFunction& rhs) const
- {
- if (insideDefine_ != rhs.insideDefine_)
- return insideDefine_ < rhs.insideDefine_;
- if (name_ != rhs.name_)
- return name_ < rhs.name_;
- // Overloads with the same name may exist
- if (comment_ != rhs.comment_)
- return comment_ < rhs.comment_;
- // Different specializations of the same template and aliases have the same comment
- return registration_ < rhs.registration_;
- }
- bool ProcessedGlobalVariable::operator <(const ProcessedGlobalVariable& rhs) const
- {
- if (insideDefine_ != rhs.insideDefine_)
- return insideDefine_ < rhs.insideDefine_;
- return name_ < rhs.name_;
- }
- bool ProcessedClass::operator <(const ProcessedClass& rhs) const
- {
- if (inherianceDeep_ != rhs.inherianceDeep_)
- return inherianceDeep_ < rhs.inherianceDeep_;
- if (insideDefine_ != rhs.insideDefine_)
- return insideDefine_ < rhs.insideDefine_;
- return name_ < rhs.name_;
- }
- bool MemberRegistrationError::operator <(const MemberRegistrationError& rhs) const
- {
- if (name_ != rhs.name_)
- return name_ < rhs.name_;
- return comment_ < rhs.comment_;
- }
- namespace Result
- {
- vector<ProcessedEnum> enums_;
- // Write result to GeneratedEnums.cpp
- static void SaveEnums()
- {
- sort(enums_.begin(), enums_.end());
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedEnums.cpp");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "// We need register all enums before registration of any functions because functions can use any enums\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n";
- for (const ProcessedEnum& processedEnum : enums_)
- {
- if (!processedEnum.glue_.size())
- continue;
- if (!processedEnum.insideDefine_.empty())
- ofs << "#ifdef " << processedEnum.insideDefine_ << "\n";
- ofs << "// " << processedEnum.comment_ << "\n";
- for (const string& glue : processedEnum.glue_)
- ofs << glue << "\n";
- if (!processedEnum.insideDefine_.empty())
- ofs << "#endif\n";
- ofs << "\n";
- }
- ofs <<
- "void ASRegisterGeneratedEnums(asIScriptEngine* engine)\n"
- "{\n";
- bool isFirst = true;
- string openedDefine;
- for (const ProcessedEnum& processedEnum : enums_)
- {
- if (processedEnum.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (!isFirst)
- ofs << "\n";
- if (processedEnum.insideDefine_ != openedDefine && !processedEnum.insideDefine_.empty())
- {
- ofs << "#ifdef " << processedEnum.insideDefine_ << "\n";
- openedDefine = processedEnum.insideDefine_;
- }
- ofs << " // " << processedEnum.comment_ << "\n";
- for (const string& registration : processedEnum.registration_)
- ofs << " " << registration << "\n";
- isFirst = false;
- }
- if (!openedDefine.empty())
- ofs << "#endif\n";
- ofs <<
- "}\n"
- "\n"
- "}\n";
- }
- // ============================================================================
- vector<ProcessedGlobalFunction> globalFunctions_;
- // Write result to GlobalFunctions.cpp
- static void SaveGlobalFunctions()
- {
- sort(globalFunctions_.begin(), globalFunctions_.end());
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedGlobalFunctions.cpp");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n";
- for (const ProcessedGlobalFunction& globalFunction : globalFunctions_)
- {
- if (globalFunction.glue_.empty())
- continue;
- if (!globalFunction.insideDefine_.empty())
- ofs << "#ifdef " << globalFunction.insideDefine_ << "\n";
- ofs << "// " << globalFunction.comment_ << "\n";
- ofs << globalFunction.glue_ << "\n";
- if (!globalFunction.insideDefine_.empty())
- ofs << "#endif\n";
- ofs << "\n";
- }
- ofs <<
- "void ASRegisterGeneratedGlobalFunctions(asIScriptEngine* engine)\n"
- "{\n";
- bool isFirst = true;
- string openedDefine;
- string lastComment;
- for (const ProcessedGlobalFunction& globalFunction : globalFunctions_)
- {
- if (globalFunction.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (!isFirst && lastComment != globalFunction.comment_)
- ofs << "\n";
- if (globalFunction.insideDefine_ != openedDefine && !globalFunction.insideDefine_.empty())
- {
- ofs << "#ifdef " << globalFunction.insideDefine_ << "\n";
- openedDefine = globalFunction.insideDefine_;
- }
- if (lastComment != globalFunction.comment_)
- ofs << " // " << globalFunction.comment_ << "\n";
- ofs << " " << globalFunction.registration_ << "\n";
- isFirst = false;
- lastComment = globalFunction.comment_;
- }
- if (!openedDefine.empty())
- ofs << "#endif\n";
- ofs <<
- "}\n"
- "\n"
- "}\n";
- }
- // ============================================================================
- vector<ProcessedGlobalVariable> globalVariables_;
- // Write result to GlobalVariables.cpp
- static void SaveGlobalVariables()
- {
- sort(globalVariables_.begin(), globalVariables_.end());
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedGlobalVariables.cpp");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "// Some headers could re-define M_PI, ensure that it's undefined\n"
- "#undef M_PI\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n"
- "void ASRegisterGeneratedGlobalVariables(asIScriptEngine* engine)\n"
- "{\n";
- bool isFirst = true;
- string openedDefine;
- string lastComment;
- for (const ProcessedGlobalVariable& globalVariable : globalVariables_)
- {
- if (globalVariable.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (!isFirst && lastComment != globalVariable.comment_)
- ofs << "\n";
- if (globalVariable.insideDefine_ != openedDefine && !globalVariable.insideDefine_.empty())
- {
- ofs << "#ifdef " << globalVariable.insideDefine_ << "\n";
- openedDefine = globalVariable.insideDefine_;
- }
- if (lastComment != globalVariable.comment_)
- ofs << " // " << globalVariable.comment_ << "\n";
- ofs << " " << globalVariable.registration_ << "\n";
- isFirst = false;
- lastComment = globalVariable.comment_;
- }
- if (!openedDefine.empty())
- ofs << "#endif\n";
- ofs <<
- "}\n"
- "\n"
- "}\n";
- }
- // ============================================================================
- vector<ProcessedClass> classes_;
- // Write result to GeneratedObjectTypes.cpp
- static void SaveObjectTypes()
- {
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedObjectTypes.cpp");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "// We need register all types before registration of any functions because functions can use any types\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n"
- "void ASRegisterGeneratedObjectTypes(asIScriptEngine* engine)\n"
- "{\n";
- string openedDefine;
- bool isFirst = true;
- for (const ProcessedClass& processedClass : classes_)
- {
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (!isFirst)
- ofs << "\n";
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- ofs << "#ifdef " << processedClass.insideDefine_ << "\n";
- openedDefine = processedClass.insideDefine_;
- }
- ofs
- << " // " << processedClass.comment_ << "\n"
- << " " << processedClass.objectTypeRegistration_ << "\n";
- isFirst = false;
- }
- if (!openedDefine.empty())
- ofs << "#endif\n";
- ofs <<
- "}\n"
- "\n"
- "}\n";
- }
- // Write result to GeneratedDefaultConstructors.cpp
- static void SaveDefaultConstructors()
- {
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedDefaultConstructors.cpp");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "// We need register default constructors before any members to allow using in Array<type>\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n";
- string openedDefine;
- for (const ProcessedClass& processedClass : classes_)
- {
- if (!processedClass.defaultConstructor_)
- continue;
- if (processedClass.defaultConstructor_->glue_.empty())
- continue;
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "\n#endif\n";
- openedDefine.clear();
- }
- ofs << "\n";
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- ofs << "#ifdef " << processedClass.insideDefine_ << "\n\n";
- openedDefine = processedClass.insideDefine_;
- }
- ofs <<
- "// " << processedClass.defaultConstructor_->comment_ << "\n" <<
- processedClass.defaultConstructor_->glue_;
- }
- if (!openedDefine.empty())
- {
- ofs << "\n#endif\n";
- openedDefine.clear();
- }
- ofs <<
- "\n"
- "void ASRegisterGeneratedDefaultConstructors(asIScriptEngine* engine)\n"
- "{\n";
- bool isFirst = true;
- for (const ProcessedClass& processedClass : classes_)
- {
- if (!processedClass.defaultConstructor_)
- continue;
- if (processedClass.noBind_)
- continue;
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (!isFirst)
- ofs << "\n";
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- ofs << "#ifdef " << processedClass.insideDefine_ << "\n";
- openedDefine = processedClass.insideDefine_;
- }
- ofs <<
- " // " << processedClass.defaultConstructor_->comment_ << "\n" <<
- " " << processedClass.defaultConstructor_->registration_ << "\n";
- isFirst = false;
- }
- if (!openedDefine.empty())
- ofs << "#endif\n";
- ofs <<
- "}\n"
- "\n"
- "}\n";
- }
- // Write result to GeneratedClasses.cpp
- static void SaveGeneratedClasses()
- {
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedClasses.cpp");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "#include \"../AngelScript/GeneratedClassMembers.h\"\n"
- "#include \"../AngelScript/Generated_Members.h\"\n"
- "#include \"../AngelScript/Manual.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n"
- "\n"
- "void FakeAddRef(void* ptr);\n"
- "void FakeReleaseRef(void* ptr);\n";
- string openedDefine;
-
- for (ProcessedClass& processedClass : classes_)
- {
- if (processedClass.noBind_)
- continue;
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "\n#endif // def " << openedDefine << "\n";
- openedDefine.clear();
- }
- ofs << "\n";
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- ofs << "#ifdef " << processedClass.insideDefine_ << "\n\n";
- openedDefine = processedClass.insideDefine_;
- }
- if (processedClass.destructor_ && !processedClass.destructor_->glue_.empty())
- {
- ofs <<
- "// " << processedClass.destructor_->comment_ << "\n"
- << processedClass.destructor_->glue_ <<
- "\n";
- }
- for (const SpecialMethodRegistration& nonDefaultConstructor : processedClass.nonDefaultConstructors_)
- {
- ofs <<
- "// " << nonDefaultConstructor.comment_ << "\n"
- << nonDefaultConstructor.glue_ <<
- "\n";
- }
- for (const Registration& personalMethod : processedClass.personalMethods_)
- {
- if (personalMethod.glue_.size())
- {
- ofs <<
- "// " << personalMethod.comment_ << "\n"
- << personalMethod.glue_ <<
- "\n";
- }
- }
- for (const Registration& personalStaticMethod : processedClass.personalStaticMethods_)
- {
- if (personalStaticMethod.glue_.size())
- {
- ofs <<
- "// " << personalStaticMethod.comment_ << "\n"
- << personalStaticMethod.glue_ <<
- "\n";
- }
- }
- ofs <<
- "// " << processedClass.comment_ << "\n"
- "static void Register_" << processedClass.name_ << "(asIScriptEngine* engine)\n"
- "{\n";
- bool needGap = false;
- sort(processedClass.unregisteredSpecialMethods_.begin(), processedClass.unregisteredSpecialMethods_.end());
- for (const MemberRegistrationError& regError : processedClass.unregisteredSpecialMethods_)
- {
- ofs <<
- " // " << regError.comment_ << "\n"
- " // " << regError.message_ << "\n";
- needGap = true;
- }
- if (needGap && processedClass.nonDefaultConstructors_.size())
- ofs << '\n';
- for (const SpecialMethodRegistration& nonDefaultConstructor : processedClass.nonDefaultConstructors_)
- {
- ofs <<
- " // " << nonDefaultConstructor.comment_ << "\n"
- " " << nonDefaultConstructor.registration_ << "\n";
- needGap = true;
- }
- if (processedClass.destructor_)
- {
- if (needGap)
- ofs << '\n';
- ofs <<
- " // " << processedClass.destructor_->comment_ << "\n"
- " " << processedClass.destructor_->registration_ << "\n";
-
- needGap = true;
- }
- if (needGap && processedClass.fakeRefBehaviors_.size())
- ofs << '\n';
- for (const SpecialMethodRegistration& fakeRefBehavior : processedClass.fakeRefBehaviors_)
- {
- if (fakeRefBehavior.comment_.size())
- ofs << " // " << fakeRefBehavior.comment_ << '\n';
- ofs << " " + fakeRefBehavior.registration_ << '\n';
- needGap = true;
- }
- if (needGap && processedClass.subclassRegistrations_.size())
- ofs << '\n';
- for (const string& subclassRegistration : processedClass.subclassRegistrations_)
- {
- ofs << " " << subclassRegistration << '\n';
- needGap = true;
- }
- if (needGap)
- ofs << '\n';
- ofs <<
- " MemberCollection members;\n"
- " RegisterMembers_" << processedClass.name_ << "<" << processedClass.name_ << ">(engine, \"" << processedClass.name_ << "\");\n"
- " CollectMembers_" << processedClass.name_ << "(members);\n"
- " RegisterMembers(engine, \"" << processedClass.name_ << "\", members);\n"
- "\n"
- " #ifdef REGISTER_CLASS_MANUAL_PART_" << processedClass.name_ << "\n"
- " REGISTER_CLASS_MANUAL_PART_" << processedClass.name_ << "();\n"
- " #endif\n";
- for (const Registration& perosnalMethod : processedClass.personalMethods_)
- {
- ofs <<
- "\n"
- " // " << perosnalMethod.comment_ << "\n";
- for (const string& reg : perosnalMethod.registration_)
- ofs << " " << reg << '\n';
- }
- for (const Registration& perosnalStaticMethod : processedClass.personalStaticMethods_)
- {
- ofs <<
- "\n"
- " // " << perosnalStaticMethod.comment_ << "\n";
- for (const string& reg : perosnalStaticMethod.registration_)
- ofs << " " << reg << '\n';
- }
- if (processedClass.additionalLines_.size())
- ofs << '\n';
- for (string str : processedClass.additionalLines_)
- ofs << str << '\n';
- ofs << "}\n";
- }
- if (!openedDefine.empty())
- {
- ofs << "\n#endif // def " << openedDefine << "\n";
- openedDefine.clear();
- }
- ofs <<
- "\n"
- "void ASRegisterGeneratedClasses(asIScriptEngine* engine)\n"
- "{\n";
- bool isFirst = true;
- for (const ProcessedClass& processedClass : classes_)
- {
- if (processedClass.noBind_)
- continue;
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- if (!isFirst)
- ofs << "\n";
- ofs << "#ifdef " << processedClass.insideDefine_ << "\n";
- openedDefine = processedClass.insideDefine_;
- }
- ofs << " Register_" << processedClass.name_ << "(engine);\n";
- isFirst = false;
- }
- if (!openedDefine.empty())
- ofs << "#endif\n";
- ofs <<
- "}\n"
- "\n"
- "}\n";
- }
- struct MemberCppFile
- {
- ofstream ofs_;
- string openedDefine_;
- bool needGap_ = false;
- MemberCppFile(const string& dirName)
- {
- string fileName = _sourceDir + "/Source/Urho3D/AngelScript/Generated_Members_" + dirName + ".cpp";
- ofs_ = ofstream(fileName);
- ofs_ <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#include \"../Precompiled.h\"\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "#include \"../AngelScript/GeneratedClassMembers.h\"\n"
- "#include \"../AngelScript/Manual.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n";
- }
- };
- unordered_map<string, shared_ptr<MemberCppFile>> memberCppFiles_;
- shared_ptr<MemberCppFile> GetMemberCppFile(const string& dirName)
- {
- auto it = memberCppFiles_.find(dirName);
- if (it == memberCppFiles_.end())
- {
- auto newElement = memberCppFiles_.emplace(dirName, make_shared<MemberCppFile>(dirName));
- it = newElement.first;
- }
- return (*it).second;
- }
- // Write result to GeneratedClassMembers.cpp and GeneratedClassMembers.h // TODO change comment
- static void SaveClassMembers()
- {
- for (ProcessedClass& processedClass : classes_)
- {
- shared_ptr<MemberCppFile> file = GetMemberCppFile(processedClass.dirName_);
- if (processedClass.insideDefine_ != file->openedDefine_ && !file->openedDefine_.empty())
- {
- file->ofs_ <<
- "\n"
- "#endif // def " << file->openedDefine_ << "\n";
- file->openedDefine_.clear();
- }
- if (processedClass.insideDefine_ != file->openedDefine_ && !processedClass.insideDefine_.empty())
- {
- file->ofs_ <<
- "\n"
- "#ifdef " << processedClass.insideDefine_ << "\n";
- file->openedDefine_ = processedClass.insideDefine_;
- }
- for (const MethodRegistration& method : processedClass.methods_)
- {
- if (!method.glue_.empty())
- {
- file->ofs_ <<
- "\n"
- "// " << method.cppDeclaration_ << "\n"
- << method.glue_;
- }
- }
- for (const StaticMethodRegistration& staticMethod : processedClass.staticMethods_)
- {
- if (!staticMethod.glue_.empty())
- {
- file->ofs_ <<
- "\n"
- "// " << staticMethod.cppDeclaration_ << "\n"
- << staticMethod.glue_;
- }
- }
- file->ofs_ <<
- "\n"
- "// " << processedClass.comment_ << "\n"
- "void CollectMembers_" << processedClass.name_ << "(MemberCollection& members)\n"
- "{\n";
- file->needGap_ = false;
- if (processedClass.baseClassNames_.size())
- {
- for (const string& baseClassName : processedClass.baseClassNames_)
- file->ofs_ << " CollectMembers_" << baseClassName << "(members);\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.hiddenMethods_.size())
- file->ofs_ << '\n';
- for (const string& hiddenMethod : processedClass.hiddenMethods_)
- {
- string escaped = ReplaceAll(hiddenMethod, "\"", "\\\"");
- file->ofs_ << " Remove(members.methods_, \"" << escaped << "\");\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.hiddenStaticMethods_.size())
- file->ofs_ << '\n';
- for (const string& hiddenStaticMethod : processedClass.hiddenStaticMethods_)
- {
- string escaped = ReplaceAll(hiddenStaticMethod, "\"", "\\\"");
- file->ofs_ << " Remove(members.staticMethods_, \"" << escaped << "\");\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.hiddenFields_.size())
- file->ofs_ << '\n';
- for (const string& hiddenField : processedClass.hiddenFields_)
- {
- string escaped = ReplaceAll(hiddenField, "\"", "\\\"");
- file->ofs_ << " Remove(members.fields_, \"" << escaped << "\");\n";
- file->ofs_ << " Remove(members.wrappedFields_, \"" << escaped << "\");\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.hiddenStaticFields_.size())
- file->ofs_ << '\n';
- for (const string& hiddenStaticField : processedClass.hiddenStaticFields_)
- {
- string escaped = ReplaceAll(hiddenStaticField, "\"", "\\\"");
- file->ofs_ << " Remove(members.staticFields_, \"" << escaped << "\");\n";
- file->needGap_ = true;
- }
- sort(processedClass.unregisteredMethods_.begin(), processedClass.unregisteredMethods_.end());
- if (file->needGap_ && processedClass.unregisteredMethods_.size())
- file->ofs_ << '\n';
- for (const MemberRegistrationError& unregisteredMethod : processedClass.unregisteredMethods_)
- {
- file->ofs_ <<
- " // " << unregisteredMethod.comment_ << "\n"
- " // " << unregisteredMethod.message_ << "\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.methods_.size())
- file->ofs_ << '\n';
- // TODO сортировать
- for (const MethodRegistration& method : processedClass.methods_)
- {
- const RegisterObjectMethodArgs& args = method.registration_;
- assert(args.asDeclarations_.size());
- for (const string& asDeclaration : args.asDeclarations_)
- file->ofs_ << " members.methods_.Push(RegisterObjectMethodArgs(\"" << method.cppDeclaration_ << "\", \"" << asDeclaration << "\", " << args.funcPointer_ << ", " << args.callConv_ << "));\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.unregisteredStaticMethods_.size())
- file->ofs_ << '\n';
- for (const MemberRegistrationError& unregisteredStaticMethod : processedClass.unregisteredStaticMethods_)
- {
- file->ofs_ <<
- " // " << unregisteredStaticMethod.comment_ << "\n"
- " // " << unregisteredStaticMethod.message_ << "\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.staticMethods_.size())
- file->ofs_ << '\n';
- for (const StaticMethodRegistration& staticMethod : processedClass.staticMethods_)
- {
- const RegisterGlobalFunctionArgs& args = staticMethod.registration_;
- assert(args.asDeclarations_.size());
- for (const string& asDeclaration : args.asDeclarations_)
- file->ofs_ << " members.staticMethods_.Push(RegisterGlobalFunctionArgs(\"" << staticMethod.cppDeclaration_ << "\", \"" << asDeclaration << "\", " << args.funcPointer_ << ", " << args.callConv_ << "));\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.unregisteredFields_.size())
- file->ofs_ << '\n';
- for (const MemberRegistrationError& unregisteredField : processedClass.unregisteredFields_)
- {
- file->ofs_ <<
- " // " << unregisteredField.comment_ << "\n"
- " // " << unregisteredField.message_ << "\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.fields_.size())
- file->ofs_ << '\n';
- for (const FieldRegistration& field : processedClass.fields_)
- {
- const RegisterObjectPropertyArgs& args = field.registration_;
- assert(args.asDeclarations_.size());
- for (const string& asDeclaration : args.asDeclarations_)
- file->ofs_ << " members.fields_.Push(RegisterObjectPropertyArgs(\"" << field.cppDeclaration_ << "\", \"" << asDeclaration << "\", " << args.byteOffset_ << "));\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.unregisteredStaticFields_.size())
- file->ofs_ << '\n';
- for (const MemberRegistrationError& unregisteredStaticField : processedClass.unregisteredStaticFields_)
- {
- file->ofs_ <<
- " // " << unregisteredStaticField.comment_ << "\n"
- " // " << unregisteredStaticField.message_ << "\n";
- file->needGap_ = true;
- }
- if (file->needGap_ && processedClass.staticFields_.size())
- file->ofs_ << '\n';
- for (const StaticFieldRegistration& staticField : processedClass.staticFields_)
- {
- const RegisterGlobalPropertyArgs& args = staticField.registration_;
- assert(args.asDeclarations_.size());
- for (const string& asDeclaration : args.asDeclarations_)
- file->ofs_ << " members.staticFields_.Push(RegisterGlobalPropertyArgs(\"" << staticField.cppDeclaration_ << "\", \"" << asDeclaration << "\", " << args.pointer_ << "));\n";
- file->needGap_ = true;
- }
- if (file->needGap_)
- file->ofs_ << '\n';
- //file->ofs_ <<
- // " #ifdef REGISTER_MEMBERS_MANUAL_PART_" << processedClass.name_ << "\n"
- // " REGISTER_MEMBERS_MANUAL_PART_" << processedClass.name_ << "();\n"
- // " #endif\n";
- file->ofs_ << "}\n";
- }
- for (auto it : memberCppFiles_)
- {
- shared_ptr<MemberCppFile> file = it.second;
-
- if (!file->openedDefine_.empty())
- {
- file->ofs_ <<
- "\n"
- "#endif // def " << file->openedDefine_ << "\n";
- file->openedDefine_.clear();
- }
- file->ofs_ <<
- "\n"
- "} // namespace Urho3D\n";
- }
- ofstream ofsH(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedClassMembers.h");
- ofsH <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#pragma once\n"
- "\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n";
- string openedDefine;
- for (const ProcessedClass& processedClass : classes_)
- {
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofsH <<
- "\n"
- "#endif // def " << openedDefine << "\n";
- openedDefine.clear();
- }
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- ofsH <<
- "\n"
- "#ifdef " << processedClass.insideDefine_ << "\n";
- openedDefine = processedClass.insideDefine_;
- }
- ofsH <<
- "\n"
- "// " << processedClass.comment_ << "\n"
- "void CollectMembers_" << processedClass.name_ << "(MemberCollection& members);\n";
- }
- if (!openedDefine.empty())
- {
- ofsH <<
- "\n"
- "#endif // def " << openedDefine << "\n";
- openedDefine.clear();
- }
- ofsH <<
- "\n"
- "} // namespace Urho3D\n";
- ofsH = ofstream(_sourceDir + "/Source/Urho3D/AngelScript/Generated_Members.h");
- ofsH <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#pragma once\n"
- "\n"
- "#include \"../AngelScript/APITemplates.h\"\n"
- "\n"
- "#include \"../AngelScript/GeneratedIncludes.h\"\n"
- "#include \"../AngelScript/Manual.h\"\n"
- "\n"
- "namespace Urho3D\n"
- "{\n";
- openedDefine.clear();
- for (const ProcessedClass& processedClass : classes_)
- {
- if (processedClass.insideDefine_ != openedDefine && !openedDefine.empty())
- {
- ofsH <<
- "\n"
- "#endif // def " << openedDefine << "\n";
- openedDefine.clear();
- }
- if (processedClass.insideDefine_ != openedDefine && !processedClass.insideDefine_.empty())
- {
- ofsH <<
- "\n"
- "#ifdef " << processedClass.insideDefine_ << "\n";
- openedDefine = processedClass.insideDefine_;
- }
- for (const Registration& method : processedClass.templateMethods_)
- {
- if (method.glue_.size())
- {
- ofsH <<
- "\n"
- "// " << method.comment_ << "\n"
- << method.glue_;
- }
- }
- for (const Registration& staticMethod : processedClass.templateStaticMethods_)
- {
- if (staticMethod.glue_.size())
- {
- ofsH <<
- "\n"
- "// " << staticMethod.comment_ << "\n"
- << staticMethod.glue_;
- }
- }
- ofsH <<
- "\n"
- "// " << processedClass.comment_ << "\n"
- "template <class T> void RegisterMembers_" << processedClass.name_ << "(asIScriptEngine* engine, const char* className)\n"
- "{\n";
- bool needGap = false;
- if (processedClass.baseClassNames_.size())
- {
- for (const string& baseClassName : processedClass.baseClassNames_)
- ofsH << " RegisterMembers_" << baseClassName << "<T>(engine, className);\n";
- needGap = true;
- }
- if (needGap && processedClass.unregisteredMethods_.size())
- ofsH << '\n';
- for (const MemberRegistrationError& unregisteredMethod : processedClass.unregisteredMethods_)
- {
- ofsH <<
- " // " << unregisteredMethod.comment_ << "\n"
- " // " << unregisteredMethod.message_ << "\n";
- needGap = true;
- }
- for (const Registration& method : processedClass.templateMethods_)
- {
- if (needGap)
- ofsH << '\n';
- ofsH << " // " << method.comment_ << '\n';
- for (const string& registration : method.registration_)
- ofsH << " " << registration << '\n';
- needGap = true;
- }
- for (const Registration& staticMethod : processedClass.templateStaticMethods_)
- {
- if (needGap)
- ofsH << '\n';
- ofsH << " // " << staticMethod.comment_ << '\n';
- for (const string& registration : staticMethod.registration_)
- ofsH << " " << registration << '\n';
- needGap = true;
- }
- ofsH <<
- " #ifdef REGISTER_MEMBERS_MANUAL_PART_" << processedClass.name_ << "\n"
- " REGISTER_MEMBERS_MANUAL_PART_" << processedClass.name_ << "();\n"
- " #endif\n";
- ofsH << "}\n";
- }
- if (!openedDefine.empty())
- {
- ofsH <<
- "\n"
- "#endif // def " << openedDefine << "\n";
- openedDefine.clear();
- }
- ofsH <<
- "\n"
- "} // namespace Urho3D\n";
- }
- static void SaveClasses()
- {
- sort(classes_.begin(), classes_.end());
- SaveObjectTypes();
- SaveDefaultConstructors();
- SaveGeneratedClasses();
- SaveClassMembers();
- }
- // ============================================================================
- // List of all required header files
- static vector<string> headers_;
- // Discarded header files for statistic
- static vector<string> ignoredHeaders_;
- // Add header to lists if not added yet
- void AddHeader(const string& headerFile)
- {
- if (IsIgnoredHeader(headerFile))
- {
- if (!CONTAINS(ignoredHeaders_, headerFile))
- ignoredHeaders_.push_back(headerFile);
- }
- else
- {
- if (!CONTAINS(headers_, headerFile))
- headers_.push_back(headerFile);
- }
- }
- // Write result to GeneratedIncludes.h
- static void SaveIncludes()
- {
- sort(headers_.begin(), headers_.end());
- sort(ignoredHeaders_.begin(), ignoredHeaders_.end());
- ofstream ofs(_sourceDir + "/Source/Urho3D/AngelScript/GeneratedIncludes.h");
- ofs <<
- "// DO NOT EDIT. This file is generated\n"
- "\n"
- "#pragma once\n"
- "\n";
- string openedDefine;
- bool isFirst = true;
- for (const string& header : headers_)
- {
- string insideDefine = InsideDefine(header);
- if (insideDefine != openedDefine)
- {
- if (!openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (!isFirst) // First include can be guarded. Avoid print \n before it
- ofs << "\n";
- if (!insideDefine.empty())
- {
- ofs << "#ifdef " << insideDefine << "\n";
- openedDefine = insideDefine;
- }
- }
- ofs << "#include \"" << header << "\"\n";
- isFirst = false;
- }
- if (!openedDefine.empty())
- {
- ofs << "#endif\n";
- openedDefine.clear();
- }
- if (headers_.size() > 0)
- ofs << "\n";
- if (ignoredHeaders_.size() > 0)
- ofs << "// Ignored headers\n\n";
- isFirst = true;
- for (const string& header : ignoredHeaders_)
- {
- string insideDefine = InsideDefine(header);
- if (insideDefine != openedDefine)
- {
- if (!openedDefine.empty())
- {
- ofs << "//#endif\n";
- openedDefine.clear();
- }
- if (!isFirst) // First include can be guarded. Avoid print \n before it
- ofs << "\n";
- if (!insideDefine.empty())
- {
- ofs << "//#ifdef " << insideDefine << "\n";
- openedDefine = insideDefine;
- }
- }
- ofs << "//#include \"" << header << "\"\n";
- isFirst = false;
- }
- if (!openedDefine.empty())
- ofs << "//#endif\n";
- }
- }
- void SaveResult()
- {
- Result::SaveEnums();
- Result::SaveGlobalFunctions();
- Result::SaveGlobalVariables();
- Result::SaveClasses();
- Result::SaveIncludes();
- }
- }
|