compute method

  1. @override
dynamic compute(
  1. SymbolTable? scope
)
override

Implementation

@override
dynamic compute(SymbolTable? scope) {
  var target = expression.compute(scope);
  if (op.span.text == '?.' && target == null) return null;
  if (target == null) return null;

  var key = name.name;
  var resolver = scope?.resolve('!memberResolver!')?.value;
  if (resolver is Function) {
    var resolved = resolver(target, key);
    if (resolved is MemberResolution) {
      if (resolved.handled) return resolved.value;
    } else if (resolved != null) {
      return resolved;
    }
  }

  if (target is Map) return target[key];

  if (target is Iterable || target is String) {
    switch (key) {
      case 'length':
        return (target as dynamic).length;
      case 'isEmpty':
        return (target as dynamic).isEmpty;
      case 'isNotEmpty':
        return (target as dynamic).isNotEmpty;
    }
  }

  if (scope?.resolve('!strict!')?.value == false) return null;
  throw ArgumentError('The name "$key" does not exist in this scope.');
}