diff options
author | cpeyser <cpeyser@google.com> | 2018-02-08 12:53:52 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-02-08 12:55:26 -0800 |
commit | c7f613b0ede0efd977065d1fc190d2a67eb3148e (patch) | |
tree | 81a112057d2313b46271fbfe2d2f5ca7fddfede4 /src/main/java/com | |
parent | cf3f81aef7c32019d70cbce218a64a03276268f0 (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.java | 35 |
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); |