code: TypeMirror builderMethodReturnType(ExecutableElement builderMethod) {
      DeclaredType builderTypeMirror = MoreTypes.asDeclared(builderType.asType());
      TypeMirror methodMirror;
      try {
        methodMirror = typeUtils.asMemberOf(builderTypeMirror, builderMethod);
      } catch (IllegalArgumentException e) {
        // Presumably we've hit the Eclipse bug cited.
        return builderMethod.getReturnType();
      }
      return MoreTypes.asExecutable(methodMirror).getReturnType();
    }
docs: Returns the return type of the given method from the builder. This should be the final type of
  the method when any bound type variables are substituted. Consider this example:
  
  <pre>{@code
  abstract static class ParentBuilder<B extends ParentBuilder> {
  B setFoo(String s);
  }
  abstract static class ChildBuilder extends ParentBuilder<ChildBuilder> {
  ...
  }
  }</pre>
  
  If the builder is {@code ChildBuilder} then the return type of {@code setFoo} is also {@code
  ChildBuilder}, and not {@code B} as its {@code getReturnType()} method would claim.
  
  <p>If the caller is in a version of Eclipse with <a
  href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=382590">this bug</a> then the {@code
  asMemberOf} call will fail if the method is inherited from an interface. We work around that
  for methods in the {@code @AutoValue} class using {@link EclipseHack#methodReturnTypes} but we
  don't try to do so here because it should be much less likely. You might need to change {@code
  ParentBuilder} from an interface to an abstract class to make it work, but you'll often need to
  do that anyway.