function parameter_list()

in web/jslint/src/main/resources/data/jslint-2020-03-28.js [2442:2594]


function parameter_list() {
  var list = [];
  var optional;
  var signature = ["("];

  if (next_token.id !== ")" && next_token.id !== "(end)") {
    (function parameter() {
      var ellipsis = false;
      var param;

      if (next_token.id === "{") {
        if (optional !== undefined) {
          warn("required_a_optional_b", next_token, next_token.id, optional.id);
        }

        param = next_token;
        param.names = [];
        advance("{");
        signature.push("{");

        (function subparameter() {
          var subparam = next_token;

          if (!subparam.identifier) {
            return stop("expected_identifier_a");
          }

          survey(subparam);
          advance();
          signature.push(subparam.id);

          if (next_token.id === ":") {
            advance(":");
            advance();
            token.label = subparam;
            subparam = token;

            if (!subparam.identifier) {
              return stop("expected_identifier_a");
            }
          }

          if (next_token.id === "=") {
            advance("=");
            subparam.expression = expression();
            param.open = true;
          }

          param.names.push(subparam);

          if (next_token.id === ",") {
            advance(",");
            signature.push(", ");
            return subparameter();
          }
        })();

        list.push(param);
        advance("}");
        signature.push("}");

        if (next_token.id === ",") {
          advance(",");
          signature.push(", ");
          return parameter();
        }
      } else if (next_token.id === "[") {
        if (optional !== undefined) {
          warn("required_a_optional_b", next_token, next_token.id, optional.id);
        }

        param = next_token;
        param.names = [];
        advance("[");
        signature.push("[]");

        (function subparameter() {
          var subparam = next_token;

          if (!subparam.identifier) {
            return stop("expected_identifier_a");
          }

          advance();
          param.names.push(subparam);

          if (next_token.id === "=") {
            advance("=");
            subparam.expression = expression();
            param.open = true;
          }

          if (next_token.id === ",") {
            advance(",");
            return subparameter();
          }
        })();

        list.push(param);
        advance("]");

        if (next_token.id === ",") {
          advance(",");
          signature.push(", ");
          return parameter();
        }
      } else {
        if (next_token.id === "...") {
          ellipsis = true;
          signature.push("...");
          advance("...");

          if (optional !== undefined) {
            warn("required_a_optional_b", next_token, next_token.id, optional.id);
          }
        }

        if (!next_token.identifier) {
          return stop("expected_identifier_a");
        }

        param = next_token;
        list.push(param);
        advance();
        signature.push(param.id);

        if (ellipsis) {
          param.ellipsis = true;
        } else {
          if (next_token.id === "=") {
            optional = param;
            advance("=");
            param.expression = expression(0);
          } else {
            if (optional !== undefined) {
              warn("required_a_optional_b", param, param.id, optional.id);
            }
          }

          if (next_token.id === ",") {
            advance(",");
            signature.push(", ");
            return parameter();
          }
        }
      }
    })();
  }

  advance(")");
  signature.push(")");
  return [list, signature.join("")];
}