code: final boolean checkFunctionEquivalenceHelper(
        FunctionType that, EquivalenceMethod eqMethod, EqCache eqCache) {
      if (this == that) {
        return true;
      }
      if (kind != that.kind) {
        return false;
      }
      switch (kind) {
        case CONSTRUCTOR:
          return false; // constructors use identity semantics, which we already checked for above.
        case INTERFACE:
          return getReferenceName().equals(that.getReferenceName());
        case ORDINARY:
          return typeOfThis.checkEquivalenceHelper(that.typeOfThis, eqMethod, eqCache)
              && call.checkArrowEquivalenceHelper(that.call, eqMethod, eqCache);
        default:
          throw new AssertionError();
      }
    }
docs: Two function types are equal if their signatures match. Since they don't have signatures, two
  interfaces are equal if their names match.