matchArgs method

  1. @override
bool matchArgs (List<MixinArgs> args, Contexts context)
override

Check arguments call is according mixin definition

Implementation

@override
bool matchArgs(List<MixinArgs> args, Contexts context) {
  final int allArgsCnt = args?.length ?? 0;
  final int requiredArgsCnt = (args == null)
      ? 0
      : args.fold(
          0,
          (int count, MixinArgs p) =>
              (!optionalParameters.contains(p.name)) ? count + 1 : count);

  if (!variadic) {
    if (requiredArgsCnt < required) return false;
    if (allArgsCnt > params.length) return false;
  } else {
    if (requiredArgsCnt < (required - 1)) return false;
  }

  // check patterns
  final int len = math.min(requiredArgsCnt, arity);
  for (int i = 0; i < len; i++) {
    if (params[i].name == null && !params[i].variadic) {
      if (args[i].value.eval(context).toCSS(context) !=
          params[i].value.eval(context).toCSS(context)) return false;
    }
  }
  return true;

//2.5.1 20150722
// Definition.prototype.matchArgs = function (args, context) {
//     var allArgsCnt = (args && args.length) || 0, len, optionalParameters = this.optionalParameters;
//     var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {
//         if (optionalParameters.indexOf(p.name) < 0) {
//             return count + 1;
//         } else {
//             return count;
//         }
//     }, 0);
//
//     if (! this.variadic) {
//         if (requiredArgsCnt < this.required) {
//             return false;
//         }
//         if (allArgsCnt > this.params.length) {
//             return false;
//         }
//     } else {
//         if (requiredArgsCnt < (this.required - 1)) {
//             return false;
//         }
//     }
//
//     // check patterns
//     len = Math.min(requiredArgsCnt, this.arity);
//
//     for (var i = 0; i < len; i++) {
//         if (!this.params[i].name && !this.params[i].variadic) {
//             if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {
//                 return false;
//             }
//         }
//     }
//     return true;
// };
}