Add debug hints for attributes

refs #6702
This commit is contained in:
Gunnar Beutner 2014-08-12 15:31:47 +02:00 committed by Gunnar Beutner
parent 0443c85bf5
commit e359c55909
4 changed files with 169 additions and 95 deletions

View File

@ -45,7 +45,7 @@ AExpression::AExpression(OpCallback op, const Value& operand1, const Value& oper
: m_Operator(op), m_Operand1(operand1), m_Operand2(operand2), m_DebugInfo(di) : m_Operator(op), m_Operand1(operand1), m_Operand2(operand2), m_DebugInfo(di)
{ } { }
Value AExpression::Evaluate(const Dictionary::Ptr& locals) const Value AExpression::Evaluate(const Dictionary::Ptr& locals, DebugHint *dhint) const
{ {
try { try {
#ifdef _DEBUG #ifdef _DEBUG
@ -56,7 +56,7 @@ Value AExpression::Evaluate(const Dictionary::Ptr& locals) const
} }
#endif /* _DEBUG */ #endif /* _DEBUG */
return m_Operator(this, locals); return m_Operator(this, locals, dhint);
} catch (const std::exception& ex) { } catch (const std::exception& ex) {
if (boost::get_error_info<boost::errinfo_nested_exception>(ex)) if (boost::get_error_info<boost::errinfo_nested_exception>(ex))
throw; throw;
@ -98,22 +98,22 @@ void AExpression::Dump(std::ostream& stream, int indent) const
DumpOperand(stream, m_Operand2, indent + 1); DumpOperand(stream, m_Operand2, indent + 1);
} }
Value AExpression::EvaluateOperand1(const Dictionary::Ptr& locals) const Value AExpression::EvaluateOperand1(const Dictionary::Ptr& locals, DebugHint *dhint) const
{ {
return static_cast<AExpression::Ptr>(m_Operand1)->Evaluate(locals); return static_cast<AExpression::Ptr>(m_Operand1)->Evaluate(locals, dhint);
} }
Value AExpression::EvaluateOperand2(const Dictionary::Ptr& locals) const Value AExpression::EvaluateOperand2(const Dictionary::Ptr& locals, DebugHint *dhint) const
{ {
return static_cast<AExpression::Ptr>(m_Operand2)->Evaluate(locals); return static_cast<AExpression::Ptr>(m_Operand2)->Evaluate(locals, dhint);
} }
Value AExpression::OpLiteral(const AExpression *expr, const Dictionary::Ptr&) Value AExpression::OpLiteral(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->m_Operand1; return expr->m_Operand1;
} }
Value AExpression::OpVariable(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpVariable(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Dictionary::Ptr scope = locals; Dictionary::Ptr scope = locals;
@ -127,87 +127,87 @@ Value AExpression::OpVariable(const AExpression *expr, const Dictionary::Ptr& lo
return ScriptVariable::Get(expr->m_Operand1); return ScriptVariable::Get(expr->m_Operand1);
} }
Value AExpression::OpNegate(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return ~(long)expr->EvaluateOperand1(locals); return ~(long)expr->EvaluateOperand1(locals);
} }
Value AExpression::OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return !expr->EvaluateOperand1(locals).ToBool(); return !expr->EvaluateOperand1(locals).ToBool();
} }
Value AExpression::OpAdd(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpAdd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) + expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) + expr->EvaluateOperand2(locals);
} }
Value AExpression::OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) - expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) - expr->EvaluateOperand2(locals);
} }
Value AExpression::OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) * expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) * expr->EvaluateOperand2(locals);
} }
Value AExpression::OpDivide(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) / expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) / expr->EvaluateOperand2(locals);
} }
Value AExpression::OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) & expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) & expr->EvaluateOperand2(locals);
} }
Value AExpression::OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) | expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) | expr->EvaluateOperand2(locals);
} }
Value AExpression::OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) << expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) << expr->EvaluateOperand2(locals);
} }
Value AExpression::OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) >> expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) >> expr->EvaluateOperand2(locals);
} }
Value AExpression::OpEqual(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) == expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) == expr->EvaluateOperand2(locals);
} }
Value AExpression::OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) != expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) != expr->EvaluateOperand2(locals);
} }
Value AExpression::OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) < expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) < expr->EvaluateOperand2(locals);
} }
Value AExpression::OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) > expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) > expr->EvaluateOperand2(locals);
} }
Value AExpression::OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) <= expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) <= expr->EvaluateOperand2(locals);
} }
Value AExpression::OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals) >= expr->EvaluateOperand2(locals); return expr->EvaluateOperand1(locals) >= expr->EvaluateOperand2(locals);
} }
Value AExpression::OpIn(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value right = expr->EvaluateOperand2(locals); Value right = expr->EvaluateOperand2(locals);
@ -231,22 +231,22 @@ Value AExpression::OpIn(const AExpression *expr, const Dictionary::Ptr& locals)
return found; return found;
} }
Value AExpression::OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return !OpIn(expr, locals); return !OpIn(expr, locals, dhint);
} }
Value AExpression::OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals).ToBool() && expr->EvaluateOperand2(locals).ToBool(); return expr->EvaluateOperand1(locals).ToBool() && expr->EvaluateOperand2(locals).ToBool();
} }
Value AExpression::OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
return expr->EvaluateOperand1(locals).ToBool() || expr->EvaluateOperand2(locals).ToBool(); return expr->EvaluateOperand1(locals).ToBool() || expr->EvaluateOperand2(locals).ToBool();
} }
Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value funcName = expr->EvaluateOperand1(locals); Value funcName = expr->EvaluateOperand1(locals);
@ -270,7 +270,7 @@ Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr
return func->Invoke(arguments); return func->Invoke(arguments);
} }
Value AExpression::OpArray(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpArray(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Array::Ptr arr = expr->m_Operand1; Array::Ptr arr = expr->m_Operand1;
Array::Ptr result = make_shared<Array>(); Array::Ptr result = make_shared<Array>();
@ -285,7 +285,7 @@ Value AExpression::OpArray(const AExpression *expr, const Dictionary::Ptr& local
return result; return result;
} }
Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Array::Ptr arr = expr->m_Operand1; Array::Ptr arr = expr->m_Operand1;
bool in_place = expr->m_Operand2; bool in_place = expr->m_Operand2;
@ -297,7 +297,7 @@ Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals
for (Array::SizeType index = 0; index < arr->GetLength(); index++) { for (Array::SizeType index = 0; index < arr->GetLength(); index++) {
const AExpression::Ptr& aexpr = arr->Get(index); const AExpression::Ptr& aexpr = arr->Get(index);
Dictionary::Ptr alocals = in_place ? locals : result; Dictionary::Ptr alocals = in_place ? locals : result;
aexpr->Evaluate(alocals); aexpr->Evaluate(alocals, dhint);
if (alocals->Contains("__result")) if (alocals->Contains("__result"))
break; break;
@ -309,15 +309,17 @@ Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals
return xresult; return xresult;
} }
Value AExpression::OpSet(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpSet(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value index = expr->EvaluateOperand1(locals); Value index = expr->EvaluateOperand1(locals);
Value right = expr->EvaluateOperand2(locals); DebugHint *sdhint = dhint->GetChild(index);
Value right = expr->EvaluateOperand2(locals, sdhint);
locals->Set(index, right); locals->Set(index, right);
sdhint->AddMessage("=", expr->m_DebugInfo);
return right; return right;
} }
Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value index = expr->EvaluateOperand1(locals); Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index); Value left = locals->Get(index);
@ -333,7 +335,8 @@ Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& loc
xlocals->Set("__parent", locals); xlocals->Set("__parent", locals);
} }
Value result = left + expr->EvaluateOperand2(xlocals); DebugHint *sdhint = dhint->GetChild(index);
Value result = left + expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) { if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result; Dictionary::Ptr dict = result;
@ -341,10 +344,12 @@ Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& loc
} }
locals->Set(index, result); locals->Set(index, result);
sdhint->AddMessage("+=", expr->m_DebugInfo);
return result; return result;
} }
Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value index = expr->EvaluateOperand1(locals); Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index); Value left = locals->Get(index);
@ -360,7 +365,8 @@ Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& lo
xlocals->Set("__parent", locals); xlocals->Set("__parent", locals);
} }
Value result = left - expr->EvaluateOperand2(xlocals); DebugHint *sdhint = dhint->GetChild(index);
Value result = left - expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) { if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result; Dictionary::Ptr dict = result;
@ -368,10 +374,12 @@ Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& lo
} }
locals->Set(index, result); locals->Set(index, result);
sdhint->AddMessage("-=", expr->m_DebugInfo);
return result; return result;
} }
Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value index = expr->EvaluateOperand1(locals); Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index); Value left = locals->Get(index);
@ -387,7 +395,8 @@ Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr&
xlocals->Set("__parent", locals); xlocals->Set("__parent", locals);
} }
Value result = left * expr->EvaluateOperand2(xlocals); DebugHint *sdhint = dhint->GetChild(index);
Value result = left * expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) { if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result; Dictionary::Ptr dict = result;
@ -395,10 +404,12 @@ Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr&
} }
locals->Set(index, result); locals->Set(index, result);
sdhint->AddMessage("*=", expr->m_DebugInfo);
return result; return result;
} }
Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value index = expr->EvaluateOperand1(locals); Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index); Value left = locals->Get(index);
@ -414,7 +425,8 @@ Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& l
xlocals->Set("__parent", locals); xlocals->Set("__parent", locals);
} }
Value result = left / expr->EvaluateOperand2(xlocals); DebugHint *sdhint = dhint->GetChild(index);
Value result = left / expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) { if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result; Dictionary::Ptr dict = result;
@ -422,10 +434,12 @@ Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& l
} }
locals->Set(index, result); locals->Set(index, result);
sdhint->AddMessage("/=", expr->m_DebugInfo);
return result; return result;
} }
Value AExpression::OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value value = expr->EvaluateOperand1(locals); Value value = expr->EvaluateOperand1(locals);
Value index = expr->EvaluateOperand2(locals); Value index = expr->EvaluateOperand2(locals);
@ -456,7 +470,7 @@ Value AExpression::OpIndexer(const AExpression *expr, const Dictionary::Ptr& loc
} }
} }
Value AExpression::OpImport(const AExpression *expr, const Dictionary::Ptr& locals) Value AExpression::OpImport(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Value type = expr->EvaluateOperand1(locals); Value type = expr->EvaluateOperand1(locals);
Value name = expr->EvaluateOperand2(locals); Value name = expr->EvaluateOperand2(locals);
@ -466,7 +480,7 @@ Value AExpression::OpImport(const AExpression *expr, const Dictionary::Ptr& loca
if (!item) if (!item)
BOOST_THROW_EXCEPTION(ConfigError("Import references unknown template: '" + name + "'")); BOOST_THROW_EXCEPTION(ConfigError("Import references unknown template: '" + name + "'"));
item->GetExpressionList()->Evaluate(locals); item->GetExpressionList()->Evaluate(locals, dhint);
return Empty; return Empty;
} }
@ -486,7 +500,7 @@ Value AExpression::FunctionWrapper(const std::vector<Value>& arguments, const Ar
return locals->Get("__result"); return locals->Get("__result");
} }
Value AExpression::OpFunction(const AExpression* expr, const Dictionary::Ptr& locals) Value AExpression::OpFunction(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Array::Ptr left = expr->m_Operand1; Array::Ptr left = expr->m_Operand1;
AExpression::Ptr aexpr = left->Get(1); AExpression::Ptr aexpr = left->Get(1);
@ -501,7 +515,7 @@ Value AExpression::OpFunction(const AExpression* expr, const Dictionary::Ptr& lo
return func; return func;
} }
Value AExpression::OpApply(const AExpression* expr, const Dictionary::Ptr& locals) Value AExpression::OpApply(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Array::Ptr left = expr->m_Operand1; Array::Ptr left = expr->m_Operand1;
AExpression::Ptr exprl = expr->m_Operand2; AExpression::Ptr exprl = expr->m_Operand2;
@ -510,14 +524,14 @@ Value AExpression::OpApply(const AExpression* expr, const Dictionary::Ptr& local
AExpression::Ptr aname = left->Get(2); AExpression::Ptr aname = left->Get(2);
AExpression::Ptr filter = left->Get(3); AExpression::Ptr filter = left->Get(3);
String name = aname->Evaluate(locals); String name = aname->Evaluate(locals, dhint);
ApplyRule::AddRule(type, target, name, exprl, filter, expr->m_DebugInfo, locals); ApplyRule::AddRule(type, target, name, exprl, filter, expr->m_DebugInfo, locals);
return Empty; return Empty;
} }
Value AExpression::OpObject(const AExpression* expr, const Dictionary::Ptr& locals) Value AExpression::OpObject(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Array::Ptr left = expr->m_Operand1; Array::Ptr left = expr->m_Operand1;
AExpression::Ptr exprl = expr->m_Operand2; AExpression::Ptr exprl = expr->m_Operand2;
@ -527,7 +541,7 @@ Value AExpression::OpObject(const AExpression* expr, const Dictionary::Ptr& loca
AExpression::Ptr filter = left->Get(3); AExpression::Ptr filter = left->Get(3);
String zone = left->Get(4); String zone = left->Get(4);
String name = aname->Evaluate(locals); String name = aname->Evaluate(locals, dhint);
ConfigItemBuilder::Ptr item = make_shared<ConfigItemBuilder>(expr->m_DebugInfo); ConfigItemBuilder::Ptr item = make_shared<ConfigItemBuilder>(expr->m_DebugInfo);
@ -571,14 +585,14 @@ Value AExpression::OpObject(const AExpression* expr, const Dictionary::Ptr& loca
return Empty; return Empty;
} }
Value AExpression::OpFor(const AExpression* expr, const Dictionary::Ptr& locals) Value AExpression::OpFor(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{ {
Array::Ptr left = expr->m_Operand1; Array::Ptr left = expr->m_Operand1;
String varname = left->Get(0); String varname = left->Get(0);
AExpression::Ptr aexpr = left->Get(1); AExpression::Ptr aexpr = left->Get(1);
AExpression::Ptr ascope = expr->m_Operand2; AExpression::Ptr ascope = expr->m_Operand2;
Array::Ptr arr = aexpr->Evaluate(locals); Array::Ptr arr = aexpr->Evaluate(locals, dhint);
ObjectLock olock(arr); ObjectLock olock(arr);
BOOST_FOREACH(const Value& value, arr) { BOOST_FOREACH(const Value& value, arr) {
@ -586,8 +600,40 @@ Value AExpression::OpFor(const AExpression* expr, const Dictionary::Ptr& locals)
xlocals->Set("__parent", locals); xlocals->Set("__parent", locals);
xlocals->Set(varname, value); xlocals->Set(varname, value);
ascope->Evaluate(xlocals); ascope->Evaluate(xlocals, dhint);
} }
return Empty; return Empty;
} }
Dictionary::Ptr DebugHint::ToDictionary(void) const
{
Dictionary::Ptr result = make_shared<Dictionary>();
Array::Ptr messages = make_shared<Array>();
typedef std::pair<String, DebugInfo> MessageType;
BOOST_FOREACH(const MessageType& message, Messages) {
Array::Ptr amsg = make_shared<Array>();
amsg->Add(message.first);
amsg->Add(message.second.Path);
amsg->Add(message.second.FirstLine);
amsg->Add(message.second.FirstColumn);
amsg->Add(message.second.LastLine);
amsg->Add(message.second.LastColumn);
messages->Add(amsg);
}
result->Set("messages", messages);
Dictionary::Ptr properties = make_shared<Dictionary>();
typedef std::map<String, DebugHint>::value_type ChildType;
BOOST_FOREACH(const ChildType& kv, Children) {
properties->Set(kv.first, kv.second.ToDictionary());
}
result->Set("properties", properties);
return result;
}

View File

@ -28,6 +28,24 @@
namespace icinga namespace icinga
{ {
struct DebugHint
{
std::vector<std::pair<String, DebugInfo> > Messages;
std::map<String, DebugHint> Children;
inline void AddMessage(const String& message, const DebugInfo& di)
{
Messages.push_back(std::make_pair(message, di));
}
inline DebugHint *GetChild(const String& name)
{
return &Children[name];
}
Dictionary::Ptr ToDictionary(void) const;
};
/** /**
* @ingroup config * @ingroup config
*/ */
@ -36,53 +54,53 @@ class I2_CONFIG_API AExpression : public Object
public: public:
DECLARE_PTR_TYPEDEFS(AExpression); DECLARE_PTR_TYPEDEFS(AExpression);
typedef Value (*OpCallback)(const AExpression *, const Dictionary::Ptr&); typedef Value (*OpCallback)(const AExpression *, const Dictionary::Ptr&, DebugHint *dhint);
AExpression(OpCallback op, const Value& operand1, const DebugInfo& di); AExpression(OpCallback op, const Value& operand1, const DebugInfo& di);
AExpression(OpCallback op, const Value& operand1, const Value& operand2, const DebugInfo& di); AExpression(OpCallback op, const Value& operand1, const Value& operand2, const DebugInfo& di);
Value Evaluate(const Dictionary::Ptr& locals) const; Value Evaluate(const Dictionary::Ptr& locals, DebugHint *dhint = NULL) const;
void MakeInline(void); void MakeInline(void);
void Dump(std::ostream& stream, int indent = 0) const; void Dump(std::ostream& stream, int indent = 0) const;
static Value OpLiteral(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpLiteral(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpVariable(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpVariable(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpNegate(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpAdd(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpAdd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpDivide(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpEqual(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpIn(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpArray(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpArray(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpDict(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpDict(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpSet(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpSet(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpImport(const AExpression *expr, const Dictionary::Ptr& locals); static Value OpImport(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpFunction(const AExpression* expr, const Dictionary::Ptr& locals); static Value OpFunction(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpApply(const AExpression* expr, const Dictionary::Ptr& locals); static Value OpApply(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpObject(const AExpression* expr, const Dictionary::Ptr& locals); static Value OpObject(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
static Value OpFor(const AExpression* expr, const Dictionary::Ptr& locals); static Value OpFor(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
private: private:
OpCallback m_Operator; OpCallback m_Operator;
@ -90,8 +108,8 @@ private:
Value m_Operand2; Value m_Operand2;
DebugInfo m_DebugInfo; DebugInfo m_DebugInfo;
Value EvaluateOperand1(const Dictionary::Ptr& locals) const; Value EvaluateOperand1(const Dictionary::Ptr& locals, DebugHint *dhint = NULL) const;
Value EvaluateOperand2(const Dictionary::Ptr& locals) const; Value EvaluateOperand2(const Dictionary::Ptr& locals, DebugHint *dhint = NULL) const;
static void DumpOperand(std::ostream& stream, const Value& operand, int indent); static void DumpOperand(std::ostream& stream, const Value& operand, int indent);

View File

@ -121,13 +121,15 @@ Dictionary::Ptr ConfigItem::GetProperties(void)
ASSERT(OwnsLock()); ASSERT(OwnsLock());
if (!m_Properties) { if (!m_Properties) {
DebugHint dhint;
m_Properties = make_shared<Dictionary>(); m_Properties = make_shared<Dictionary>();
m_Properties->Set("type", m_Type); m_Properties->Set("type", m_Type);
if (!m_Zone.IsEmpty()) if (!m_Zone.IsEmpty())
m_Properties->Set("zone", m_Zone); m_Properties->Set("zone", m_Zone);
m_Properties->Set("__parent", m_Scope); m_Properties->Set("__parent", m_Scope);
GetExpressionList()->Evaluate(m_Properties); GetExpressionList()->Evaluate(m_Properties, &dhint);
m_Properties->Remove("__parent"); m_Properties->Remove("__parent");
m_DebugHints = dhint.ToDictionary();
String name = m_Name; String name = m_Name;
@ -153,6 +155,11 @@ Dictionary::Ptr ConfigItem::GetProperties(void)
return m_Properties; return m_Properties;
} }
Dictionary::Ptr ConfigItem::GetDebugHints(void) const
{
return m_DebugHints;
}
/** /**
* Commits the configuration item by creating a DynamicObject * Commits the configuration item by creating a DynamicObject
* object. * object.
@ -290,6 +297,7 @@ void ConfigItem::WriteObjectsFile(const String& filename)
persistentItem->Set("name", item->GetName()); persistentItem->Set("name", item->GetName());
persistentItem->Set("abstract", item->IsAbstract()); persistentItem->Set("abstract", item->IsAbstract());
persistentItem->Set("properties", item->GetProperties()); persistentItem->Set("properties", item->GetProperties());
persistentItem->Set("debug_hints", item->GetDebugHints());
String json = JsonSerialize(persistentItem); String json = JsonSerialize(persistentItem);

View File

@ -49,6 +49,7 @@ public:
AExpression::Ptr GetExpressionList(void) const; AExpression::Ptr GetExpressionList(void) const;
Dictionary::Ptr GetProperties(void); Dictionary::Ptr GetProperties(void);
Dictionary::Ptr GetDebugHints(void) const;
DynamicObject::Ptr Commit(void); DynamicObject::Ptr Commit(void);
void Register(void); void Register(void);
@ -78,6 +79,7 @@ private:
AExpression::Ptr m_ExpressionList; AExpression::Ptr m_ExpressionList;
Dictionary::Ptr m_Properties; Dictionary::Ptr m_Properties;
Dictionary::Ptr m_DebugHints;
std::vector<String> m_ParentNames; /**< The names of parent configuration std::vector<String> m_ParentNames; /**< The names of parent configuration
items. */ items. */
DebugInfo m_DebugInfo; /**< Debug information. */ DebugInfo m_DebugInfo; /**< Debug information. */