evaluate method

dynamic evaluate(
  1. 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;
}