function are_similar()

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


function are_similar(a, b) {
  if (a === b) {
    return true;
  }

  if (Array.isArray(a)) {
    return Array.isArray(b) && a.length === b.length && a.every(function (value, index) {
      return are_similar(value, b[index]);
    });
  }

  if (Array.isArray(b)) {
    return false;
  }

  if (a.id === "(number)" && b.id === "(number)") {
    return a.value === b.value;
  }

  var a_string;
  var b_string;

  if (a.id === "(string)") {
    a_string = a.value;
  } else if (a.id === "`" && a.constant) {
    a_string = a.value[0];
  }

  if (b.id === "(string)") {
    b_string = b.value;
  } else if (b.id === "`" && b.constant) {
    b_string = b.value[0];
  }

  if (typeof a_string === "string") {
    return a_string === b_string;
  }

  if (is_weird(a) || is_weird(b)) {
    return false;
  }

  if (a.arity === b.arity && a.id === b.id) {
    if (a.id === ".") {
      return are_similar(a.expression, b.expression) && are_similar(a.name, b.name);
    }

    if (a.arity === "unary") {
      return are_similar(a.expression, b.expression);
    }

    if (a.arity === "binary") {
      return a.id !== "(" && are_similar(a.expression[0], b.expression[0]) && are_similar(a.expression[1], b.expression[1]);
    }

    if (a.arity === "ternary") {
      return are_similar(a.expression[0], b.expression[0]) && are_similar(a.expression[1], b.expression[1]) && are_similar(a.expression[2], b.expression[2]);
    }

    if (a.arity === "function" && a.arity === "regexp") {
      return false;
    }

    return true;
  }

  return false;
}