Class AutoValueOrOneOfProcessor

java.lang.Object
javax.annotation.processing.AbstractProcessor
com.google.auto.value.processor.AutoValueOrOneOfProcessor
All Implemented Interfaces:
Processor
Direct Known Subclasses:
AutoOneOfProcessor, AutoValueProcessor

abstract class AutoValueOrOneOfProcessor extends AbstractProcessor
Shared code between AutoValueProcessor and AutoOneOfProcessor.
  • Field Details

    • annotationClassName

      private final String annotationClassName
    • deferredTypeNames

      private final List<String> deferredTypeNames
      Qualified names of @AutoValue or AutoOneOf classes that we attempted to process but had to abandon because we needed other types that they referenced and those other types were missing.
    • annotationType

      private TypeElement annotationType
      The annotation we are processing, AutoValue or AutoOneOf.
    • simpleAnnotationName

      private String simpleAnnotationName
      The simple name of annotationType.
    • errorReporter

      private ErrorReporter errorReporter
  • Constructor Details

    • AutoValueOrOneOfProcessor

      AutoValueOrOneOfProcessor(String annotationClassName)
  • Method Details

    • init

      public void init(ProcessingEnvironment processingEnv)
      Specified by:
      init in interface Processor
      Overrides:
      init in class AbstractProcessor
    • errorReporter

      final ErrorReporter errorReporter()
    • typeUtils

      final Types typeUtils()
    • elementUtils

      final Elements elementUtils()
    • getSupportedSourceVersion

      public final SourceVersion getSupportedSourceVersion()
      Specified by:
      getSupportedSourceVersion in interface Processor
      Overrides:
      getSupportedSourceVersion in class AbstractProcessor
    • process

      public final boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
      Specified by:
      process in interface Processor
      Specified by:
      process in class AbstractProcessor
    • processType

      abstract void processType(TypeElement type)
      Analyzes a single @AutoValue or @AutoOneOf class, and outputs the corresponding implementation class or classes.
      Parameters:
      type - the class with the @AutoValue or @AutoOneOf annotation.
    • nullableAnnotationForMethod

      abstract Optional<String> nullableAnnotationForMethod(ExecutableElement propertyMethod)
      Returns the appropriate @Nullable annotation to put on the implementation of the given property method, and indicates whether the property is in fact nullable. The annotation in question is on the method, not its return type. If instead the return type is @Nullable, this method returns Optional.of(""), to indicate that the property is nullable but the method isn't. The @Nullable annotation will instead appear when the return type of the method is spelled out in the implementation.
    • propertySet

      final com.google.common.collect.ImmutableSet<AutoValueOrOneOfProcessor.Property> propertySet(TypeElement type, com.google.common.collect.ImmutableSet<ExecutableElement> propertyMethods, com.google.common.collect.ImmutableListMultimap<ExecutableElement,AnnotationMirror> annotatedPropertyMethods)
      Returns the ordered set of AutoValueOrOneOfProcessor.Property definitions for the given @AutoValue or AutoOneOf type.
      Parameters:
      annotatedPropertyMethods - a map from property methods to the method annotations that should go on the implementation of those methods. These annotations are method annotations specifically. Type annotations do not appear because they are considered part of the return type and will appear when that is spelled out. Annotations that are excluded by AutoValue.CopyAnnotations also do not appear here.
    • defineSharedVarsForType

      final void defineSharedVarsForType(TypeElement type, com.google.common.collect.ImmutableSet<ExecutableElement> methods, AutoValueOrOneOfTemplateVars vars)
      Defines the template variables that are shared by AutoValue and AutoOneOf.
    • annotationStrings

      static com.google.common.collect.ImmutableList<String> annotationStrings(List<? extends AnnotationMirror> annotations)
      Returns the spelling to be used in the generated code for the given list of annotations.
    • generatedClassName

      static String generatedClassName(TypeElement type, String prefix)
      Returns the name of the generated @AutoValue or @AutoOneOf class, for example AutoOneOf_TaskResult or $$AutoValue_SimpleMethod.
      Parameters:
      type - the name of the type bearing the @AutoValue or @AutoOneOf annotation.
      prefix - the prefix to use in the generated class. This may start with one or more dollar signs, for an @AutoValue implementation where there are AutoValue extensions.
    • isJavaLangObject

      private static boolean isJavaLangObject(TypeElement type)
    • objectMethodToOverride

      static AutoValueOrOneOfProcessor.ObjectMethod objectMethodToOverride(ExecutableElement method)
      Determines which of the three public non-final methods from java.lang.Object, if any, is overridden by the given method.
    • propertyNameToMethodMap

      final com.google.common.collect.ImmutableBiMap<String,ExecutableElement> propertyNameToMethodMap(Set<ExecutableElement> propertyMethods)
      Returns a bi-map between property names and the corresponding abstract property methods.
    • gettersAllPrefixed

      private static boolean gettersAllPrefixed(Set<ExecutableElement> methods)
    • prefixedGettersIn

      static com.google.common.collect.ImmutableSet<ExecutableElement> prefixedGettersIn(Iterable<ExecutableElement> methods)
      Returns the subset of the given zero-arg methods whose names begin with get. Also includes isFoo methods if they return boolean. This corresponds to JavaBeans conventions.
    • nameWithoutPrefix

      private static String nameWithoutPrefix(String name)
      Returns the name of the property defined by the given getter. A getter called getFoo() or isFoo() defines a property called foo. For consistency with JavaBeans, a getter called getHTMLPage() defines a property called HTMLPage. The rule is: the name of the property is the part after get or is, with the first letter lowercased unless the first two letters are uppercase. This works well for the HTMLPage example, but in these more enlightened times we use HtmlPage anyway, so the special behaviour is not useful, and of course it behaves poorly with examples like OAuth.
    • checkModifiersIfNested

      final void checkModifiersIfNested(TypeElement type)
      Checks that, if the given @AutoValue or @AutoOneOf class is nested, it is static and not private. This check is not necessary for correctness, since the generated code would not compile if the check fails, but it produces better error messages for the user.
    • fixReservedIdentifiers

      static void fixReservedIdentifiers(Map<?,String> methodToIdentifier)
      Modifies the values of the given map to avoid reserved words. If we have a getter called getPackage() then we can't use the identifier package to represent its value since that's a reserved word.
    • disambiguate

      private static String disambiguate(String name, Collection<String> existingNames)
    • determineObjectMethodsToGenerate

      private static Map<AutoValueOrOneOfProcessor.ObjectMethod,ExecutableElement> determineObjectMethodsToGenerate(Set<ExecutableElement> methods)
      Given a list of all methods defined in or inherited by a class, returns a map indicating which of equals, hashCode, and toString should be generated. Each value in the map is the method that will be overridden by the generated method, which might be a method in Object or an abstract method in the @AutoValue class or an ancestor.
    • equalsParameterType

      static String equalsParameterType(Map<AutoValueOrOneOfProcessor.ObjectMethod,ExecutableElement> methodsToGenerate)
      Returns the encoded parameter type of the equals(Object) method that is to be generated, or an empty string if the method is not being generated. The parameter type includes any type annotations, for example @Nullable.
    • abstractMethodsIn

      static com.google.common.collect.ImmutableSet<ExecutableElement> abstractMethodsIn(com.google.common.collect.ImmutableSet<ExecutableElement> methods)
      Returns the subset of all abstract methods in the given set of methods. A given method signature is only mentioned once, even if it is inherited on more than one path.
    • propertyMethodsIn

      static com.google.common.collect.ImmutableSet<ExecutableElement> propertyMethodsIn(Set<ExecutableElement> abstractMethods)
      Returns the subset of property methods in the given set of abstract methods. A property method has no arguments, is not void, and is not hashCode() or toString().
    • checkReturnType

      final void checkReturnType(TypeElement autoValueClass, ExecutableElement getter)
      Checks that the return type of the given property method is allowed. Currently, this means that it cannot be an array, unless it is a primitive array.
    • warnAboutPrimitiveArrays

      private void warnAboutPrimitiveArrays(TypeElement autoValueClass, ExecutableElement getter)
    • getSerialVersionUID

      final String getSerialVersionUID(TypeElement type)
      Returns a string like "1234L" if type instanceof Serializable and defines serialVersionUID = 1234L; otherwise "".
    • annotationsToCopy

      com.google.common.collect.ImmutableList<AnnotationMirror> annotationsToCopy(Element autoValueType, Element typeOrMethod, Set<String> excludedAnnotations)
      Implements the semantics of AutoValue.CopyAnnotations; see its javadoc.
    • isInAutoValuePackage

      private boolean isInAutoValuePackage(String className)
      True if the given class name is in the com.google.auto.value package or a subpackage. False if the class name contains Test, since many AutoValue tests under com.google.auto.value define their own annotations.
    • copiedClassAnnotations

      private com.google.common.collect.ImmutableList<String> copiedClassAnnotations(TypeElement type)
    • copyAnnotations

      private com.google.common.collect.ImmutableList<String> copyAnnotations(Element autoValueType, Element typeOrMethod, Set<String> excludedAnnotations)
      Implements the semantics of AutoValue.CopyAnnotations; see its javadoc.
    • getExcludedClasses

      private Set<String> getExcludedClasses(Element element)
      Returns the contents of the AutoValue.CopyAnnotations.exclude element, as a set of strings that are fully-qualified class names.
    • getAnnotationsMarkedWithInherited

      private static Set<String> getAnnotationsMarkedWithInherited(Element element)
    • getAnnotationFqName

      private static String getAnnotationFqName(AnnotationMirror annotation)
      Returns the fully-qualified name of an annotation-mirror, e.g. "com.google.auto.value.AutoValue".
    • propertyMethodAnnotationMap

      final com.google.common.collect.ImmutableListMultimap<ExecutableElement,AnnotationMirror> propertyMethodAnnotationMap(TypeElement type, com.google.common.collect.ImmutableSet<ExecutableElement> propertyMethods)
    • propertyMethodAnnotations

      private com.google.common.collect.ImmutableList<AnnotationMirror> propertyMethodAnnotations(TypeElement type, ExecutableElement method)
    • annotationVisibleFrom

      private boolean annotationVisibleFrom(AnnotationMirror annotation, Element from)
    • wildcardTypeParametersString

      private static String wildcardTypeParametersString(TypeElement type)
      Returns the @AutoValue or @AutoOneOf type parameters, with a ? for every type. If we have @AutoValue abstract class Foo<T extends Something> then this method will return just <?>.
    • getAnnotationMirror

      static Optional<AnnotationMirror> getAnnotationMirror(Element element, String annotationName)
    • hasAnnotationMirror

      static boolean hasAnnotationMirror(Element element, String annotationName)
    • writeSourceFile

      final void writeSourceFile(String className, String text, TypeElement originatingType)