docs: static ImmutableSet<ExecutableElement> abstractMethodsIn(
        ImmutableSet<ExecutableElement> methods) {
      Set<Name> noArgMethods = new HashSet<>();
      ImmutableSet.Builder<ExecutableElement> abstracts = ImmutableSet.builder();
      for (ExecutableElement method : methods) {
        if (method.getModifiers().contains(Modifier.ABSTRACT)) {
          boolean hasArgs = !method.getParameters().isEmpty();
          if (hasArgs || noArgMethods.add(method.getSimpleName())) {
            // If an abstract method with the same signature is inherited on more than one path,
            // we only add it once. At the moment we only do this check for no-arg methods. All
            // methods that AutoValue will implement are either no-arg methods or equals(Object).
            // The former is covered by this check and the latter will lead to vars.equals being
            // set to true, regardless of how many times it appears. So the only case that is
            // covered imperfectly here is that of a method that is inherited on more than one path
            // and that will be consumed by an extension. We could check parameters as well, but that
            // can be a bit tricky if any of the parameters are generic.
            abstracts.add(method);
          }
        }
      }
      return abstracts.build();
    }