Compare commits

...

6 Commits

6 changed files with 116 additions and 5 deletions

View File

@@ -79,6 +79,23 @@ public class NameAndAgeBuilder {
this.age = age;
return this;
}
@Override
public String toString() {
return "NameAndAgeBuilder[name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public boolean equals(Object o) {
return (this == o) || ((o instanceof NameAndAgeBuilder b)
&& Objects.equals(name, b.name)
&& (age == b.age));
}
}
```

View File

@@ -5,7 +5,7 @@
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder</artifactId>
<packaging>pom</packaging>
<version>1.1.ea</version>
<version>1.3.ea</version>
<modules>
<module>record-builder-core</module>
@@ -70,7 +70,7 @@
<url>https://github.com/randgalt/record-builder</url>
<connection>scm:git:https://github.com/randgalt/record-builder.git</connection>
<developerConnection>scm:git:git@github.com:randgalt/record-builder.git</developerConnection>
<tag>record-builder-1.1.ea</tag>
<tag>record-builder-1.3.ea</tag>
</scm>
<issueManagement>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder</artifactId>
<version>1.1.ea</version>
<version>1.3.ea</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder</artifactId>
<version>1.1.ea</version>
<version>1.3.ea</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -29,6 +29,7 @@ import javax.tools.JavaFileObject;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -67,6 +68,9 @@ public class RecordBuilderProcessor extends AbstractProcessor {
addStaticDefaultBuilderMethod(builder, builderClassType, typeVariables, metaData);
addStaticCopyMethod(builder, builderClassType, recordClassType, recordComponents, typeVariables, metaData);
addBuildMethod(builder, recordClassType, recordComponents, metaData);
addToStringMethod(builder, builderClassType, recordComponents);
addHashCodeMethod(builder, recordComponents);
addEqualsMethod(builder, builderClassType, recordComponents);
recordComponents.forEach(component -> {
add1Field(builder, component);
add1SetterMethod(builder, component, builderClassType);
@@ -119,6 +123,96 @@ public class RecordBuilderProcessor extends AbstractProcessor {
builder.addMethod(constructorBuilder.build());
}
private void addToStringMethod(TypeSpec.Builder builder, ClassType builderClassType, List<ClassType> recordComponents) {
/*
add a toString() method similar to:
@Override
public String toString() {
return "MyRecord[p1=blah, p2=blah]";
}
*/
var codeBuilder = CodeBlock.builder().add("return \"$L[", builderClassType.name());
IntStream.range(0, recordComponents.size()).forEach(index -> {
if (index > 0) {
codeBuilder.add(", ");
}
String name = recordComponents.get(index).name();
codeBuilder.add("$L=\" + $L + \"", name, name);
});
codeBuilder.add("]\"");
var methodSpec = MethodSpec.methodBuilder("toString")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(String.class)
.addStatement(codeBuilder.build())
.build();
builder.addMethod(methodSpec);
}
private void addHashCodeMethod(TypeSpec.Builder builder, List<ClassType> recordComponents) {
/*
add an hashCode() method similar to:
@Override
public int hashCode() {
return Objects.hash(p1, p2);
}
*/
var codeBuilder = CodeBlock.builder().add("return $T.hash(", Objects.class);
IntStream.range(0, recordComponents.size()).forEach(index -> {
if (index > 0) {
codeBuilder.add(", ");
}
codeBuilder.add("$L", recordComponents.get(index).name());
});
codeBuilder.add(")");
var methodSpec = MethodSpec.methodBuilder("hashCode")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(TypeName.INT)
.addStatement(codeBuilder.build())
.build();
builder.addMethod(methodSpec);
}
private void addEqualsMethod(TypeSpec.Builder builder, ClassType builderClassType, List<ClassType> recordComponents) {
/*
add an equals() method similar to:
@Override
public boolean equals(Object o) {
if (this == o) return true;
return (o instanceof MyRecordBuilder b)
&& Objects.equals(p1, b.p1)
&& Objects.equals(p2, b.p2);
}
*/
var codeBuilder = CodeBlock.builder();
codeBuilder.add("return (this == o) || (");
codeBuilder.add("(o instanceof $L b)", builderClassType.name());
recordComponents.forEach(recordComponent -> {
String name = recordComponent.name();
if (recordComponent.typeName().isPrimitive()) {
codeBuilder.add("\n&& ($L == b.$L)", name, name);
} else {
codeBuilder.add("\n&& $T.equals($L, b.$L)", Objects.class, name, name);
}
});
codeBuilder.add(")");
var methodSpec = MethodSpec.methodBuilder("equals")
.addParameter(Object.class, "o")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(TypeName.BOOLEAN)
.addStatement(codeBuilder.build())
.build();
builder.addMethod(methodSpec);
}
private void addBuildMethod(TypeSpec.Builder builder, ClassType recordClassType, List<ClassType> recordComponents, RecordBuilderMetaData metaData) {
/*
Adds the build method that generates the record similar to:

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder</artifactId>
<version>1.1.ea</version>
<version>1.3.ea</version>
</parent>
<modelVersion>4.0.0</modelVersion>