@AutoService(value=javax.annotation.processing.Processor.class) public class AutoValueProcessor extends javax.annotation.processing.AbstractProcessor
AutoValue
,
AutoValue User's GuideModifier and Type | Class and Description |
---|---|
private static class |
AutoValueProcessor.ContainsMutableVisitor |
private static class |
AutoValueProcessor.ExtensionName |
private static class |
AutoValueProcessor.ObjectMethodToOverride |
static class |
AutoValueProcessor.Property
A property of an
@AutoValue class, defined by one of its abstract methods. |
static class |
AutoValueProcessor.SimpleMethod
A basic method on an @AutoValue class with no specific attached information, such as a
toBuilder() method, or a build() method, where only the name and access type is needed
in context. |
private static class |
AutoValueProcessor.SimpleMethodFunction |
Modifier and Type | Field and Description |
---|---|
private static java.util.regex.Pattern |
AUTO_VALUE_CLASSNAME_PATTERN
Used to test whether a fully-qualified name is AutoValue.class.getCanonicalName() or one of its
nested annotations.
|
private java.util.List<java.lang.String> |
deferredTypeNames
Qualified names of
@AutoValue classes that we attempted to process but had to abandon
because we needed other types that they referenced and those other types were missing. |
private ErrorReporter |
errorReporter |
private com.google.common.collect.ImmutableList<AutoValueExtension> |
extensions |
private java.lang.ClassLoader |
loaderForExtensions |
private javax.lang.model.util.Types |
typeUtils |
Constructor and Description |
---|
AutoValueProcessor() |
AutoValueProcessor(java.lang.ClassLoader loaderForExtensions) |
AutoValueProcessor(java.lang.Iterable<? extends AutoValueExtension> extensions) |
Modifier and Type | Method and Description |
---|---|
private com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> |
abstractMethodsIn(com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> methods) |
(package private) static java.lang.String |
access(javax.lang.model.element.ExecutableElement method) |
private java.util.Set<javax.lang.model.type.TypeMirror> |
allMethodAnnotationTypes(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods,
com.google.common.collect.ImmutableSetMultimap<javax.lang.model.element.ExecutableElement,java.lang.String> excludedAnnotationsMap)
Returns all method annotations that should be imported in the generated class.
|
private com.google.common.collect.ImmutableSetMultimap<javax.lang.model.element.ExecutableElement,java.lang.String> |
allMethodExcludedAnnotations(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods) |
private boolean |
ancestorIsAutoValue(javax.lang.model.element.TypeElement type) |
private com.google.common.collect.ImmutableList<AutoValueExtension> |
applicableExtensions(javax.lang.model.element.TypeElement type,
ExtensionContext context) |
private void |
checkModifiersIfNested(javax.lang.model.element.TypeElement type) |
private boolean |
checkReturnType(javax.lang.model.element.TypeElement autoValueClass,
javax.lang.model.element.ExecutableElement getter) |
private static boolean |
containsArrayType(java.util.Set<javax.lang.model.type.TypeMirror> types) |
private static com.google.common.collect.ImmutableList<java.lang.String> |
copyAnnotations(javax.lang.model.element.Element type,
TypeSimplifier typeSimplifier,
java.util.Set<java.lang.String> excludedAnnotations)
Implements the semantics of
AutoValue.CopyAnnotations ; see its javadoc. |
private TypeSimplifier |
defineVarsForType(javax.lang.model.element.TypeElement type,
AutoValueTemplateVars vars,
com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> toBuilderMethods,
com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> propertyMethods,
com.google.common.base.Optional<BuilderSpec.Builder> builder) |
private static void |
determineObjectMethodsToGenerate(java.util.Set<javax.lang.model.element.ExecutableElement> methods,
AutoValueTemplateVars vars)
Given a list of all methods defined in or inherited by a class, sets the equals, hashCode, and
toString fields of vars according as the corresponding methods should be generated.
|
private java.lang.String |
disambiguate(java.lang.String name,
java.util.Collection<java.lang.String> existingNames) |
private EclipseHack |
eclipseHack() |
private static java.lang.String |
extensionName(AutoValueExtension extension) |
private void |
fixReservedIdentifiers(java.util.Map<javax.lang.model.element.ExecutableElement,java.lang.String> methodToIdentifier) |
private java.lang.String |
generatedClassName(javax.lang.model.element.TypeElement type,
java.lang.String prefix) |
private java.lang.String |
generatedSubclassName(javax.lang.model.element.TypeElement type,
int depth) |
private static java.lang.String |
getAnnotationFqName(javax.lang.model.element.AnnotationMirror annotation)
Returns the fully-qualified name of an annotation-mirror, e.g.
|
private com.google.common.collect.ImmutableSet<java.lang.String> |
getAnnotationsMarkedWithInherited(javax.lang.model.element.Element element) |
private com.google.common.collect.ImmutableSet<java.lang.String> |
getFieldOfClasses(javax.lang.model.element.Element element,
java.lang.Class<? extends java.lang.annotation.Annotation> annotation,
java.lang.String fieldName,
javax.lang.model.util.Elements elementUtils)
Returns the contents of a
Class[] -typed field in an annotation. |
private java.lang.String |
getSerialVersionUID(javax.lang.model.element.TypeElement type) |
java.util.Set<java.lang.String> |
getSupportedAnnotationTypes() |
javax.lang.model.SourceVersion |
getSupportedSourceVersion() |
private static boolean |
gettersAllPrefixed(java.util.Set<javax.lang.model.element.ExecutableElement> methods) |
private javax.lang.model.type.TypeMirror |
getTypeMirror(java.lang.Class<?> c) |
private static <E> com.google.common.collect.ImmutableSet<E> |
immutableSetDifference(com.google.common.collect.ImmutableSet<E> a,
com.google.common.collect.ImmutableSet<E> b) |
private boolean |
implementsAnnotation(javax.lang.model.element.TypeElement type) |
void |
init(javax.annotation.processing.ProcessingEnvironment processingEnv) |
private static boolean |
isJavaLangObject(javax.lang.model.element.TypeElement type) |
private com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> |
methodsConsumedByExtensions(javax.lang.model.element.TypeElement type,
com.google.common.collect.ImmutableList<AutoValueExtension> applicableExtensions,
ExtensionContext context,
com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethods,
com.google.common.collect.ImmutableBiMap<java.lang.String,javax.lang.model.element.ExecutableElement> properties) |
private java.lang.String |
nameWithoutPrefix(java.lang.String name)
Returns the name of the property defined by the given getter.
|
private static AutoValueProcessor.ObjectMethodToOverride |
objectMethodToOverride(javax.lang.model.element.ExecutableElement method) |
(package private) static com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> |
prefixedGettersIn(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods) |
boolean |
process(java.util.Set<? extends javax.lang.model.element.TypeElement> annotations,
javax.annotation.processing.RoundEnvironment roundEnv) |
private void |
processType(javax.lang.model.element.TypeElement type) |
private com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> |
propertyMethodsIn(com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethods) |
private com.google.common.collect.ImmutableBiMap<java.lang.String,javax.lang.model.element.ExecutableElement> |
propertyNameToMethodMap(java.util.Set<javax.lang.model.element.ExecutableElement> propertyMethods) |
private java.util.Set<javax.lang.model.type.TypeMirror> |
returnTypesOf(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods) |
private void |
validateMethods(javax.lang.model.element.TypeElement type,
com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethods,
com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> toBuilderMethods,
com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> propertyMethods,
boolean extensionsPresent) |
private void |
warnAboutPrimitiveArrays(javax.lang.model.element.TypeElement autoValueClass,
javax.lang.model.element.ExecutableElement getter) |
private static java.lang.String |
wildcardTypeParametersString(javax.lang.model.element.TypeElement type) |
private int |
writeExtensions(javax.lang.model.element.TypeElement type,
ExtensionContext context,
com.google.common.collect.ImmutableList<AutoValueExtension> applicableExtensions) |
private void |
writeSourceFile(java.lang.String className,
java.lang.String text,
javax.lang.model.element.TypeElement originatingType) |
private static final java.util.regex.Pattern AUTO_VALUE_CLASSNAME_PATTERN
private ErrorReporter errorReporter
private final java.util.List<java.lang.String> deferredTypeNames
@AutoValue
classes that we attempted to process but had to abandon
because we needed other types that they referenced and those other types were missing.private com.google.common.collect.ImmutableList<AutoValueExtension> extensions
private final java.lang.ClassLoader loaderForExtensions
private javax.lang.model.util.Types typeUtils
public AutoValueProcessor()
AutoValueProcessor(java.lang.ClassLoader loaderForExtensions)
public AutoValueProcessor(java.lang.Iterable<? extends AutoValueExtension> extensions)
public java.util.Set<java.lang.String> getSupportedAnnotationTypes()
getSupportedAnnotationTypes
in interface javax.annotation.processing.Processor
getSupportedAnnotationTypes
in class javax.annotation.processing.AbstractProcessor
public javax.lang.model.SourceVersion getSupportedSourceVersion()
getSupportedSourceVersion
in interface javax.annotation.processing.Processor
getSupportedSourceVersion
in class javax.annotation.processing.AbstractProcessor
public void init(javax.annotation.processing.ProcessingEnvironment processingEnv)
init
in interface javax.annotation.processing.Processor
init
in class javax.annotation.processing.AbstractProcessor
public boolean process(java.util.Set<? extends javax.lang.model.element.TypeElement> annotations, javax.annotation.processing.RoundEnvironment roundEnv)
process
in interface javax.annotation.processing.Processor
process
in class javax.annotation.processing.AbstractProcessor
private java.lang.String generatedClassName(javax.lang.model.element.TypeElement type, java.lang.String prefix)
private java.lang.String generatedSubclassName(javax.lang.model.element.TypeElement type, int depth)
static java.lang.String access(javax.lang.model.element.ExecutableElement method)
private static boolean isJavaLangObject(javax.lang.model.element.TypeElement type)
private static AutoValueProcessor.ObjectMethodToOverride objectMethodToOverride(javax.lang.model.element.ExecutableElement method)
private void processType(javax.lang.model.element.TypeElement type)
private static com.google.common.collect.ImmutableList<java.lang.String> copyAnnotations(javax.lang.model.element.Element type, TypeSimplifier typeSimplifier, java.util.Set<java.lang.String> excludedAnnotations)
AutoValue.CopyAnnotations
; see its javadoc.private static java.lang.String getAnnotationFqName(javax.lang.model.element.AnnotationMirror annotation)
private com.google.common.collect.ImmutableSet<java.lang.String> getFieldOfClasses(javax.lang.model.element.Element element, java.lang.Class<? extends java.lang.annotation.Annotation> annotation, java.lang.String fieldName, javax.lang.model.util.Elements elementUtils)
Class[]
-typed field in an annotation.
This method is needed because directly reading the value of such a field from an AnnotationMirror throws:
javax.lang.model.type.MirroredTypeException: Attempt to access Class object for TypeMirror Foo.
element
- The element on which the annotation is present. e.g. the class being processed
by AutoValue.annotation
- The class of the annotation to read from., e.g. AutoValue.CopyAnnotations
.fieldName
- The name of the field to read, e.g. "exclude".private com.google.common.collect.ImmutableSet<java.lang.String> getAnnotationsMarkedWithInherited(javax.lang.model.element.Element element)
private int writeExtensions(javax.lang.model.element.TypeElement type, ExtensionContext context, com.google.common.collect.ImmutableList<AutoValueExtension> applicableExtensions)
private com.google.common.collect.ImmutableList<AutoValueExtension> applicableExtensions(javax.lang.model.element.TypeElement type, ExtensionContext context)
private com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> methodsConsumedByExtensions(javax.lang.model.element.TypeElement type, com.google.common.collect.ImmutableList<AutoValueExtension> applicableExtensions, ExtensionContext context, com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethods, com.google.common.collect.ImmutableBiMap<java.lang.String,javax.lang.model.element.ExecutableElement> properties)
private void validateMethods(javax.lang.model.element.TypeElement type, com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethods, com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> toBuilderMethods, com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> propertyMethods, boolean extensionsPresent)
private static java.lang.String extensionName(AutoValueExtension extension)
private TypeSimplifier defineVarsForType(javax.lang.model.element.TypeElement type, AutoValueTemplateVars vars, com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> toBuilderMethods, com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> propertyMethods, com.google.common.base.Optional<BuilderSpec.Builder> builder)
private com.google.common.collect.ImmutableSetMultimap<javax.lang.model.element.ExecutableElement,java.lang.String> allMethodExcludedAnnotations(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods)
private com.google.common.collect.ImmutableBiMap<java.lang.String,javax.lang.model.element.ExecutableElement> propertyNameToMethodMap(java.util.Set<javax.lang.model.element.ExecutableElement> propertyMethods)
private static boolean gettersAllPrefixed(java.util.Set<javax.lang.model.element.ExecutableElement> methods)
static com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> prefixedGettersIn(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods)
private java.util.Set<javax.lang.model.type.TypeMirror> allMethodAnnotationTypes(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods, com.google.common.collect.ImmutableSetMultimap<javax.lang.model.element.ExecutableElement,java.lang.String> excludedAnnotationsMap)
private java.lang.String nameWithoutPrefix(java.lang.String name)
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
.private void checkModifiersIfNested(javax.lang.model.element.TypeElement type)
private void fixReservedIdentifiers(java.util.Map<javax.lang.model.element.ExecutableElement,java.lang.String> methodToIdentifier)
private java.lang.String disambiguate(java.lang.String name, java.util.Collection<java.lang.String> existingNames)
private java.util.Set<javax.lang.model.type.TypeMirror> returnTypesOf(java.lang.Iterable<javax.lang.model.element.ExecutableElement> methods)
private static boolean containsArrayType(java.util.Set<javax.lang.model.type.TypeMirror> types)
private static void determineObjectMethodsToGenerate(java.util.Set<javax.lang.model.element.ExecutableElement> methods, AutoValueTemplateVars vars)
private com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethodsIn(com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> methods)
private com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> propertyMethodsIn(com.google.common.collect.ImmutableSet<javax.lang.model.element.ExecutableElement> abstractMethods)
private boolean checkReturnType(javax.lang.model.element.TypeElement autoValueClass, javax.lang.model.element.ExecutableElement getter)
private void warnAboutPrimitiveArrays(javax.lang.model.element.TypeElement autoValueClass, javax.lang.model.element.ExecutableElement getter)
private void writeSourceFile(java.lang.String className, java.lang.String text, javax.lang.model.element.TypeElement originatingType)
private boolean ancestorIsAutoValue(javax.lang.model.element.TypeElement type)
private boolean implementsAnnotation(javax.lang.model.element.TypeElement type)
private java.lang.String getSerialVersionUID(javax.lang.model.element.TypeElement type)
private javax.lang.model.type.TypeMirror getTypeMirror(java.lang.Class<?> c)
private static java.lang.String wildcardTypeParametersString(javax.lang.model.element.TypeElement type)
private static <E> com.google.common.collect.ImmutableSet<E> immutableSetDifference(com.google.common.collect.ImmutableSet<E> a, com.google.common.collect.ImmutableSet<E> b)
private EclipseHack eclipseHack()