From 1cda421badfdaa4ee641b2b108c8ae2067fb0f5e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 8 Aug 2019 20:26:44 +0200 Subject: [PATCH] DSL: Add get_template{,s} Signed-off-by: Michael Friedrich --- lib/base/scriptutils.cpp | 54 ++++++++++++++++++++++++++++++++++++++++ lib/base/scriptutils.hpp | 2 ++ 2 files changed, 56 insertions(+) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index 47f2ccdea..838f20edd 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -14,6 +14,7 @@ #include "base/dependencygraph.hpp" #include "base/initialize.hpp" #include "base/namespace.hpp" +#include "config/configitem.hpp" #include #include #include @@ -35,6 +36,8 @@ REGISTER_FUNCTION(System, exit, &Application::Exit, "status"); REGISTER_SAFE_FUNCTION(System, typeof, &ScriptUtils::TypeOf, "value"); REGISTER_SAFE_FUNCTION(System, keys, &ScriptUtils::Keys, "value"); REGISTER_SAFE_FUNCTION(System, random, &Utility::Random, ""); +REGISTER_SAFE_FUNCTION(System, get_template, &ScriptUtils::GetTemplate, "type:name"); +REGISTER_SAFE_FUNCTION(System, get_templates, &ScriptUtils::GetTemplates, "type"); REGISTER_SAFE_FUNCTION(System, get_object, &ScriptUtils::GetObject, "type:name"); REGISTER_SAFE_FUNCTION(System, get_objects, &ScriptUtils::GetObjects, "type"); REGISTER_FUNCTION(System, assert, &ScriptUtils::Assert, "value"); @@ -407,6 +410,57 @@ Array::Ptr ScriptUtils::Keys(const Object::Ptr& obj) return new Array(std::move(result)); } +static Dictionary::Ptr GetTargetForTemplate(const ConfigItem::Ptr& item) +{ + DebugInfo di = item->GetDebugInfo(); + + return new Dictionary({ + { "name", item->GetName() }, + { "type", item->GetType()->GetName() }, + { "location", new Dictionary({ + { "path", di.Path }, + { "first_line", di.FirstLine }, + { "first_column", di.FirstColumn }, + { "last_line", di.LastLine }, + { "last_column", di.LastColumn } + }) } + }); +} + +Dictionary::Ptr ScriptUtils::GetTemplate(const Value& vtype, const String& name) +{ + Type::Ptr ptype; + + if (vtype.IsObjectType()) + ptype = vtype; + else + ptype = Type::GetByName(vtype); + + ConfigItem::Ptr item = ConfigItem::GetByTypeAndName(ptype, name); + + if (!item || !item->IsAbstract()) + return nullptr; + + DebugInfo di = item->GetDebugInfo(); + + return GetTargetForTemplate(item); +} + +Array::Ptr ScriptUtils::GetTemplates(const Type::Ptr& type) +{ + if (!type) + BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid type: Must not be null")); + + ArrayData result; + + for (const ConfigItem::Ptr& item : ConfigItem::GetItems(type)) { + if (item->IsAbstract()) + result.push_back(GetTargetForTemplate(item)); + } + + return new Array(std::move(result)); +} + ConfigObject::Ptr ScriptUtils::GetObject(const Value& vtype, const String& name) { Type::Ptr ptype; diff --git a/lib/base/scriptutils.hpp b/lib/base/scriptutils.hpp index c874ff857..7bd3e8b9d 100644 --- a/lib/base/scriptutils.hpp +++ b/lib/base/scriptutils.hpp @@ -33,6 +33,8 @@ public: static Array::Ptr Range(const std::vector& arguments); static Type::Ptr TypeOf(const Value& value); static Array::Ptr Keys(const Object::Ptr& obj); + static Dictionary::Ptr GetTemplate(const Value& vtype, const String& name); + static Array::Ptr GetTemplates(const Type::Ptr& type); static ConfigObject::Ptr GetObject(const Value& type, const String& name); static Array::Ptr GetObjects(const Type::Ptr& type); static void Assert(const Value& arg);