\htmlhr
\chapterAndLabel{Returns Receiver Checker}{returns-receiver-checker}

The Returns Receiver Checker enables documenting and checking that a method
returns its receiver (i.e., the \<this> parameter).

There are two ways to run the Returns Receiver Checker.
\begin{itemize}
\item
  Typically, it is automatically run by another checker.

  If the code being checked does not use fluent APIs, you can pass the
  \<-AdisableReturnsReceiver> command-line option.  This disables the
  Returns Receiver Checker and makes the other checker run faster.
\item
Alternately, you can run just the Returns Receiver Checker, by
supplying the following command-line options to javac:
\code{-processor org.checkerframework.common.returnsreceiver.ReturnsReceiverChecker}
\end{itemize}


\sectionAndLabel{Annotations}{returns-receiver-checker-annotations}

The qualifier \refqualclass{common/returnsreceiver/qual}{This} on the return
type of a method indicates that the method returns its receiver.  Methods
that return their receiver are common in so-called ``fluent'' APIs.  Here
is an example:

\begin{Verbatim}
class MyBuilder {
  @This MyBuilder setName(String name) {
    this.name = name;
    return this;
  }
}
\end{Verbatim}

An \refqualclass{common/returnsreceiver/qual}{This} annotation can only be
written on a return type, a receiver type, or in a downcast.

As is standard, the Returns Receiver Checker has a top qualifier,
\refqualclass{common/returnsreceiver/qual}{UnknownThis}, and a bottom qualifier,
\refqualclass{common/returnsreceiver/qual}{BottomThis}.
Programmers rarely need to write these annotations.

Here are additional details.  \refqualclass{common/returnsreceiver/qual}{This}
is a polymorphic qualifier rather than a regular type qualifier (see
Section~\ref{method-qualifier-polymorphism}). Conceptually, a receiver type always has
an \refqualclass{common/returnsreceiver/qual}{This} qualifier. When a method
return type also has an \refqualclass{common/returnsreceiver/qual}{This}
qualifier, the presence of the polymorphic annotation on both the method's
return and receiver type forces their type qualifiers to be \emph{equal}. Hence,
the method will only pass the type checker if it returns its receiver argument,
achieving the desired checking.


\sectionAndLabel{AutoValue and Lombok Support}{returns-receiver-checker-autovalue-lombok-support}

\begin{figure}
\begin{Verbatim}
@AutoValue
abstract class Animal {
  abstract String name();
  abstract int numberOfLegs();
  static Builder builder() {
    return new AutoValue_Animal.Builder();
  }
  @AutoValue.Builder
  abstract static class Builder {
    abstract Builder setName(String value);       // @This is automatically added here
    abstract Builder setNumberOfLegs(int value);  // @This is automatically added here
    abstract Animal build();
  }
}
\end{Verbatim}
    \caption{User-written code that uses the \<@AutoValue.Builder> annotation.
      Given this code,
      (1) AutoValue automatically generates a concrete subclass of
      \<Animal.Builder>, see Figure~\ref{fig-autovalue-builder-generated}, and
      (2) the Returns Receiver Checker automatically adds \<@This> annotations
      on setters in both user-written and automatically-generated code.}
    \label{fig-autovalue-builder}
\end{figure}

\begin{figure}
    \begin{Verbatim}
    class AutoValue_Animal {
      static final class Builder extends Animal.Builder {
        private String name;
        private Integer numberOfLegs;
        @This Animal.Builder setName(String name) {
          this.name = name;
          return this;
        }
        @This Animal.Builder setNumberOfLegs(int numberOfLegs) {
          this.numberOfLegs = numberOfLegs;
          return this;
        }
        @Override
        Animal build() {
          return new AutoValue_Animal(this.name, this.numberOfLegs);
        }
      }
    }
    \end{Verbatim}
    \caption{Code generated by AutoValue for the example of
    Figure~\ref{fig-autovalue-builder}, including the \<@This> annotations added
    by the Returns Receiver Checker.}
    \label{fig-autovalue-builder-generated}
\end{figure}

The \href{https://github.com/google/auto/tree/master/value}{AutoValue} and
\href{https://projectlombok.org/}{Lombok} projects both support automatic
generation of builder classes, which enable flexible object construction.
For code using these two frameworks, the Returns Receiver Checker
automatically adds \<@This> annotations to setter methods in builder
classes.  All the \<@This> annotations in
Figures~\ref{fig-autovalue-builder}
and~\ref{fig-autovalue-builder-generated} are automatically added by the
Returns Receiver Checker.

% LocalWords:  UnknownThis BottomThis AutoValue autovalue lombok
