]> git.tdb.fi Git - libs/game.git/commitdiff
Support declaring external types for generated setups
authorMikko Rasa <tdb@tdb.fi>
Sat, 15 Mar 2025 10:44:02 +0000 (12:44 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 15 Mar 2025 10:44:02 +0000 (12:44 +0200)
tools/setupgen/setupgen.cpp
tools/setupgen/setupgen.h

index 8448f558006f8780c47912f76b06f3e8c643c730..18e130071878f1542ee78d2f4e64612b3167e79f 100644 (file)
@@ -206,6 +206,7 @@ void SetupGen::Loader::init_actions()
        add("component", &Loader::struct_def, Struct::COMPONENT);
        add("entity", &Loader::struct_def, Struct::ENTITY);
        add("enum", &Loader::enum_def);
+       add("external", &Loader::external);
        add("import", &Loader::import);
        add("namespace", &Loader::name_space);
 }
@@ -230,6 +231,13 @@ void SetupGen::Loader::enum_def(const DataFile::Symbol &n)
        type.set_enum(*mod.enums.emplace_back(make_unique<Enum>(move(en))));
 }
 
+void SetupGen::Loader::external(const std::string &h)
+{
+       ExternalLoader ldr(obj, h);
+       load_sub_with(ldr);
+       obj.headers.insert(h);
+}
+
 void SetupGen::Loader::import(const string &n)
 {
        string fn = n+".mgs";
@@ -257,3 +265,31 @@ void SetupGen::Loader::struct_def(Struct::Kind kind, const DataFile::Symbol &n)
        type.set_cpp_type(join(mod.name_space, "::", type.get_cpp_type()));
        type.set_struct(*mod.structs.emplace_back(make_unique<Struct>(move(sct))));
 }
+
+
+SetupGen::ExternalLoader::ExternalLoader(SetupGen &s, const string &h):
+       ObjectLoader(s),
+       header(h)
+{
+       static ActionMap shared_actions;
+       set_actions(shared_actions);
+}
+
+void SetupGen::ExternalLoader::init_actions()
+{
+       add("component", &ExternalLoader::declaration, Type::STRUCT);
+       add("entity", &ExternalLoader::declaration, Type::STRUCT);
+       add("enum", &ExternalLoader::declaration, Type::ENUM);
+       add("namespace", &ExternalLoader::set_namespace);
+}
+
+void SetupGen::ExternalLoader::declaration(Type::Kind k, const DataFile::Symbol &n)
+{
+       Type &type = obj.add_type(n.name, k);
+       type.set_cpp_type(join(name_space, "::", type.get_cpp_type()), header);
+}
+
+void SetupGen::ExternalLoader::set_namespace(const string &n)
+{
+       name_space = n;
+}
index f792e4506c2ca88a4e2196c5a99a23fb2b560205..82f614a01d3f7d7b371b2142af74195126756c6d 100644 (file)
@@ -39,11 +39,28 @@ private:
                void api(const std::string &);
                void api_with_header(const std::string &, const std::string &);
                void enum_def(const Msp::DataFile::Symbol &);
+               void external(const std::string &);
                void import(const std::string &);
                void name_space(const std::string &);
                void struct_def(Struct::Kind, const Msp::DataFile::Symbol &);
        };
 
+       class ExternalLoader: public Msp::DataFile::ObjectLoader<SetupGen>
+       {
+       private:
+               std::string header;
+               std::string name_space;
+
+       public:
+               ExternalLoader(SetupGen &, const std::string &);
+
+       private:
+               void init_actions() override;
+
+               void declaration(Type::Kind, const Msp::DataFile::Symbol &);
+               void set_namespace(const std::string &);
+       };
+
        std::string in_fn;
        std::string out_fn;
        std::vector<Msp::FS::Path> import_path;