AnnotatedTypeMirror builderMethodReturnType(ExecutableElement builderMethod) {
    return MethodSignature.asMemberOf(typeUtils, builderType, builderMethod).returnType();
  }
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.
value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java