From beea9bfadf856ca9e8c8fa962bb21ffacf2953cc Mon Sep 17 00:00:00 2001 From: Username404 Date: Sun, 19 Sep 2021 20:38:32 +0200 Subject: [PATCH] Make const parse trees actually constant, fix formatting in Target.hpp and classes derived from Target --- src/headers/parsing/ParseComponents.hpp | 25 ++++++++++++------- src/headers/transpiler/Target.hpp | 2 +- src/headers/transpiler/implementations/Js.hpp | 4 +-- .../transpiler/implementations/Lua.hpp | 4 +-- src/headers/transpiler/implementations/Py.hpp | 4 +-- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/headers/parsing/ParseComponents.hpp b/src/headers/parsing/ParseComponents.hpp index 8e9938c..701be51 100644 --- a/src/headers/parsing/ParseComponents.hpp +++ b/src/headers/parsing/ParseComponents.hpp @@ -48,6 +48,12 @@ namespace StandardComponents { #define IS_PARSECOMPONENT IS(ParseComponent) class ParseTree { + IS_PARSECOMPONENT + void addComponent(const T& component) const { + subComponents.emplace_back(new T(component)); + }; IS_PARSECOMPONENT void addAllComponents(const initializer_list& components) const { + for (const T& comp: components) addComponent(comp); + } protected: mutable vector> subComponents; using array_type = decltype(subComponents); @@ -79,19 +85,20 @@ public: return optional>(); }; inline size_t getCompCount() const { return subComponents.size(); } + IS_PARSECOMPONENT inline void add(const T& component) { addComponent(component); }; + IS_PARSECOMPONENT inline void addAll(const initializer_list& components) { addAllComponents(components); } IS_PARSECOMPONENT - void add(const T& component) const { - subComponents.emplace_back(new T(component)); - }; IS_PARSECOMPONENT void addAll(const initializer_list& components) const { - for (const auto& comp: components) add(comp); - } - IS_PARSECOMPONENT - inline const ParseTree& operator<<(const T& component) const { add(component); return *this; } + inline ParseTree& operator<<(const T& component) { add(component); return *this; } ParseTree(): subComponents() {}; IS_PARSECOMPONENT - explicit ParseTree(const T& element): ParseTree() { add(element); } + constexpr explicit ParseTree(const T& element): ParseTree() { addComponent(element); } IS_PARSECOMPONENT - ParseTree(const initializer_list& elements): ParseTree() { addAll(elements); } + constexpr ParseTree(const initializer_list& elements): ParseTree() { addAllComponents(elements); } + ParseTree(const initializer_list& elements): ParseTree() { + for_each(elements.begin(), elements.end(), [&](ParseComponent* component){ + subComponents.emplace_back(component); + }); + } }; #undef IS_PARSECOMPONENT diff --git a/src/headers/transpiler/Target.hpp b/src/headers/transpiler/Target.hpp index 1a7d3b5..b2338c3 100644 --- a/src/headers/transpiler/Target.hpp +++ b/src/headers/transpiler/Target.hpp @@ -95,7 +95,7 @@ inline string transpile(const ParseTree& tree, const string_view& language, cons #include "implementations/Py.hpp" enum LANGUAGE: signed short { NONE = -1, LUA, JS, PY }; -constinit const array languages { ".lua", ".js", ".py"}; +constinit const array languages { ".lua", ".js", ".py" }; shared_ptr Target::forName(string_view name, const bool newLines = true) { LANGUAGE selected = NONE; diff --git a/src/headers/transpiler/implementations/Js.hpp b/src/headers/transpiler/implementations/Js.hpp index b6e6161..a697b18 100644 --- a/src/headers/transpiler/implementations/Js.hpp +++ b/src/headers/transpiler/implementations/Js.hpp @@ -2,10 +2,10 @@ #define JS_HPP JsTarget struct JsTarget: Target { - void on(const StandardComponents::Define &parseComponent) override { + void on(const StandardComponents::Define& parseComponent) override { output << (parseComponent.final ? "const " : "let ") << parseComponent.name << " = "; } - void on(const StandardComponents::types::String &parseComponent) override { + void on(const StandardComponents::types::String& parseComponent) override { stringInterpolation(parseComponent.content); } using Target::Target; diff --git a/src/headers/transpiler/implementations/Lua.hpp b/src/headers/transpiler/implementations/Lua.hpp index 12f2772..0dcf2be 100644 --- a/src/headers/transpiler/implementations/Lua.hpp +++ b/src/headers/transpiler/implementations/Lua.hpp @@ -2,13 +2,13 @@ #define LUA_HPP LuaTarget struct LuaTarget: Target { - void on(const StandardComponents::Define &parseComponent) override { + void on(const StandardComponents::Define& parseComponent) override { if (parseComponent.final) output << "local "; output << parseComponent.name; if (parseComponent.final) output << " "; // TODO Find an alternative to for lua <5.4 output << " = "; } - void on(const StandardComponents::types::String &parseComponent) override { + void on(const StandardComponents::types::String& parseComponent) override { stringInterpolation(parseComponent.content, "[[", "]]", ".."); } using Target::Target; diff --git a/src/headers/transpiler/implementations/Py.hpp b/src/headers/transpiler/implementations/Py.hpp index 252d79b..aab2640 100644 --- a/src/headers/transpiler/implementations/Py.hpp +++ b/src/headers/transpiler/implementations/Py.hpp @@ -3,10 +3,10 @@ struct PyTarget: Target { bool supportsOneLine() final { return false; } - void on(const StandardComponents::Define &parseComponent) override { + void on(const StandardComponents::Define& parseComponent) override { output << parseComponent.name << " = "; } - void on(const StandardComponents::types::String &parseComponent) override { + void on(const StandardComponents::types::String& parseComponent) override { stringInterpolation(R"(""")", parseComponent.content); } using Target::Target;