| package org.checkerframework.checker.calledmethods.builder; |
| |
| import com.sun.source.tree.NewClassTree; |
| import javax.lang.model.element.ExecutableElement; |
| import org.checkerframework.framework.type.AnnotatedTypeMirror; |
| import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedExecutableType; |
| |
| /** |
| * Provides hooks to add CalledMethods annotations to code generated by a builder framework like |
| * Lombok or AutoValue. If you are adding support to the Called Methods Checker for a new builder |
| * framework, you should create a subclass of this class and modify the private method {@code |
| * enableFramework} in {@link |
| * org.checkerframework.checker.calledmethods.CalledMethodsAnnotatedTypeFactory}. |
| * |
| * <p>Every method in this class is permitted to do nothing (or always return false). The work that |
| * each method must do is particular to the builder framework being supported. |
| */ |
| public interface BuilderFrameworkSupport { |
| |
| /** |
| * Determines if a method is a {@code toBuilder} method on a type generated by the builder |
| * framework. |
| * |
| * @param candidateToBuilderElement a method |
| * @return {@code true} if {@code candidateToBuilderElement} is a {@code toBuilder} method on a |
| * type generated by the builder framework |
| */ |
| boolean isToBuilderMethod(ExecutableElement candidateToBuilderElement); |
| |
| /** |
| * Hook for supporting a builder framework's {@code toBuilder} routine. Typically, the returned |
| * Builder has had all of its required setters invoked. So, implementations of this method should |
| * add a {@link org.checkerframework.checker.calledmethods.qual.CalledMethods} annotation |
| * capturing this fact. |
| * |
| * @param toBuilderType the type of a method that is the {@code toBuilder} method (as determined |
| * by {@link #isToBuilderMethod(ExecutableElement)}) for a type that has an associated builder |
| */ |
| void handleToBuilderMethod(AnnotatedExecutableType toBuilderType); |
| |
| /** |
| * Determines if a method is a {@code build} method on a {@code Builder} type for the builder |
| * framework. |
| * |
| * @param candidateBuildElement a method |
| * @return {@code true} if {@code candidateBuildElement} is a {@code build} method on a {@code |
| * Builder} type for the builder framework |
| */ |
| boolean isBuilderBuildMethod(ExecutableElement candidateBuildElement); |
| |
| /** |
| * Hook for adding annotations to a build() method (i.e. a finalizer) generated by a builder |
| * framework. |
| * |
| * <p>For {@code build} methods on {@code Builder} types, implementations of this method should |
| * determine the required properties and add a corresponding {@link |
| * org.checkerframework.checker.calledmethods.qual.CalledMethods} annotation to the type of the |
| * receiver parameter. |
| * |
| * @param builderBuildType the type of a method that is the {@code build} method (as determined by |
| * {@link #isBuilderBuildMethod(ExecutableElement)}) for a builder |
| */ |
| void handleBuilderBuildMethod(AnnotatedExecutableType builderBuildType); |
| |
| /** |
| * Hook for adding annotations (e.g., {@code @}{@link |
| * org.checkerframework.checker.calledmethods.qual.CalledMethods}) to a constructor call. |
| * |
| * @param tree a constructor call |
| * @param type type of the call expression |
| */ |
| void handleConstructor(NewClassTree tree, AnnotatedTypeMirror type); |
| } |