function do_var()

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


function do_var() {
  var the_statement = token;
  var is_const = the_statement.id === "const";
  the_statement.names = []; // A program may use var or let, but not both.

  if (!is_const) {
    if (var_mode === undefined) {
      var_mode = the_statement.id;
    } else if (the_statement.id !== var_mode) {
      warn("expected_a_b", the_statement, var_mode, the_statement.id);
    }
  } // We don't expect to see variables created in switch statements.


  if (functionage.switch > 0) {
    warn("var_switch", the_statement);
  }

  if (functionage.loop > 0 && the_statement.id === "var") {
    warn("var_loop", the_statement);
  }

  (function next() {
    if (next_token.id === "{" && the_statement.id !== "var") {
      var the_brace = next_token;
      advance("{");

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

        var name = next_token;
        survey(name);
        advance();

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

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

          next_token.label = name;
          the_statement.names.push(next_token);
          enroll(next_token, "variable", is_const);
          advance();
          the_brace.open = true;
        } else {
          the_statement.names.push(name);
          enroll(name, "variable", is_const);
        }

        name.dead = false;
        name.init = true;

        if (next_token.id === "=") {
          advance("=");
          name.expression = expression();
          the_brace.open = true;
        }

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

      advance("}");
      advance("=");
      the_statement.expression = expression(0);
    } else if (next_token.id === "[" && the_statement.id !== "var") {
      var the_bracket = next_token;
      advance("[");

      (function element() {
        var ellipsis;

        if (next_token.id === "...") {
          ellipsis = true;
          advance("...");
        }

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

        var name = next_token;
        advance();
        the_statement.names.push(name);
        enroll(name, "variable", is_const);
        name.dead = false;
        name.init = true;

        if (ellipsis) {
          name.ellipsis = true;
        } else {
          if (next_token.id === "=") {
            advance("=");
            name.expression = expression();
            the_bracket.open = true;
          }

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

      advance("]");
      advance("=");
      the_statement.expression = expression(0);
    } else if (next_token.identifier) {
      var name = next_token;
      advance();

      if (name.id === "ignore") {
        warn("unexpected_a", name);
      }

      enroll(name, "variable", is_const);

      if (next_token.id === "=" || is_const) {
        advance("=");
        name.dead = false;
        name.init = true;
        name.expression = expression(0);
      }

      the_statement.names.push(name);
    } else {
      return stop("expected_identifier_a", next_token);
    }
  })();

  semicolon();
  return the_statement;
}