visitMemberAccessAsync method

  1. @override
Future visitMemberAccessAsync(
  1. MemberAccess node
)

Implementation

@override
Future<dynamic> visitMemberAccessAsync(MemberAccess node) async {
  var object = node.object;
  final objName = (object as Identifier).name;
  var objectVal = context.getVariable(objName);

  if (objectVal == null) return null;

  for (final member in node.members) {
    final keyName = member is Identifier
        ? member.name
        : ((member as ArrayAccess).array as Identifier).name;
    final isArray = member is ArrayAccess;

    if (isArray) {
      final key = (member.array as Identifier).name;
      final index = (member.key as Literal).value;
      objectVal = objectVal[key];

      if (objectVal == null) return;
      if (objectVal is List) {
        if (index >= 0 && index < objectVal.length) {
          objectVal = objectVal[index];
        } else {
          return null;
        }
      } else {
        objectVal = objectVal[index];
      }
    } else if (objectVal is Drop) {
      if (member is Identifier) {
        objectVal = objectVal(Symbol(keyName));
      }
    } else if (objectVal is List && member is Identifier) {
      // Check if it's a registered dot notation filter
      if (FilterRegistry.isDotNotationFilter(keyName)) {
        final filterFunction = FilterRegistry.getFilter(keyName);
        if (filterFunction != null) {
          objectVal = await filterFunction(objectVal, [], {});
        }
      }
    } else if (objectVal is Map) {
      if (!objectVal.containsKey(keyName)) {
        return null;
      }
      objectVal = objectVal[keyName];
    } else if (objectVal == null) {
      return null;
    }
  }
  return objectVal;
}