verify method

void verify(
  1. int positional,
  2. Set<String> names
)

Throws a SassScriptException if positional and names aren't valid for this parameter declaration.

Implementation

void verify(int positional, Set<String> names) {
  var namedUsed = 0;
  for (var i = 0; i < parameters.length; i++) {
    var parameter = parameters[i];
    if (i < positional) {
      if (names.contains(parameter.name)) {
        throw SassScriptException(
          "Argument ${_originalParameterName(parameter.name)} was passed "
          "both by position and by name.",
        );
      }
    } else if (names.contains(parameter.name)) {
      namedUsed++;
    } else if (parameter.defaultValue == null) {
      throw MultiSpanSassScriptException(
        "Missing argument ${_originalParameterName(parameter.name)}.",
        "invocation",
        {spanWithName: "declaration"},
      );
    }
  }

  if (restParameter != null) return;

  if (positional > parameters.length) {
    throw MultiSpanSassScriptException(
      "Only ${parameters.length} "
          "${names.isEmpty ? '' : 'positional '}"
          "${pluralize('argument', parameters.length)} allowed, but "
          "$positional ${pluralize('was', positional, plural: 'were')} "
          "passed.",
      "invocation",
      {spanWithName: "declaration"},
    );
  }

  if (namedUsed < names.length) {
    var unknownNames = Set.of(names)
      ..removeAll(parameters.map((parameter) => parameter.name));
    throw MultiSpanSassScriptException(
      "No ${pluralize('parameter', unknownNames.length)} named "
          "${toSentence(unknownNames.map((name) => "\$$name"), 'or')}.",
      "invocation",
      {spanWithName: "declaration"},
    );
  }
}