parseArguments method

({Map<String, Constant?> named, List<Constant?> positional}) parseArguments(
  1. CallWithArguments call
)

Implementation

({List<Constant?> positional, Map<String, Constant?> named}) parseArguments(
  CallWithArguments call,
) {
  final positionalArguments = <Constant?>[];
  final namedArguments = <String, Constant?>{};
  final names = [
    ...positionalParameters,
    ...positionalOptionalParameters,
    ...namedParameters,
    ...namedOptionalParameters,
  ];
  if (call.positionalArguments.length + call.namedArguments.length !=
      names.length) {
    throw FormatException(
      '''
Invalid number of arguments - $names vs ${call.positionalArguments} and ${call.namedArguments}''',
    );
  }
  final sortedNames = names.sorted();
  final mapping = <String, Constant?>{};
  for (var i = 0; i < sortedNames.length; i++) {
    final name = sortedNames[i];
    mapping[name] = call.namedArguments[name] ?? call.positionalArguments[i];
  }
  for (var name in names) {
    var constant = mapping[name];
    if (positionalParameters.contains(name) ||
        positionalOptionalParameters.contains(name)) {
      positionalArguments.add(constant);
    } else if (namedParameters.contains(name) ||
        namedOptionalParameters.contains(name)) {
      namedArguments[name] = constant;
    }
  }
  return (named: namedArguments, positional: positionalArguments);
}