| \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 |