visitMemberAccessAsync method
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;
}