class EclipseHack
extends java.lang.Object
To work around the problem, we access Eclipse-specific APIs to find the original source code of
the class with the @AutoValue
annotation, and we do just enough parsing of that code to
be able to pick out the abstract method declarations so we can determine their order. The code
to access Eclipse-specific APIs will fail in environments other than Eclipse (for example, javac)
and the methods will be left in the order they came in, which in these other environments should
already be the correct order.
This is obviously a giant hack, and the right thing would be for the Eclipse compiler to be
fixed. The approach here works, but is vulnerable to future changes in the Eclipse API. If
@AutoValue
constructor calls like new AutoValue_Foo(...)
suddenly start being
redlined in a new Eclipse version then the likely cause is that the APIs have changed and this
hack will need to be updated to track the change.
Modifier and Type | Class and Description |
---|---|
private class |
EclipseHack.BinaryPropertyOrderer |
private static interface |
EclipseHack.PropertyOrderer |
private class |
EclipseHack.SourcePropertyOrderer |
Modifier and Type | Field and Description |
---|---|
private javax.annotation.processing.ProcessingEnvironment |
processingEnv |
Constructor and Description |
---|
EclipseHack(javax.annotation.processing.ProcessingEnvironment processingEnv) |
Modifier and Type | Method and Description |
---|---|
private EclipseHack.PropertyOrderer |
getPropertyOrderer(javax.lang.model.element.TypeElement type) |
(package private) void |
reorderProperties(java.util.List<AutoValueProcessor.Property> properties)
Reorders the properties (abstract methods) in the given list to correspond to the order found
by parsing the source code of the given type.
|
private void |
reorderProperties(javax.lang.model.element.TypeElement type,
java.util.List<AutoValueProcessor.Property> properties) |
private final javax.annotation.processing.ProcessingEnvironment processingEnv
EclipseHack(javax.annotation.processing.ProcessingEnvironment processingEnv)
void reorderProperties(java.util.List<AutoValueProcessor.Property> properties)
private void reorderProperties(javax.lang.model.element.TypeElement type, java.util.List<AutoValueProcessor.Property> properties)
private EclipseHack.PropertyOrderer getPropertyOrderer(javax.lang.model.element.TypeElement type)