diff --git a/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java b/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java index b310f78faf..5c8345eb60 100644 --- a/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java +++ b/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java @@ -844,6 +844,7 @@ private TypeSpec generateMessage(MessageType type) { builder.addMethod(messageConstructor(nameAllocator, type, builderJavaType)); builder.addMethod(newBuilder(nameAllocator, type)); + builder.addMethod(staticBuilder(type)); builder.addMethod(messageEquals(nameAllocator, type)); builder.addMethod(messageHashCode(nameAllocator, type)); @@ -2077,6 +2078,23 @@ private MethodSpec newBuilder(NameAllocator nameAllocator, MessageType message) return result.build(); } + // Example: + // + // public static final Builder builder() { + // return new Builder(); + // } + private MethodSpec staticBuilder(MessageType message) { + ClassName javaType = (ClassName) typeName(message.getType()); + ClassName builderJavaType = javaType.nestedClass("Builder"); + + MethodSpec.Builder result = + MethodSpec.methodBuilder("builder") + .addModifiers(PUBLIC, STATIC, FINAL) + .returns(builderJavaType) + .addStatement("return new $1T()", builderJavaType); + return result.build(); + } + private MethodSpec setter( NameAllocator nameAllocator, TypeName builderType, OneOf oneOf, Field field) { TypeName javaType = fieldType(field); diff --git a/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java b/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java index 947803380b..f0a40737c6 100644 --- a/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java +++ b/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java @@ -437,6 +437,26 @@ public void nestedAbstractAdapterIsStatic() throws IOException { + " public abstract static class AbstractBAdapter extends ProtoAdapter {\n"); } + @Test + public void builderFactoryMethodIsGenerated() throws IOException { + Schema schema = + new SchemaBuilder() + .add( + Path.get("message.proto"), + "" + + "syntax = \"proto2\";\n" + + "message SomeMessage {\n" + + " optional string a = 1;\n" + + "}\n") + .build(); + String javaOutput = new JavaWithProfilesGenerator(schema).generateJava("SomeMessage"); + assertThat(javaOutput) + .contains( + " public static final Builder builder() {\n" + + " return new Builder();\n" + + " }\n"); + } + /** https://github.com/square/wire/issues/655 */ @Test public void defaultValues() throws IOException {