aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2018-02-08 12:53:52 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-08 12:55:26 -0800
commitc7f613b0ede0efd977065d1fc190d2a67eb3148e (patch)
tree81a112057d2313b46271fbfe2d2f5ca7fddfede4 /src/main/java/com
parentcf3f81aef7c32019d70cbce218a64a03276268f0 (diff)
Add support for javabeans-style getters ("getFoo()", "isFoo()") to AutoCodec's
AutoValue support. This is required to serialize ActionOwner. PiperOrigin-RevId: 185037291
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
index 4d34175926..c576f0c52c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
@@ -302,13 +302,46 @@ public class AutoCodecProcessor extends AbstractProcessor {
return serializeBuilder.build();
}
+ private String findGetterForAutoValue(VariableElement parameter, TypeElement type) {
+ List<ExecutableElement> methods = ElementFilter.methodsIn(type.getEnclosedElements());
+
+ ImmutableList.Builder<String> possibleGetterNamesBuilder =
+ ImmutableList.<String>builder().add(parameter.getSimpleName().toString());
+
+ if (parameter.asType().getKind() == TypeKind.BOOLEAN) {
+ possibleGetterNamesBuilder.add(
+ addCamelCasePrefix(parameter.getSimpleName().toString(), "is"));
+ } else {
+ possibleGetterNamesBuilder.add(
+ addCamelCasePrefix(parameter.getSimpleName().toString(), "get"));
+ }
+ ImmutableList<String> possibleGetterNames = possibleGetterNamesBuilder.build();
+
+ for (Element element : methods) {
+ if (possibleGetterNames.contains(element.getSimpleName().toString())) {
+ return element.getSimpleName().toString();
+ }
+ }
+
+ throw new IllegalArgumentException(
+ "No AutoValue getter found corresponding to parameter " + parameter.getSimpleName());
+ }
+
+ private String addCamelCasePrefix(String name, String prefix) {
+ if (name.length() == 1) {
+ return prefix + Character.toUpperCase(name.charAt(0));
+ } else {
+ return prefix + Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ }
+ }
+
private MethodSpec buildSerializeMethodWithInstantiatorForAutoValue(
TypeElement encodedType, PartitionedParameters parameters) {
MethodSpec.Builder serializeBuilder =
AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, parameters.dependency);
for (VariableElement parameter : parameters.fields) {
TypeKind typeKind = parameter.asType().getKind();
- String getter = "input." + parameter.getSimpleName() + "()";
+ String getter = "input." + findGetterForAutoValue(parameter, encodedType) + "()";
switch (typeKind) {
case BOOLEAN:
serializeBuilder.addStatement("codedOut.writeBoolNoTag($L)", getter);