evaluate method
dynamic
evaluate(
- ASTNode node
Implementation
dynamic evaluate(ASTNode node) {
dynamic result;
if (node is Token) {
if (node.kind == TokenKind.Word) {
if (!context.containsKey(node.text)) {
throw ConfigException(
'Unknown variable ${repr(node.text)}', node.start);
}
result = context[node.text];
} else if (node.kind == TokenKind.BackTick) {
result = _convertString(node.value, node.start!);
} else {
result = node.value;
}
} else if (node is MappingNode) {
result = wrapMapping(node);
} else if (node is ListNode) {
result = node.elements;
} else {
switch (node.kind) {
case TokenKind.At:
result = _evalAt(node as UnaryNode);
break;
case TokenKind.Dollar:
result = _evalReference(node as UnaryNode);
break;
case TokenKind.LeftCurly:
assert(false);
break;
case TokenKind.Plus:
result = _evalAdd(node as BinaryNode);
break;
case TokenKind.Minus:
if (node is UnaryNode) {
result = _evalNegate(node);
} else {
result = _evalSubtract(node as BinaryNode);
}
break;
case TokenKind.Star:
result = _evalMultiply(node as BinaryNode);
break;
case TokenKind.Slash:
result = _evalDivide(node as BinaryNode);
break;
case TokenKind.SlashSlash:
result = _evalIntegerDivide(node as BinaryNode);
break;
case TokenKind.Modulo:
result = _evalModulo(node as BinaryNode);
break;
case TokenKind.LeftShift:
result = _evalLeftShift(node as BinaryNode);
break;
case TokenKind.RightShift:
result = _evalRightShift(node as BinaryNode);
break;
case TokenKind.Power:
result = _evalPower(node as BinaryNode);
break;
case TokenKind.And:
result = _evalLogicalAnd(node as BinaryNode);
break;
case TokenKind.Or:
result = _evalLogicalOr(node as BinaryNode);
break;
case TokenKind.BitwiseComplement:
result = _evalComplement(node as UnaryNode);
break;
case TokenKind.BitwiseAnd:
result = _evalBitwiseAnd(node as BinaryNode);
break;
case TokenKind.BitwiseOr:
result = _evalBitwiseOr(node as BinaryNode);
break;
case TokenKind.BitwiseXor:
result = _evalBitwiseXor(node as BinaryNode);
break;
default:
throw ConfigException(
'Unable to evaluate node of kind $node.kind', node.start);
}
}
return result;
}