Implement support for functions in set_if

refs #7564
This commit is contained in:
Gunnar Beutner 2015-01-29 10:09:53 +01:00
parent ea3c3e0c3e
commit 7b4f1e217a
4 changed files with 35 additions and 21 deletions

View File

@ -201,11 +201,13 @@
%attribute %dictionary "*" {
%attribute %string "key"
%attribute %string "value"
%attribute %function "value"
%attribute %string "description"
%attribute %number "required"
%attribute %number "skip_key"
%attribute %number "repeat_key"
%attribute %string "set_if"
%attribute %function "set_if"
%attribute %number "order"
}
},

View File

@ -59,8 +59,10 @@ Value MacroProcessor::ResolveMacros(const Value& str, const ResolverList& resolv
}
result = resultArr;
} else if (str.IsObjectType<Function>()) {
result = EvaluateFunction(str, resolvers, cr, missingMacro, escapeFn, resolvedMacros, useResolvedMacros, 0);
} else {
BOOST_THROW_EXCEPTION(std::invalid_argument("Command is not a string or array."));
BOOST_THROW_EXCEPTION(std::invalid_argument("Macro is not a string or array."));
}
return result;
@ -166,6 +168,26 @@ Value MacroProcessor::InternalResolveMacrosShim(const std::vector<Value>& args,
resolvedMacros, useResolvedMacros, recursionLevel);
}
Value MacroProcessor::EvaluateFunction(const Function::Ptr& func, const ResolverList& resolvers,
const CheckResult::Ptr& cr, String *missingMacro,
const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
bool useResolvedMacros, int recursionLevel)
{
Dictionary::Ptr resolvers_this = new Dictionary();
BOOST_FOREACH(const ResolverSpec& resolver, resolvers) {
resolvers_this->Set(resolver.first, resolver.second);
}
resolvers_this->Set("macro", new Function(boost::bind(&MacroProcessor::InternalResolveMacrosShim,
_1, boost::cref(resolvers), cr, missingMacro, boost::cref(escapeFn), resolvedMacros, useResolvedMacros,
recursionLevel)));
ScriptFrame frame(resolvers_this);
std::vector<Value> args;
return func->Invoke(args);
}
Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverList& resolvers,
const CheckResult::Ptr& cr, String *missingMacro,
const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
@ -210,23 +232,8 @@ Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverLis
}
if (resolved_macro.IsObjectType<Function>()) {
Function::Ptr func = resolved_macro;
if (!resolvers_this) {
resolvers_this = new Dictionary();
BOOST_FOREACH(const ResolverSpec& resolver, resolvers) {
resolvers_this->Set(resolver.first, resolver.second);
}
resolvers_this->Set("macro", new Function(boost::bind(&MacroProcessor::InternalResolveMacrosShim,
_1, boost::cref(resolvers), cr, missingMacro, boost::cref(escapeFn), resolvedMacros, useResolvedMacros,
recursionLevel)));
}
ScriptFrame frame(resolvers_this);
std::vector<Value> args;
resolved_macro = func->Invoke(args);
resolved_macro = EvaluateFunction(resolved_macro, resolvers, cr, missingMacro, escapeFn,
resolvedMacros, useResolvedMacros, recursionLevel);
}
if (!found) {

View File

@ -61,6 +61,11 @@ private:
const CheckResult::Ptr& cr, String *missingMacro,
const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
bool useResolvedMacros, int recursionLevel);
static Value EvaluateFunction(const Function::Ptr& func, const ResolverList& resolvers,
const CheckResult::Ptr& cr, String *missingMacro,
const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros,
bool useResolvedMacros, int recursionLevel);
};
}

View File

@ -109,7 +109,7 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab
arg.Key = kv.first;
bool required = false;
String argval;
Value argval;
if (arginfo.IsObjectType<Dictionary>()) {
Dictionary::Ptr argdict = arginfo;
@ -123,11 +123,11 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab
arg.RepeatKey = argdict->Get("repeat_key");
arg.Order = argdict->Get("order");
String set_if = argdict->Get("set_if");
Value set_if = argdict->Get("set_if");
if (!set_if.IsEmpty()) {
String missingMacro;
String set_if_resolved = MacroProcessor::ResolveMacros(set_if, macroResolvers,
Value set_if_resolved = MacroProcessor::ResolveMacros(set_if, macroResolvers,
cr, &missingMacro, MacroProcessor::EscapeCallback(), resolvedMacros,
useResolvedMacros);