replaceInLiterals static method

Expression? replaceInLiterals(
  1. dynamic expression,
  2. Map<String, dynamic> variables
)

Implementation

static Expression? replaceInLiterals(
    dynamic expression, Map<String, dynamic> variables) {
  // conditional expression
  if (expression is ConditionalExpression) {
    expression = ConditionalExpression(
        expression.test,
        replaceInLiterals(expression.consequent, variables),
        replaceInLiterals(expression.alternate, variables));
    return expression;
  }

  // binary expression
  if (expression is BinaryExpression) {
    expression = BinaryExpression(
        expression.operator,
        replaceInLiterals(expression.left, variables),
        replaceInLiterals(expression.right, variables));
    return expression;
  }

  // call expression
  if (expression is CallExpression) {
    var args = expression.arguments;
    if (args != null) {
      for (int i = 0; i < args.length; i++) {
        args[i] = replaceInLiterals(args[i], variables);
      }
    }
    expression = CallExpression(expression.callee, args);
    return expression;
  }

  // literal expression
  if (expression is Literal) {
    if (expression.value is String) {
      var v = expression.value ?? "";

      // loop backwards in the string so v1 does not replace the start of v10
      for (String key in variables.keys.toList().reversed) {
        // replace the keys in the string with the value of the variables map
        // replace missing variables with a blank string (formerly the key name)
        v = v.replaceAll(key, _toString(variables[key]) ?? "");
      }
      expression = Literal(v, v);
    }
    return expression;
  }

  // variable expression
  if (expression is Variable) {
    var name = expression.identifier.name;
    var exists = variables.containsKey(name);
    if (!exists) {
      String? value = _toString(name);
      expression = Literal(value, value);
    }
    return expression;
  }

  // unknown expression
  return expression;
}