compute method
dynamic
compute(
- 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.');
}