Skip to content

Commit

Permalink
Merge pull request #16 from rharter/rh/prefixes
Browse files Browse the repository at this point in the history
Adds better handling of method prefixes. Fixes #15
  • Loading branch information
rharter committed Mar 22, 2016
2 parents fd4a18e + 509d4e8 commit 6a0945f
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,15 @@
public class AutoValueGsonExtension extends AutoValueExtension {

public static class Property {
String name;
ExecutableElement element;
TypeName type;
ImmutableSet<String> annotations;

public Property() {
}

public Property(String name, ExecutableElement element) {
this.name = name;
final String methodName;
final String humanName;
final ExecutableElement element;
final TypeName type;
final ImmutableSet<String> annotations;

public Property(String humanName, ExecutableElement element) {
this.methodName = element.getSimpleName().toString();
this.humanName = humanName;
this.element = element;

type = TypeName.get(element.getReturnType());
Expand All @@ -68,7 +67,7 @@ public String serializedName() {
if (serializedName != null) {
return serializedName.value();
} else {
return name;
return humanName;
}
}

Expand Down Expand Up @@ -139,7 +138,7 @@ ImmutableMap<Property, FieldSpec> createFields(List<Property> properties) {
TypeName type = property.type.isPrimitive() ? property.type.box() : property.type;
ParameterizedTypeName adp = ParameterizedTypeName.get(jsonAdapter, type);
fields.put(property,
FieldSpec.builder(adp, property.name + "Adapter", PRIVATE, FINAL).build());
FieldSpec.builder(adp, property.humanName + "Adapter", PRIVATE, FINAL).build());
}

return fields.build();
Expand Down Expand Up @@ -265,13 +264,13 @@ public MethodSpec createWriteMethod(ClassName autoValueClassName,
FieldSpec field = entry.getValue();

if (prop.nullable()) {
writeMethod.beginControlFlow("if ($N.$N() != null)", annotatedParam, prop.name);
writeMethod.beginControlFlow("if ($N.$N() != null)", annotatedParam, prop.methodName);
writeMethod.addStatement("$N.name($S)", jsonWriter, prop.serializedName());
writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.name);
writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.methodName);
writeMethod.endControlFlow();
} else {
writeMethod.addStatement("$N.name($S)", jsonWriter, prop.serializedName());
writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.name);
writeMethod.addStatement("$N.write($N, $N.$N())", field, jsonWriter, annotatedParam, prop.methodName);
}
}
writeMethod.addStatement("$N.endObject()", jsonWriter);
Expand All @@ -297,7 +296,7 @@ public MethodSpec createReadMethod(ClassName className,
// add the properties
Map<Property, FieldSpec> fields = new LinkedHashMap<Property, FieldSpec>(adapters.size());
for (Property prop : adapters.keySet()) {
FieldSpec field = FieldSpec.builder(prop.type, prop.name).build();
FieldSpec field = FieldSpec.builder(prop.type, prop.humanName).build();
fields.put(prop, field);
if (field.type.isPrimitive()) {
String defaultValue = getDefaultPrimitiveValue(field.type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import javax.tools.JavaFileObject;

import static com.google.common.truth.Truth.assertAbout;
import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;

/**
Expand Down Expand Up @@ -222,4 +223,100 @@ public void simple() {
.and()
.generatesSources(expected);
}

@Test public void propertyMethodReferencedWithPrefix() {
JavaFileObject source = JavaFileObjects.forSourceString("test.Test", ""
+ "package test;\n"
+ "import com.google.auto.value.AutoValue;\n"
+ "@AutoValue public abstract class Test {\n"
+ " public abstract String getName();\n"
+ " public abstract boolean isAwesome();\n"
+ "}"
);
JavaFileObject expected = JavaFileObjects.forSourceString("test/AutoValue_Test", ""
+ "package test;\n"
+ "\n"
+ "import com.google.gson.Gson;\n"
+ "import com.google.gson.TypeAdapter;\n"
+ "import com.google.gson.TypeAdapterFactory;\n"
+ "import com.google.gson.reflect.TypeToken;\n"
+ "import com.google.gson.stream.JsonReader;\n"
+ "import com.google.gson.stream.JsonToken;\n"
+ "import com.google.gson.stream.JsonWriter;\n"
+ "import java.io.IOException;\n"
+ "import java.lang.Boolean;\n"
+ "import java.lang.Override;\n"
+ "import java.lang.String;\n"
+ "\n"
+ "final class AutoValue_Test extends $AutoValue_Test {\n"
+ " AutoValue_Test(String name, boolean awesome) {\n"
+ " super(name, awesome);\n"
+ " }\n"
+ "\n"
+ " public static TestTypeAdapterFactory typeAdapterFactory() {\n"
+ " return new TestTypeAdapterFactory();\n"
+ " }\n"
+ "\n"
+ " public static final class TestTypeAdapterFactory implements TypeAdapterFactory {\n"
+ " @Override\n"
+ " public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {\n"
+ " if (!Test.class.isAssignableFrom(typeToken.getRawType())) return null;\n"
+ " return (TypeAdapter<T>) new TestTypeAdapter(gson);\n"
+ " }\n"
+ " }\n"
+ "\n"
+ " public static final class TestTypeAdapter extends TypeAdapter<Test> {\n"
+ " private final TypeAdapter<String> nameAdapter;\n"
+ " private final TypeAdapter<Boolean> awesomeAdapter;\n"
+ " public TestTypeAdapter(Gson gson) {\n"
+ " this.nameAdapter = gson.getAdapter(String.class);\n"
+ " this.awesomeAdapter = gson.getAdapter(Boolean.class);\n"
+ " }\n"
+ " @Override\n"
+ " public void write(JsonWriter jsonWriter, Test object) throws IOException {\n"
+ " jsonWriter.beginObject();\n"
+ " jsonWriter.name(\"name\");\n"
+ " nameAdapter.write(jsonWriter, object.getName());\n"
+ " jsonWriter.name(\"awesome\");\n"
+ " awesomeAdapter.write(jsonWriter, object.isAwesome());\n"
+ " jsonWriter.endObject();\n"
+ " }\n"
+ " @Override\n"
+ " public Test read(JsonReader jsonReader) throws IOException {\n"
+ " jsonReader.beginObject();\n"
+ " String name = null;\n"
+ " boolean awesome = false;\n"
+ " while (jsonReader.hasNext()) {\n"
+ " String _name = jsonReader.nextName();\n"
+ " if (jsonReader.peek() == JsonToken.NULL) {\n"
+ " jsonReader.skipValue();\n"
+ " continue;\n"
+ " }\n"
+ " switch (_name) {\n"
+ " case \"name\": {\n"
+ " name = nameAdapter.read(jsonReader);\n"
+ " break;\n"
+ " }\n"
+ " case \"awesome\": {\n"
+ " awesome = awesomeAdapter.read(jsonReader);\n"
+ " break;\n"
+ " }\n"
+ " default: {\n"
+ " jsonReader.skipValue();\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " jsonReader.endObject();\n"
+ " return new AutoValue_Test(name, awesome);\n"
+ " }\n"
+ " }\n"
+ "}");

assertAbout(javaSource())
.that(source)
.processedWith(new AutoValueProcessor())
.compilesWithoutError()
.and()
.generatesSources(expected);
}
}

0 comments on commit 6a0945f

Please sign in to comment.